Commit 7109841f authored by Florian Kaltenberger's avatar Florian Kaltenberger

Merge remote-tracking branch 'origin/nr_prach_fr2' into NR_FR2_RRC_SSB

parents ed97e216 d17e075f
...@@ -1302,10 +1302,12 @@ ...@@ -1302,10 +1302,12 @@
<testCase id="015112"> <testCase id="015112">
<class>execution</class> <class>execution</class>
<desc>nr_prachsim Test cases. (Test1: 106 PRBs - Prach format A2), <desc>nr_prachsim Test cases. (Test1: 30kHz SCS, 106 PRBs, Prach format A2),
(Test2: 217 PRBs - Prach format A2), (Test2: 30kHz SCS, 217 PRBs, Prach format A2),
(Test3: 273 PRBs - Prach format A2), (Test3: 30kHz SCS, 273 PRBs, Prach format A2),
(Test4: 106 PRBs - Prach format 0)</desc> (Test4: 30kHz SCS, 106 PRBs, Prach format 0)
(Test5: 120kHz SCS, 32 PRBs, Prach format A2)
(Test5: 120kHz SCS, 66 PRBs, Prach format A2)</desc>
<pre_compile_prog></pre_compile_prog> <pre_compile_prog></pre_compile_prog>
<compile_prog>$OPENAIR_DIR/cmake_targets/build_oai</compile_prog> <compile_prog>$OPENAIR_DIR/cmake_targets/build_oai</compile_prog>
<compile_prog_args> --phy_simulators -c </compile_prog_args> <compile_prog_args> --phy_simulators -c </compile_prog_args>
...@@ -1315,7 +1317,9 @@ ...@@ -1315,7 +1317,9 @@
<main_exec_args>-a -s -30 -n 100 -p 63 -R 106 <main_exec_args>-a -s -30 -n 100 -p 63 -R 106
-a -s -30 -n 100 -p 63 -R 217 -a -s -30 -n 100 -p 63 -R 217
-a -s -30 -n 100 -p 63 -R 273 -a -s -30 -n 100 -p 63 -R 273
-a -s -30 -n 100 -p 63 -R 106 -c 4</main_exec_args> -a -s -30 -n 100 -p 63 -R 106 -c 4
-a -s -30 -n 100 -p 32 -R 32 -m 3 -c52
-a -s -30 -n 100 -p 32 -R 66 -m 3 -c52</main_exec_args>
<tags>nr_prachsim.test1 nr_prachsim.test2 nr_prachsim.test3 nr_prachsim.test4</tags> <tags>nr_prachsim.test1 nr_prachsim.test2 nr_prachsim.test3 nr_prachsim.test4</tags>
<search_expr_true>PRACH test OK</search_expr_true> <search_expr_true>PRACH test OK</search_expr_true>
<search_expr_false>segmentation fault|assertion|exiting|fatal</search_expr_false> <search_expr_false>segmentation fault|assertion|exiting|fatal</search_expr_false>
......
...@@ -433,11 +433,18 @@ void nr_phy_config_request_sim(PHY_VARS_gNB *gNB, ...@@ -433,11 +433,18 @@ void nr_phy_config_request_sim(PHY_VARS_gNB *gNB,
//gNB_config->subframe_config.dl_cyclic_prefix_type.value = (fp->Ncp == NORMAL) ? NFAPI_CP_NORMAL : NFAPI_CP_EXTENDED; //gNB_config->subframe_config.dl_cyclic_prefix_type.value = (fp->Ncp == NORMAL) ? NFAPI_CP_NORMAL : NFAPI_CP_EXTENDED;
gNB->mac_enabled = 1; gNB->mac_enabled = 1;
fp->dl_CarrierFreq = 3500000000;//from_nrarfcn(gNB_config->nfapi_config.rf_bands.rf_band[0],gNB_config->nfapi_config.nrarfcn.value); if (mu==1) {
fp->ul_CarrierFreq = 3500000000;//fp->dl_CarrierFreq - (get_uldl_offset(gNB_config->nfapi_config.rf_bands.rf_band[0])*100000); fp->dl_CarrierFreq = 3500000000;//from_nrarfcn(gNB_config->nfapi_config.rf_bands.rf_band[0],gNB_config->nfapi_config.nrarfcn.value);
fp->nr_band = 78; fp->ul_CarrierFreq = 3500000000;//fp->dl_CarrierFreq - (get_uldl_offset(gNB_config->nfapi_config.rf_bands.rf_band[0])*100000);
// fp->threequarter_fs= 0; fp->nr_band = 78;
// fp->threequarter_fs= 0;
} else if (mu==3) {
fp->dl_CarrierFreq = 27524520000;//from_nrarfcn(gNB_config->nfapi_config.rf_bands.rf_band[0],gNB_config->nfapi_config.nrarfcn.value);
fp->ul_CarrierFreq = 27524520000;//fp->dl_CarrierFreq - (get_uldl_offset(gNB_config->nfapi_config.rf_bands.rf_band[0])*100000);
fp->nr_band = 261;
// fp->threequarter_fs= 0;
}
gNB_config->carrier_config.dl_bandwidth.value = config_bandwidth(mu, N_RB_DL, fp->nr_band); gNB_config->carrier_config.dl_bandwidth.value = config_bandwidth(mu, N_RB_DL, fp->nr_band);
nr_init_frame_parms(gNB_config, fp); nr_init_frame_parms(gNB_config, fp);
......
...@@ -185,10 +185,10 @@ void rx_nr_prach_ru(RU_t *ru, ...@@ -185,10 +185,10 @@ void rx_nr_prach_ru(RU_t *ru,
for (int aa=0; aa<ru->nb_rx; aa++){ for (int aa=0; aa<ru->nb_rx; aa++){
if (prach_sequence_length == 0) slot2=(slot/fp->slots_per_subframe)*fp->slots_per_subframe; if (prach_sequence_length == 0) slot2=(slot/fp->slots_per_subframe)*fp->slots_per_subframe;
prach[aa] = (int16_t*)&ru->common.rxdata[aa][(slot2*fp->get_samples_per_slot(slot,fp))+sample_offset_slot-ru->N_TA_offset]; prach[aa] = (int16_t*)&ru->common.rxdata[aa][fp->get_samples_slot_timestamp(slot2,fp,0)+sample_offset_slot-ru->N_TA_offset];
} }
idft_size_idx_t dftsize;
int dftlen=0; int dftlen=0;
int mu = fp->numerology_index; int mu = fp->numerology_index;
int Ncp = 0; int Ncp = 0;
...@@ -269,7 +269,8 @@ void rx_nr_prach_ru(RU_t *ru, ...@@ -269,7 +269,8 @@ void rx_nr_prach_ru(RU_t *ru,
if (LOG_DEBUGFLAG(PRACH)) { if (LOG_DEBUGFLAG(PRACH)) {
LOG_D(PHY,"rx_prach: Doing PRACH FFT for nb_rx:%d Ncp:%d\n",ru->nb_rx, Ncp); LOG_D(PHY,"rx_prach: Doing PRACH FFT for nb_rx:%d Ncp:%d\n",ru->nb_rx, Ncp);
} }
AssertFatal(mu==1,"only 30 kHz SCS handled for now\n");
// Note: Assumes PUSCH SCS @ 30 kHz, take values for formats 0-2 and adjust for others below // Note: Assumes PUSCH SCS @ 30 kHz, take values for formats 0-2 and adjust for others below
int kbar = 1; int kbar = 1;
...@@ -299,6 +300,7 @@ void rx_nr_prach_ru(RU_t *ru, ...@@ -299,6 +300,7 @@ void rx_nr_prach_ru(RU_t *ru,
AssertFatal(prach[aa]!=NULL,"prach[%d] is null\n",aa); AssertFatal(prach[aa]!=NULL,"prach[%d] is null\n",aa);
// do DFT // do DFT
if (mu==1) {
if (fp->N_RB_UL <= 100) if (fp->N_RB_UL <= 100)
AssertFatal(1==0,"N_RB_UL %d not support for NR PRACH yet\n",fp->N_RB_UL); AssertFatal(1==0,"N_RB_UL %d not support for NR PRACH yet\n",fp->N_RB_UL);
else if (fp->N_RB_UL < 137) { else if (fp->N_RB_UL < 137) {
...@@ -327,36 +329,29 @@ void rx_nr_prach_ru(RU_t *ru, ...@@ -327,36 +329,29 @@ void rx_nr_prach_ru(RU_t *ru,
} }
}// 839 sequence }// 839 sequence
else { else {
if ((mu==0 && if (prachStartSymbol == 0)
(prachStartSymbol == 0 || prachStartSymbol == 7)) || prach2+=64; // 32 samples @ 61.44 Ms/s in first symbol of each half subframe (15/30 kHz only)
(mu==1 && prachStartSymbol == 0)) prach2+=64; // 32 samples @ 61.44 Ms/s in first symbol of each half subframe (15/30 kHz only)
dftlen=2048;
if (mu==0) AssertFatal(1==0,"Shouldn't get here\n"); dft(DFT_2048,prach2,rxsigF[aa],1);
else if (mu==1) { if (prachFormat != 9/*C0*/) {
dftlen=2048; dft(DFT_2048,prach2+4096,rxsigF[aa]+4096,1);
dft(DFT_2048,prach2,rxsigF[aa],1); reps++;
if (prachFormat != 9/*C0*/) { }
dft(DFT_2048,prach2+4096,rxsigF[aa]+4096,1); if (prachFormat == 5/*A2*/ || prachFormat == 6/*A3*/|| prachFormat == 8/*B4*/ || prachFormat == 10/*C2*/) {
reps++; dft(DFT_2048,prach2+4096*2,rxsigF[aa]+4096*2,1);
} dft(DFT_2048,prach2+4096*3,rxsigF[aa]+4096*3,1);
if (prachFormat == 5/*A2*/ || prachFormat == 6/*A3*/|| prachFormat == 8/*B4*/ || prachFormat == 10/*C2*/) { reps+=2;
dft(DFT_2048,prach2+4096*2,rxsigF[aa]+4096*2,1); }
dft(DFT_2048,prach2+4096*3,rxsigF[aa]+4096*3,1); if (prachFormat == 6/*A3*/ || prachFormat == 8/*B4*/) {
reps+=2; dft(DFT_2048,prach2+4096*4,rxsigF[aa]+4096*4,1);
} dft(DFT_2048,prach2+4096*5,rxsigF[aa]+4096*5,1);
if (prachFormat == 6/*A3*/ || prachFormat == 8/*B4*/) { reps+=2;
dft(DFT_2048,prach2+4096*4,rxsigF[aa]+4096*4,1); }
dft(DFT_2048,prach2+4096*5,rxsigF[aa]+4096*5,1); if (prachFormat == 8/*B4*/) {
reps+=2; for (int i=6;i<12;i++) dft(DFT_2048,prach2+(4096*i),rxsigF[aa]+(4096*i),1);
} reps+=6;
if (prachFormat == 8/*B4*/) {
for (int i=6;i<12;i++) dft(DFT_2048,prach2+(4096*i),rxsigF[aa]+(4096*i),1);
reps+=6;
}
} }
else if (mu==2) AssertFatal(1==0,"Shouldn't get here\n");
else if (mu==3) AssertFatal(1==0,"Shouldn't get here\n");
else if (mu==4) AssertFatal(1==0,"Shouldn't get here\n");
} }
} else { // threequarter sampling } else { // threequarter sampling
// 40 MHz @ 46.08 Ms/s // 40 MHz @ 46.08 Ms/s
...@@ -383,36 +378,28 @@ void rx_nr_prach_ru(RU_t *ru, ...@@ -383,36 +378,28 @@ void rx_nr_prach_ru(RU_t *ru,
reps=4; reps=4;
} }
} else { } else {
if ((mu==0 && if (prachStartSymbol == 0) prach2+=48; // 24 samples @ 46.08 Ms/s in first symbol of each half subframe (15/30 kHz only)
(prachStartSymbol == 0 || prachStartSymbol == 7)) || dftlen=1536;
(mu==1 && prachStartSymbol == 0)) prach2+=48; // 24 samples @ 46.08 Ms/s in first symbol of each half subframe (15/30 kHz only) dft(DFT_1536,prach2,rxsigF[aa],1);
if (mu==0) AssertFatal(1==0,"Shouldn't get here\n"); if (prachFormat != 9/*C0*/) {
else if (mu==1) { dft(DFT_1536,prach2+3072,rxsigF[aa]+3072,1);
dftlen=1536; reps++;
dft(DFT_1536,prach2,rxsigF[aa],1); }
if (prachFormat != 9/*C0*/) {
dft(DFT_1536,prach2+3072,rxsigF[aa]+3072,1); if (prachFormat == 5/*A2*/ || prachFormat == 6/*A3*/|| prachFormat == 8/*B4*/ || prachFormat == 10/*C2*/) {
reps++; dft(DFT_1536,prach2+3072*2,rxsigF[aa]+3072*2,1);
} dft(DFT_1536,prach2+3072*3,rxsigF[aa]+3072*3,1);
reps+=2;
if (prachFormat == 5/*A2*/ || prachFormat == 6/*A3*/|| prachFormat == 8/*B4*/ || prachFormat == 10/*C2*/) { }
dft(DFT_1536,prach2+3072*2,rxsigF[aa]+3072*2,1); if (prachFormat == 6/*A3*/ || prachFormat == 8/*B4*/) {
dft(DFT_1536,prach2+3072*3,rxsigF[aa]+3072*3,1); dft(DFT_1536,prach2+3072*4,rxsigF[aa]+3072*4,1);
reps+=2; dft(DFT_1536,prach2+3072*5,rxsigF[aa]+3072*5,1);
} reps+=2;
if (prachFormat == 6/*A3*/ || prachFormat == 8/*B4*/) { }
dft(DFT_1536,prach2+3072*4,rxsigF[aa]+3072*4,1); if (prachFormat == 8/*B4*/) {
dft(DFT_1536,prach2+3072*5,rxsigF[aa]+3072*5,1); for (int i=6;i<12;i++) dft(DFT_1536,prach2+(3072*i),rxsigF[aa]+(3072*i),1);
reps+=2; reps+=6;
} }
if (prachFormat == 8/*B4*/) {
for (int i=6;i<12;i++) dft(DFT_1536,prach2+(3072*i),rxsigF[aa]+(3072*i),1);
reps+=6;
}
}// mu==1
else if (mu==2) AssertFatal(1==0,"Shouldn't get here\n");
else if (mu==3) AssertFatal(1==0,"Shouldn't get here\n");
else if (mu==4) AssertFatal(1==0,"Shouldn't get here\n");
} // short format } // short format
} // 3/4 sampling } // 3/4 sampling
} // <=50 MHz BW } // <=50 MHz BW
...@@ -442,37 +429,29 @@ void rx_nr_prach_ru(RU_t *ru, ...@@ -442,37 +429,29 @@ void rx_nr_prach_ru(RU_t *ru,
} }
} }
else { else {
if ((mu==0 && if (prachStartSymbol == 0) prach2+=128; // 64 samples @ 122.88 Ms/s in first symbol of each half subframe (15/30 kHz only)
(prachStartSymbol == 0 || prachStartSymbol == 7)) ||
(mu==1 && prachStartSymbol == 0)) prach2+=128; // 64 samples @ 122.88 Ms/s in first symbol of each half subframe (15/30 kHz only) dftlen=4096;
dft(DFT_4096,prach2,rxsigF[aa],1);
if (mu==0) AssertFatal(1==0,"Shouldn't get here\n"); if (prachFormat != 9/*C0*/) {
else if (mu==1) { dft(DFT_4096,prach2+8192,rxsigF[aa]+8192,1);
dftlen=4096; reps++;
dft(DFT_4096,prach2,rxsigF[aa],1); }
if (prachFormat != 9/*C0*/) {
dft(DFT_4096,prach2+8192,rxsigF[aa]+8192,1); if (prachFormat == 5/*A2*/ || prachFormat == 6/*A3*/|| prachFormat == 8/*B4*/ || prachFormat == 10/*C2*/) {
reps++; dft(DFT_4096,prach2+8192*2,rxsigF[aa]+8192*2,1);
} dft(DFT_4096,prach2+8192*3,rxsigF[aa]+8192*3,1);
reps+=2;
if (prachFormat == 5/*A2*/ || prachFormat == 6/*A3*/|| prachFormat == 8/*B4*/ || prachFormat == 10/*C2*/) { }
dft(DFT_4096,prach2+8192*2,rxsigF[aa]+8192*2,1); if (prachFormat == 6/*A3*/ || prachFormat == 8/*B4*/) {
dft(DFT_4096,prach2+8192*3,rxsigF[aa]+8192*3,1); dft(DFT_4096,prach2+8192*4,rxsigF[aa]+8192*4,1);
reps+=2; dft(DFT_4096,prach2+8192*5,rxsigF[aa]+8192*5,1);
} reps+=2;
if (prachFormat == 6/*A3*/ || prachFormat == 8/*B4*/) { }
dft(DFT_4096,prach2+8192*4,rxsigF[aa]+8192*4,1); if (prachFormat == 8/*B4*/) {
dft(DFT_4096,prach2+8192*5,rxsigF[aa]+8192*5,1); for (int i=6;i<12;i++) dft(DFT_4096,prach2+(8192*i),rxsigF[aa]+(8192*i),1);
reps+=2; reps+=6;
}
if (prachFormat == 8/*B4*/) {
for (int i=6;i<12;i++) dft(DFT_4096,prach2+(8192*i),rxsigF[aa]+(8192*i),1);
reps+=6;
}
} }
else if (mu==2) AssertFatal(1==0,"Shouldn't get here\n");
else if (mu==3) AssertFatal(1==0,"Shouldn't get here\n");
else if (mu==4) AssertFatal(1==0,"Shouldn't get here\n");
} }
} else { } else {
AssertFatal(fp->N_RB_UL <= 217,"cannot do more than 217 PRBs with 3/4 sampling\n"); AssertFatal(fp->N_RB_UL <= 217,"cannot do more than 217 PRBs with 3/4 sampling\n");
...@@ -494,40 +473,85 @@ void rx_nr_prach_ru(RU_t *ru, ...@@ -494,40 +473,85 @@ void rx_nr_prach_ru(RU_t *ru,
reps=4; reps=4;
} }
} else { } else {
if ((mu==0 && if (prachStartSymbol == 0) prach2+=96; // 64 samples @ 122.88 Ms/s in first symbol of each half subframe (15/30 kHz only)
(prachStartSymbol == 0 || prachStartSymbol == 7)) ||
(mu==1 && prachStartSymbol == 0)) prach2+=96; // 64 samples @ 122.88 Ms/s in first symbol of each half subframe (15/30 kHz only) dftlen=3072;
dft(DFT_3072,prach2,rxsigF[aa],1);
if (mu==0) AssertFatal(1==0,"Shouldn't get here\n"); if (prachFormat != 9/*C0*/) {
else if (mu==1) { dft(DFT_3072,prach2+6144,rxsigF[aa]+6144,1);
dftlen=3072; reps++;
dft(DFT_3072,prach2,rxsigF[aa],1); }
if (prachFormat != 9/*C0*/) {
dft(DFT_3072,prach2+6144,rxsigF[aa]+6144,1); if (prachFormat == 5/*A2*/ || prachFormat == 6/*A3*/|| prachFormat == 8/*B4*/ || prachFormat == 10/*C2*/) {
reps++; dft(DFT_3072,prach2+6144*2,rxsigF[aa]+6144*2,1);
} dft(DFT_3072,prach2+6144*3,rxsigF[aa]+6144*3,1);
reps+=2;
if (prachFormat == 5/*A2*/ || prachFormat == 6/*A3*/|| prachFormat == 8/*B4*/ || prachFormat == 10/*C2*/) { }
dft(DFT_3072,prach2+6144*2,rxsigF[aa]+6144*2,1); if (prachFormat == 6/*A3*/ || prachFormat == 8/*B4*/) {
dft(DFT_3072,prach2+6144*3,rxsigF[aa]+6144*3,1); dft(DFT_3072,prach2+6144*4,rxsigF[aa]+6144*4,1);
reps+=2; dft(DFT_3072,prach2+6144*5,rxsigF[aa]+6144*5,1);
} reps+=2;
if (prachFormat == 6/*A3*/ || prachFormat == 8/*B4*/) { }
dft(DFT_3072,prach2+6144*4,rxsigF[aa]+6144*4,1); if (prachFormat == 8/*B4*/) {
dft(DFT_3072,prach2+6144*5,rxsigF[aa]+6144*5,1); for (int i=6;i<12;i++) dft(DFT_3072,prach2+(6144*i),rxsigF[aa]+(6144*i),1);
reps+=2; reps+=6;
}
if (prachFormat == 8/*B4*/) {
for (int i=6;i<12;i++) dft(DFT_3072,prach2+(6144*i),rxsigF[aa]+(6144*i),1);
reps+=6;
}
} }
else if (mu==2) AssertFatal(1==0,"Shouldn't get here\n");
else if (mu==3) AssertFatal(1==0,"Shouldn't get here\n");
else if (mu==4) AssertFatal(1==0,"Shouldn't get here\n");
} }
} }
} }
}
else if (mu==3) {
if (fp->threequarter_fs) {
AssertFatal(1==0,"3/4 sampling not supported for numerology %d\n",mu);
}
if (prach_sequence_length == 0) {
AssertFatal(1==0,"long prach not supported for numerology %d\n",mu);
}
if (fp->N_RB_UL == 32) {
prach2 = prach[aa] + (Ncp<<2); // Ncp is for 30.72 Ms/s, so multiply by 2 for I/Q, and 2 for 61.44Msps
if (slot%(fp->slots_per_subframe/2)==0 && prachStartSymbol == 0)
prach2+=64; // 32 samples @ 61.44 Ms/s in first symbol of each half subframe
dftlen=512;
dftsize = DFT_512;
}
else if (fp->N_RB_UL == 66) {
prach2 = prach[aa] + (Ncp<<3); // Ncp is for 30.72 Ms/s, so multiply by 4 for I/Q, and 2 for 122.88Msps
if (slot%(fp->slots_per_subframe/2)==0 && prachStartSymbol == 0)
prach2+=128; // 64 samples @ 122.88 Ms/s in first symbol of each half subframe
dftlen=1024;
dftsize = DFT_1024;
}
else {
AssertFatal(1==0,"N_RB_UL %d not support for numerology %d\n",fp->N_RB_UL,mu);
}
dft(dftsize,prach2,rxsigF[aa],1);
if (prachFormat != 9/*C0*/) {
dft(dftsize,prach2+dftlen*2,rxsigF[aa]+dftlen*2,1);
reps++;
}
if (prachFormat == 5/*A2*/ || prachFormat == 6/*A3*/|| prachFormat == 8/*B4*/ || prachFormat == 10/*C2*/) {
dft(dftsize,prach2+dftlen*4,rxsigF[aa]+dftlen*4,1);
dft(dftsize,prach2+dftlen*6,rxsigF[aa]+dftlen*6,1);
reps+=2;
}
if (prachFormat == 6/*A3*/ || prachFormat == 8/*B4*/) {
dft(dftsize,prach2+dftlen*8,rxsigF[aa]+dftlen*8,1);
dft(dftsize,prach2+dftlen*10,rxsigF[aa]+dftlen*10,1);
reps+=2;
}
if (prachFormat == 8/*B4*/) {
for (int i=6;i<12;i++)
dft(dftsize,prach2+(dftlen*2*i),rxsigF[aa]+(dftlen*2*i),1);
reps+=6;
}
}
else {
AssertFatal(1==0,"Numerology not supported\n");
}
//LOG_M("ru_rxsigF_tmp.m","rxsFtmp", rxsigF[aa], dftlen*2*reps, 1, 1);
//Coherent combining of PRACH repetitions (assumes channel does not change, to be revisted for "long" PRACH) //Coherent combining of PRACH repetitions (assumes channel does not change, to be revisted for "long" PRACH)
LOG_D(PHY,"Doing PRACH combining of %d reptitions N_ZC %d\n",reps,N_ZC); LOG_D(PHY,"Doing PRACH combining of %d reptitions N_ZC %d\n",reps,N_ZC);
......
...@@ -105,6 +105,8 @@ int32_t generate_nr_prach(PHY_VARS_NR_UE *ue, uint8_t gNB_id, uint8_t slot){ ...@@ -105,6 +105,8 @@ int32_t generate_nr_prach(PHY_VARS_NR_UE *ue, uint8_t gNB_id, uint8_t slot){
sample_offset_slot = (prachStartSymbol==0?0:fp->ofdm_symbol_size*prachStartSymbol+fp->nb_prefix_samples0+fp->nb_prefix_samples*(prachStartSymbol-1)); sample_offset_slot = (prachStartSymbol==0?0:fp->ofdm_symbol_size*prachStartSymbol+fp->nb_prefix_samples0+fp->nb_prefix_samples*(prachStartSymbol-1));
prach_start = fp->get_samples_slot_timestamp(slot, fp, 0) + sample_offset_slot; prach_start = fp->get_samples_slot_timestamp(slot, fp, 0) + sample_offset_slot;
//printf("prachstartsymbold %d, sample_offset_slot %d, prach_start %d\n",prachStartSymbol, sample_offset_slot, prach_start);
// First compute physical root sequence // First compute physical root sequence
/************************************************************************ /************************************************************************
* 4G and NR NCS tables are slightly different and depend on prach format * 4G and NR NCS tables are slightly different and depend on prach format
...@@ -241,6 +243,7 @@ int32_t generate_nr_prach(PHY_VARS_NR_UE *ue, uint8_t gNB_id, uint8_t slot){ ...@@ -241,6 +243,7 @@ int32_t generate_nr_prach(PHY_VARS_NR_UE *ue, uint8_t gNB_id, uint8_t slot){
* *
*********************************************************/ *********************************************************/
if (mu==1) {
if (fp->N_RB_UL <= 100) if (fp->N_RB_UL <= 100)
AssertFatal(1 == 0, "N_RB_UL %d not support for NR PRACH yet\n", fp->N_RB_UL); AssertFatal(1 == 0, "N_RB_UL %d not support for NR PRACH yet\n", fp->N_RB_UL);
else if (fp->N_RB_UL < 137) { else if (fp->N_RB_UL < 137) {
...@@ -321,6 +324,22 @@ int32_t generate_nr_prach(PHY_VARS_NR_UE *ue, uint8_t gNB_id, uint8_t slot){ ...@@ -321,6 +324,22 @@ int32_t generate_nr_prach(PHY_VARS_NR_UE *ue, uint8_t gNB_id, uint8_t slot){
} }
} }
} }
}
else if (mu==3) {
if (fp->threequarter_fs)
AssertFatal(1==0,"3/4 sampling not supported for numerology %d\n",mu);
if (prach_sequence_length == 0)
AssertFatal(1==0,"long prach not supported for numerology %d\n",mu);
if (fp->N_RB_UL == 32)
dftlen=512;
else if (fp->N_RB_UL == 66)
dftlen=1024;
else
AssertFatal(1==0,"N_RB_UL %d not support for numerology %d\n",fp->N_RB_UL,mu);
}
for (offset=0,offset2=0; offset<N_ZC; offset++,offset2+=preamble_shift) { for (offset=0,offset2=0; offset<N_ZC; offset++,offset2+=preamble_shift) {
...@@ -344,6 +363,7 @@ int32_t generate_nr_prach(PHY_VARS_NR_UE *ue, uint8_t gNB_id, uint8_t slot){ ...@@ -344,6 +363,7 @@ int32_t generate_nr_prach(PHY_VARS_NR_UE *ue, uint8_t gNB_id, uint8_t slot){
AssertFatal(prach_fmt_id < 4, "Illegal PRACH format %d for sequence length 839\n", prach_fmt_id); AssertFatal(prach_fmt_id < 4, "Illegal PRACH format %d for sequence length 839\n", prach_fmt_id);
// Ncp here is given in terms of T_s wich is 30.72MHz sampling
switch (prach_fmt_id) { switch (prach_fmt_id) {
case 0: case 0:
Ncp = 3168; Ncp = 3168;
...@@ -401,13 +421,149 @@ int32_t generate_nr_prach(PHY_VARS_NR_UE *ue, uint8_t gNB_id, uint8_t slot){ ...@@ -401,13 +421,149 @@ int32_t generate_nr_prach(PHY_VARS_NR_UE *ue, uint8_t gNB_id, uint8_t slot){
LOG_D(PHY, "PRACH [UE %d] Ncp %d, dftlen %d \n", Mod_id, Ncp, dftlen); LOG_D(PHY, "PRACH [UE %d] Ncp %d, dftlen %d \n", Mod_id, Ncp, dftlen);
#endif #endif
if (fp->N_RB_UL <= 100) //actually what we should be checking here is how often the current prach crosses a 0.5ms boundary. I am not quite sure for which paramter set this would be the case, so I will ignore it for now and just check if the prach starts on a 0.5ms boundary
AssertFatal(1==0,"N_RB_UL %d not supported for NR PRACH yet\n",fp->N_RB_UL); uint8_t use_extended_prach_prefix = 0;
if(fp->numerology_index == 0) {
if (prachStartSymbol == 0 || prachStartSymbol == 7)
use_extended_prach_prefix = 1;
}
else {
if (slot%(fp->slots_per_subframe/2)==0 && prachStartSymbol == 0)
use_extended_prach_prefix = 1;
}
if (fp->N_RB_UL <= 34) { //32 PRB case 61.44Msps
if (fp->threequarter_fs == 0) {
Ncp<<=1; //to account for 61.44Mbps
// This is after cyclic prefix
prach2 = prach+(Ncp<<1); //times 2 for complex samples
if (prach_sequence_length == 0)
AssertFatal(1==0,"no long PRACH for this PRACH size %d\n",fp->N_RB_UL);
else {
if (use_extended_prach_prefix)
Ncp+=32; // 16*kappa, kappa=2 for 61.44Msps
prach2 = prach+(Ncp<<1); //times 2 for complex samples
if (prach_fmt_id == 4 || prach_fmt_id == 7 || prach_fmt_id == 9) {
idft(IDFT_512,prachF,prach2,1);
// here we have |empty | Prach512 |
if (prach_fmt_id != 9) {
memmove(prach2+(512<<1),prach2,(512<<2));
prach_len = (512*2)+Ncp;
}
else prach_len = (512*1)+Ncp;
memmove(prach,prach+(512<<1),(Ncp<<2));
// here we have |Prefix | Prach512 | Prach512 (if ! 0xc0) |
} else if (prach_fmt_id == 5) { // 6x512
idft(IDFT_512,prachF,prach2,1);
// here we have |empty | Prach512 |
memmove(prach2+(512<<1),prach2,(512<<2));
// here we have |empty | Prach512 | Prach512| empty512 | empty512 |
memmove(prach2+(512<<2),prach2,(512<<3));
// here we have |empty | Prach512 | Prach512| Prach512 | Prach512 |
memmove(prach,prach+(512<<1),(Ncp<<2));
// here we have |Prefix | Prach512 |
prach_len = (512*4)+Ncp;
} else if (prach_fmt_id == 6) { // 6x512
idft(IDFT_512,prachF,prach2,1);
// here we have |empty | Prach512 |
memmove(prach2+(512<<1),prach2,(512<<2));
// here we have |empty | Prach512 | Prach512| empty512 | empty512 | empty512 | empty512
memmove(prach2+(512<<2),prach2,(512<<3));
// here we have |empty | Prach512 | Prach512| Prach512 | Prach512 | empty512 | empty512
memmove(prach2+(512<<3),prach2,(512<<3));
// here we have |empty | Prach512 | Prach512| Prach512 | Prach512 | Prach512 | Prach512
memmove(prach,prach+(512<<1),(Ncp<<2));
// here we have |Prefix | Prach512 |
prach_len = (512*6)+Ncp;
} else if (prach_fmt_id == 8) { // 12x512
idft(IDFT_512,prachF,prach2,1);
// here we have |empty | Prach512 |
memmove(prach2+(512<<1),prach2,(512<<2));
// here we have |empty | Prach512 | Prach512| empty512 | empty512 | empty512 | empty512
memmove(prach2+(512<<2),prach2,(512<<3));
// here we have |empty | Prach512 | Prach512| Prach512 | Prach512 | empty512 | empty512
memmove(prach2+(512<<3),prach2,(512<<3));
// here we have |empty | Prach512 | Prach512| Prach512 | Prach512 | Prach512 | Prach512
memmove(prach2+(512<<1)*6,prach2,(512<<2)*6);
// here we have |empty | Prach512 | Prach512| Prach512 | Prach512 | Prach512 | Prach512 | Prach512 | Prach512| Prach512 | Prach512 | Prach512 | Prach512|
memmove(prach,prach+(512<<1),(Ncp<<2));
// here we have |Prefix | Prach512 | Prach512| Prach512 | Prach512 | Prach512 | Prach512 | Prach512 | Prach512| Prach512 | Prach512 | Prach512 | Prach512|
prach_len = (512*12)+Ncp;
}
}
}
else
AssertFatal(1==0,"3/4 sampling not supported for this PRACH size %d\n",fp->N_RB_UL);
}
else if (fp->N_RB_UL <= 68) {//66 PRB case, 122.88 Msps
if (fp->threequarter_fs == 0) {
Ncp<<=2; //to account for 122.88Mbps
// This is after cyclic prefix
prach2 = prach+(Ncp<<1); //times 2 for complex samples
if (prach_sequence_length == 0)
AssertFatal(1==0,"no long PRACH for this PRACH size %d\n",fp->N_RB_UL);
else {
if (use_extended_prach_prefix)
Ncp+=64; // 16*kappa, kappa=4 for 122.88Msps
prach2 = prach+(Ncp<<1); //times 2 for complex samples
if (prach_fmt_id == 4 || prach_fmt_id == 7 || prach_fmt_id == 9) {
idft(IDFT_1024,prachF,prach2,1);
// here we have |empty | Prach1024 |
if (prach_fmt_id != 9) {
memmove(prach2+(1024<<1),prach2,(1024<<2));
prach_len = (1024*2)+Ncp;
}
else prach_len = (1024*1)+Ncp;
memmove(prach,prach+(1024<<1),(Ncp<<2));
// here we have |Prefix | Prach1024 | Prach1024 (if ! 0xc0) |
} else if (prach_fmt_id == 5) { // 6x1024
idft(IDFT_1024,prachF,prach2,1);
// here we have |empty | Prach1024 |
memmove(prach2+(1024<<1),prach2,(1024<<2));
// here we have |empty | Prach1024 | Prach1024| empty1024 | empty1024 |
memmove(prach2+(1024<<2),prach2,(1024<<3));
// here we have |empty | Prach1024 | Prach1024| Prach1024 | Prach1024 |
memmove(prach,prach+(1024<<1),(Ncp<<2));
// here we have |Prefix | Prach1024 |
prach_len = (1024*4)+Ncp;
} else if (prach_fmt_id == 6) { // 6x1024
idft(IDFT_1024,prachF,prach2,1);
// here we have |empty | Prach1024 |
memmove(prach2+(1024<<1),prach2,(1024<<2));
// here we have |empty | Prach1024 | Prach1024| empty1024 | empty1024 | empty1024 | empty1024
memmove(prach2+(1024<<2),prach2,(1024<<3));
// here we have |empty | Prach1024 | Prach1024| Prach1024 | Prach1024 | empty1024 | empty1024
memmove(prach2+(1024<<3),prach2,(1024<<3));
// here we have |empty | Prach1024 | Prach1024| Prach1024 | Prach1024 | Prach1024 | Prach1024
memmove(prach,prach+(1024<<1),(Ncp<<2));
// here we have |Prefix | Prach1024 |
prach_len = (1024*6)+Ncp;
} else if (prach_fmt_id == 8) { // 12x1024
idft(IDFT_1024,prachF,prach2,1);
// here we have |empty | Prach1024 |
memmove(prach2+(1024<<1),prach2,(1024<<2));
// here we have |empty | Prach1024 | Prach1024| empty1024 | empty1024 | empty1024 | empty1024
memmove(prach2+(1024<<2),prach2,(1024<<3));
// here we have |empty | Prach1024 | Prach1024| Prach1024 | Prach1024 | empty1024 | empty1024
memmove(prach2+(1024<<3),prach2,(1024<<3));
// here we have |empty | Prach1024 | Prach1024| Prach1024 | Prach1024 | Prach1024 | Prach1024
memmove(prach2+(1024<<1)*6,prach2,(1024<<2)*6);
// here we have |empty | Prach1024 | Prach1024| Prach1024 | Prach1024 | Prach1024 | Prach1024 | Prach1024 | Prach1024| Prach1024 | Prach1024 | Prach1024 | Prach1024|
memmove(prach,prach+(1024<<1),(Ncp<<2));
// here we have |Prefix | Prach1024 | Prach1024| Prach1024 | Prach1024 | Prach1024 | Prach1024 | Prach1024 | Prach1024| Prach1024 | Prach1024 | Prach1024 | Prach1024|
prach_len = (1024*12)+Ncp;
}
}
}
else
AssertFatal(1==0,"3/4 sampling not supported for this PRACH size %d\n",fp->N_RB_UL);
}
else if (fp->N_RB_UL < 137) { // 46.08 or 61.44 Ms/s else if (fp->N_RB_UL < 137) { // 46.08 or 61.44 Ms/s
if (fp->threequarter_fs == 0) { // full sampling @ 61.44 Ms/s if (fp->threequarter_fs == 0) { // full sampling @ 61.44 Ms/s
Ncp<<=1; Ncp<<=1; //to account for 61.44Mbps
// This is after cyclic prefix (Ncp<<1 samples for 30.72 Ms/s, Ncp<<2 samples for 61.44 Ms/s // This is after cyclic prefix
prach2 = prach+(Ncp<<1); prach2 = prach+(Ncp<<1); //times 2 for complex samples
if (prach_sequence_length == 0){ if (prach_sequence_length == 0){
if (prach_fmt_id == 0) { //24576 samples @ 30.72 Ms/s, 49152 samples @ 61.44 Ms/s if (prach_fmt_id == 0) { //24576 samples @ 30.72 Ms/s, 49152 samples @ 61.44 Ms/s
idft(IDFT_49152,prachF,prach2,1); idft(IDFT_49152,prachF,prach2,1);
...@@ -442,9 +598,10 @@ int32_t generate_nr_prach(PHY_VARS_NR_UE *ue, uint8_t gNB_id, uint8_t slot){ ...@@ -442,9 +598,10 @@ int32_t generate_nr_prach(PHY_VARS_NR_UE *ue, uint8_t gNB_id, uint8_t slot){
prach_len = (12288*4)+Ncp; prach_len = (12288*4)+Ncp;
} }
} else { // short PRACH sequence } else { // short PRACH sequence
if (use_extended_prach_prefix)
Ncp+=32; // 16*kappa, kappa=2 for 61.44Msps
prach2 = prach+(Ncp<<1); //times 2 for complex samples
if (prach_fmt_id == 4 || prach_fmt_id == 7 || prach_fmt_id == 9) { if (prach_fmt_id == 4 || prach_fmt_id == 7 || prach_fmt_id == 9) {
Ncp+=32; // This assumes we are transmitting starting in symbol 0 of a PRACH slot, 30 kHz, full sampling
prach2 = prach+(Ncp<<1);
idft(IDFT_2048,prachF,prach2,1); idft(IDFT_2048,prachF,prach2,1);
// here we have |empty | Prach2048 | // here we have |empty | Prach2048 |
if (prach_fmt_id != 9) { if (prach_fmt_id != 9) {
...@@ -455,8 +612,6 @@ int32_t generate_nr_prach(PHY_VARS_NR_UE *ue, uint8_t gNB_id, uint8_t slot){ ...@@ -455,8 +612,6 @@ int32_t generate_nr_prach(PHY_VARS_NR_UE *ue, uint8_t gNB_id, uint8_t slot){
memmove(prach,prach+(2048<<1),(Ncp<<2)); memmove(prach,prach+(2048<<1),(Ncp<<2));
// here we have |Prefix | Prach2048 | Prach2048 (if ! 0xc0) | // here we have |Prefix | Prach2048 | Prach2048 (if ! 0xc0) |
} else if (prach_fmt_id == 5) { // 6x2048 } else if (prach_fmt_id == 5) { // 6x2048
Ncp+=32; // This assumes we are transmitting starting in symbol 0 of a PRACH slot, 30 kHz, full sampling
prach2 = prach+(Ncp<<1);
idft(IDFT_2048,prachF,prach2,1); idft(IDFT_2048,prachF,prach2,1);
// here we have |empty | Prach2048 | // here we have |empty | Prach2048 |
memmove(prach2+(2048<<1),prach2,(2048<<2)); memmove(prach2+(2048<<1),prach2,(2048<<2));
...@@ -467,8 +622,6 @@ int32_t generate_nr_prach(PHY_VARS_NR_UE *ue, uint8_t gNB_id, uint8_t slot){ ...@@ -467,8 +622,6 @@ int32_t generate_nr_prach(PHY_VARS_NR_UE *ue, uint8_t gNB_id, uint8_t slot){
// here we have |Prefix | Prach2048 | // here we have |Prefix | Prach2048 |
prach_len = (2048*4)+Ncp; prach_len = (2048*4)+Ncp;
} else if (prach_fmt_id == 6) { // 6x2048 } else if (prach_fmt_id == 6) { // 6x2048
Ncp+=32;
prach2 = prach+(Ncp<<1);
idft(IDFT_2048,prachF,prach2,1); idft(IDFT_2048,prachF,prach2,1);
// here we have |empty | Prach2048 | // here we have |empty | Prach2048 |
memmove(prach2+(2048<<1),prach2,(2048<<2)); memmove(prach2+(2048<<1),prach2,(2048<<2));
...@@ -481,8 +634,6 @@ int32_t generate_nr_prach(PHY_VARS_NR_UE *ue, uint8_t gNB_id, uint8_t slot){ ...@@ -481,8 +634,6 @@ int32_t generate_nr_prach(PHY_VARS_NR_UE *ue, uint8_t gNB_id, uint8_t slot){
// here we have |Prefix | Prach2048 | // here we have |Prefix | Prach2048 |
prach_len = (2048*6)+Ncp; prach_len = (2048*6)+Ncp;
} else if (prach_fmt_id == 8) { // 12x2048 } else if (prach_fmt_id == 8) { // 12x2048
Ncp+=32; // This assumes we are transmitting starting in symbol 0 of a PRACH slot, 30 kHz, full sampling
prach2 = prach+(Ncp<<1);
idft(IDFT_2048,prachF,prach2,1); idft(IDFT_2048,prachF,prach2,1);
// here we have |empty | Prach2048 | // here we have |empty | Prach2048 |
memmove(prach2+(2048<<1),prach2,(2048<<2)); memmove(prach2+(2048<<1),prach2,(2048<<2));
...@@ -535,9 +686,10 @@ int32_t generate_nr_prach(PHY_VARS_NR_UE *ue, uint8_t gNB_id, uint8_t slot){ ...@@ -535,9 +686,10 @@ int32_t generate_nr_prach(PHY_VARS_NR_UE *ue, uint8_t gNB_id, uint8_t slot){
prach_len = (9216*4)+Ncp; prach_len = (9216*4)+Ncp;
} }
} else { // short sequence } else { // short sequence
if (use_extended_prach_prefix)
Ncp+=24; // 16*kappa, kappa=1.5 for 46.08Msps
prach2 = prach+(Ncp<<1); //times 2 for complex samples
if (prach_fmt_id == 4 || prach_fmt_id == 7 || prach_fmt_id == 9) { if (prach_fmt_id == 4 || prach_fmt_id == 7 || prach_fmt_id == 9) {
Ncp+=24; // This assumes we are transmitting starting in symbol 0 of a PRACH slot, 30 kHz, full sampling
prach2 = prach+(Ncp<<1);
idft(IDFT_1536,prachF,prach2,1); idft(IDFT_1536,prachF,prach2,1);
// here we have |empty | Prach1536 | // here we have |empty | Prach1536 |
if (prach_fmt_id != 9) { if (prach_fmt_id != 9) {
...@@ -549,9 +701,6 @@ int32_t generate_nr_prach(PHY_VARS_NR_UE *ue, uint8_t gNB_id, uint8_t slot){ ...@@ -549,9 +701,6 @@ int32_t generate_nr_prach(PHY_VARS_NR_UE *ue, uint8_t gNB_id, uint8_t slot){
// here we have |Prefix | Prach1536 | Prach1536 (if ! 0xc0) | // here we have |Prefix | Prach1536 | Prach1536 (if ! 0xc0) |
} else if (prach_fmt_id == 5) { // 6x1536 } else if (prach_fmt_id == 5) { // 6x1536
Ncp+=24; // This assumes we are transmitting starting in symbol 0 of a PRACH slot, 30 kHz, full sampling
prach2 = prach+(Ncp<<1);
idft(IDFT_1536,prachF,prach2,1); idft(IDFT_1536,prachF,prach2,1);
// here we have |empty | Prach1536 | // here we have |empty | Prach1536 |
memmove(prach2+(1536<<1),prach2,(1536<<2)); memmove(prach2+(1536<<1),prach2,(1536<<2));
...@@ -562,8 +711,6 @@ int32_t generate_nr_prach(PHY_VARS_NR_UE *ue, uint8_t gNB_id, uint8_t slot){ ...@@ -562,8 +711,6 @@ int32_t generate_nr_prach(PHY_VARS_NR_UE *ue, uint8_t gNB_id, uint8_t slot){
// here we have |Prefix | Prach1536 | // here we have |Prefix | Prach1536 |
prach_len = (1536*4)+Ncp; prach_len = (1536*4)+Ncp;
} else if (prach_fmt_id == 6) { // 6x1536 } else if (prach_fmt_id == 6) { // 6x1536
Ncp+=24; // This assumes we are transmitting starting in symbol 0 of a PRACH slot, 30 kHz, full sampling
prach2 = prach+(Ncp<<1);
idft(IDFT_1536,prachF,prach2,1); idft(IDFT_1536,prachF,prach2,1);
// here we have |empty | Prach1536 | // here we have |empty | Prach1536 |
memmove(prach2+(1536<<1),prach2,(1536<<2)); memmove(prach2+(1536<<1),prach2,(1536<<2));
...@@ -576,8 +723,6 @@ int32_t generate_nr_prach(PHY_VARS_NR_UE *ue, uint8_t gNB_id, uint8_t slot){ ...@@ -576,8 +723,6 @@ int32_t generate_nr_prach(PHY_VARS_NR_UE *ue, uint8_t gNB_id, uint8_t slot){
// here we have |Prefix | Prach1536 | // here we have |Prefix | Prach1536 |
prach_len = (1536*6)+Ncp; prach_len = (1536*6)+Ncp;
} else if (prach_fmt_id == 8) { // 12x1536 } else if (prach_fmt_id == 8) { // 12x1536
Ncp+=24; // This assumes we are transmitting starting in symbol 0 of a PRACH slot, 30 kHz, full sampling
prach2 = prach+(Ncp<<1);
idft(IDFT_1536,prachF,prach2,1); idft(IDFT_1536,prachF,prach2,1);
// here we have |empty | Prach1536 | // here we have |empty | Prach1536 |
memmove(prach2+(1536<<1),prach2,(1536<<2)); memmove(prach2+(1536<<1),prach2,(1536<<2));
...@@ -596,8 +741,9 @@ int32_t generate_nr_prach(PHY_VARS_NR_UE *ue, uint8_t gNB_id, uint8_t slot){ ...@@ -596,8 +741,9 @@ int32_t generate_nr_prach(PHY_VARS_NR_UE *ue, uint8_t gNB_id, uint8_t slot){
} }
} else if (fp->N_RB_UL <= 273) {// 92.16 or 122.88 Ms/s } else if (fp->N_RB_UL <= 273) {// 92.16 or 122.88 Ms/s
if (fp->threequarter_fs == 0) { // full sampling @ 122.88 Ms/s if (fp->threequarter_fs == 0) { // full sampling @ 122.88 Ms/s
Ncp<<=2; Ncp<<=2; //to account for 122.88Mbps
prach2 = prach+(Ncp<<1); // This is after cyclic prefix
prach2 = prach+(Ncp<<1); //times 2 for complex samples
if (prach_sequence_length == 0){ if (prach_sequence_length == 0){
if (prach_fmt_id == 0) { //24576 samples @ 30.72 Ms/s, 98304 samples @ 122.88 Ms/s if (prach_fmt_id == 0) { //24576 samples @ 30.72 Ms/s, 98304 samples @ 122.88 Ms/s
idft(IDFT_98304,prachF,prach2,1); idft(IDFT_98304,prachF,prach2,1);
...@@ -632,9 +778,10 @@ int32_t generate_nr_prach(PHY_VARS_NR_UE *ue, uint8_t gNB_id, uint8_t slot){ ...@@ -632,9 +778,10 @@ int32_t generate_nr_prach(PHY_VARS_NR_UE *ue, uint8_t gNB_id, uint8_t slot){
prach_len = (24576*4)+Ncp; prach_len = (24576*4)+Ncp;
} }
} else { // short sequence } else { // short sequence
if (use_extended_prach_prefix)
Ncp+=64; // 16*kappa, kappa=4 for 122.88Msps
prach2 = prach+(Ncp<<1); //times 2 for complex samples
if (prach_fmt_id == 4 || prach_fmt_id == 7 || prach_fmt_id == 9) { if (prach_fmt_id == 4 || prach_fmt_id == 7 || prach_fmt_id == 9) {
Ncp+=64; // This assumes we are transmitting starting in symbol 0 of a PRACH slot, 30 kHz, full sampling
prach2 = prach+(Ncp<<1);
idft(IDFT_4096,prachF,prach2,1); idft(IDFT_4096,prachF,prach2,1);
// here we have |empty | Prach4096 | // here we have |empty | Prach4096 |
if (prach_fmt_id != 9) { if (prach_fmt_id != 9) {
...@@ -644,8 +791,6 @@ int32_t generate_nr_prach(PHY_VARS_NR_UE *ue, uint8_t gNB_id, uint8_t slot){ ...@@ -644,8 +791,6 @@ int32_t generate_nr_prach(PHY_VARS_NR_UE *ue, uint8_t gNB_id, uint8_t slot){
memmove(prach,prach+(4096<<1),(Ncp<<2)); memmove(prach,prach+(4096<<1),(Ncp<<2));
// here we have |Prefix | Prach4096 | Prach4096 (if ! 0xc0) | // here we have |Prefix | Prach4096 | Prach4096 (if ! 0xc0) |
} else if (prach_fmt_id == 5) { // 4x4096 } else if (prach_fmt_id == 5) { // 4x4096
Ncp+=64; // This assumes we are transmitting starting in symbol 0 of a PRACH slot, 30 kHz, full sampling
prach2 = prach+(Ncp<<1);
idft(IDFT_4096,prachF,prach2,1); idft(IDFT_4096,prachF,prach2,1);
// here we have |empty | Prach4096 | // here we have |empty | Prach4096 |
memmove(prach2+(4096<<1),prach2,(4096<<2)); memmove(prach2+(4096<<1),prach2,(4096<<2));
...@@ -656,8 +801,6 @@ int32_t generate_nr_prach(PHY_VARS_NR_UE *ue, uint8_t gNB_id, uint8_t slot){ ...@@ -656,8 +801,6 @@ int32_t generate_nr_prach(PHY_VARS_NR_UE *ue, uint8_t gNB_id, uint8_t slot){
// here we have |Prefix | Prach4096 | // here we have |Prefix | Prach4096 |
prach_len = (4096*4)+Ncp; prach_len = (4096*4)+Ncp;
} else if (prach_fmt_id == 6) { // 6x4096 } else if (prach_fmt_id == 6) { // 6x4096
Ncp+=64; // This assumes we are transmitting starting in symbol 0 of a PRACH slot, 30 kHz, full sampling
prach2 = prach+(Ncp<<1);
idft(IDFT_4096,prachF,prach2,1); idft(IDFT_4096,prachF,prach2,1);
// here we have |empty | Prach4096 | // here we have |empty | Prach4096 |
memmove(prach2+(4096<<1),prach2,(4096<<2)); memmove(prach2+(4096<<1),prach2,(4096<<2));
...@@ -670,8 +813,6 @@ int32_t generate_nr_prach(PHY_VARS_NR_UE *ue, uint8_t gNB_id, uint8_t slot){ ...@@ -670,8 +813,6 @@ int32_t generate_nr_prach(PHY_VARS_NR_UE *ue, uint8_t gNB_id, uint8_t slot){
// here we have |Prefix | Prach4096 | // here we have |Prefix | Prach4096 |
prach_len = (4096*6)+Ncp; prach_len = (4096*6)+Ncp;
} else if (prach_fmt_id == 8) { // 12x4096 } else if (prach_fmt_id == 8) { // 12x4096
Ncp+=64; // This assumes we are transmitting starting in symbol 0 of a PRACH slot, 30 kHz, full sampling
prach2 = prach+(Ncp<<1);
idft(IDFT_4096,prachF,prach2,1); idft(IDFT_4096,prachF,prach2,1);
// here we have |empty | Prach4096 | // here we have |empty | Prach4096 |
memmove(prach2+(4096<<1),prach2,(4096<<2)); memmove(prach2+(4096<<1),prach2,(4096<<2));
...@@ -688,8 +829,8 @@ int32_t generate_nr_prach(PHY_VARS_NR_UE *ue, uint8_t gNB_id, uint8_t slot){ ...@@ -688,8 +829,8 @@ int32_t generate_nr_prach(PHY_VARS_NR_UE *ue, uint8_t gNB_id, uint8_t slot){
} }
} }
} else { // three quarter sampling @ 92.16 Ms/s } else { // three quarter sampling @ 92.16 Ms/s
Ncp = (Ncp*3); Ncp = (Ncp*3); //to account for 92.16 Msps
prach2 = prach+(Ncp<<1); prach2 = prach+(Ncp<<1); //times 2 for complex samples
if (prach_sequence_length == 0){ if (prach_sequence_length == 0){
if (prach_fmt_id == 0) { if (prach_fmt_id == 0) {
idft(IDFT_73728,prachF,prach2,1); idft(IDFT_73728,prachF,prach2,1);
...@@ -724,20 +865,19 @@ int32_t generate_nr_prach(PHY_VARS_NR_UE *ue, uint8_t gNB_id, uint8_t slot){ ...@@ -724,20 +865,19 @@ int32_t generate_nr_prach(PHY_VARS_NR_UE *ue, uint8_t gNB_id, uint8_t slot){
prach_len = (18432*4)+Ncp; prach_len = (18432*4)+Ncp;
} }
} else { // short sequence } else { // short sequence
if (prach_fmt_id == 4 || prach_fmt_id == 7 || prach_fmt_id == 9) { if (use_extended_prach_prefix)
Ncp+=48; // This assumes we are transmitting starting in symbol 0 of a PRACH slot, 30 kHz, full sampling Ncp+=48; // 16*kappa, kappa=3 for 92.16Msps
prach2 = prach+(Ncp<<1); prach2 = prach+(Ncp<<1); //times 2 for complex samples
if (prach_fmt_id == 4 || prach_fmt_id == 7 || prach_fmt_id == 9) {
idft(IDFT_3072,prachF,prach2,1); idft(IDFT_3072,prachF,prach2,1);
// here we have |empty | Prach3072 | // here we have |empty | Prach3072 |
if (prach_fmt_id != 9) { if (prach_fmt_id != 9) {
memmove(prach2+(3072<<1),prach2,(3072<<2)); memmove(prach2+(3072<<1),prach2,(3072<<2));
prach_len = (3072*2)+Ncp; prach_len = (3072*2)+Ncp;
} else prach_len = (3072*1)+Ncp; } else prach_len = (3072*1)+Ncp;
memmove(prach,prach+(3072<<1),(Ncp<<2)); memmove(prach,prach+(3072<<1),(Ncp<<2));
// here we have |Prefix | Prach3072 | Prach3072 (if ! 0xc0) | // here we have |Prefix | Prach3072 | Prach3072 (if ! 0xc0) |
} else if (prach_fmt_id == 6) { // 6x3072 } else if (prach_fmt_id == 6) { // 6x3072
Ncp+=48; // This assumes we are transmitting starting in symbol 0 of a PRACH slot, 30 kHz, full sampling
prach2 = prach+(Ncp<<1);
idft(IDFT_3072,prachF,prach2,1); idft(IDFT_3072,prachF,prach2,1);
// here we have |empty | Prach3072 | // here we have |empty | Prach3072 |
memmove(prach2+(3072<<1),prach2,(3072<<2)); memmove(prach2+(3072<<1),prach2,(3072<<2));
...@@ -750,8 +890,6 @@ int32_t generate_nr_prach(PHY_VARS_NR_UE *ue, uint8_t gNB_id, uint8_t slot){ ...@@ -750,8 +890,6 @@ int32_t generate_nr_prach(PHY_VARS_NR_UE *ue, uint8_t gNB_id, uint8_t slot){
// here we have |Prefix | Prach3072 | // here we have |Prefix | Prach3072 |
prach_len = (3072*6)+Ncp; prach_len = (3072*6)+Ncp;
} else if (prach_fmt_id == 5) { // 4x3072 } else if (prach_fmt_id == 5) { // 4x3072
Ncp+=48; // This assumes we are transmitting starting in symbol 0 of a PRACH slot, 30 kHz, full sampling
prach2 = prach+(Ncp<<1);
idft(IDFT_3072,prachF,prach2,1); idft(IDFT_3072,prachF,prach2,1);
// here we have |empty | Prach3072 | // here we have |empty | Prach3072 |
memmove(prach2+(3072<<1),prach2,(3072<<2)); memmove(prach2+(3072<<1),prach2,(3072<<2));
...@@ -762,8 +900,6 @@ int32_t generate_nr_prach(PHY_VARS_NR_UE *ue, uint8_t gNB_id, uint8_t slot){ ...@@ -762,8 +900,6 @@ int32_t generate_nr_prach(PHY_VARS_NR_UE *ue, uint8_t gNB_id, uint8_t slot){
// here we have |Prefix | Prach3072 | // here we have |Prefix | Prach3072 |
prach_len = (3072*4)+Ncp; prach_len = (3072*4)+Ncp;
} else if (prach_fmt_id == 6) { // 12x3072 } else if (prach_fmt_id == 6) { // 12x3072
Ncp+=48; // This assumes we are transmitting starting in symbol 0 of a PRACH slot, 30 kHz, full sampling
prach2 = prach+(Ncp<<1);
idft(IDFT_3072,prachF,prach2,1); idft(IDFT_3072,prachF,prach2,1);
// here we have |empty | Prach3072 | // here we have |empty | Prach3072 |
memmove(prach2+(3072<<1),prach2,(3072<<2)); memmove(prach2+(3072<<1),prach2,(3072<<2));
......
...@@ -153,7 +153,7 @@ int main(int argc, char **argv){ ...@@ -153,7 +153,7 @@ int main(int argc, char **argv){
randominit(0); randominit(0);
while ((c = getopt (argc, argv, "hHaA:Cc:r:p:g:n:s:S:t:x:y:v:V:z:N:F:d:Z:L:R:E")) != -1) { while ((c = getopt (argc, argv, "hHaA:Cc:r:p:g:m:n:s:S:t:x:y:v:V:z:N:F:d:Z:L:R:E")) != -1) {
switch (c) { switch (c) {
case 'a': case 'a':
printf("Running AWGN simulation\n"); printf("Running AWGN simulation\n");
...@@ -243,6 +243,10 @@ int main(int argc, char **argv){ ...@@ -243,6 +243,10 @@ int main(int argc, char **argv){
threequarter_fs=1; threequarter_fs=1;
break; break;
case 'm':
mu = atoi(optarg);
break;
case 'n': case 'n':
n_frames = atoi(optarg); n_frames = atoi(optarg);
break; break;
...@@ -370,13 +374,6 @@ int main(int argc, char **argv){ ...@@ -370,13 +374,6 @@ int main(int argc, char **argv){
} }
} }
if (config_index<67) { prach_sequence_length=0; slot = subframe*2; slot_gNB = 1+(subframe*2); }
uint16_t N_ZC;
N_ZC = prach_sequence_length == 0 ? 839 : 139;
printf("Config_index %d, prach_sequence_length %d\n",config_index,prach_sequence_length);
// Configure log // Configure log
logInit(); logInit();
set_glog(loglvl); set_glog(loglvl);
...@@ -416,7 +413,18 @@ int main(int argc, char **argv){ ...@@ -416,7 +413,18 @@ int main(int argc, char **argv){
nr_phy_config_request_sim(gNB, N_RB_UL, N_RB_UL, mu, Nid_cell, SSB_positions); nr_phy_config_request_sim(gNB, N_RB_UL, N_RB_UL, mu, Nid_cell, SSB_positions);
//nsymb = (frame_parms->Ncp == 0) ? 14 : 12; absoluteFrequencyPointA = to_nrarfcn(frame_parms->nr_band,
frame_parms->dl_CarrierFreq,
frame_parms->numerology_index,
frame_parms->N_RB_UL*(180e3)*(1 << frame_parms->numerology_index));
subframe = slot/frame_parms->slots_per_subframe;
if (config_index<67 && mu==1) { prach_sequence_length=0; slot = subframe*2; slot_gNB = 1+(subframe*2); }
uint16_t N_ZC = prach_sequence_length == 0 ? 839 : 139;
printf("Config_index %d, prach_sequence_length %d\n",config_index,prach_sequence_length);
printf("FFT Size %d, Extended Prefix %d, Samples per subframe %d, Frame type %s, Frequency Range %s\n", printf("FFT Size %d, Extended Prefix %d, Samples per subframe %d, Frame type %s, Frequency Range %s\n",
NUMBER_OF_OFDM_CARRIERS, NUMBER_OF_OFDM_CARRIERS,
...@@ -432,7 +440,14 @@ int main(int argc, char **argv){ ...@@ -432,7 +440,14 @@ int main(int argc, char **argv){
gNB->gNB_config.carrier_config.num_tx_ant.value = 1; gNB->gNB_config.carrier_config.num_tx_ant.value = 1;
gNB->gNB_config.carrier_config.num_rx_ant.value = 1; gNB->gNB_config.carrier_config.num_rx_ant.value = 1;
gNB->gNB_config.tdd_table.tdd_period.value = 6; if (mu==1)
gNB->gNB_config.tdd_table.tdd_period.value = 6;
else if (mu==3)
gNB->gNB_config.tdd_table.tdd_period.value = 3;
else {
printf("unsupported numerology %d\n",mu);
exit(-1);
}
gNB->gNB_config.prach_config.num_prach_fd_occasions.value = num_prach_fd_occasions; gNB->gNB_config.prach_config.num_prach_fd_occasions.value = num_prach_fd_occasions;
gNB->gNB_config.prach_config.num_prach_fd_occasions_list = (nfapi_nr_num_prach_fd_occasions_t *) malloc(num_prach_fd_occasions*sizeof(nfapi_nr_num_prach_fd_occasions_t)); gNB->gNB_config.prach_config.num_prach_fd_occasions_list = (nfapi_nr_num_prach_fd_occasions_t *) malloc(num_prach_fd_occasions*sizeof(nfapi_nr_num_prach_fd_occasions_t));
...@@ -752,7 +767,7 @@ int main(int argc, char **argv){ ...@@ -752,7 +767,7 @@ int main(int argc, char **argv){
LOG_M("prachF0.m","prachF0", &gNB->prach_vars.prachF[0], N_ZC, 1, 1); LOG_M("prachF0.m","prachF0", &gNB->prach_vars.prachF[0], N_ZC, 1, 1);
LOG_M("rxsig0.m","rxs0", &gNB->common_vars.rxdata[0][subframe*frame_parms->samples_per_subframe], frame_parms->samples_per_subframe, 1, 1); LOG_M("rxsig0.m","rxs0", &gNB->common_vars.rxdata[0][subframe*frame_parms->samples_per_subframe], frame_parms->samples_per_subframe, 1, 1);
LOG_M("ru_rxsig0.m","rxs0", &ru->common.rxdata[0][subframe*frame_parms->samples_per_subframe], frame_parms->samples_per_subframe, 1, 1); LOG_M("ru_rxsig0.m","rxs0", &ru->common.rxdata[0][subframe*frame_parms->samples_per_subframe], frame_parms->samples_per_subframe, 1, 1);
LOG_M("rxsigF0.m","rxsF0", gNB->prach_vars.rxsigF[0], N_ZC, 1, 1); LOG_M("ru_rxsigF0.m","rxsF0", ru->prach_rxsigF[0][0], N_ZC, 1, 1);
LOG_M("prach_preamble.m","prachp", &gNB->X_u[0], N_ZC, 1, 1); LOG_M("prach_preamble.m","prachp", &gNB->X_u[0], N_ZC, 1, 1);
LOG_M("ue_prach_preamble.m","prachp", &UE->X_u[0], N_ZC, 1, 1); LOG_M("ue_prach_preamble.m","prachp", &UE->X_u[0], N_ZC, 1, 1);
#endif #endif
......
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