Commit 8ac98d55 authored by Florian Kaltenberger's avatar Florian Kaltenberger Committed by Francesco Mani

first version of PRACH for FR2. to be tested

parent 78e0af58
...@@ -431,10 +431,17 @@ void nr_phy_config_request_sim(PHY_VARS_gNB *gNB, ...@@ -431,10 +431,17 @@ 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;
if (mu==1) {
fp->dl_CarrierFreq = 3500000000;//from_nrarfcn(gNB_config->nfapi_config.rf_bands.rf_band[0],gNB_config->nfapi_config.nrarfcn.value); fp->dl_CarrierFreq = 3500000000;//from_nrarfcn(gNB_config->nfapi_config.rf_bands.rf_band[0],gNB_config->nfapi_config.nrarfcn.value);
fp->ul_CarrierFreq = 3500000000;//fp->dl_CarrierFreq - (get_uldl_offset(gNB_config->nfapi_config.rf_bands.rf_band[0])*100000); fp->ul_CarrierFreq = 3500000000;//fp->dl_CarrierFreq - (get_uldl_offset(gNB_config->nfapi_config.rf_bands.rf_band[0])*100000);
fp->nr_band = 78; fp->nr_band = 78;
// fp->threequarter_fs= 0; // 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);
......
...@@ -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,12 +329,9 @@ void rx_nr_prach_ru(RU_t *ru, ...@@ -327,12 +329,9 @@ 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)
if (mu==0) AssertFatal(1==0,"Shouldn't get here\n");
else if (mu==1) {
dftlen=2048; dftlen=2048;
dft(DFT_2048,prach2,rxsigF[aa],1); dft(DFT_2048,prach2,rxsigF[aa],1);
if (prachFormat != 9/*C0*/) { if (prachFormat != 9/*C0*/) {
...@@ -354,10 +353,6 @@ void rx_nr_prach_ru(RU_t *ru, ...@@ -354,10 +353,6 @@ void rx_nr_prach_ru(RU_t *ru,
reps+=6; 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
prach2 = prach[aa] + (3*Ncp); // 46.08 is 1.5 * 30.72, times 2 for I/Q prach2 = prach[aa] + (3*Ncp); // 46.08 is 1.5 * 30.72, times 2 for I/Q
...@@ -383,11 +378,7 @@ void rx_nr_prach_ru(RU_t *ru, ...@@ -383,11 +378,7 @@ 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)) ||
(mu==1 && prachStartSymbol == 0)) prach2+=48; // 24 samples @ 46.08 Ms/s in first symbol of each half subframe (15/30 kHz only)
if (mu==0) AssertFatal(1==0,"Shouldn't get here\n");
else if (mu==1) {
dftlen=1536; dftlen=1536;
dft(DFT_1536,prach2,rxsigF[aa],1); dft(DFT_1536,prach2,rxsigF[aa],1);
if (prachFormat != 9/*C0*/) { if (prachFormat != 9/*C0*/) {
...@@ -409,10 +400,6 @@ void rx_nr_prach_ru(RU_t *ru, ...@@ -409,10 +400,6 @@ void rx_nr_prach_ru(RU_t *ru,
for (int i=6;i<12;i++) dft(DFT_1536,prach2+(3072*i),rxsigF[aa]+(3072*i),1); for (int i=6;i<12;i++) dft(DFT_1536,prach2+(3072*i),rxsigF[aa]+(3072*i),1);
reps+=6; 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,12 +429,8 @@ void rx_nr_prach_ru(RU_t *ru, ...@@ -442,12 +429,8 @@ 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)
if (mu==0) AssertFatal(1==0,"Shouldn't get here\n");
else if (mu==1) {
dftlen=4096; dftlen=4096;
dft(DFT_4096,prach2,rxsigF[aa],1); dft(DFT_4096,prach2,rxsigF[aa],1);
if (prachFormat != 9/*C0*/) { if (prachFormat != 9/*C0*/) {
...@@ -470,10 +453,6 @@ void rx_nr_prach_ru(RU_t *ru, ...@@ -470,10 +453,6 @@ void rx_nr_prach_ru(RU_t *ru,
reps+=6; 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");
prach2 = prach[aa] + (6*Ncp); prach2 = prach[aa] + (6*Ncp);
...@@ -494,12 +473,8 @@ void rx_nr_prach_ru(RU_t *ru, ...@@ -494,12 +473,8 @@ 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)
if (mu==0) AssertFatal(1==0,"Shouldn't get here\n");
else if (mu==1) {
dftlen=3072; dftlen=3072;
dft(DFT_3072,prach2,rxsigF[aa],1); dft(DFT_3072,prach2,rxsigF[aa],1);
if (prachFormat != 9/*C0*/) { if (prachFormat != 9/*C0*/) {
...@@ -522,12 +497,60 @@ void rx_nr_prach_ru(RU_t *ru, ...@@ -522,12 +497,60 @@ void rx_nr_prach_ru(RU_t *ru,
reps+=6; 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);
......
This diff is collapsed.
...@@ -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;
...@@ -371,9 +375,8 @@ int main(int argc, char **argv){ ...@@ -371,9 +375,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);
...@@ -416,6 +419,11 @@ int main(int argc, char **argv){ ...@@ -416,6 +419,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",
...@@ -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;
if (mu==1)
gNB->gNB_config.tdd_table.tdd_period.value = 6; 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