Merge branch 'nr_initialsync' of https://gitlab.eurecom.fr/oai/openairinterface5g into nr_initialsync
This commit is contained in:
@@ -32,11 +32,12 @@
|
|||||||
|
|
||||||
#include "PHY/defs_gNB.h"
|
#include "PHY/defs_gNB.h"
|
||||||
#include "PHY/NR_TRANSPORT/nr_transport.h"
|
#include "PHY/NR_TRANSPORT/nr_transport.h"
|
||||||
#include "PHY/phy_extern.h"
|
#include "PHY/LTE_REFSIG/lte_refsig.h"
|
||||||
#include "PHY/sse_intrin.h"
|
#include "PHY/sse_intrin.h"
|
||||||
|
|
||||||
//#define DEBUG_PBCH
|
//#define DEBUG_PBCH
|
||||||
//#define DEBUG_PBCH_ENCODING
|
//#define DEBUG_PBCH_ENCODING
|
||||||
|
//#define DEBUG_PBCH_DMRS
|
||||||
|
|
||||||
extern short nr_mod_table[NR_MOD_TABLE_SIZE_SHORT];
|
extern short nr_mod_table[NR_MOD_TABLE_SIZE_SHORT];
|
||||||
|
|
||||||
@@ -58,7 +59,7 @@ int nr_generate_pbch_dmrs(uint32_t *gold_pbch_dmrs,
|
|||||||
for (int m=0; m<NR_PBCH_DMRS_LENGTH; m++) {
|
for (int m=0; m<NR_PBCH_DMRS_LENGTH; m++) {
|
||||||
mod_dmrs[m<<1] = nr_mod_table[((NR_MOD_TABLE_BPSK_OFFSET + ((gold_pbch_dmrs[m>>5]&(1<<(m&0x1f)))>>(m&0x1f)))<<1)];
|
mod_dmrs[m<<1] = nr_mod_table[((NR_MOD_TABLE_BPSK_OFFSET + ((gold_pbch_dmrs[m>>5]&(1<<(m&0x1f)))>>(m&0x1f)))<<1)];
|
||||||
mod_dmrs[(m<<1)+1] = nr_mod_table[((NR_MOD_TABLE_BPSK_OFFSET + ((gold_pbch_dmrs[m>>5]&(1<<(m&0x1f)))>>(m&0x1f)))<<1) + 1];
|
mod_dmrs[(m<<1)+1] = nr_mod_table[((NR_MOD_TABLE_BPSK_OFFSET + ((gold_pbch_dmrs[m>>5]&(1<<(m&0x1f)))>>(m&0x1f)))<<1) + 1];
|
||||||
#ifdef DEBUG_PBCH
|
#ifdef DEBUG_PBCH_DMRS
|
||||||
printf("m %d mod_dmrs %d %d\n", m, mod_dmrs[2*m], mod_dmrs[2*m+1]);
|
printf("m %d mod_dmrs %d %d\n", m, mod_dmrs[2*m], mod_dmrs[2*m+1]);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
@@ -75,7 +76,7 @@ int nr_generate_pbch_dmrs(uint32_t *gold_pbch_dmrs,
|
|||||||
l = ssb_start_symbol + 1;
|
l = ssb_start_symbol + 1;
|
||||||
|
|
||||||
for (int m = 0; m < 60; m++) {
|
for (int m = 0; m < 60; m++) {
|
||||||
#ifdef DEBUG_PBCH
|
#ifdef DEBUG_PBCH_DMRS
|
||||||
printf("m %d at k %d of l %d\n", m, k, l);
|
printf("m %d at k %d of l %d\n", m, k, l);
|
||||||
#endif
|
#endif
|
||||||
((int16_t*)txdataF[aa])[(l*frame_parms->ofdm_symbol_size + k)<<1] = (a * mod_dmrs[m<<1]) >> 15;
|
((int16_t*)txdataF[aa])[(l*frame_parms->ofdm_symbol_size + k)<<1] = (a * mod_dmrs[m<<1]) >> 15;
|
||||||
@@ -91,7 +92,7 @@ int nr_generate_pbch_dmrs(uint32_t *gold_pbch_dmrs,
|
|||||||
l++;
|
l++;
|
||||||
|
|
||||||
for (int m = 60; m < 84; m++) {
|
for (int m = 60; m < 84; m++) {
|
||||||
#ifdef DEBUG_PBCH
|
#ifdef DEBUG_PBCH_DMRS
|
||||||
printf("m %d at k %d of l %d\n", m, k, l);
|
printf("m %d at k %d of l %d\n", m, k, l);
|
||||||
#endif
|
#endif
|
||||||
((int16_t*)txdataF[aa])[(l*frame_parms->ofdm_symbol_size + k)<<1] = (a * mod_dmrs[m<<1]) >> 15;
|
((int16_t*)txdataF[aa])[(l*frame_parms->ofdm_symbol_size + k)<<1] = (a * mod_dmrs[m<<1]) >> 15;
|
||||||
@@ -107,7 +108,7 @@ int nr_generate_pbch_dmrs(uint32_t *gold_pbch_dmrs,
|
|||||||
l++;
|
l++;
|
||||||
|
|
||||||
for (int m = 84; m < NR_PBCH_DMRS_LENGTH; m++) {
|
for (int m = 84; m < NR_PBCH_DMRS_LENGTH; m++) {
|
||||||
#ifdef DEBUG_PBCH
|
#ifdef DEBUG_PBCH_DMRS
|
||||||
printf("m %d at k %d of l %d\n", m, k, l);
|
printf("m %d at k %d of l %d\n", m, k, l);
|
||||||
#endif
|
#endif
|
||||||
((int16_t*)txdataF[aa])[(l*frame_parms->ofdm_symbol_size + k)<<1] = (a * mod_dmrs[m<<1]) >> 15;
|
((int16_t*)txdataF[aa])[(l*frame_parms->ofdm_symbol_size + k)<<1] = (a * mod_dmrs[m<<1]) >> 15;
|
||||||
@@ -121,13 +122,14 @@ int nr_generate_pbch_dmrs(uint32_t *gold_pbch_dmrs,
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
#ifdef DEBUG_PBCH
|
#ifdef DEBUG_PBCH_DMRS
|
||||||
write_output("txdataF.m", "txdataF", txdataF[0], frame_parms->samples_per_frame_wCP>>1, 1, 1);
|
write_output("txdataF_pbch_dmrs.m", "txdataF_pbch_dmrs", txdataF[0], frame_parms->samples_per_frame_wCP>>1, 1, 1);
|
||||||
#endif
|
#endif
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void nr_pbch_scrambling(uint32_t Nid,
|
void nr_pbch_scrambling(uint32_t Nid,
|
||||||
|
uint8_t nushift,
|
||||||
uint8_t *pbch_a,
|
uint8_t *pbch_a,
|
||||||
uint32_t length)
|
uint32_t length)
|
||||||
{
|
{
|
||||||
@@ -161,7 +163,7 @@ int nr_generate_pbch(NR_gNB_PBCH *pbch,
|
|||||||
NR_DL_FRAME_PARMS *frame_parms)
|
NR_DL_FRAME_PARMS *frame_parms)
|
||||||
{
|
{
|
||||||
|
|
||||||
int m,k,l;
|
int k,l,m;
|
||||||
int16_t a;
|
int16_t a;
|
||||||
int16_t mod_pbch_e[NR_POLAR_PBCH_E<<1];
|
int16_t mod_pbch_e[NR_POLAR_PBCH_E<<1];
|
||||||
uint8_t sfn_4lsb, idx=0;
|
uint8_t sfn_4lsb, idx=0;
|
||||||
@@ -182,18 +184,27 @@ int nr_generate_pbch(NR_gNB_PBCH *pbch,
|
|||||||
pbch->pbch_a[NR_PBCH_PDU_BITS+4] = n_hf; // half frame index bit
|
pbch->pbch_a[NR_PBCH_PDU_BITS+4] = n_hf; // half frame index bit
|
||||||
|
|
||||||
pbch->pbch_a[NR_PBCH_PDU_BITS+5] = (config->sch_config.ssb_subcarrier_offset.value>>5)&1; //MSB of k0 -- Note the case Lssb=64 is not supported (FR2)
|
pbch->pbch_a[NR_PBCH_PDU_BITS+5] = (config->sch_config.ssb_subcarrier_offset.value>>5)&1; //MSB of k0 -- Note the case Lssb=64 is not supported (FR2)
|
||||||
|
#ifdef DEBUG_PBCH_ENCODING
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
// Scrambling
|
// Scrambling
|
||||||
nr_pbch_scrambling((uint32_t)config->sch_config.physical_cell_id.value, pbch->pbch_a, NR_POLAR_PBCH_PAYLOAD_BITS);
|
nr_pbch_scrambling((uint32_t)config->sch_config.physical_cell_id.value, nushift, pbch->pbch_a, NR_POLAR_PBCH_PAYLOAD_BITS);
|
||||||
|
#ifdef DEBUG_PBCH_ENCODING
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
/// CRC, coding and rate matching
|
/// CRC, coding and rate matching
|
||||||
polar_encoder (pbch->pbch_a, pbch->pbch_e, &frame_parms->pbch_polar_params);
|
polar_encoder (pbch->pbch_a, pbch->pbch_e, &frame_parms->pbch_polar_params);
|
||||||
|
#ifdef DEBUG_PBCH_ENCODING
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
/// QPSK modulation
|
/// QPSK modulation
|
||||||
for (int i=0; i<NR_POLAR_PBCH_E>>2; i++){
|
for (int i=0; i<NR_POLAR_PBCH_E>>1; i++){
|
||||||
idx = (pbch->pbch_e[i<<2]&1) ^ ((pbch->pbch_e[(i<<2)+1]&1)<<1);
|
idx = (pbch->pbch_e[i<<1]&1) ^ ((pbch->pbch_e[(i<<1)+1]&1)<<1);
|
||||||
mod_pbch_e[i<<2] = nr_mod_table[(NR_MOD_TABLE_QPSK_OFFSET + idx)<<1];
|
mod_pbch_e[i<<1] = nr_mod_table[(NR_MOD_TABLE_QPSK_OFFSET + idx)<<1];
|
||||||
mod_pbch_e[(i<<2)+1] = nr_mod_table[((NR_MOD_TABLE_QPSK_OFFSET + idx)<<1)+1];
|
mod_pbch_e[(i<<1)+1] = nr_mod_table[((NR_MOD_TABLE_QPSK_OFFSET + idx)<<1)+1];
|
||||||
|
|
||||||
#ifdef DEBUG_PBCH
|
#ifdef DEBUG_PBCH
|
||||||
printf("i %d mod_pbch %d %d\n", i, mod_pbch_e[2*i], mod_pbch_e[2*i+1]);
|
printf("i %d mod_pbch %d %d\n", i, mod_pbch_e[2*i], mod_pbch_e[2*i+1]);
|
||||||
@@ -201,55 +212,108 @@ int nr_generate_pbch(NR_gNB_PBCH *pbch,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Resource mapping
|
/// Resource mapping
|
||||||
/* a = (config->rf_config.tx_antenna_ports.value == 1) ? amp : (amp*ONE_OVER_SQRT2_Q15)>>15;
|
a = (config->rf_config.tx_antenna_ports.value == 1) ? amp : (amp*ONE_OVER_SQRT2_Q15)>>15;
|
||||||
|
|
||||||
for (int aa = 0; aa < config->rf_config.tx_antenna_ports.value; aa++)
|
for (int aa = 0; aa < config->rf_config.tx_antenna_ports.value; aa++)
|
||||||
{
|
{
|
||||||
|
|
||||||
// PBCH DMRS are mapped within the SSB block on every fourth subcarrier starting from nushift of symbols 1, 2, 3
|
// PBCH modulated symbols are mapped within the SSB block on symbols 1, 2, 3 excluding the subcarriers used for the PBCH DMRS
|
||||||
///symbol 1 [0+nushift:4:236+nushift] -- 60 mod symbols
|
///symbol 1 [0:239] -- 180 mod symbols
|
||||||
k = frame_parms->first_carrier_offset + frame_parms->ssb_start_subcarrier + nushift;
|
k = frame_parms->first_carrier_offset + frame_parms->ssb_start_subcarrier;
|
||||||
l = ssb_start_symbol + 1;
|
l = ssb_start_symbol + 1;
|
||||||
|
m = 0;
|
||||||
|
|
||||||
for (int m = 0; m < 60; m++) {
|
for (int ssb_sc_idx = 0; ssb_sc_idx < 240; ssb_sc_idx++) {
|
||||||
|
|
||||||
|
if ((ssb_sc_idx&3) == nushift) { //skip DMRS
|
||||||
|
k++;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
else {
|
||||||
#ifdef DEBUG_PBCH
|
#ifdef DEBUG_PBCH
|
||||||
printf("m %d at k %d of l %d\n", m, k, l);
|
printf("m %d ssb_sc_idx %d at k %d of l %d\n", m, ssb_sc_idx, k, l);
|
||||||
#endif
|
#endif
|
||||||
((int16_t*)txdataF[aa])[(l*frame_parms->ofdm_symbol_size + k)<<1] = (a * mod_dmrs[m<<1]) >> 15;
|
((int16_t*)txdataF[aa])[(l*frame_parms->ofdm_symbol_size + k)<<1] = (a * mod_pbch_e[m<<1]) >> 15;
|
||||||
((int16_t*)txdataF[aa])[((l*frame_parms->ofdm_symbol_size + k)<<1) + 1] = (a * mod_dmrs[(m<<1) + 1]) >> 15;
|
((int16_t*)txdataF[aa])[((l*frame_parms->ofdm_symbol_size + k)<<1) + 1] = (a * mod_pbch_e[(m<<1) + 1]) >> 15;
|
||||||
k+=4;
|
k++;
|
||||||
|
m++;
|
||||||
|
}
|
||||||
|
|
||||||
if (k >= frame_parms->ofdm_symbol_size)
|
if (k >= frame_parms->ofdm_symbol_size)
|
||||||
k-=frame_parms->ofdm_symbol_size;
|
k-=frame_parms->ofdm_symbol_size;
|
||||||
}
|
}
|
||||||
|
|
||||||
///symbol 2 [0+u:4:44+nushift ; 192+nu:4:236+nushift] -- 24 mod symbols
|
///symbol 2 [0:47 ; 192:239] -- 72 mod symbols
|
||||||
k = frame_parms->first_carrier_offset + frame_parms->ssb_start_subcarrier + nushift;
|
k = frame_parms->first_carrier_offset + frame_parms->ssb_start_subcarrier;
|
||||||
l++;
|
l++;
|
||||||
|
m=180;
|
||||||
|
|
||||||
for (int m = 60; m < 84; m++) {
|
for (int ssb_sc_idx = 0; ssb_sc_idx < 48; ssb_sc_idx++) {
|
||||||
|
|
||||||
|
if ((ssb_sc_idx&3) == nushift) {
|
||||||
|
k++;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
else {
|
||||||
#ifdef DEBUG_PBCH
|
#ifdef DEBUG_PBCH
|
||||||
printf("m %d at k %d of l %d\n", m, k, l);
|
printf("m %d ssb_sc_idx %d at k %d of l %d\n", m, ssb_sc_idx, k, l);
|
||||||
#endif
|
#endif
|
||||||
((int16_t*)txdataF[aa])[(l*frame_parms->ofdm_symbol_size + k)<<1] = (a * mod_dmrs[m<<1]) >> 15;
|
((int16_t*)txdataF[aa])[(l*frame_parms->ofdm_symbol_size + k)<<1] = (a * mod_pbch_e[m<<1]) >> 15;
|
||||||
((int16_t*)txdataF[aa])[((l*frame_parms->ofdm_symbol_size + k)<<1) + 1] = (a * mod_dmrs[(m<<1) + 1]) >> 15;
|
((int16_t*)txdataF[aa])[((l*frame_parms->ofdm_symbol_size + k)<<1) + 1] = (a * mod_pbch_e[(m<<1) + 1]) >> 15;
|
||||||
k+=(m==71)?148:4; // Jump from 44+nu to 192+nu
|
k++;
|
||||||
|
m++;
|
||||||
|
}
|
||||||
|
|
||||||
if (k >= frame_parms->ofdm_symbol_size)
|
if (k >= frame_parms->ofdm_symbol_size)
|
||||||
k-=frame_parms->ofdm_symbol_size;
|
k-=frame_parms->ofdm_symbol_size;
|
||||||
}
|
}
|
||||||
|
|
||||||
///symbol 3 [0+nushift:4:236+nushift] -- 60 mod symbols
|
k += 144;
|
||||||
k = frame_parms->first_carrier_offset + frame_parms->ssb_start_subcarrier + nushift;
|
if (k >= frame_parms->ofdm_symbol_size)
|
||||||
l++;
|
k-=frame_parms->ofdm_symbol_size;
|
||||||
|
|
||||||
for (int m = 84; m < NR_PBCH_DMRS_LENGTH; m++) {
|
m=216;
|
||||||
|
|
||||||
|
for (int ssb_sc_idx = 192; ssb_sc_idx < 240; ssb_sc_idx++) {
|
||||||
|
|
||||||
|
if ((ssb_sc_idx&3) == nushift) {
|
||||||
|
k++;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
else {
|
||||||
#ifdef DEBUG_PBCH
|
#ifdef DEBUG_PBCH
|
||||||
printf("m %d at k %d of l %d\n", m, k, l);
|
printf("m %d ssb_sc_idx %d at k %d of l %d\n", m, ssb_sc_idx, k, l);
|
||||||
#endif
|
#endif
|
||||||
((int16_t*)txdataF[aa])[(l*frame_parms->ofdm_symbol_size + k)<<1] = (a * mod_dmrs[m<<1]) >> 15;
|
((int16_t*)txdataF[aa])[(l*frame_parms->ofdm_symbol_size + k)<<1] = (a * mod_pbch_e[m<<1]) >> 15;
|
||||||
((int16_t*)txdataF[aa])[((l*frame_parms->ofdm_symbol_size + k)<<1) + 1] = (a * mod_dmrs[(m<<1) + 1]) >> 15;
|
((int16_t*)txdataF[aa])[((l*frame_parms->ofdm_symbol_size + k)<<1) + 1] = (a * mod_pbch_e[(m<<1) + 1]) >> 15;
|
||||||
k+=4;
|
k++;
|
||||||
|
m++;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (k >= frame_parms->ofdm_symbol_size)
|
||||||
|
k-=frame_parms->ofdm_symbol_size;
|
||||||
|
}
|
||||||
|
|
||||||
|
///symbol 3 [0:239] -- 180 mod symbols
|
||||||
|
k = frame_parms->first_carrier_offset + frame_parms->ssb_start_subcarrier;
|
||||||
|
l++;
|
||||||
|
m=252;
|
||||||
|
|
||||||
|
for (int ssb_sc_idx = 0; ssb_sc_idx < 240; ssb_sc_idx++) {
|
||||||
|
|
||||||
|
if ((ssb_sc_idx&3) == nushift) {
|
||||||
|
k++;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
#ifdef DEBUG_PBCH
|
||||||
|
printf("m %d ssb_sc_idx %d at k %d of l %d\n", m, ssb_sc_idx, k, l);
|
||||||
|
#endif
|
||||||
|
((int16_t*)txdataF[aa])[(l*frame_parms->ofdm_symbol_size + k)<<1] = (a * mod_pbch_e[m<<1]) >> 15;
|
||||||
|
((int16_t*)txdataF[aa])[((l*frame_parms->ofdm_symbol_size + k)<<1) + 1] = (a * mod_pbch_e[(m<<1) + 1]) >> 15;
|
||||||
|
k++;
|
||||||
|
m++;
|
||||||
|
}
|
||||||
|
|
||||||
if (k >= frame_parms->ofdm_symbol_size)
|
if (k >= frame_parms->ofdm_symbol_size)
|
||||||
k-=frame_parms->ofdm_symbol_size;
|
k-=frame_parms->ofdm_symbol_size;
|
||||||
@@ -259,9 +323,9 @@ int nr_generate_pbch(NR_gNB_PBCH *pbch,
|
|||||||
|
|
||||||
|
|
||||||
#ifdef DEBUG_PBCH
|
#ifdef DEBUG_PBCH
|
||||||
write_output("txdataF.m", "txdataF", txdataF[0], frame_parms->samples_per_frame_wCP>>1, 1, 1);
|
write_output("txdataF_pbch.m", "txdataF_pbch", txdataF[0], frame_parms->samples_per_frame_wCP>>1, 1, 1);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
*/
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -72,6 +72,7 @@ int nr_generate_pbch_dmrs(uint32_t *gold_pbch_dmrs,
|
|||||||
@param
|
@param
|
||||||
*/
|
*/
|
||||||
void nr_pbch_scrambling(uint32_t Nid,
|
void nr_pbch_scrambling(uint32_t Nid,
|
||||||
|
uint8_t nushift,
|
||||||
uint8_t *pbch_a,
|
uint8_t *pbch_a,
|
||||||
uint32_t length);
|
uint32_t length);
|
||||||
|
|
||||||
|
|||||||
@@ -20,7 +20,7 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
/*! \file lte-enb.c
|
/*! \file lte-enb.c
|
||||||
* \brief Top-level threads for eNodeB
|
* \brief Top-level threads for gNodeB
|
||||||
* \author R. Knopp, F. Kaltenberger, Navid Nikaein
|
* \author R. Knopp, F. Kaltenberger, Navid Nikaein
|
||||||
* \date 2012
|
* \date 2012
|
||||||
* \version 0.1
|
* \version 0.1
|
||||||
|
|||||||
Reference in New Issue
Block a user