Commit 4ab9c755 authored by Florian Kaltenberger's avatar Florian Kaltenberger

first version of PRACH for FR2. to be tested

parent bddd86b7
...@@ -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);
......
...@@ -188,7 +188,7 @@ void rx_nr_prach_ru(RU_t *ru, ...@@ -188,7 +188,7 @@ void rx_nr_prach_ru(RU_t *ru,
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][(slot2*fp->get_samples_per_slot(slot,fp))+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,84 @@ void rx_nr_prach_ru(RU_t *ru, ...@@ -494,40 +473,84 @@ 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 = IDFT_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 = IDFT_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");
}
//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);
......
...@@ -241,6 +241,7 @@ int32_t generate_nr_prach(PHY_VARS_NR_UE *ue, uint8_t gNB_id, uint8_t slot){ ...@@ -241,6 +241,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 +322,22 @@ int32_t generate_nr_prach(PHY_VARS_NR_UE *ue, uint8_t gNB_id, uint8_t slot){ ...@@ -321,6 +322,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 +361,7 @@ int32_t generate_nr_prach(PHY_VARS_NR_UE *ue, uint8_t gNB_id, uint8_t slot){ ...@@ -344,6 +361,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 +419,149 @@ int32_t generate_nr_prach(PHY_VARS_NR_UE *ue, uint8_t gNB_id, uint8_t slot){ ...@@ -401,13 +419,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 +596,10 @@ int32_t generate_nr_prach(PHY_VARS_NR_UE *ue, uint8_t gNB_id, uint8_t slot){ ...@@ -442,9 +596,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 +610,6 @@ int32_t generate_nr_prach(PHY_VARS_NR_UE *ue, uint8_t gNB_id, uint8_t slot){ ...@@ -455,8 +610,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 +620,6 @@ int32_t generate_nr_prach(PHY_VARS_NR_UE *ue, uint8_t gNB_id, uint8_t slot){ ...@@ -467,8 +620,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 +632,6 @@ int32_t generate_nr_prach(PHY_VARS_NR_UE *ue, uint8_t gNB_id, uint8_t slot){ ...@@ -481,8 +632,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 +684,10 @@ int32_t generate_nr_prach(PHY_VARS_NR_UE *ue, uint8_t gNB_id, uint8_t slot){ ...@@ -535,9 +684,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 +699,6 @@ int32_t generate_nr_prach(PHY_VARS_NR_UE *ue, uint8_t gNB_id, uint8_t slot){ ...@@ -549,9 +699,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 +709,6 @@ int32_t generate_nr_prach(PHY_VARS_NR_UE *ue, uint8_t gNB_id, uint8_t slot){ ...@@ -562,8 +709,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 +721,6 @@ int32_t generate_nr_prach(PHY_VARS_NR_UE *ue, uint8_t gNB_id, uint8_t slot){ ...@@ -576,8 +721,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 +739,9 @@ int32_t generate_nr_prach(PHY_VARS_NR_UE *ue, uint8_t gNB_id, uint8_t slot){ ...@@ -596,8 +739,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 +776,10 @@ int32_t generate_nr_prach(PHY_VARS_NR_UE *ue, uint8_t gNB_id, uint8_t slot){ ...@@ -632,9 +776,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 +789,6 @@ int32_t generate_nr_prach(PHY_VARS_NR_UE *ue, uint8_t gNB_id, uint8_t slot){ ...@@ -644,8 +789,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 +799,6 @@ int32_t generate_nr_prach(PHY_VARS_NR_UE *ue, uint8_t gNB_id, uint8_t slot){ ...@@ -656,8 +799,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 +811,6 @@ int32_t generate_nr_prach(PHY_VARS_NR_UE *ue, uint8_t gNB_id, uint8_t slot){ ...@@ -670,8 +811,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 +827,8 @@ int32_t generate_nr_prach(PHY_VARS_NR_UE *ue, uint8_t gNB_id, uint8_t slot){ ...@@ -688,8 +827,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 +863,19 @@ int32_t generate_nr_prach(PHY_VARS_NR_UE *ue, uint8_t gNB_id, uint8_t slot){ ...@@ -724,20 +863,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 +888,6 @@ int32_t generate_nr_prach(PHY_VARS_NR_UE *ue, uint8_t gNB_id, uint8_t slot){ ...@@ -750,8 +888,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 +898,6 @@ int32_t generate_nr_prach(PHY_VARS_NR_UE *ue, uint8_t gNB_id, uint8_t slot){ ...@@ -762,8 +898,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));
......
...@@ -151,7 +151,7 @@ int main(int argc, char **argv){ ...@@ -151,7 +151,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");
...@@ -241,6 +241,10 @@ int main(int argc, char **argv){ ...@@ -241,6 +241,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;
...@@ -369,9 +373,8 @@ int main(int argc, char **argv){ ...@@ -369,9 +373,8 @@ int main(int argc, char **argv){
} }
if (config_index<67) { prach_sequence_length=0; slot = subframe*2; slot_gNB = 1+(subframe*2); } if (config_index<67 && mu==1) { prach_sequence_length=0; slot = subframe*2; slot_gNB = 1+(subframe*2); }
uint16_t N_ZC; uint16_t N_ZC = prach_sequence_length == 0 ? 839 : 139;
N_ZC = prach_sequence_length == 0 ? 839 : 139;
printf("Config_index %d, prach_sequence_length %d\n",config_index,prach_sequence_length); printf("Config_index %d, prach_sequence_length %d\n",config_index,prach_sequence_length);
...@@ -414,6 +417,11 @@ int main(int argc, char **argv){ ...@@ -414,6 +417,11 @@ 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);
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));
//nsymb = (frame_parms->Ncp == 0) ? 14 : 12; //nsymb = (frame_parms->Ncp == 0) ? 14 : 12;
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",
...@@ -430,7 +438,14 @@ int main(int argc, char **argv){ ...@@ -430,7 +438,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));
......
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