Commit 830bf079 authored by Khalid Ahmed's avatar Khalid Ahmed Committed by Thomas Schlichter

pusch scrambling

parent ac1682f9
...@@ -1322,6 +1322,7 @@ set(PHY_SRC_UE ...@@ -1322,6 +1322,7 @@ set(PHY_SRC_UE
${OPENAIR1_DIR}/PHY/NR_UE_TRANSPORT/dci_nr.c ${OPENAIR1_DIR}/PHY/NR_UE_TRANSPORT/dci_nr.c
${OPENAIR1_DIR}/PHY/NR_UE_TRANSPORT/dci_tools_nr.c ${OPENAIR1_DIR}/PHY/NR_UE_TRANSPORT/dci_tools_nr.c
${OPENAIR1_DIR}/PHY/NR_UE_TRANSPORT/pucch_nr.c ${OPENAIR1_DIR}/PHY/NR_UE_TRANSPORT/pucch_nr.c
${OPENAIR1_DIR}/PHY/NR_UE_TRANSPORT/nr_ulsch.c
${OPENAIR1_DIR}/PHY/NR_REFSIG/ul_ref_seq_nr.c ${OPENAIR1_DIR}/PHY/NR_REFSIG/ul_ref_seq_nr.c
${OPENAIR1_DIR}/PHY/NR_REFSIG/nr_dmrs_rx.c ${OPENAIR1_DIR}/PHY/NR_REFSIG/nr_dmrs_rx.c
${OPENAIR1_DIR}/PHY/NR_REFSIG/nr_gold_ue.c ${OPENAIR1_DIR}/PHY/NR_REFSIG/nr_gold_ue.c
......
...@@ -43,6 +43,9 @@ ...@@ -43,6 +43,9 @@
#define MAX_NUM_NR_CHANNEL_BITS (14*273*12*6) // 14 symbols, 273 RB #define MAX_NUM_NR_CHANNEL_BITS (14*273*12*6) // 14 symbols, 273 RB
#define MAX_NUM_NR_RE (14*273*12) #define MAX_NUM_NR_RE (14*273*12)
#define NR_PUSCH_x 2 // UCI placeholder bit TS 38.212 V15.4.0 subclause 5.3.3.1
#define NR_PUSCH_y 3 // UCI placeholder bit
// Functions below implement minor procedures from 38-214 // Functions below implement minor procedures from 38-214
/** \brief Computes Q based on I_MCS PDSCH and when 'MCS-Table-PDSCH' is set to "256QAM". Implements Table 5.1.3.1-2 from 38.214. /** \brief Computes Q based on I_MCS PDSCH and when 'MCS-Table-PDSCH' is set to "256QAM". Implements Table 5.1.3.1-2 from 38.214.
......
...@@ -152,11 +152,12 @@ typedef struct { ...@@ -152,11 +152,12 @@ typedef struct {
// int calibration_flag; // int calibration_flag;
/// Number of soft channel bits /// Number of soft channel bits
uint32_t G; uint32_t G;
// number of symbols // Number of modulated symbols carrying data
uint8_t nb_symbols; uint8_t num_of_mod_symbols;
// first symbol in the slot // This is "L" in TS 38.214 V15.4.0 subclause 6.1.2.1
uint8_t number_of_symbols;
// This is "S" in TS 38.214 V15.4.0 subclause 6.1.2.1
uint8_t start_symbol; uint8_t start_symbol;
// decode phich // decode phich
uint8_t decode_phich; uint8_t decode_phich;
} NR_UL_UE_HARQ_t; } NR_UL_UE_HARQ_t;
...@@ -166,6 +167,8 @@ typedef struct { ...@@ -166,6 +167,8 @@ typedef struct {
uint8_t Nsymb_pusch; uint8_t Nsymb_pusch;
/// number of DMRS resource elements /// number of DMRS resource elements
uint8_t nb_re_dmrs; uint8_t nb_re_dmrs;
/// DMRS length
uint8_t length_dmrs;
/// SRS active flag /// SRS active flag
uint8_t srs_active; uint8_t srs_active;
//#if defined(UPGRADE_RAT_NR) //#if defined(UPGRADE_RAT_NR)
......
/*
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The OpenAirInterface Software Alliance licenses this file to You under
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
* except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.openairinterface.org/?page_id=698
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*-------------------------------------------------------------------------------
* For more information about the OpenAirInterface (OAI) Software Alliance:
* contact@openairinterface.org
*/
/*! \file PHY/NR_UE_TRANSPORT/nr_ulsch.c
* \brief Top-level routines for transmission of the PUSCH TS 38.211 v 15.4.0
* \author Khalid Ahmed
* \date 2019
* \version 0.1
* \company Fraunhofer IIS
* \email: khalid.ahmed@iis.fraunhofer.de
* \note
* \warning
*/
#include <stdint.h>
#include "PHY/NR_TRANSPORT/nr_transport_common_proto.h"
void nr_pusch_codeword_scrambling(uint8_t *in,
uint16_t size,
uint32_t Nid,
uint32_t n_RNTI,
uint32_t* out) {
uint8_t reset, b_idx;
uint32_t x1, x2, s=0;
reset = 1;
x2 = (n_RNTI<<15) + Nid;
for (int i=0; i<size; i++) {
b_idx = i&0x1f;
if (b_idx==0) {
s = lte_gold_generic(&x1, &x2, reset);
reset = 0;
if (i)
out++;
}
if (in[i]==NR_PUSCH_x)
*out ^= 1<<b_idx;
else if (in[i]==NR_PUSCH_y)
*out ^= (*out & (1<<b_idx-1))<<b_idx;
else
*out ^= (((in[i])&1) ^ ((s>>b_idx)&1))<<b_idx;
//printf("i %d b_idx %d in %d s 0x%08x out 0x%08x\n", i, b_idx, in[i], s, *out);
}
}
\ No newline at end of file
...@@ -224,7 +224,7 @@ int nr_ulsch_encoding(NR_UE_ULSCH_t *ulsch, ...@@ -224,7 +224,7 @@ int nr_ulsch_encoding(NR_UE_ULSCH_t *ulsch,
crc = 1; crc = 1;
harq_process = ulsch->harq_processes[harq_pid]; harq_process = ulsch->harq_processes[harq_pid];
nb_rb = harq_process->nb_rb; nb_rb = harq_process->nb_rb;
nb_symb_sch = harq_process->nb_symbols; nb_symb_sch = harq_process->number_of_symbols;
A = harq_process->TBS; A = harq_process->TBS;
pz = &Z; pz = &Z;
mod_order = nr_get_Qm(harq_process->mcs,1); mod_order = nr_get_Qm(harq_process->mcs,1);
......
...@@ -142,7 +142,7 @@ int8_t nr_ue_scheduled_response(nr_scheduled_response_t *scheduled_response){ ...@@ -142,7 +142,7 @@ int8_t nr_ue_scheduled_response(nr_scheduled_response_t *scheduled_response){
uint8_t current_harq_pid = pusch_config_pdu->harq_process_nbr; uint8_t current_harq_pid = pusch_config_pdu->harq_process_nbr;
ulsch0->harq_processes[current_harq_pid]->nb_rb = pusch_config_pdu->number_rbs; ulsch0->harq_processes[current_harq_pid]->nb_rb = pusch_config_pdu->number_rbs;
ulsch0->harq_processes[current_harq_pid]->first_rb = pusch_config_pdu->start_rb; ulsch0->harq_processes[current_harq_pid]->first_rb = pusch_config_pdu->start_rb;
ulsch0->harq_processes[current_harq_pid]->nb_symbols = pusch_config_pdu->number_symbols; ulsch0->harq_processes[current_harq_pid]->number_of_symbols = pusch_config_pdu->number_symbols;
ulsch0->harq_processes[current_harq_pid]->start_symbol = pusch_config_pdu->start_symbol; ulsch0->harq_processes[current_harq_pid]->start_symbol = pusch_config_pdu->start_symbol;
ulsch0->harq_processes[current_harq_pid]->mcs = pusch_config_pdu->mcs; ulsch0->harq_processes[current_harq_pid]->mcs = pusch_config_pdu->mcs;
ulsch0->harq_processes[current_harq_pid]->DCINdi = pusch_config_pdu->ndi; ulsch0->harq_processes[current_harq_pid]->DCINdi = pusch_config_pdu->ndi;
......
...@@ -138,7 +138,7 @@ int main(int argc, char **argv) { ...@@ -138,7 +138,7 @@ int main(int argc, char **argv) {
// int subframe_offset; // int subframe_offset;
// char fname[40], vname[40]; // char fname[40], vname[40];
int trial, n_trials = 1, n_errors = 0, n_false_positive = 0; int trial, n_trials = 1, n_errors = 0, n_false_positive = 0;
uint8_t n_tx = 1, n_rx = 1; uint8_t n_tx = 1, n_rx = 1, nb_codewords = 1;
//uint8_t transmission_mode = 1; //uint8_t transmission_mode = 1;
uint16_t Nid_cell = 0; uint16_t Nid_cell = 0;
channel_desc_t *gNB2UE; channel_desc_t *gNB2UE;
...@@ -475,6 +475,8 @@ int main(int argc, char **argv) { ...@@ -475,6 +475,8 @@ int main(int argc, char **argv) {
unsigned int available_bits; unsigned int available_bits;
uint8_t nb_re_dmrs = 6; uint8_t nb_re_dmrs = 6;
uint16_t length_dmrs = 1; uint16_t length_dmrs = 1;
uint8_t N_PRB_oh;
uint16_t N_RE_prime;
unsigned char mod_order; unsigned char mod_order;
uint8_t Nl = 1; uint8_t Nl = 1;
uint8_t rvidx = 0; uint8_t rvidx = 0;
...@@ -485,8 +487,6 @@ int main(int argc, char **argv) { ...@@ -485,8 +487,6 @@ int main(int argc, char **argv) {
NR_UE_ULSCH_t *ulsch_ue = UE->ulsch[0][0][0]; NR_UE_ULSCH_t *ulsch_ue = UE->ulsch[0][0][0];
ulsch_ue->nb_re_dmrs = nb_re_dmrs; //[adk] A HOT FIX until cearting nfapi_nr_ul_config_ulsch_pdu_rel15_t
mod_order = nr_get_Qm(Imcs, 1); mod_order = nr_get_Qm(Imcs, 1);
available_bits = nr_get_G(nb_rb, nb_symb_sch, nb_re_dmrs, length_dmrs, mod_order, 1); available_bits = nr_get_G(nb_rb, nb_symb_sch, nb_re_dmrs, length_dmrs, mod_order, 1);
TBS = nr_compute_tbs(Imcs, nb_rb, nb_symb_sch, nb_re_dmrs, length_dmrs, Nl); TBS = nr_compute_tbs(Imcs, nb_rb, nb_symb_sch, nb_re_dmrs, length_dmrs, Nl);
...@@ -522,16 +522,28 @@ int main(int argc, char **argv) { ...@@ -522,16 +522,28 @@ int main(int argc, char **argv) {
// estimated_output = ulsch_gNB->harq_processes[harq_pid]->b; // estimated_output = ulsch_gNB->harq_processes[harq_pid]->b;
/////////////////////////[adk] preparing NR_UE_ULSCH_t parameters///////////////////////// A HOT FIX until creating nfapi_nr_ul_config_ulsch_pdu_rel15_t
///////////
ulsch_ue->nb_re_dmrs = nb_re_dmrs;
ulsch_ue->length_dmrs = length_dmrs;
ulsch_ue->rnti = n_rnti;
///////////
////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////[adk] preparing UL harq_process parameters///////////////////////// /////////////////////////[adk] preparing UL harq_process parameters/////////////////////////
/////////// ///////////
NR_UL_UE_HARQ_t *harq_process_ul_ue = ulsch_ue->harq_processes[harq_pid]; NR_UL_UE_HARQ_t *harq_process_ul_ue = ulsch_ue->harq_processes[harq_pid];
N_PRB_oh = 0; // higher layer (RRC) parameter xOverhead in PUSCH-ServingCellConfig
N_RE_prime = NR_NB_SC_PER_RB*nb_symb_sch - nb_re_dmrs - N_PRB_oh;
if (harq_process_ul_ue) { if (harq_process_ul_ue) {
harq_process_ul_ue->mcs = Imcs; harq_process_ul_ue->mcs = Imcs;
harq_process_ul_ue->Nl = Nl; harq_process_ul_ue->Nl = Nl;
harq_process_ul_ue->nb_rb = nb_rb; harq_process_ul_ue->nb_rb = nb_rb;
harq_process_ul_ue->nb_symbols = nb_symb_sch; harq_process_ul_ue->number_of_symbols = nb_symb_sch;
harq_process_ul_ue->num_of_mod_symbols = N_RE_prime*nb_rb*nb_codewords;
harq_process_ul_ue->rvidx = rvidx; harq_process_ul_ue->rvidx = rvidx;
harq_process_ul_ue->TBS = TBS; harq_process_ul_ue->TBS = TBS;
harq_process_ul_ue->a = &test_input[0]; harq_process_ul_ue->a = &test_input[0];
...@@ -560,6 +572,27 @@ int main(int argc, char **argv) { ...@@ -560,6 +572,27 @@ int main(int argc, char **argv) {
/////////// ///////////
//////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////
/////////////////////////[adk] ULSCH scrambling/////////////////////////
///////////
uint32_t scrambled_output[NR_MAX_NB_CODEWORDS][NR_MAX_PDSCH_ENCODED_LENGTH>>5];
uint16_t encoded_length;
encoded_length = harq_process_ul_ue->num_of_mod_symbols*mod_order;
for (int q=0; q<nb_codewords; q++){
memset((void*)scrambled_output[q], 0, (encoded_length>>5)*sizeof(uint32_t));
}
nr_pusch_codeword_scrambling(ulsch_ue->g,
encoded_length,
Nid_cell,
ulsch_ue->rnti,
scrambled_output[0]); // assume one codeword for the moment
/////////////
//////////////////////////////////////////////////////////////////////////
for (SNR = snr0; SNR < snr1; SNR += snr_step) { for (SNR = snr0; SNR < snr1; SNR += snr_step) {
n_errors = 0; n_errors = 0;
......
...@@ -531,7 +531,7 @@ int main(int argc, char **argv) { ...@@ -531,7 +531,7 @@ int main(int argc, char **argv) {
harq_process_ul_ue->mcs = Imcs; harq_process_ul_ue->mcs = Imcs;
harq_process_ul_ue->Nl = Nl; harq_process_ul_ue->Nl = Nl;
harq_process_ul_ue->nb_rb = nb_rb; harq_process_ul_ue->nb_rb = nb_rb;
harq_process_ul_ue->nb_symbols = nb_symb_sch; harq_process_ul_ue->number_of_symbols = nb_symb_sch;
harq_process_ul_ue->rvidx = rvidx; harq_process_ul_ue->rvidx = rvidx;
harq_process_ul_ue->TBS = TBS; harq_process_ul_ue->TBS = TBS;
harq_process_ul_ue->a = &test_input[0]; harq_process_ul_ue->a = &test_input[0];
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment