PRACH duration to be calculated based on PRACH format.
PRACH_PDU.prach_format now interpreted according to last version (March 2020) of 5G FAPI specs fixing nr_prachsim
This commit is contained in:
+4
-4
@@ -1584,10 +1584,10 @@ void *ru_thread( void *param ) {
|
||||
// Do PRACH RU processing
|
||||
|
||||
int prach_id=find_nr_prach_ru(ru,proc->frame_rx,proc->tti_rx,SEARCH_EXIST);
|
||||
int prachStartSymbol;
|
||||
uint16_t format,RA_sfn_index;
|
||||
uint8_t start_symbol,N_t_slot,N_dur,N_RA_slot,config_period;
|
||||
uint8_t prachStartSymbol,N_dur;
|
||||
if (prach_id>=0) {
|
||||
N_dur = get_nr_prach_duration(ru->prach_list[prach_id].fmt);
|
||||
/*
|
||||
get_nr_prach_info_from_index(ru->config.prach_config.prach_ConfigurationIndex.value,
|
||||
proc->frame_rx,proc->tti_rx,
|
||||
ru->config.carrier_config.dl_frequency.value,
|
||||
@@ -1600,7 +1600,7 @@ void *ru_thread( void *param ) {
|
||||
&RA_sfn_index,
|
||||
&N_RA_slot,
|
||||
&config_period);
|
||||
|
||||
*/
|
||||
for (int prach_oc = 0; prach_oc<ru->prach_list[prach_id].num_prach_ocas; prach_oc++) {
|
||||
prachStartSymbol = ru->prach_list[prach_id].prachStartSymbol+prach_oc*N_dur;
|
||||
//comment FK: the standard 38.211 section 5.3.2 has one extra term +14*N_RA_slot. This is because there prachStartSymbol is given wrt to start of the 15kHz slot or 60kHz slot. Here we work slot based, so this function is anyway only called in slots where there is PRACH. Its up to the MAC to schedule another PRACH PDU in the case there are there N_RA_slot \in {0,1}.
|
||||
|
||||
@@ -223,22 +223,24 @@ void rx_nr_prach_ru(RU_t *ru,
|
||||
ru->idx,frame,slot,prachfmt[prachFormat],msg1_frequencystart,prachStartSymbol);
|
||||
|
||||
switch (prachFormat) {
|
||||
case 0: //A1
|
||||
case 4: //A1
|
||||
Ncp = 288/(1<<mu);
|
||||
break;
|
||||
|
||||
case 1: //A2
|
||||
case 5: //A2
|
||||
Ncp = 576/(1<<mu);
|
||||
break;
|
||||
|
||||
case 2: //A3
|
||||
case 6: //A3
|
||||
Ncp = 864/(1<<mu);
|
||||
break;
|
||||
|
||||
case 3: //B1
|
||||
case 7: //B1
|
||||
Ncp = 216/(1<<mu);
|
||||
break;
|
||||
|
||||
/*
|
||||
// B2 and B3 do not exist in FAPI
|
||||
case 4: //B2
|
||||
Ncp = 360/(1<<mu);
|
||||
break;
|
||||
@@ -246,16 +248,16 @@ void rx_nr_prach_ru(RU_t *ru,
|
||||
case 5: //B3
|
||||
Ncp = 504/(1<<mu);
|
||||
break;
|
||||
|
||||
case 6: //B4
|
||||
*/
|
||||
case 8: //B4
|
||||
Ncp = 936/(1<<mu);
|
||||
break;
|
||||
|
||||
case 7: //C0
|
||||
case 9: //C0
|
||||
Ncp = 1240/(1<<mu);
|
||||
break;
|
||||
|
||||
case 8: //C2
|
||||
case 10: //C2
|
||||
Ncp = 2048/(1<<mu);
|
||||
break;
|
||||
|
||||
@@ -334,21 +336,21 @@ void rx_nr_prach_ru(RU_t *ru,
|
||||
else if (mu==1) {
|
||||
dftlen=2048;
|
||||
dft(DFT_2048,prach2,rxsigF[aa],1);
|
||||
if (prachFormat != 7) { // !=C0
|
||||
if (prachFormat != 9/*C0*/) {
|
||||
dft(DFT_2048,prach2+4096,rxsigF[aa]+4096,1);
|
||||
reps++;
|
||||
}
|
||||
if (prachFormat == 1 || prachFormat == 2 || prachFormat == 4 || prachFormat == 5 || prachFormat == 6 || prachFormat == 8) {
|
||||
if (prachFormat == 5/*A2*/ || prachFormat == 6/*A3*/|| prachFormat == 8/*B4*/ || prachFormat == 10/*C2*/) {
|
||||
dft(DFT_2048,prach2+4096*2,rxsigF[aa]+4096*2,1);
|
||||
dft(DFT_2048,prach2+4096*3,rxsigF[aa]+4096*3,1);
|
||||
reps+=2;
|
||||
}
|
||||
if (prachFormat == 2 || prachFormat == 5 || prachFormat == 6) {
|
||||
if (prachFormat == 6/*A3*/ || prachFormat == 8/*B4*/) {
|
||||
dft(DFT_2048,prach2+4096*4,rxsigF[aa]+4096*4,1);
|
||||
dft(DFT_2048,prach2+4096*5,rxsigF[aa]+4096*5,1);
|
||||
reps+=2;
|
||||
}
|
||||
if (prachFormat == 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;
|
||||
}
|
||||
@@ -389,22 +391,22 @@ void rx_nr_prach_ru(RU_t *ru,
|
||||
else if (mu==1) {
|
||||
dftlen=1536;
|
||||
dft(DFT_1536,prach2,rxsigF[aa],1);
|
||||
if (prachFormat != 7) {
|
||||
if (prachFormat != 9/*C0*/) {
|
||||
dft(DFT_1536,prach2+3072,rxsigF[aa]+3072,1);
|
||||
reps++;
|
||||
}
|
||||
|
||||
if (prachFormat == 1 || prachFormat == 2 || prachFormat == 4 || prachFormat == 5 || prachFormat == 6 || prachFormat == 8) {
|
||||
if (prachFormat == 5/*A2*/ || prachFormat == 6/*A3*/|| prachFormat == 8/*B4*/ || prachFormat == 10/*C2*/) {
|
||||
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 == 2 || prachFormat == 5 || prachFormat == 6) {
|
||||
if (prachFormat == 6/*A3*/ || prachFormat == 8/*B4*/) {
|
||||
dft(DFT_1536,prach2+3072*4,rxsigF[aa]+3072*4,1);
|
||||
dft(DFT_1536,prach2+3072*5,rxsigF[aa]+3072*5,1);
|
||||
reps+=2;
|
||||
}
|
||||
if (prachFormat == 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;
|
||||
}
|
||||
@@ -449,22 +451,22 @@ void rx_nr_prach_ru(RU_t *ru,
|
||||
else if (mu==1) {
|
||||
dftlen=4096;
|
||||
dft(DFT_4096,prach2,rxsigF[aa],1);
|
||||
if (prachFormat != 7) { //!=C0
|
||||
if (prachFormat != 9/*C0*/) {
|
||||
dft(DFT_4096,prach2+8192,rxsigF[aa]+8192,1);
|
||||
reps++;
|
||||
}
|
||||
|
||||
if (prachFormat == 1 || prachFormat == 2 || prachFormat == 4 || prachFormat == 5 || prachFormat == 6 || prachFormat == 8) {
|
||||
if (prachFormat == 5/*A2*/ || prachFormat == 6/*A3*/|| prachFormat == 8/*B4*/ || prachFormat == 10/*C2*/) {
|
||||
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 == 2 || prachFormat == 5 || prachFormat == 6) {
|
||||
if (prachFormat == 6/*A3*/ || prachFormat == 8/*B4*/) {
|
||||
dft(DFT_4096,prach2+8192*4,rxsigF[aa]+8192*4,1);
|
||||
dft(DFT_4096,prach2+8192*5,rxsigF[aa]+8192*5,1);
|
||||
reps+=2;
|
||||
}
|
||||
if (prachFormat == 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;
|
||||
}
|
||||
@@ -501,22 +503,22 @@ void rx_nr_prach_ru(RU_t *ru,
|
||||
else if (mu==1) {
|
||||
dftlen=3072;
|
||||
dft(DFT_3072,prach2,rxsigF[aa],1);
|
||||
if (prachFormat != 7) { //!=C0
|
||||
if (prachFormat != 9/*C0*/) {
|
||||
dft(DFT_3072,prach2+6144,rxsigF[aa]+6144,1);
|
||||
reps++;
|
||||
}
|
||||
|
||||
if (prachFormat == 1 || prachFormat == 2 || prachFormat == 4 || prachFormat == 5 || prachFormat == 6 || prachFormat == 8) {
|
||||
if (prachFormat == 5/*A2*/ || prachFormat == 6/*A3*/|| prachFormat == 8/*B4*/ || prachFormat == 10/*C2*/) {
|
||||
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 == 2 || prachFormat == 5 || prachFormat == 6) {
|
||||
if (prachFormat == 6/*A3*/ || prachFormat == 8/*B4*/) {
|
||||
dft(DFT_3072,prach2+6144*4,rxsigF[aa]+6144*4,1);
|
||||
dft(DFT_3072,prach2+6144*5,rxsigF[aa]+6144*5,1);
|
||||
reps+=2;
|
||||
}
|
||||
if (prachFormat == 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;
|
||||
}
|
||||
@@ -609,7 +611,7 @@ void rx_nr_prach(PHY_VARS_gNB *gNB,
|
||||
uint8_t prach_fmt = prach_pdu->prach_format;
|
||||
uint16_t N_ZC = (prach_sequence_length==0)?839:139;
|
||||
|
||||
LOG_D(PHY,"L1 PRACH RX: rooSequenceIndex %d, numRootSeqeuences %d, NCS %d, N_ZC %d \n",rootSequenceIndex,numrootSequenceIndex,NCS,N_ZC);
|
||||
LOG_D(PHY,"L1 PRACH RX: rooSequenceIndex %d, numRootSeqeuences %d, NCS %d, N_ZC %d, format %d \n",rootSequenceIndex,numrootSequenceIndex,NCS,N_ZC,prach_fmt);
|
||||
|
||||
prach_ifft = gNB->prach_vars.prach_ifft;
|
||||
prachF = gNB->prach_vars.prachF;
|
||||
|
||||
@@ -206,17 +206,17 @@ int32_t generate_nr_prach(PHY_VARS_NR_UE *ue, uint8_t gNB_id, uint8_t slot){
|
||||
}
|
||||
|
||||
// now generate PRACH signal
|
||||
#ifdef NR_PRACH_DEBUG
|
||||
#ifdef NR_PRACH_DEBUG
|
||||
if (NCS>0)
|
||||
LOG_I(PHY, "PRACH [UE %d] generate PRACH for RootSeqIndex %d, Preamble Index %d, PRACH Format %s, NCS %d (N_ZC %d): Preamble_offset %d, Preamble_shift %d\n", Mod_id,
|
||||
rootSequenceIndex,
|
||||
preamble_index,
|
||||
prach_sequence_length == 0 ? prachfmt03[prach_fmt_id] : prachfmt[prach_fmt_id],
|
||||
NCS,
|
||||
N_ZC,
|
||||
preamble_offset,
|
||||
preamble_shift);
|
||||
#endif
|
||||
rootSequenceIndex,
|
||||
preamble_index,
|
||||
prachfmt[prach_fmt_id],
|
||||
NCS,
|
||||
N_ZC,
|
||||
preamble_offset,
|
||||
preamble_shift);
|
||||
#endif
|
||||
|
||||
// nsymb = (frame_parms->Ncp==0) ? 14:12;
|
||||
// subframe_offset = (unsigned int)frame_parms->ofdm_symbol_size*slot*nsymb;
|
||||
@@ -386,31 +386,33 @@ int32_t generate_nr_prach(PHY_VARS_NR_UE *ue, uint8_t gNB_id, uint8_t slot){
|
||||
//LOG_D(PHY, "PRACH [UE %d] in slot %d, format %d, msg1 frequency start %d startSymbol %d \n", Mod_id, slot, prachfmt[prach_fmt_id], n_ra_prb, prachStartSymbol);
|
||||
|
||||
switch (prach_fmt_id) {
|
||||
case 0: //A1
|
||||
case 4: //A1
|
||||
Ncp = 288/(1<<mu);
|
||||
break;
|
||||
case 1: //A2
|
||||
case 5: //A2
|
||||
Ncp = 576/(1<<mu);
|
||||
break;
|
||||
case 2: //A3
|
||||
case 6: //A3
|
||||
Ncp = 864/(1<<mu);
|
||||
break;
|
||||
case 3: //B1
|
||||
case 7: //B1
|
||||
Ncp = 216/(1<<mu);
|
||||
break;
|
||||
/*
|
||||
case 4: //B2
|
||||
Ncp = 360/(1<<mu);
|
||||
break;
|
||||
case 5: //B3
|
||||
Ncp = 504/(1<<mu);
|
||||
break;
|
||||
case 6: //B4
|
||||
*/
|
||||
case 8: //B4
|
||||
Ncp = 936/(1<<mu);
|
||||
break;
|
||||
case 7: //C0
|
||||
case 9: //C0
|
||||
Ncp = 1240/(1<<mu);
|
||||
break;
|
||||
case 8: //C2
|
||||
case 10: //C2
|
||||
Ncp = 2048/(1<<mu);
|
||||
break;
|
||||
default:
|
||||
@@ -462,19 +464,19 @@ int32_t generate_nr_prach(PHY_VARS_NR_UE *ue, uint8_t gNB_id, uint8_t slot){
|
||||
prach_len = (12288*4)+Ncp;
|
||||
}
|
||||
} else { // short PRACH sequence
|
||||
if (prach_fmt_id == 0 || prach_fmt_id == 3 || prach_fmt_id == 7) {
|
||||
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);
|
||||
// here we have |empty | Prach2048 |
|
||||
if (prach_fmt_id != 7) {
|
||||
if (prach_fmt_id != 9) {
|
||||
memmove(prach2+(2048<<1),prach2,(2048<<2));
|
||||
prach_len = (2048*2)+Ncp;
|
||||
}
|
||||
else prach_len = (2048*1)+Ncp;
|
||||
memmove(prach,prach+(2048<<1),(Ncp<<2));
|
||||
// here we have |Prefix | Prach2048 | Prach2048 (if ! 0xc0) |
|
||||
} else if (prach_fmt_id == 1 || prach_fmt_id == 4) { // 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);
|
||||
@@ -486,7 +488,7 @@ int32_t generate_nr_prach(PHY_VARS_NR_UE *ue, uint8_t gNB_id, uint8_t slot){
|
||||
memmove(prach,prach+(2048<<1),(Ncp<<2));
|
||||
// here we have |Prefix | Prach2048 |
|
||||
prach_len = (2048*4)+Ncp;
|
||||
} else if (prach_fmt_id == 2 || prach_fmt_id == 5) { // 6x2048
|
||||
} else if (prach_fmt_id == 6) { // 6x2048
|
||||
Ncp+=32;
|
||||
prach2 = prach+(Ncp<<1);
|
||||
idft(IDFT_2048,prachF,prach2,1);
|
||||
@@ -500,7 +502,7 @@ int32_t generate_nr_prach(PHY_VARS_NR_UE *ue, uint8_t gNB_id, uint8_t slot){
|
||||
memmove(prach,prach+(2048<<1),(Ncp<<2));
|
||||
// here we have |Prefix | Prach2048 |
|
||||
prach_len = (2048*6)+Ncp;
|
||||
} else if (prach_fmt_id == 6) { // 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);
|
||||
@@ -555,12 +557,12 @@ int32_t generate_nr_prach(PHY_VARS_NR_UE *ue, uint8_t gNB_id, uint8_t slot){
|
||||
prach_len = (9216*4)+Ncp;
|
||||
}
|
||||
} else { // short sequence
|
||||
if (prach_fmt_id == 0 || prach_fmt_id == 3 || prach_fmt_id == 7) {
|
||||
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);
|
||||
// here we have |empty | Prach1536 |
|
||||
if (prach_fmt_id != 7) {
|
||||
if (prach_fmt_id != 9) {
|
||||
memmove(prach2+(1536<<1),prach2,(1536<<2));
|
||||
prach_len = (1536*2)+Ncp;
|
||||
} else prach_len = (1536*1)+Ncp;
|
||||
@@ -568,7 +570,7 @@ int32_t generate_nr_prach(PHY_VARS_NR_UE *ue, uint8_t gNB_id, uint8_t slot){
|
||||
memmove(prach,prach+(1536<<1),(Ncp<<2));
|
||||
// here we have |Prefix | Prach1536 | Prach1536 (if ! 0xc0) |
|
||||
|
||||
} else if (prach_fmt_id == 1 || prach_fmt_id == 4) { // 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);
|
||||
@@ -581,7 +583,7 @@ int32_t generate_nr_prach(PHY_VARS_NR_UE *ue, uint8_t gNB_id, uint8_t slot){
|
||||
memmove(prach,prach+(1536<<1),(Ncp<<2));
|
||||
// here we have |Prefix | Prach1536 |
|
||||
prach_len = (1536*4)+Ncp;
|
||||
} else if (prach_fmt_id == 2 || prach_fmt_id == 5) { // 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);
|
||||
@@ -595,7 +597,7 @@ int32_t generate_nr_prach(PHY_VARS_NR_UE *ue, uint8_t gNB_id, uint8_t slot){
|
||||
memmove(prach,prach+(1536<<1),(Ncp<<2));
|
||||
// here we have |Prefix | Prach1536 |
|
||||
prach_len = (1536*6)+Ncp;
|
||||
} else if (prach_fmt_id == 6) { // 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);
|
||||
@@ -652,18 +654,18 @@ int32_t generate_nr_prach(PHY_VARS_NR_UE *ue, uint8_t gNB_id, uint8_t slot){
|
||||
prach_len = (24576*4)+Ncp;
|
||||
}
|
||||
} else { // short sequence
|
||||
if (prach_fmt_id == 0 || prach_fmt_id == 3 || prach_fmt_id == 7) {
|
||||
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);
|
||||
// here we have |empty | Prach4096 |
|
||||
if (prach_fmt_id != 7) {
|
||||
if (prach_fmt_id != 9) {
|
||||
memmove(prach2+(4096<<1),prach2,(4096<<2));
|
||||
prach_len = (4096*2)+Ncp;
|
||||
} else prach_len = (4096*1)+Ncp;
|
||||
memmove(prach,prach+(4096<<1),(Ncp<<2));
|
||||
// here we have |Prefix | Prach4096 | Prach4096 (if ! 0xc0) |
|
||||
} else if (prach_fmt_id == 1 || prach_fmt_id == 4) { // 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);
|
||||
@@ -675,7 +677,7 @@ int32_t generate_nr_prach(PHY_VARS_NR_UE *ue, uint8_t gNB_id, uint8_t slot){
|
||||
memmove(prach,prach+(4096<<1),(Ncp<<2));
|
||||
// here we have |Prefix | Prach4096 |
|
||||
prach_len = (4096*4)+Ncp;
|
||||
} else if (prach_fmt_id == 2 || prach_fmt_id == 5) { // 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);
|
||||
@@ -689,7 +691,7 @@ int32_t generate_nr_prach(PHY_VARS_NR_UE *ue, uint8_t gNB_id, uint8_t slot){
|
||||
memmove(prach,prach+(4096<<1),(Ncp<<2));
|
||||
// here we have |Prefix | Prach4096 |
|
||||
prach_len = (4096*6)+Ncp;
|
||||
} else if (prach_fmt_id == 6) { // 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);
|
||||
@@ -744,18 +746,18 @@ int32_t generate_nr_prach(PHY_VARS_NR_UE *ue, uint8_t gNB_id, uint8_t slot){
|
||||
prach_len = (18432*4)+Ncp;
|
||||
}
|
||||
} else { // short sequence
|
||||
if (prach_fmt_id == 0 || prach_fmt_id == 3 || prach_fmt_id == 7) {
|
||||
if (prach_fmt_id == 4 || prach_fmt_id == 7 || prach_fmt_id == 9) {
|
||||
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);
|
||||
// here we have |empty | Prach3072 |
|
||||
if (prach_fmt_id != 7) {
|
||||
if (prach_fmt_id != 9) {
|
||||
memmove(prach2+(3072<<1),prach2,(3072<<2));
|
||||
prach_len = (3072*2)+Ncp;
|
||||
} else prach_len = (3072*1)+Ncp;
|
||||
memmove(prach,prach+(3072<<1),(Ncp<<2));
|
||||
// here we have |Prefix | Prach3072 | Prach3072 (if ! 0xc0) |
|
||||
} else if (prach_fmt_id == 2 || prach_fmt_id == 5) { // 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);
|
||||
@@ -769,7 +771,7 @@ int32_t generate_nr_prach(PHY_VARS_NR_UE *ue, uint8_t gNB_id, uint8_t slot){
|
||||
memmove(prach,prach+(3072<<1),(Ncp<<2));
|
||||
// here we have |Prefix | Prach3072 |
|
||||
prach_len = (3072*6)+Ncp;
|
||||
} else if (prach_fmt_id == 1 || prach_fmt_id == 4) { // 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);
|
||||
|
||||
@@ -75,10 +75,13 @@ void L1_nr_prach_procedures(PHY_VARS_gNB *gNB,int frame,int slot) {
|
||||
|
||||
if (prach_id>=0) {
|
||||
nfapi_nr_prach_pdu_t *prach_pdu = &gNB->prach_vars.list[prach_id].pdu;
|
||||
int prachStartSymbol;
|
||||
uint8_t prachStartSymbol;
|
||||
uint8_t N_dur = get_nr_prach_duration(prach_pdu->prach_format);
|
||||
|
||||
/*
|
||||
uint16_t format,RA_sfn_index;
|
||||
uint8_t start_symbol,N_t_slot,N_dur,N_RA_slot,config_period;
|
||||
|
||||
|
||||
get_nr_prach_info_from_index(gNB->gNB_config.prach_config.prach_ConfigurationIndex.value,
|
||||
frame,slot,
|
||||
gNB->gNB_config.carrier_config.dl_frequency.value,
|
||||
@@ -91,6 +94,7 @@ void L1_nr_prach_procedures(PHY_VARS_gNB *gNB,int frame,int slot) {
|
||||
&RA_sfn_index,
|
||||
&N_RA_slot,
|
||||
&config_period);
|
||||
*/
|
||||
|
||||
for(int prach_oc = 0; prach_oc < prach_pdu->num_prach_ocas; prach_oc++) {
|
||||
for (ru_aa=0,aa=0;ru_aa<ru->nb_rx;ru_aa++,aa++) {
|
||||
|
||||
@@ -93,6 +93,10 @@ int main(int argc, char **argv){
|
||||
uint16_t Nid_cell = 0, preamble_tx = 0, preamble_delay, format, format0, format1;
|
||||
uint32_t tx_lev = 10000, prach_errors = 0, samp_count; //,tx_lev_dB;
|
||||
uint64_t SSB_positions = 0x01, absoluteFrequencyPointA = 640000;
|
||||
uint16_t RA_sfn_index;
|
||||
uint8_t N_RA_slot;
|
||||
uint8_t config_period;
|
||||
int prachOccasion = 0;
|
||||
|
||||
// int8_t interf1=-19,interf2=-19;
|
||||
// uint8_t abstraction_flag=0,calibration_flag=0;
|
||||
@@ -407,15 +411,18 @@ int main(int argc, char **argv){
|
||||
gNB->proc.slot_rx = slot;
|
||||
|
||||
int ret = get_nr_prach_info_from_index(config_index,
|
||||
(int)frame,
|
||||
(int)slot_gNB,
|
||||
absoluteFrequencyPointA,
|
||||
mu,
|
||||
frame_parms->frame_type,
|
||||
&format,
|
||||
&start_symbol,
|
||||
&N_t_slot,
|
||||
&N_dur);
|
||||
(int)frame,
|
||||
(int)slot_gNB,
|
||||
absoluteFrequencyPointA,
|
||||
mu,
|
||||
frame_parms->frame_type,
|
||||
&format,
|
||||
&start_symbol,
|
||||
&N_t_slot,
|
||||
&N_dur,
|
||||
&RA_sfn_index,
|
||||
&N_RA_slot,
|
||||
&config_period);
|
||||
|
||||
if (ret == 0) {printf("No prach in %d.%d, mu %d, config_index %d\n",frame,slot,mu,config_index); exit(-1);}
|
||||
format0 = format&0xff; // first column of format from table
|
||||
@@ -424,60 +431,54 @@ int main(int argc, char **argv){
|
||||
if (format1 != 0xff) {
|
||||
switch(format0) {
|
||||
case 0xa1:
|
||||
prach_format = 9;
|
||||
prach_format = 11;
|
||||
break;
|
||||
case 0xa2:
|
||||
prach_format = 10;
|
||||
prach_format = 12;
|
||||
break;
|
||||
case 0xa3:
|
||||
prach_format = 11;
|
||||
prach_format = 13;
|
||||
break;
|
||||
default:
|
||||
AssertFatal(1==0, "Only formats A1/B1 A2/B2 A3/B3 are valid for dual format");
|
||||
}
|
||||
} else {
|
||||
switch(format0) {
|
||||
case 0xa1:
|
||||
prach_format = 0;
|
||||
break;
|
||||
case 0xa2:
|
||||
prach_format = 1;
|
||||
break;
|
||||
case 0xa3:
|
||||
prach_format = 2;
|
||||
break;
|
||||
case 0xb1:
|
||||
prach_format = 3;
|
||||
break;
|
||||
case 0xb2:
|
||||
prach_format = 4;
|
||||
break;
|
||||
case 0xb3:
|
||||
prach_format = 5;
|
||||
break;
|
||||
case 0xb4:
|
||||
prach_format = 6;
|
||||
break;
|
||||
case 0xc0:
|
||||
prach_format = 7;
|
||||
break;
|
||||
case 0xc2:
|
||||
prach_format = 8;
|
||||
break;
|
||||
case 0:
|
||||
// long formats are handled @ PHY
|
||||
break;
|
||||
case 1:
|
||||
// long formats are handled @ PHY
|
||||
break;
|
||||
case 2:
|
||||
// long formats are handled @ PHY
|
||||
break;
|
||||
case 3:
|
||||
// long formats are handled @ PHY
|
||||
break;
|
||||
switch(format0) { // single PRACH format
|
||||
case 0:
|
||||
prach_format = 0;
|
||||
break;
|
||||
case 1:
|
||||
prach_format = 1;
|
||||
break;
|
||||
case 2:
|
||||
prach_format = 2;
|
||||
break;
|
||||
case 3:
|
||||
prach_format = 3;
|
||||
break;
|
||||
case 0xa1:
|
||||
prach_format = 4;
|
||||
break;
|
||||
case 0xa2:
|
||||
prach_format = 5;
|
||||
break;
|
||||
case 0xa3:
|
||||
prach_format = 6;
|
||||
break;
|
||||
case 0xb1:
|
||||
prach_format = 7;
|
||||
break;
|
||||
case 0xb4:
|
||||
prach_format = 8;
|
||||
break;
|
||||
case 0xc0:
|
||||
prach_format = 9;
|
||||
break;
|
||||
case 0xc2:
|
||||
prach_format = 10;
|
||||
break;
|
||||
default:
|
||||
AssertFatal(1==0, "Invalid PRACH format");
|
||||
AssertFatal(1 == 0, "Invalid PRACH format");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -699,11 +700,11 @@ int main(int argc, char **argv){
|
||||
}
|
||||
|
||||
|
||||
rx_nr_prach_ru(ru, prach_format, numRA, prachStartSymbol, frame, slot);
|
||||
rx_nr_prach_ru(ru, prach_format, numRA, prachStartSymbol, prachOccasion, frame, slot);
|
||||
|
||||
gNB->prach_vars.rxsigF = ru->prach_rxsigF;
|
||||
gNB->prach_vars.rxsigF = ru->prach_rxsigF[prachOccasion];
|
||||
if (n_frames == 1) printf("ncs %d,num_seq %d\n",prach_pdu->num_cs, prach_config->num_prach_fd_occasions_list[fd_occasion].num_root_sequences.value);
|
||||
rx_nr_prach(gNB, prach_pdu, frame, subframe, &preamble_rx, &preamble_energy, &preamble_delay);
|
||||
rx_nr_prach(gNB, prach_pdu, prachOccasion, frame, subframe, &preamble_rx, &preamble_energy, &preamble_delay);
|
||||
|
||||
// printf(" preamble_energy %d preamble_rx %d preamble_tx %d \n", preamble_energy, preamble_rx, preamble_tx);
|
||||
|
||||
|
||||
@@ -48,8 +48,7 @@ uint16_t NCS_restricted_TypeB_delta_f_RA_5[14] = {36,57,60,63,65,68,71,77,81,8
|
||||
// Table 6.3.3.1-7 (38.211) NCS for preamble formats with delta_f_RA = 15 * 2mu KHz where mu = {0,1,2,3}
|
||||
uint16_t NCS_unrestricted_delta_f_RA_15[16] = {0,2,4,6,8,10,12,13,15,17,19,23,27,34,46,69};
|
||||
|
||||
const char *prachfmt[]={"A1","A2","A3","B1","B2","B3","B4","C0","C2"};
|
||||
const char *prachfmt03[]={"0","1","2","3"};
|
||||
const char *prachfmt[]={"0","1","2","3", "A1","A2","A3","B1","B4","C0","C2","A1/B1","A2/B2","A3/B3"};
|
||||
|
||||
uint16_t get_NCS(uint8_t index, uint16_t format0, uint8_t restricted_set_config) {
|
||||
|
||||
@@ -1120,6 +1119,61 @@ int get_nr_prach_occasion_info_from_index(uint8_t index,
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
uint8_t get_nr_prach_duration(uint8_t prach_format){
|
||||
|
||||
switch(prach_format){
|
||||
|
||||
case 0: // format 0
|
||||
return 0;
|
||||
|
||||
case 1: // format 1
|
||||
return 0;
|
||||
|
||||
case 2: // format 2
|
||||
return 0;
|
||||
|
||||
case 3: // format 3
|
||||
return 0;
|
||||
|
||||
case 4: // format A1
|
||||
return 2;
|
||||
|
||||
case 5: // format A2
|
||||
return 4;
|
||||
|
||||
case 6: // format A3
|
||||
return 6;
|
||||
|
||||
case 7: // format B1
|
||||
return 2;
|
||||
|
||||
case 8: // format B4
|
||||
return 12;
|
||||
|
||||
case 9: // format C0
|
||||
return 2;
|
||||
|
||||
case 10: // format C2
|
||||
return 6;
|
||||
|
||||
case 11: // format A1/B1
|
||||
return 2;
|
||||
|
||||
case 12: // format A2/B2
|
||||
return 4;
|
||||
|
||||
case 13: // format A3/B3
|
||||
return 6;
|
||||
|
||||
default :
|
||||
AssertFatal(1==0,"Invalid Prach format\n");
|
||||
break;
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
int get_nr_prach_info_from_index(uint8_t index,
|
||||
int frame,
|
||||
int slot,
|
||||
|
||||
@@ -115,6 +115,8 @@ int get_nr_prach_occasion_info_from_index(uint8_t index,
|
||||
uint16_t *N_RA_sfn,
|
||||
uint8_t *max_association_period);
|
||||
|
||||
uint8_t get_nr_prach_duration(uint8_t prach_format);
|
||||
|
||||
uint8_t compute_nr_root_seq(NR_RACH_ConfigCommon_t *rach_config,
|
||||
uint8_t nb_preambles,
|
||||
uint8_t unpaired);
|
||||
|
||||
@@ -952,6 +952,9 @@ void nr_ue_msg2_scheduler(module_id_t mod_id,
|
||||
void nr_ue_prach_scheduler(module_id_t module_idP, frame_t frameP, sub_frame_t slotP) {
|
||||
|
||||
uint8_t config_index, mu, N_dur, N_t_slot, start_symbol;
|
||||
uint16_t RA_sfn_index;
|
||||
uint8_t N_RA_slot;
|
||||
uint8_t config_period;
|
||||
uint16_t format, format0, format1, ncs;
|
||||
int msg1_FDM, is_nr_prach_slot, fdm;
|
||||
|
||||
@@ -986,7 +989,10 @@ void nr_ue_prach_scheduler(module_id_t module_idP, frame_t frameP, sub_frame_t s
|
||||
&format,
|
||||
&start_symbol,
|
||||
&N_t_slot,
|
||||
&N_dur);
|
||||
&N_dur,
|
||||
&RA_sfn_index,
|
||||
&N_RA_slot,
|
||||
&config_period);
|
||||
|
||||
if (is_nr_prach_slot && mac->ra_state == RA_UE_IDLE) {
|
||||
|
||||
@@ -1033,57 +1039,51 @@ void nr_ue_prach_scheduler(module_id_t module_idP, frame_t frameP, sub_frame_t s
|
||||
if (format1 != 0xff) {
|
||||
switch(format0) { // dual PRACH format
|
||||
case 0xa1:
|
||||
prach_config_pdu->prach_format = 9;
|
||||
prach_config_pdu->prach_format = 11;
|
||||
break;
|
||||
case 0xa2:
|
||||
prach_config_pdu->prach_format = 10;
|
||||
prach_config_pdu->prach_format = 12;
|
||||
break;
|
||||
case 0xa3:
|
||||
prach_config_pdu->prach_format = 11;
|
||||
prach_config_pdu->prach_format = 13;
|
||||
break;
|
||||
default:
|
||||
AssertFatal(1 == 0, "Only formats A1/B1 A2/B2 A3/B3 are valid for dual format");
|
||||
}
|
||||
} else {
|
||||
switch(format0) { // single PRACH format
|
||||
case 0xa1:
|
||||
case 0:
|
||||
prach_config_pdu->prach_format = 0;
|
||||
break;
|
||||
case 0xa2:
|
||||
case 1:
|
||||
prach_config_pdu->prach_format = 1;
|
||||
break;
|
||||
case 0xa3:
|
||||
case 2:
|
||||
prach_config_pdu->prach_format = 2;
|
||||
break;
|
||||
case 0xb1:
|
||||
case 3:
|
||||
prach_config_pdu->prach_format = 3;
|
||||
break;
|
||||
case 0xb2:
|
||||
case 0xa1:
|
||||
prach_config_pdu->prach_format = 4;
|
||||
break;
|
||||
case 0xb3:
|
||||
case 0xa2:
|
||||
prach_config_pdu->prach_format = 5;
|
||||
break;
|
||||
case 0xb4:
|
||||
case 0xa3:
|
||||
prach_config_pdu->prach_format = 6;
|
||||
break;
|
||||
case 0xc0:
|
||||
case 0xb1:
|
||||
prach_config_pdu->prach_format = 7;
|
||||
break;
|
||||
case 0xc2:
|
||||
case 0xb4:
|
||||
prach_config_pdu->prach_format = 8;
|
||||
break;
|
||||
case 0:
|
||||
// long formats are handled @ PHY
|
||||
case 0xc0:
|
||||
prach_config_pdu->prach_format = 9;
|
||||
break;
|
||||
case 1:
|
||||
// long formats are handled @ PHY
|
||||
break;
|
||||
case 2:
|
||||
// long formats are handled @ PHY
|
||||
break;
|
||||
case 3:
|
||||
// long formats are handled @ PHY
|
||||
case 0xc2:
|
||||
prach_config_pdu->prach_format = 10;
|
||||
break;
|
||||
default:
|
||||
AssertFatal(1 == 0, "Invalid PRACH format");
|
||||
|
||||
@@ -269,23 +269,24 @@ void schedule_nr_prach(module_id_t module_idP, frame_t frameP, sub_frame_t slotP
|
||||
prach_pdu->num_cs = get_NCS(scc->uplinkConfigCommon->initialUplinkBWP->rach_ConfigCommon->choice.setup->rach_ConfigGeneric.zeroCorrelationZoneConfig,
|
||||
format0,
|
||||
scc->uplinkConfigCommon->initialUplinkBWP->rach_ConfigCommon->choice.setup->restrictedSetConfig);
|
||||
|
||||
LOG_I(MAC, "Frame %d, Slot %d: Prach Occasion id = %u fdm index = %u start symbol = %u slot index = %u subframe index = %u \n", frameP, slotP,
|
||||
prach_occasion_id, prach_pdu->num_ra,
|
||||
prach_pdu->prach_start_symbol,
|
||||
slot_index, RA_sfn_index);
|
||||
|
||||
LOG_I(MAC, "Frame %d, Slot %d: Prach Occasion id = %u fdm index = %u start symbol = %u slot index = %u subframe index = %u \n",
|
||||
frameP, slotP,
|
||||
prach_occasion_id, prach_pdu->num_ra,
|
||||
prach_pdu->prach_start_symbol,
|
||||
slot_index, RA_sfn_index);
|
||||
// SCF PRACH PDU format field does not consider A1/B1 etc. possibilities
|
||||
// We added 9 = A1/B1 10 = A2/B2 11 A3/B3
|
||||
if (format1!=0xff) {
|
||||
switch(format0) {
|
||||
case 0xa1:
|
||||
prach_pdu->prach_format = 9;
|
||||
prach_pdu->prach_format = 11;
|
||||
break;
|
||||
case 0xa2:
|
||||
prach_pdu->prach_format = 10;
|
||||
prach_pdu->prach_format = 12;
|
||||
break;
|
||||
case 0xa3:
|
||||
prach_pdu->prach_format = 11;
|
||||
prach_pdu->prach_format = 13;
|
||||
break;
|
||||
default:
|
||||
AssertFatal(1==0,"Only formats A1/B1 A2/B2 A3/B3 are valid for dual format");
|
||||
@@ -293,44 +294,38 @@ void schedule_nr_prach(module_id_t module_idP, frame_t frameP, sub_frame_t slotP
|
||||
}
|
||||
else{
|
||||
switch(format0) {
|
||||
case 0xa1:
|
||||
case 0:
|
||||
prach_pdu->prach_format = 0;
|
||||
break;
|
||||
case 0xa2:
|
||||
case 1:
|
||||
prach_pdu->prach_format = 1;
|
||||
break;
|
||||
case 0xa3:
|
||||
case 2:
|
||||
prach_pdu->prach_format = 2;
|
||||
break;
|
||||
case 0xb1:
|
||||
case 3:
|
||||
prach_pdu->prach_format = 3;
|
||||
break;
|
||||
case 0xb2:
|
||||
case 0xa1:
|
||||
prach_pdu->prach_format = 4;
|
||||
break;
|
||||
case 0xb3:
|
||||
case 0xa2:
|
||||
prach_pdu->prach_format = 5;
|
||||
break;
|
||||
case 0xb4:
|
||||
case 0xa3:
|
||||
prach_pdu->prach_format = 6;
|
||||
break;
|
||||
case 0xc0:
|
||||
case 0xb1:
|
||||
prach_pdu->prach_format = 7;
|
||||
break;
|
||||
case 0xc2:
|
||||
case 0xb4:
|
||||
prach_pdu->prach_format = 8;
|
||||
break;
|
||||
case 0:
|
||||
// long formats are handled @ PHY
|
||||
case 0xc0:
|
||||
prach_pdu->prach_format = 9;
|
||||
break;
|
||||
case 1:
|
||||
// long formats are handled @ PHY
|
||||
break;
|
||||
case 2:
|
||||
// long formats are handled @ PHY
|
||||
break;
|
||||
case 3:
|
||||
// long formats are handled @ PHY
|
||||
case 0xc2:
|
||||
prach_pdu->prach_format = 10;
|
||||
break;
|
||||
default:
|
||||
AssertFatal(1==0,"Invalid PRACH format");
|
||||
|
||||
Reference in New Issue
Block a user