Commit cbef02b8 authored by Sakthivel Velumani's avatar Sakthivel Velumani

PDSCH refactoring

PBCH refactoring

PTRS refactoring

CSI refactoring

Main functional changes to bring in symbol based processing

Initial sync changes to use nr_symbol_fep() and rxdataF for symbol

Function arguments changes made in header files
and changes to global structures

PRS and other measurement changes

Physim updates

Code cleanup

Changed DURATION_RX_TO_TX to 2. Works fine with k1,k2=2.

Fix wrong SSB symbol detect

PBCH decoding error message

Decoded SSB of init sync till SIB1 rx

Fix DMRS scrambling ID bug (Fixes SIB1 reception)

Bugfix in multiple PDCCH monitoring within slot
Bug: Only the first symbol in monitoringSymbolsWithinSlot was used. This could skip
PDCCH candidates in other monitoring occations. This fix, creates separate LLR buffer
for each monitoring occations in all search spaces in an OFDM symbol. In the last PDCCH
symbol of the slot, decoding of DCI in all candidates on all occations are attempted.
parent e35e7520
......@@ -310,8 +310,8 @@ int cce_to_reg_interleaving(const int R, int k, int n_shift, const int C, int L,
return f;
}
void get_coreset_rballoc(uint8_t *FreqDomainResource,int *n_rb,int *rb_offset) {
void get_coreset_rballoc(const uint8_t *FreqDomainResource, int *n_rb, int *rb_offset)
{
uint8_t count=0, start=0, start_set=0;
uint64_t bitmap = (((uint64_t)FreqDomainResource[0])<<37)|
......
......@@ -95,7 +95,7 @@ uint64_t reverse_bits(uint64_t in, int n_bits);
int get_first_ul_slot(int nrofDownlinkSlots, int nrofDownlinkSymbols, int nrofUplinkSymbols);
int cce_to_reg_interleaving(const int R, int k, int n_shift, const int C, int L, const int N_regs);
int get_SLIV(uint8_t S, uint8_t L);
void get_coreset_rballoc(uint8_t *FreqDomainResource,int *n_rb,int *rb_offset);
void get_coreset_rballoc(const uint8_t *FreqDomainResource, int *n_rb, int *rb_offset);
int get_nr_table_idx(int nr_bandP, uint8_t scs_index);
int32_t get_delta_duplex(int nr_bandP, uint8_t scs_index);
frame_type_t get_frame_type(uint16_t nr_bandP, uint8_t scs_index);
......@@ -134,6 +134,7 @@ void freq2time(uint16_t ofdm_symbol_size,
void nr_est_delay(int ofdm_symbol_size, const c16_t *ls_est, c16_t *ch_estimates_time, delay_t *delay);
#define SYMBOL_HAS_LONGER_CP(a, b) (!(a % (0x7 << b)))
#define CEILIDIV(a,b) ((a+b-1)/b)
#define ROUNDIDIV(a,b) (((a<<1)+b)/(b<<1))
......
......@@ -246,7 +246,8 @@ void rx_func(void *param)
gNB->frame_parms.N_RB_UL,
soffset,
0,
gNB->frame_parms.Ncp == EXTENDED ? 12 : 14);
gNB->frame_parms.Ncp == EXTENDED ? 12 : 14,
false);
}
}
phy_procedures_gNB_uespec_RX(gNB, frame_rx, slot_rx);
......
This diff is collapsed.
......@@ -68,7 +68,7 @@ typedef struct {
typedef struct {
/// frequency_domain_resource;
uint8_t frequency_domain_resource[6];
uint8_t StartSymbolIndex;
uint16_t StartSymbolBitmap;
uint8_t duration;
uint8_t CceRegMappingType; // interleaved or noninterleaved
uint8_t RegBundleSize; // valid if CCE to REG mapping type is interleaved type
......
......@@ -607,10 +607,10 @@ void init_polar_deinterleaver_table(t_nrPolar_params *polarParams) {
uint32_t polar_decoder_int16(int16_t *input,
uint64_t *out,
uint8_t ones_flag,
int8_t messageType,
uint16_t messageLength,
uint8_t aggregation_level )
const uint8_t ones_flag,
const int8_t messageType,
const uint16_t messageLength,
const uint8_t aggregation_level)
{
t_nrPolar_params *polarParams=nr_polar_params(messageType, messageLength, aggregation_level, true);
......
......@@ -168,10 +168,10 @@ int8_t polar_decoder(double *input,
uint32_t polar_decoder_int16(int16_t *input,
uint64_t *out,
uint8_t ones_flag,
int8_t messageType,
uint16_t messageLength,
uint8_t aggregation_level);
const uint8_t ones_flag,
const int8_t messageType,
const uint16_t messageLength,
const uint8_t aggregation_level);
int8_t polar_decoder_dci(double *input,
uint32_t *out,
......@@ -230,12 +230,7 @@ void nr_polar_rate_matching_pattern(uint16_t *rmp,
uint16_t N,
uint16_t E);
void nr_polar_rate_matching(double *input,
double *output,
uint16_t *rmp,
uint16_t K,
uint16_t N,
uint16_t E);
void nr_polar_rate_matching(const double *input, double *output, uint16_t *rmp, uint16_t K, uint16_t N, uint16_t E);
void nr_polar_rate_matching_int16(int16_t *input,
int16_t *output,
......
......@@ -425,13 +425,7 @@ void nr_polar_rate_matching_pattern(uint16_t *rmp,
free(y);
}
void nr_polar_rate_matching(double *input,
double *output,
uint16_t *rmp,
uint16_t K,
uint16_t N,
uint16_t E)
void nr_polar_rate_matching(const double *input, double *output, uint16_t *rmp, uint16_t K, uint16_t N, uint16_t E)
{
if (E>=N) { //repetition
for (int i=0; i<=N-1; i++) output[i]=0;
......
......@@ -153,6 +153,12 @@ void init_nr_prs_ue_vars(PHY_VARS_NR_UE *ue)
prs_vars[idx]->prs_resource[k].prs_meas = malloc16_clear(fp->nb_antennas_rx * sizeof(prs_meas_t *));
AssertFatal((prs_vars[idx]->prs_resource[k].prs_meas!=NULL), "%s: PRS measurements malloc failed for gNB_id %d\n", __FUNCTION__, idx);
prs_vars[idx]->prs_resource[k].ch_est = malloc16_clear(sizeof(c16_t) * ue->frame_parms.ofdm_symbol_size);
AssertFatal((prs_vars[idx]->prs_resource[k].ch_est != NULL),
"%s: PRS channel estimates malloc failed for gNB_id %d\n",
__FUNCTION__,
idx);
for (int j=0; j<fp->nb_antennas_rx; j++) {
prs_vars[idx]->prs_resource[k].prs_meas[j] = malloc16_clear(sizeof(prs_meas_t));
AssertFatal((prs_vars[idx]->prs_resource[k].prs_meas[j]!=NULL), "%s: PRS measurements malloc failed for gNB_id %d, rx_ant %d\n", __FUNCTION__, idx, j);
......@@ -196,11 +202,9 @@ int init_nr_ue_signal(PHY_VARS_NR_UE *ue, int nb_connected_gNB)
NR_DL_FRAME_PARMS *const fp = &ue->frame_parms;
NR_UE_COMMON *const common_vars = &ue->common_vars;
NR_UE_PRACH **const prach_vars = ue->prach_vars;
NR_UE_CSI_IM **const csiim_vars = ue->csiim_vars;
NR_UE_CSI_RS **const csirs_vars = ue->csirs_vars;
NR_UE_SRS **const srs_vars = ue->srs_vars;
int i, slot, symb, gNB_id;
int slot, symb, gNB_id;
LOG_I(PHY, "Initializing UE vars for gNB TXant %u, UE RXant %u\n", fp->nb_antennas_tx, fp->nb_antennas_rx);
......@@ -210,10 +214,10 @@ int init_nr_ue_signal(PHY_VARS_NR_UE *ue, int nb_connected_gNB)
AssertFatal( nb_connected_gNB <= NUMBER_OF_CONNECTED_gNB_MAX, "n_connected_gNB is too large" );
// init phy_vars_ue
for (i=0; i<fp->Lmax; i++)
for (int i = 0; i < fp->Lmax; i++)
ue->measurements.ssb_rsrp_dBm[i] = INT_MIN;
for (i=0; i<4; i++) {
for (int i = 0; i < 4; i++) {
ue->rx_gain_max[i] = 135;
ue->rx_gain_med[i] = 128;
ue->rx_gain_byp[i] = 120;
......@@ -283,20 +287,20 @@ int init_nr_ue_signal(PHY_VARS_NR_UE *ue, int nb_connected_gNB)
///////////
////////////////////////////////////////////////////////////////////////////////////////////
for (i=0; i<10; i++)
for (int i = 0; i < 10; i++)
ue->tx_power_dBm[i]=-127;
// init TX buffers
common_vars->txData = malloc16(fp->nb_antennas_tx * sizeof(c16_t *));
for (i=0; i<fp->nb_antennas_tx; i++) {
for (int i = 0; i < fp->nb_antennas_tx; i++) {
common_vars->txData[i] = malloc16_clear((fp->samples_per_frame) * sizeof(c16_t));
}
// init RX buffers
common_vars->rxdata = malloc16(fp->nb_antennas_rx * sizeof(c16_t *));
for (i=0; i<fp->nb_antennas_rx; i++) {
for (int i = 0; i < fp->nb_antennas_rx; i++) {
common_vars->rxdata[i] = malloc16_clear((2 * (fp->samples_per_frame) + fp->ofdm_symbol_size) * sizeof(c16_t));
}
......@@ -342,12 +346,8 @@ int init_nr_ue_signal(PHY_VARS_NR_UE *ue, int nb_connected_gNB)
// DLSCH
for (gNB_id = 0; gNB_id < ue->n_connected_gNB; gNB_id++) {
prach_vars[gNB_id] = malloc16_clear(sizeof(NR_UE_PRACH));
csiim_vars[gNB_id] = malloc16_clear(sizeof(NR_UE_CSI_IM));
csirs_vars[gNB_id] = malloc16_clear(sizeof(NR_UE_CSI_RS));
srs_vars[gNB_id] = malloc16_clear(sizeof(NR_UE_SRS));
csiim_vars[gNB_id]->active = false;
csirs_vars[gNB_id]->active = false;
srs_vars[gNB_id]->active = false;
// ceil((NB_RB*8(max allocation per RB)*2(QPSK))/32)
......@@ -363,9 +363,10 @@ int init_nr_ue_signal(PHY_VARS_NR_UE *ue, int nb_connected_gNB)
AssertFatal(ue->nr_csi_info->nr_gold_csi_rs[slot][symb] != NULL, "NR init: csi reference signal for slot %d symbol %d - malloc failed\n", slot, symb);
}
}
ue->nr_csi_info->csi_rs_generated_signal = malloc16(NR_MAX_NB_PORTS * sizeof(int32_t *));
for (i=0; i<NR_MAX_NB_PORTS; i++) {
ue->nr_csi_info->csi_rs_generated_signal[i] = malloc16_clear(fp->samples_per_frame_wCP * sizeof(int32_t));
ue->nr_csi_info->csi_rs_generated_signal = malloc16(NR_MAX_NB_PORTS * sizeof(*ue->nr_csi_info->csi_rs_generated_signal));
for (int i = 0; i < NR_MAX_NB_PORTS; i++) {
ue->nr_csi_info->csi_rs_generated_signal[i] =
malloc16_clear(fp->samples_per_frame_wCP * sizeof(**ue->nr_csi_info->csi_rs_generated_signal));
}
ue->nr_srs_info = malloc16_clear(sizeof(nr_srs_info_t));
......@@ -451,8 +452,6 @@ void term_nr_ue_signal(PHY_VARS_NR_UE *ue, int nb_connected_gNB)
free_and_zero(ue->nr_srs_info);
free_and_zero(ue->csiim_vars[gNB_id]);
free_and_zero(ue->csirs_vars[gNB_id]);
free_and_zero(ue->srs_vars[gNB_id]);
free_and_zero(ue->prach_vars[gNB_id]);
......@@ -485,6 +484,7 @@ void term_nr_ue_signal(PHY_VARS_NR_UE *ue, int nb_connected_gNB)
free_and_zero(ue->prs_vars[idx]->prs_resource[k].prs_meas[j]);
}
free_and_zero(ue->prs_vars[idx]->prs_resource[k].prs_meas);
free_and_zero(ue->prs_vars[idx]->prs_resource[k].ch_est);
}
free_and_zero(ue->prs_vars[idx]);
......
......@@ -65,9 +65,8 @@ void set_Lmax(NR_DL_FRAME_PARMS *fp) {
}
}
int nr_get_ssb_start_symbol(NR_DL_FRAME_PARMS *fp,uint8_t i_ssb) {
int nr_get_ssb_start_symbol(const NR_DL_FRAME_PARMS *fp, const uint8_t i_ssb)
{
int mu = fp->numerology_index;
int symbol = 0;
uint8_t n, n_temp;
......@@ -188,12 +187,12 @@ uint32_t get_samples_per_slot(int slot, const NR_DL_FRAME_PARMS *fp)
uint32_t get_slot_from_timestamp(openair0_timestamp timestamp_rx, const NR_DL_FRAME_PARMS *fp)
{
uint32_t slot_idx = 0;
int samples_till_the_slot = fp->get_samples_per_slot(slot_idx,fp)-1;
timestamp_rx = timestamp_rx%fp->samples_per_frame;
int samples_till_the_slot = fp->get_samples_per_slot(slot_idx, fp) - 1;
timestamp_rx = timestamp_rx % fp->samples_per_frame;
while (timestamp_rx > samples_till_the_slot) {
slot_idx++;
samples_till_the_slot += fp->get_samples_per_slot(slot_idx,fp);
samples_till_the_slot += fp->get_samples_per_slot(slot_idx, fp);
}
return slot_idx;
}
......
......@@ -25,7 +25,7 @@
#include "PHY/defs_gNB.h"
#include "PHY/defs_nr_UE.h"
int nr_get_ssb_start_symbol(NR_DL_FRAME_PARMS *fp,uint8_t i_ssb);
int nr_get_ssb_start_symbol(const NR_DL_FRAME_PARMS *fp, const uint8_t i_ssb);
int nr_init_frame_parms(nfapi_nr_config_request_scf_t *config, NR_DL_FRAME_PARMS *frame_parms);
int nr_init_frame_parms_ue(NR_DL_FRAME_PARMS *frame_parms, fapi_nr_config_request_t *config, uint16_t nr_band);
void nr_init_frame_parms_ue_sa(NR_DL_FRAME_PARMS *frame_parms, uint64_t downlink_frequency, int32_t uplink_frequency_offset, uint8_t mu, uint16_t nr_band);
......
......@@ -48,18 +48,13 @@ int slot_fep(PHY_VARS_UE *phy_vars_ue,
int no_prefix,
int reset_freq_est);
int nr_slot_fep(PHY_VARS_NR_UE *ue,
UE_nr_rxtx_proc_t *proc,
unsigned char symbol,
c16_t rxdataF[][ue->frame_parms.samples_per_slot_wCP]);
int nr_slot_fep_init_sync(PHY_VARS_NR_UE *ue,
UE_nr_rxtx_proc_t *proc,
unsigned char symbol,
int sample_offset,
bool pbch_decoded,
c16_t rxdataF[][ue->frame_parms.samples_per_slot_wCP],
int link_type);
void nr_symbol_fep(
const PHY_VARS_NR_UE *ue,
const int slot,
const unsigned char symbol,
const int link_type,
const c16_t rxdata[ue->frame_parms.nb_antennas_rx][ue->frame_parms.ofdm_symbol_size + ue->frame_parms.nb_prefix_samples0],
c16_t rxdataF[ue->frame_parms.nb_antennas_rx][ue->frame_parms.ofdm_symbol_size]);
int slot_fep_mbsfn(PHY_VARS_UE *phy_vars_ue,
unsigned char l,
......
......@@ -120,14 +120,15 @@ void init_symbol_rotation(NR_DL_FRAME_PARMS *fp);
void init_timeshift_rotation(NR_DL_FRAME_PARMS *fp);
void apply_nr_rotation_RX(NR_DL_FRAME_PARMS *frame_parms,
void apply_nr_rotation_RX(const NR_DL_FRAME_PARMS *frame_parms,
c16_t *rxdataF,
c16_t *rot,
int slot,
int nb_rb,
int soffset,
int first_symbol,
int nsymb);
const c16_t *rot,
const int slot,
const int nb_rb,
const int soffset,
const int first_symbol,
const int nsymb,
const bool isUE);
/*! \brief Perform NR precoding. TS 38.211 V15.4.0 subclause 6.3.1.5
@param[in] datatx_F_precoding, Pointer to n_layers*re data array
......
This diff is collapsed.
......@@ -529,12 +529,7 @@ void nr_pusch_ptrs_processing(PHY_VARS_gNB *gNB,
}
if(symbol == *startSymbIndex) {
*ptrsSymbPos = 0;
set_ptrs_symb_idx(ptrsSymbPos,
*nbSymb,
*startSymbIndex,
1<< *L_ptrs,
*dmrsSymbPos);
*ptrsSymbPos = get_ptrs_symb_idx(*nbSymb, *startSymbIndex, 1 << *L_ptrs, *dmrsSymbPos);
}
/* if not PTRS symbol set current ptrs symbol index to zero*/
......@@ -554,8 +549,8 @@ void nr_pusch_ptrs_processing(PHY_VARS_gNB *gNB,
nr_tti_rx,
symbol,
frame_parms->ofdm_symbol_size,
(int16_t *)&pusch_vars->rxdataF_comp[aarx][(symbol * nb_re_pusch)],
gNB->nr_gold_pusch_dmrs[rel15_ul->scid][nr_tti_rx][symbol],
(int16_t *)&pusch_vars->rxdataF_comp[aarx][(symbol * nb_re_pusch)],
(int16_t *)&phase_per_symbol[symbol],
ptrs_re_symbol);
}
......
......@@ -317,6 +317,15 @@ uint8_t get_dmrs_symbols_in_slot(uint16_t l_prime_mask, uint16_t nb_symb)
return tmp;
}
int get_last_dmrs_symbol_in_slot(const int dmrs_symbol_pos)
{
for (int i = NR_SYMBOLS_PER_SLOT - 1; i > 0; i--) {
if ((dmrs_symbol_pos >> i) & 0x1)
return i;
}
return -1;
}
/* return the position of valid dmrs symbol in a slot for channel compensation */
int8_t get_valid_dmrs_idx_for_channel_est(uint16_t dmrs_symb_pos, uint8_t counter)
{
......@@ -339,26 +348,72 @@ int8_t get_valid_dmrs_idx_for_channel_est(uint16_t dmrs_symb_pos, uint8_t count
return symbIdx;
}
/* return number of data symbols before the last DMRS symbol */
int get_num_data_symb_before_last_dmrs(const int dmrs_symb_pos)
{
int sum = 0;
const int last_dmrs_symbol_idx = get_last_dmrs_symbol_in_slot(dmrs_symb_pos);
DevAssert(last_dmrs_symbol_idx != -1);
for (int i = 0; i < last_dmrs_symbol_idx; i++) {
sum += !((dmrs_symb_pos >> i) & 0x1);
}
return sum;
}
int get_first_symb_idx_with_data(const int dmrsBitMap,
const int dmrsType,
const int numDmrsCmdGrp,
const int startSymbol,
const int numSymbs)
{
int dmrs_data_re;
int firstDataSymb = startSymbol;
if (dmrsType == NFAPI_NR_DMRS_TYPE1)
dmrs_data_re = NR_NB_SC_PER_RB - 6 * numDmrsCmdGrp;
else
dmrs_data_re = NR_NB_SC_PER_RB - 4 * numDmrsCmdGrp;
while ((dmrs_data_re == 0) && (dmrsBitMap & (1 << firstDataSymb))) {
firstDataSymb++;
}
return firstDataSymb;
}
/* perform averaging of channel estimates and store result in first symbol buffer */
void nr_chest_time_domain_avg(NR_DL_FRAME_PARMS *frame_parms,
int32_t **ch_estimates,
uint8_t num_symbols,
uint8_t start_symbol,
uint16_t dmrs_bitmap,
uint16_t num_rbs)
void nr_chest_time_domain_avg(const NR_DL_FRAME_PARMS *frame_parms,
const int num_symbols,
const int start_symbol,
const int dmrs_bitmap,
const int num_rbs,
const int antIdx,
const int layerIdx,
const int Nl,
const bool isUE,
c16_t *ch_estimates)
{
simde__m128i *ul_ch128_0;
simde__m128i *ul_ch128_1;
int16_t *ul_ch16_0;
int total_symbols = start_symbol + num_symbols;
int num_dmrs_symb = get_dmrs_symbols_in_slot(dmrs_bitmap, total_symbols);
int first_dmrs_symb = get_next_dmrs_symbol_in_slot(dmrs_bitmap, start_symbol, total_symbols);
const int total_symbols = start_symbol + num_symbols;
const int num_dmrs_symb = get_dmrs_symbols_in_slot(dmrs_bitmap, total_symbols);
const int first_dmrs_symb = get_next_dmrs_symbol_in_slot(dmrs_bitmap, start_symbol, total_symbols);
AssertFatal(first_dmrs_symb > -1, "No DMRS symbol present in this slot\n");
for (int aarx = 0; aarx < frame_parms->nb_antennas_rx; aarx++) {
for (int symb = first_dmrs_symb+1; symb < total_symbols; symb++) {
ul_ch128_0 = (simde__m128i *)&ch_estimates[aarx][first_dmrs_symb*frame_parms->ofdm_symbol_size];
const int symb_offset = Nl * frame_parms->nb_antennas_rx * frame_parms->ofdm_symbol_size;
const int layer_offset = frame_parms->nb_antennas_rx * frame_parms->ofdm_symbol_size;
for (int symb = first_dmrs_symb + 1; symb < total_symbols; symb++) {
ul_ch128_0 = isUE ? (simde__m128i *)&ch_estimates[first_dmrs_symb * symb_offset + layerIdx * layer_offset
+ antIdx * frame_parms->ofdm_symbol_size]
: (simde__m128i *)&ch_estimates[first_dmrs_symb * frame_parms->ofdm_symbol_size];
if ((dmrs_bitmap >> symb) & 0x01) {
ul_ch128_1 = (simde__m128i *)&ch_estimates[aarx][symb*frame_parms->ofdm_symbol_size];
ul_ch128_1 =
isUE
? (simde__m128i *)&ch_estimates[symb * symb_offset + layerIdx * layer_offset + antIdx * frame_parms->ofdm_symbol_size]
: (simde__m128i *)&ch_estimates[symb * frame_parms->ofdm_symbol_size];
for (int rbIdx = 0; rbIdx < num_rbs; rbIdx++) {
ul_ch128_0[0] = simde_mm_adds_epi16(ul_ch128_0[0], ul_ch128_1[0]);
ul_ch128_0[1] = simde_mm_adds_epi16(ul_ch128_0[1], ul_ch128_1[1]);
......@@ -368,7 +423,10 @@ void nr_chest_time_domain_avg(NR_DL_FRAME_PARMS *frame_parms,
}
}
}
ul_ch128_0 = (simde__m128i *)&ch_estimates[aarx][first_dmrs_symb*frame_parms->ofdm_symbol_size];
ul_ch128_0 = isUE ? (simde__m128i *)&ch_estimates[first_dmrs_symb * symb_offset + layerIdx * layer_offset
+ antIdx * frame_parms->ofdm_symbol_size]
: (simde__m128i *)&ch_estimates[first_dmrs_symb * frame_parms->ofdm_symbol_size];
if (num_dmrs_symb == 2) {
for (int rbIdx = 0; rbIdx < num_rbs; rbIdx++) {
ul_ch128_0[0] = simde_mm_srai_epi16(ul_ch128_0[0], 1);
......@@ -384,7 +442,9 @@ void nr_chest_time_domain_avg(NR_DL_FRAME_PARMS *frame_parms,
ul_ch128_0 += 3;
}
} else if (num_dmrs_symb == 3) {
ul_ch16_0 = (int16_t *)&ch_estimates[aarx][first_dmrs_symb*frame_parms->ofdm_symbol_size];
ul_ch16_0 = isUE ? (int16_t *)&ch_estimates[first_dmrs_symb * symb_offset + layerIdx * layer_offset
+ antIdx * frame_parms->ofdm_symbol_size]
: (int16_t *)&ch_estimates[first_dmrs_symb * frame_parms->ofdm_symbol_size];
for (int rbIdx = 0; rbIdx < num_rbs; rbIdx++) {
ul_ch16_0[0] /= 3;
ul_ch16_0[1] /= 3;
......@@ -412,6 +472,6 @@ void nr_chest_time_domain_avg(NR_DL_FRAME_PARMS *frame_parms,
ul_ch16_0[23] /= 3;
ul_ch16_0 += 24;
}
} else AssertFatal((num_dmrs_symb < 5) && (num_dmrs_symb > 0), "Illegal number of DMRS symbols in the slot\n");
}
} else
AssertFatal((num_dmrs_symb < 5) && (num_dmrs_symb > 0), "Illegal number of DMRS symbols in the slot\n");
}
......@@ -61,22 +61,32 @@ uint8_t allowed_xlsch_re_in_dmrs_symbol(uint16_t k,
uint8_t numDmrsCdmGrpsNoData,
uint8_t dmrs_type);
void nr_gen_ref_conj_symbols(uint32_t *in, uint32_t length, int16_t *output, uint16_t offset, int mod_order);
void nr_gen_ref_conj_symbols(const uint32_t *in, uint32_t length, int16_t *output, uint16_t offset, int mod_order);
int8_t get_next_dmrs_symbol_in_slot(uint16_t ul_dmrs_symb_pos, uint8_t counter, uint8_t end_symbol);
uint8_t get_dmrs_symbols_in_slot(uint16_t l_prime_mask, uint16_t nb_symb);
int8_t get_valid_dmrs_idx_for_channel_est(uint16_t dmrs_symb_pos, uint8_t counter);
void nr_chest_time_domain_avg(NR_DL_FRAME_PARMS *frame_parms,
int32_t **ch_estimates,
uint8_t num_symbols,
uint8_t start_symbol,
uint16_t dmrs_bitmap,
uint16_t num_rbs);
static inline uint8_t is_dmrs_symbol(uint8_t l, uint16_t dmrsSymbMask)
void nr_chest_time_domain_avg(const NR_DL_FRAME_PARMS *frame_parms,
const int num_symbols,
const int start_symbol,
const int dmrs_bitmap,
const int num_rbs,
const int antIdx,
const int layerIdx,
const int Nl,
const bool isUE,
c16_t *ch_estimates);
int get_first_symb_idx_with_data(const int dmrsBitMap,
const int dmrsType,
const int numDmrsCmdGrp,
const int startSymbol,
const int numSymbs);
static inline uint8_t is_dmrs_symbol(const uint8_t l, const uint16_t dmrsSymbMask)
{
DevAssert(l < 32);
return ((dmrsSymbMask >> l) & 0x1);
}
int get_last_dmrs_symbol_in_slot(const int dmrs_symbol_pos);
int get_num_data_symb_before_last_dmrs(const int dmrs_symb_pos);
#undef EXTERN
#endif /* DMRS_NR_H */
......
......@@ -114,15 +114,14 @@ int nr_pusch_dmrs_rx(PHY_VARS_gNB *gNB,
return(0);
}
int nr_pdsch_dmrs_rx(PHY_VARS_NR_UE *ue,
unsigned int Ns,
unsigned int *nr_gold_pdsch,
int32_t *output,
unsigned short p,
unsigned char lp,
unsigned short nb_pdsch_rb,
uint8_t config_type)
int nr_pdsch_dmrs_rx(const PHY_VARS_NR_UE *ue,
const unsigned int Ns,
const unsigned int *nr_gold_pdsch,
const unsigned short p,
const unsigned char lp,
const unsigned short nb_pdsch_rb,
const uint8_t config_type,
int32_t *output)
{
int8_t w;
unsigned char idx=0;
......@@ -166,13 +165,7 @@ int nr_pdsch_dmrs_rx(PHY_VARS_NR_UE *ue,
return(0);
}
int nr_pdcch_dmrs_rx(PHY_VARS_NR_UE *ue,
unsigned int Ns,
unsigned int *nr_gold_pdcch,
int32_t *output,
unsigned short p,
unsigned short nb_rb_coreset)
int nr_pdcch_dmrs_rx(const unsigned int *nr_gold_pdcch, int32_t *output, const unsigned short p, const unsigned short nb_rb_coreset)
{
uint8_t idx=0;
//uint8_t pdcch_rb_offset =0;
......@@ -194,13 +187,9 @@ int nr_pdcch_dmrs_rx(PHY_VARS_NR_UE *ue,
return(0);
}
int nr_pbch_dmrs_rx(int symbol,
unsigned int *nr_gold_pbch,
int32_t *output)
int nr_pbch_dmrs_rx(const int symbol, const unsigned int *nr_gold_pbch, int32_t *output)
{
int m,m0,m1;
uint8_t idx=0;
int m, m0, m1;
AssertFatal(symbol>=0 && symbol <3,"illegal symbol %d\n",symbol);
if (symbol == 0) {
m0=0;
......@@ -217,7 +206,8 @@ int nr_pbch_dmrs_rx(int symbol,
// printf("Generating pilots symbol %d, m0 %d, m1 %d\n",symbol,m0,m1);
/// QPSK modulation
for (m=m0; m<m1; m++) {
idx = ((((nr_gold_pbch[(m<<1)>>5])>>((m<<1)&0x1f))&1)<<1) ^ (((nr_gold_pbch[((m<<1)+1)>>5])>>(((m<<1)+1)&0x1f))&1);
const int idx = ((((nr_gold_pbch[(m << 1) >> 5]) >> ((m << 1) & 0x1f)) & 1) << 1)
^ (((nr_gold_pbch[((m << 1) + 1) >> 5]) >> (((m << 1) + 1) & 0x1f)) & 1);
((int16_t*)output)[(m-m0)<<1] = nr_rx_mod_table[(NR_MOD_TABLE_QPSK_OFFSET + idx)<<1];
((int16_t*)output)[((m-m0)<<1)+1] = nr_rx_mod_table[((NR_MOD_TABLE_QPSK_OFFSET + idx)<<1) + 1];
......@@ -238,7 +228,7 @@ int nr_pbch_dmrs_rx(int symbol,
\param length is number of RE in a OFDM symbol
\param *output pointer to all ptrs RE in a OFDM symbol
*/
void nr_gen_ref_conj_symbols(uint32_t *in, uint32_t length, int16_t *output, uint16_t offset, int mod_order)
void nr_gen_ref_conj_symbols(const uint32_t *in, uint32_t length, int16_t *output, uint16_t offset, int mod_order)
{
uint8_t idx, b_idx;
for (int i=0; i<length/mod_order; i++)
......
......@@ -72,12 +72,13 @@ void nr_gold_pdcch(PHY_VARS_NR_UE* ue,
}
}
void nr_gold_pdsch(PHY_VARS_NR_UE* ue,
int nscid,
uint32_t nid) {
unsigned int x1 = 0, x2 = 0, x2tmp0 = 0;
void nr_gold_pdsch(const int nscid, const unsigned int nid, PHY_VARS_NR_UE* ue)
{
unsigned int x1 = 0;
const int pdsch_dmrs_init_length = ((ue->frame_parms.N_RB_DL * 12) >> 5) + 1;
unsigned int x2 = 0;
int x2tmp0 = 0;
uint8_t reset;
int pdsch_dmrs_init_length = ((ue->frame_parms.N_RB_DL*12)>>5)+1;
for (int ns=0; ns<ue->frame_parms.slots_per_frame; ns++) {
......
......@@ -79,38 +79,30 @@ int16_t get_kRE_ref(uint8_t dmrs_antenna_port, uint8_t pusch_dmrs_type, uint8_t
return k_RE_ref;
}
/*******************************************************************
*
* NAME : set_ptrs_symb_idx
*
* PARAMETERS : ptrs_symbols PTRS OFDM symbol indicies bit mask
* duration_in_symbols number of scheduled PUSCH ofdm symbols
* start_symbol first ofdm symbol of PUSCH within slot
* L_ptrs the parameter L_ptrs
* ul_dmrs_symb_pos bitmap of the time domain positions of the DMRS symbols in the scheduled PUSCH
*
* RETURN : sets the bit map of PTRS ofdm symbol indicies
*
* DESCRIPTION : 3GPP TS 38.211 6.4.1.2.2.1
*
*********************************************************************/
void set_ptrs_symb_idx(uint16_t *ptrs_symbols,
uint8_t duration_in_symbols,
uint8_t start_symbol,
uint8_t L_ptrs,
uint16_t ul_dmrs_symb_pos) {
*
* NAME : get_ptrs_symb_idx
*
* PARAMETERS : duration_in_symbols number of scheduled PUSCH ofdm symbols
* start_symbol first ofdm symbol of PUSCH within slot
* L_ptrs the parameter L_ptrs
* ul_dmrs_symb_pos bitmap of the time domain positions of the DMRS symbols in the scheduled PUSCH
*
* RETURN : PTRS OFDM symbol indicies bit mask
*
* DESCRIPTION : 3GPP TS 38.211 6.4.1.2.2.1
*
*********************************************************************/
int get_ptrs_symb_idx(const int duration_in_symbols, const int start_symbol, const int L_ptrs, const int ul_dmrs_symb_pos)
{
const int last_symbol = start_symbol + duration_in_symbols - 1;
int i = 0;
int l_ref = start_symbol;
const int last_symbol = start_symbol + duration_in_symbols - 1;
int ptrs_symbols = 0;
if (L_ptrs==0) {
LOG_E(PHY,"bug: impossible L_ptrs\n");
*ptrs_symbols = 0;
return;
return 0;
}
while ( (l_ref + i*L_ptrs) <= last_symbol) {
......@@ -132,9 +124,10 @@ void set_ptrs_symb_idx(uint16_t *ptrs_symbols,
continue;
}
*ptrs_symbols = *ptrs_symbols | (1<<(l_ref + i*L_ptrs));
ptrs_symbols = ptrs_symbols | (1 << (l_ref + i * L_ptrs));
i++;
}
return ptrs_symbols;
}
/*******************************************************************
......@@ -242,20 +235,19 @@ int8_t get_next_estimate_in_slot(uint16_t ptrsSymbPos,uint16_t dmrsSymbPos, ui
* perform phase estimation from regenerated PTRS SC and channel compensated
* signal
*********************************************************************/
void nr_ptrs_cpe_estimation(uint8_t K_ptrs,
uint8_t ptrsReOffset,
uint8_t dmrsConfigType,
uint16_t nb_rb,
uint16_t rnti,
unsigned char Ns,
unsigned char symbol,
uint16_t ofdm_symbol_size,
void nr_ptrs_cpe_estimation(const uint8_t K_ptrs,
const uint8_t ptrsReOffset,
const uint8_t dmrsConfigType,
const uint16_t nb_rb,
const uint16_t rnti,
const unsigned char Ns,
const unsigned char symbol,
const uint16_t ofdm_symbol_size,
const uint32_t *gold_seq,
int16_t *rxF_comp,
uint32_t *gold_seq,
int16_t *error_est,
int32_t *ptrs_sc)
{
//#define DEBUG_PTRS 1
uint8_t is_ptrs_re = 0;
uint16_t re_cnt = 0;
uint16_t cnt = 0;
......@@ -271,9 +263,6 @@ void nr_ptrs_cpe_estimation(uint8_t K_ptrs,
double abs = 0.0;
double real = 0.0;
double imag = 0.0;
#ifdef DEBUG_PTRS
double alpha = 0;
#endif
/* generate PTRS RE for the symbol */
nr_gen_ref_conj_symbols(gold_seq,sc_per_symbol*2,(int16_t*)ptrs_p, NR_MOD_TABLE_QPSK_OFFSET,2);// 2 for QPSK
......@@ -313,7 +302,7 @@ void nr_ptrs_cpe_estimation(uint8_t K_ptrs,
imag += ptrs_ch_p[i].i;
}
#ifdef DEBUG_PTRS
alpha = atan(imag/real);
double alpha = atan(imag / real);
printf("[PHY][PTRS]: Symbol %d atan(Im,real):= %f \n",symbol, alpha );
#endif
/* mean */
......@@ -330,7 +319,6 @@ void nr_ptrs_cpe_estimation(uint8_t K_ptrs,
#endif
}
/*******************************************************************
*
* NAME : nr_ptrs_process_slot
......
......@@ -49,11 +49,7 @@
int16_t get_kRE_ref(uint8_t dmrs_antenna_port, uint8_t pusch_dmrs_type, uint8_t resourceElementOffset);
void set_ptrs_symb_idx(uint16_t *ptrs_symbols,
uint8_t duration_in_symbols,
uint8_t start_symbol,
uint8_t L_ptrs,
uint16_t ul_dmrs_symb_pos);
int get_ptrs_symb_idx(const int duration_in_symbols, const int start_symbol, const int L_ptrs, const int ul_dmrs_symb_pos);
uint8_t is_ptrs_subcarrier(uint16_t k,
uint16_t n_rnti,
......@@ -78,7 +74,10 @@ uint8_t is_ptrs_subcarrier(uint16_t k,
*
*********************************************************************/
static inline uint8_t is_ptrs_symbol(uint8_t l, uint16_t ptrs_symbols) { return ((ptrs_symbols >> l) & 1); }
static inline uint8_t is_ptrs_symbol(const uint8_t l, const uint16_t ptrs_symbols)
{
return ((ptrs_symbols >> l) & 1);
}
uint8_t get_ptrs_symbols_in_slot(uint16_t l_prime_mask, uint16_t start_symb, uint16_t nb_symb);
int8_t get_next_ptrs_symbol_in_slot(uint16_t ptrsSymbPos, uint8_t counter, uint8_t nb_symb);
......@@ -91,16 +90,16 @@ int8_t nr_ptrs_process_slot(uint16_t dmrsSymbPos,
uint16_t noSymb
);
/* general function to estimate common phase error based upon PTRS */
void nr_ptrs_cpe_estimation(uint8_t K_ptrs,
uint8_t ptrsReOffset,
uint8_t dmrsConfigType,
uint16_t nb_rb,
uint16_t rnti,
unsigned char Ns,
unsigned char symbol,
uint16_t ofdm_symbol_size,
void nr_ptrs_cpe_estimation(const uint8_t K_ptrs,
const uint8_t ptrsReOffset,
const uint8_t dmrsConfigType,
const uint16_t nb_rb,
const uint16_t rnti,
const unsigned char Ns,
const unsigned char symbol,
const uint16_t ofdm_symbol_size,
const uint32_t *gold_seq,
int16_t *rxF_comp,
uint32_t *gold_seq,
int16_t *error_est,
int32_t *ptrs_sc);
......
......@@ -31,37 +31,31 @@
/*!\brief This function generates the NR Gold sequence (38-211, Sec 5.2.1) for the PBCH DMRS.
@param PHY_VARS_NR_UE* ue structure provides configuration, frame parameters and the pointers to the 32 bits sequence storage tables
*/
int nr_pbch_dmrs_rx(int dmrss,
unsigned int *nr_gold_pbch,
int32_t *output);
int nr_pbch_dmrs_rx(const int dmrss, const unsigned int *nr_gold_pbch, int32_t *output);
/*!\brief This function generates the NR Gold sequence (38-211, Sec 5.2.1) for the PDCCH DMRS.
@param PHY_VARS_NR_UE* ue structure provides configuration, frame parameters and the pointers to the 32 bits sequence storage tables
*/
int nr_pdcch_dmrs_rx(PHY_VARS_NR_UE *ue,
unsigned int Ns,
unsigned int *nr_gold_pdcch,
int nr_pdcch_dmrs_rx(const unsigned int *nr_gold_pdcch,
int32_t *output,
unsigned short p,
unsigned short nb_rb_corset);
const unsigned short p,
const unsigned short nb_rb_coreset);
int nr_pdsch_dmrs_rx(PHY_VARS_NR_UE *ue,
unsigned int Ns,
unsigned int *nr_gold_pdsch,
int32_t *output,
unsigned short p,
unsigned char lp,
unsigned short nb_pdsch_rb,
uint8_t config_type);
int nr_pdsch_dmrs_rx(const PHY_VARS_NR_UE *ue,
const unsigned int Ns,
const unsigned int *nr_gold_pdsch,
const unsigned short p,
const unsigned char lp,
const unsigned short nb_pdsch_rb,
const uint8_t config_type,
int32_t *output);
void nr_gold_pbch(PHY_VARS_NR_UE* ue);
void nr_gold_pdcch(PHY_VARS_NR_UE* ue,
unsigned short n_idDMRS);
void nr_gold_pdsch(PHY_VARS_NR_UE* ue,
int nscid,
uint32_t nid);
void nr_gold_pdsch(const int nscid, const unsigned int nid, PHY_VARS_NR_UE *ue);
void nr_init_pusch_dmrs(PHY_VARS_NR_UE* ue,
uint16_t N_n_scid,
......
......@@ -80,6 +80,6 @@ bool rx_sss_nr(PHY_VARS_NR_UE *ue,
int32_t *tot_metric,
uint8_t *phase_max,
int *freq_offset_sss,
c16_t rxdataF[][ue->frame_parms.samples_per_slot_wCP]);
c16_t rxdataF[NR_N_SYMBOLS_SSB][ue->frame_parms.nb_antennas_rx][ue->frame_parms.ofdm_symbol_size]);
#endif /* SSS_NR_H */
......@@ -44,20 +44,13 @@ void nr_init_csi_rs(const NR_DL_FRAME_PARMS *fp, uint32_t ***csi_rs, uint32_t Ni
}
void nr_generate_csi_rs(const NR_DL_FRAME_PARMS *frame_parms,
int32_t **dataF,
const int16_t amp,
nr_csi_info_t *nr_csi_info,
const nfapi_nr_dl_tti_csi_rs_pdu_rel15_t *csi_params,
const int slot,
uint8_t *N_cdm_groups,
uint8_t *CDM_group_size,
uint8_t *k_prime,
uint8_t *l_prime,
uint8_t *N_ports,
uint8_t *j_cdm,
uint8_t *k_overline,
uint8_t *l_overline) {
const nfapi_nr_dl_tti_csi_rs_pdu_rel15_t *csi_params,
c16_t **dataF,
nr_csi_info_t *nr_csi_info,
nr_csi_phy_parms_t *csi_phy_parms)
{
#ifdef NR_CSIRS_DEBUG
LOG_I(NR_PHY, "csi_params->subcarrier_spacing = %i\n", csi_params->subcarrier_spacing);
LOG_I(NR_PHY, "csi_params->cyclic_prefix = %i\n", csi_params->cyclic_prefix);
......@@ -628,12 +621,12 @@ void nr_generate_csi_rs(const NR_DL_FRAME_PARMS *frame_parms,
// ZP CSI RS
if (csi_params->csi_type == 2) {
((int16_t*)dataF[p])[((l*frame_parms->ofdm_symbol_size + k)<<1)+(2*dataF_offset)] = 0;
((int16_t*)dataF[p])[((l*frame_parms->ofdm_symbol_size + k)<<1)+1+(2*dataF_offset)] = 0;
dataF[p][l * frame_parms->ofdm_symbol_size + k + dataF_offset] = (c16_t){0};
}
else {
((int16_t*)dataF[p])[((l*frame_parms->ofdm_symbol_size + k)<<1)+(2*dataF_offset)] = (beta*wt*wf*mod_csi[l][mprime<<1]) >> 15;
((int16_t*)dataF[p])[((l*frame_parms->ofdm_symbol_size + k)<<1)+1+(2*dataF_offset)] = (beta*wt*wf*mod_csi[l][(mprime<<1) + 1]) >> 15;
dataF[p][l * frame_parms->ofdm_symbol_size + k + dataF_offset].r = (beta * wt * wf * mod_csi[l][mprime << 1]) >> 15;
dataF[p][l * frame_parms->ofdm_symbol_size + k + dataF_offset].i =
(beta * wt * wf * mod_csi[l][(mprime << 1) + 1]) >> 15;
}
#ifdef NR_CSIRS_DEBUG
printf("l,k (%d,%d) seq. index %d \t port %d \t (%d,%d)\n",l,k,mprime,p+3000,
......@@ -646,14 +639,17 @@ void nr_generate_csi_rs(const NR_DL_FRAME_PARMS *frame_parms,
}
}
}
if (N_cdm_groups) *N_cdm_groups = size;
if (CDM_group_size) *CDM_group_size = gs;
if (k_prime) *k_prime = kprime;
if (l_prime) *l_prime = lprime;
if (N_ports) *N_ports = ports;
if (j_cdm) memcpy(j_cdm,j,16*sizeof(uint8_t));
if (k_overline) memcpy(k_overline,koverline,16*sizeof(uint8_t));
if (l_overline) memcpy(l_overline,loverline,16*sizeof(uint8_t));
if (csi_phy_parms) {
csi_phy_parms->N_cdm_groups = size;
csi_phy_parms->CDM_group_size = gs;
csi_phy_parms->k_prime = kprime;
csi_phy_parms->l_prime = lprime;
csi_phy_parms->N_ports = ports;
memcpy(csi_phy_parms->j_cdm, j, sizeof(csi_phy_parms->j_cdm));
memcpy(csi_phy_parms->k_overline, koverline, sizeof(csi_phy_parms->k_overline));
memcpy(csi_phy_parms->l_overline, loverline, sizeof(csi_phy_parms->l_overline));
}
#ifdef NR_CSIRS_DEBUG
if (N_ports) LOG_I(NR_PHY, "nr_csi_info->N_ports = %d\n", *N_ports);
......
......@@ -116,11 +116,8 @@ void nr_generate_pdsch(processingData_L1tx_t *msgTx,
uint16_t ptrs_idx = 0;
uint8_t is_ptrs_re = 0;
if(rel15->pduBitmap & 0x1) {
set_ptrs_symb_idx(&dlPtrsSymPos,
rel15->NrOfSymbols,
rel15->StartSymbolIndex,
1<<rel15->PTRSTimeDensity,
rel15->dlDmrsSymbPos);
dlPtrsSymPos =
get_ptrs_symb_idx(rel15->NrOfSymbols, rel15->StartSymbolIndex, 1 << rel15->PTRSTimeDensity, rel15->dlDmrsSymbPos);
n_ptrs = (rel15->rbSize + rel15->PTRSFreqDensity - 1)/rel15->PTRSFreqDensity;
}
......
......@@ -311,19 +311,12 @@ void free_nr_ru_prach_entry(RU_t *ru, int prach_id);
uint8_t get_nr_prach_duration(uint8_t prach_format);
void nr_generate_csi_rs(const NR_DL_FRAME_PARMS *frame_parms,
int32_t **dataF,
const int16_t amp,
nr_csi_info_t *nr_csi_info,
const nfapi_nr_dl_tti_csi_rs_pdu_rel15_t *csi_params,
const int slot,
uint8_t *N_cdm_groups,
uint8_t *CDM_group_size,
uint8_t *k_prime,
uint8_t *l_prime,
uint8_t *N_ports,
uint8_t *j_cdm,
uint8_t *k_overline,
uint8_t *l_overline);
const nfapi_nr_dl_tti_csi_rs_pdu_rel15_t *csi_params,
c16_t **dataF,
nr_csi_info_t *nr_csi_info,
nr_csi_phy_parms_t *csi_phy_parms);
void free_nr_prach_entry(PHY_VARS_gNB *gNB, int prach_id);
......
......@@ -1522,18 +1522,22 @@ int nr_rx_pusch_tp(PHY_VARS_gNB *gNB,
nvar /= (rel15_ul->nr_of_symbols * rel15_ul->nrOfLayers * frame_parms->nb_antennas_rx);
// averaging time domain channel estimates
if (gNB->chest_time == 1)
{
if (gNB->chest_time == 1) { // averaging time domain channel estimates
for (int aarx = 0; aarx < frame_parms->nb_antennas_rx; aarx++) {
nr_chest_time_domain_avg(frame_parms,
pusch_vars->ul_ch_estimates,
rel15_ul->nr_of_symbols,
rel15_ul->start_symbol_index,
rel15_ul->ul_dmrs_symb_pos,
rel15_ul->rb_size);
pusch_vars->dmrs_symbol = get_next_dmrs_symbol_in_slot(rel15_ul->ul_dmrs_symb_pos,
rel15_ul->start_symbol_index,
rel15_ul->nr_of_symbols);
rel15_ul->rb_size,
0,
0,
0,
false,
(c16_t *)pusch_vars->ul_ch_estimates[aarx]);
}
pusch_vars->dmrs_symbol =
get_next_dmrs_symbol_in_slot(rel15_ul->ul_dmrs_symb_pos, rel15_ul->start_symbol_index, rel15_ul->nr_of_symbols);
}
stop_meas(&gNB->ulsch_channel_estimation_stats);
......
......@@ -33,15 +33,15 @@
// The adjustment is performed once per frame based on the
// last channel estimate of the receiver
void nr_adjust_synch_ue(NR_DL_FRAME_PARMS *frame_parms,
PHY_VARS_NR_UE *ue,
module_id_t gNB_id,
const int estimateSz,
struct complex16 dl_ch_estimates_time[][estimateSz],
uint8_t frame,
uint8_t subframe,
unsigned char clear,
short coef)
void nr_adjust_synch_ue(PHY_VARS_NR_UE *ue,
const c16_t dl_ch_estimates_time[][ue->frame_parms.ofdm_symbol_size],
const uint8_t frame,
const uint8_t subframe,
const unsigned char clear,
const short coef,
int64_t *max_pos_fil,
int *rx_offset,
int *time_sync_cell)
{
static int count_max_pos_ok = 0;
......@@ -49,12 +49,13 @@ void nr_adjust_synch_ue(NR_DL_FRAME_PARMS *frame_parms,
int max_val = 0, max_pos = 0;
const int sync_pos = 0;
uint8_t sync_offset = 0;
const NR_DL_FRAME_PARMS *frame_parms = &ue->frame_parms;
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_ADJUST_SYNCH, VCD_FUNCTION_IN);
short ncoef = 32767 - coef;
LOG_D(PHY,"AbsSubframe %d: rx_offset (before) = %d\n",subframe,ue->rx_offset);
LOG_D(PHY, "AbsSubframe %d: rx_offset (before) = %d\n", subframe, *rx_offset);
// search for maximum position within the cyclic prefix
for (int i = -frame_parms->nb_prefix_samples/2; i < frame_parms->nb_prefix_samples/2; i++) {
......@@ -75,9 +76,9 @@ void nr_adjust_synch_ue(NR_DL_FRAME_PARMS *frame_parms,
// filter position to reduce jitter
if (clear == 1)
ue->max_pos_fil = max_pos << 15;
*max_pos_fil = max_pos << 15;
else
ue->max_pos_fil = ((ue->max_pos_fil * coef) >> 15) + (max_pos * ncoef);
*max_pos_fil = ((*max_pos_fil * coef) >> 15) + (max_pos * ncoef);
// do not filter to have proactive timing adjustment
//ue->max_pos_fil = max_pos << 15;
......@@ -90,9 +91,9 @@ void nr_adjust_synch_ue(NR_DL_FRAME_PARMS *frame_parms,
sync_offset = 0;
if ( abs(diff) < (SYNCH_HYST+sync_offset) )
ue->rx_offset = 0;
*rx_offset = 0;
else
ue->rx_offset = diff;
*rx_offset = diff;
const int sample_shift = -(ue->rx_offset>>1);
// reset IIR filter for next offset calculation
......@@ -107,11 +108,14 @@ void nr_adjust_synch_ue(NR_DL_FRAME_PARMS *frame_parms,
if(count_max_pos_ok > 10 && first_time == 1) {
first_time = 0;
ue->time_sync_cell = 1;
*time_sync_cell = 1;
}
#ifdef DEBUG_PHY
LOG_I(PHY,"AbsSubframe %d: diff = %i, rx_offset (final) = %i : clear = %d, max_pos = %d, max_pos_fil = %d, max_val = %d, sync_pos %d\n",
LOG_I(PHY,
"AbsSubframe %d.%d: diff = %i, rx_offset (final) = %i : clear = %d, max_pos = %d, max_pos_fil = %ld, max_val = %d, "
"sync_pos %d\n",
frame,
subframe,
diff,
ue->rx_offset,
......
......@@ -179,29 +179,22 @@ void nr_ue_measurements(PHY_VARS_NR_UE *ue,
// - RSRP: W (dBW)
// - RX Gain dB
void nr_ue_ssb_rsrp_measurements(PHY_VARS_NR_UE *ue,
int ssb_index,
UE_nr_rxtx_proc_t *proc,
c16_t rxdataF[][ue->frame_parms.samples_per_slot_wCP]) {
int k_start = 56;
int k_end = 183;
int slot = proc->nr_slot_rx;
unsigned int ssb_offset = ue->frame_parms.first_carrier_offset + ue->frame_parms.ssb_start_subcarrier;
int symbol_offset = nr_get_ssb_start_symbol(&ue->frame_parms,ssb_index);
if (ue->frame_parms.half_frame_bit)
symbol_offset += (ue->frame_parms.slots_per_frame>>1)*ue->frame_parms.symbols_per_slot;
uint8_t l_sss = (symbol_offset + 2) % ue->frame_parms.symbols_per_slot;
const int ssb_index,
const UE_nr_rxtx_proc_t *proc,
const c16_t rxdataF[ue->frame_parms.nb_antennas_rx][ue->frame_parms.ofdm_symbol_size])
{
const int k_start = 56;
const int k_end = 183;
const int slot = proc->nr_slot_rx;
const unsigned int ssb_offset = ue->frame_parms.first_carrier_offset + ue->frame_parms.ssb_start_subcarrier;
uint32_t rsrp = 0;
LOG_D(PHY, "In %s: [UE %d] slot %d l_sss %d ssb_offset %d\n", __FUNCTION__, ue->Mod_id, slot, l_sss, ssb_offset);
LOG_D(PHY, "In %s: [UE %d] slot %d \n", __FUNCTION__, ue->Mod_id, slot);
int nb_re = 0;
for (int aarx = 0; aarx < ue->frame_parms.nb_antennas_rx; aarx++) {
int16_t *rxF_sss = (int16_t *)&rxdataF[aarx][l_sss*ue->frame_parms.ofdm_symbol_size];
int16_t *rxF_sss = (int16_t *)rxdataF[aarx];
for(int k = k_start; k < k_end; k++){
......@@ -235,60 +228,53 @@ void nr_ue_ssb_rsrp_measurements(PHY_VARS_NR_UE *ue,
// Measurement units:
// - psd_awgn (AWGN power spectral density): dBm/Hz
void nr_ue_rrc_measurements(PHY_VARS_NR_UE *ue,
UE_nr_rxtx_proc_t *proc,
c16_t rxdataF[][ue->frame_parms.samples_per_slot_wCP]){
uint8_t k;
int slot = proc->nr_slot_rx;
int aarx;
int16_t *rxF_sss;
const UE_nr_rxtx_proc_t *proc,
const c16_t rxdataF[ue->frame_parms.nb_antennas_rx][ue->frame_parms.ofdm_symbol_size])
{
const int slot = proc->nr_slot_rx;
const int16_t *rxF_sss;
const uint8_t k_left = 48;
const uint8_t k_right = 183;
const uint8_t k_length = 8;
uint8_t l_sss = (ue->symbol_offset + 2) % ue->frame_parms.symbols_per_slot;
unsigned int ssb_offset = ue->frame_parms.first_carrier_offset + ue->frame_parms.ssb_start_subcarrier;
double rx_gain = openair0_cfg[0].rx_gain[0];
double rx_gain_offset = openair0_cfg[0].rx_gain_offset[0];
const unsigned int ssb_offset = ue->frame_parms.first_carrier_offset + ue->frame_parms.ssb_start_subcarrier;
const double rx_gain = openair0_cfg[0].rx_gain[0];
const double rx_gain_offset = openair0_cfg[0].rx_gain_offset[0];
ue->measurements.n0_power_tot = 0;
LOG_D(PHY, "In %s doing measurements for ssb_offset %d l_sss %d \n", __FUNCTION__, ssb_offset, l_sss);
for (aarx = 0; aarx<ue->frame_parms.nb_antennas_rx; aarx++) {
LOG_D(PHY, "In %s doing measurements for ssb_offset %d \n", __FUNCTION__, ssb_offset);
for (int aarx = 0; aarx < ue->frame_parms.nb_antennas_rx; aarx++) {
ue->measurements.n0_power[aarx] = 0;
rxF_sss = (int16_t *)&rxdataF[aarx][l_sss*ue->frame_parms.ofdm_symbol_size];
rxF_sss = (int16_t *)rxdataF[aarx];
//-ve spectrum from SSS
for(k = k_left; k < k_left + k_length; k++){
for (int k = k_left; k < k_left + k_length; k++) {
int re = (ssb_offset + k) % ue->frame_parms.ofdm_symbol_size;
#ifdef DEBUG_MEAS_RRC
LOG_I(PHY, "In %s -rxF_sss %d %d\n", __FUNCTION__, rxF_sss[re*2], rxF_sss[re*2 + 1]);
#endif
ue->measurements.n0_power[aarx] += (((int32_t)rxF_sss[re*2]*rxF_sss[re*2]) + ((int32_t)rxF_sss[re*2 + 1]*rxF_sss[re*2 + 1]));
ue->measurements.n0_power[aarx] +=
(((int32_t)rxF_sss[re * 2] * rxF_sss[re * 2]) + ((int32_t)rxF_sss[re * 2 + 1] * rxF_sss[re * 2 + 1]));
}
//+ve spectrum from SSS
for(k = k_right; k < k_right + k_length; k++){
for (int k = k_right; k < k_right + k_length; k++) {
int re = (ssb_offset + k) % ue->frame_parms.ofdm_symbol_size;
#ifdef DEBUG_MEAS_RRC
LOG_I(PHY, "In %s +rxF_sss %d %d\n", __FUNCTION__, rxF_sss[re*2], rxF_sss[re*2 + 1]);
#endif
ue->measurements.n0_power[aarx] += (((int32_t)rxF_sss[re*2]*rxF_sss[re*2]) + ((int32_t)rxF_sss[re*2 + 1]*rxF_sss[re*2 + 1]));
ue->measurements.n0_power[aarx] +=
(((int32_t)rxF_sss[re * 2] * rxF_sss[re * 2]) + ((int32_t)rxF_sss[re * 2 + 1] * rxF_sss[re * 2 + 1]));
}
ue->measurements.n0_power[aarx] /= 2*k_length;
ue->measurements.n0_power_dB[aarx] = (unsigned short) dB_fixed(ue->measurements.n0_power[aarx]);
ue->measurements.n0_power_tot += ue->measurements.n0_power[aarx];
}
ue->measurements.n0_power_tot_dB = (unsigned short) dB_fixed(ue->measurements.n0_power_tot);
......@@ -300,11 +286,12 @@ void nr_ue_rrc_measurements(PHY_VARS_NR_UE *ue,
LOG_D(PHY, "In [%s][slot:%d] NF USRP %d dB\n", __FUNCTION__, slot, nf_usrp);
#endif
LOG_D(PHY, "In [%s][slot:%d] Noise Level %d (digital level %d dB, noise power spectral density %f dBm/RE)\n",
LOG_D(PHY,
"In [%s][slot:%d] Noise Level %d (digital level %d dB, noise power spectral density %f dBm/RE)\n",
__FUNCTION__,
slot,
ue->measurements.n0_power_tot,
ue->measurements.n0_power_tot_dB,
ue->measurements.n0_power_tot_dB + 30 - 10*log10(pow(2, 30)) - dB_fixed(ue->frame_parms.ofdm_symbol_size) - ((int)rx_gain - (int)rx_gain_offset));
ue->measurements.n0_power_tot_dB + 30 - 10 * log10(pow(2, 30)) - dB_fixed(ue->frame_parms.ofdm_symbol_size)
- ((int)rx_gain - (int)rx_gain_offset));
}
This diff is collapsed.
......@@ -48,21 +48,18 @@ int16_t nr_zeros[8] __attribute__((aligned(16))) = {0, 0, 0, 0, 0, 0, 0, 0};
// QPSK
//----------------------------------------------------------------------------------------------
int nr_dlsch_qpsk_llr(NR_DL_FRAME_PARMS *frame_parms,
int32_t *rxdataF_comp,
int nr_dlsch_qpsk_llr(const NR_DL_FRAME_PARMS *frame_parms,
const c16_t *rxdataF_comp,
int16_t *dlsch_llr,
uint8_t symbol,
uint32_t len,
uint8_t first_symbol_flag,
uint16_t nb_rb)
const uint32_t len,
const uint16_t nb_rb)
{
c16_t *rxF = (c16_t *)&rxdataF_comp[((int32_t)symbol*nb_rb*12)];
c16_t *rxF = (c16_t *)rxdataF_comp;
c16_t *llr32 = (c16_t *)dlsch_llr;
int i;
if (!llr32) {
LOG_E(PHY,"nr_dlsch_qpsk_llr: llr is null, symbol %d, llr32=%p\n",symbol, llr32);
LOG_E(PHY, "nr_dlsch_qpsk_llr: llr is null, llr32=%p\n", llr32);
return(-1);
}
......@@ -89,39 +86,30 @@ int nr_dlsch_qpsk_llr(NR_DL_FRAME_PARMS *frame_parms,
// 16-QAM
//----------------------------------------------------------------------------------------------
void nr_dlsch_16qam_llr(NR_DL_FRAME_PARMS *frame_parms,
int32_t *rxdataF_comp,
void nr_dlsch_16qam_llr(const NR_DL_FRAME_PARMS *frame_parms,
const c16_t *rxdataF_comp,
int16_t *dlsch_llr,
int32_t *dl_ch_mag,
uint8_t symbol,
uint32_t len,
uint8_t first_symbol_flag,
uint16_t nb_rb)
const c16_t *dl_ch_mag,
const uint32_t len,
const uint16_t nb_rb)
{
simde__m128i *rxF = (simde__m128i*)&rxdataF_comp[(symbol*nb_rb*12)];
simde__m128i *ch_mag;
simde__m128i *rxF = (simde__m128i *)rxdataF_comp;
simde__m128i llr128[2];
uint32_t *llr32;
int i;
unsigned char len_mod4=0;
llr32 = (uint32_t*)dlsch_llr;
ch_mag = (simde__m128i *)dl_ch_mag;
uint32_t *llr32 = (uint32_t *)dlsch_llr;
simde__m128i *ch_mag = (simde__m128i *)dl_ch_mag;
// printf("len=%d\n", len);
len_mod4 = len&3;
// printf("len_mod4=%d\n", len_mod4);
len>>=2; // length in quad words (4 REs)
int nlen = len >> 2; // length in quad words (4 REs)
// printf("len>>=2=%d\n", len);
len+=(len_mod4==0 ? 0 : 1);
nlen += (len_mod4 == 0 ? 0 : 1);
// printf("len+=%d\n", len);
for (i=0; i<len; i++) {
for (i = 0; i < nlen; i++) {
simde__m128i xmm0 =simde_mm_abs_epi16(rxF[i]);
xmm0 =simde_mm_subs_epi16(ch_mag[i],xmm0);
......@@ -136,8 +124,7 @@ void nr_dlsch_16qam_llr(NR_DL_FRAME_PARMS *frame_parms,
llr32[5] =simde_mm_extract_epi32(llr128[1],1); //((uint32_t *)&llr128[1])[1];
llr32[6] =simde_mm_extract_epi32(llr128[1],2); //((uint32_t *)&llr128[1])[2];
llr32[7] =simde_mm_extract_epi32(llr128[1],3); //((uint32_t *)&llr128[1])[3];
llr32+=8;
llr32 += 8;
}
simde_mm_empty();
......@@ -148,32 +135,28 @@ void nr_dlsch_16qam_llr(NR_DL_FRAME_PARMS *frame_parms,
// 64-QAM
//----------------------------------------------------------------------------------------------
void nr_dlsch_64qam_llr(NR_DL_FRAME_PARMS *frame_parms,
int32_t *rxdataF_comp,
void nr_dlsch_64qam_llr(const NR_DL_FRAME_PARMS *frame_parms,
const c16_t *rxdataF_comp,
int16_t *dlsch_llr,
int32_t *dl_ch_mag,
int32_t *dl_ch_magb,
uint8_t symbol,
uint32_t len,
uint8_t first_symbol_flag,
uint16_t nb_rb)
const c16_t *dl_ch_mag,
const c16_t *dl_ch_magb,
const uint32_t len,
const uint16_t nb_rb)
{
simde__m128i *rxF = (simde__m128i*)&rxdataF_comp[(symbol*nb_rb*12)];
simde__m128i *ch_mag,*ch_magb;
const simde__m128i *rxF = (simde__m128i *)rxdataF_comp;
int i,len2;
unsigned char len_mod4;
int16_t *llr2;
llr2 = dlsch_llr;
ch_mag = (simde__m128i *)dl_ch_mag;
ch_magb = (simde__m128i *)dl_ch_magb;
const simde__m128i *ch_mag = (simde__m128i *)dl_ch_mag;
const simde__m128i *ch_magb = (simde__m128i *)dl_ch_magb;
// printf("nr_dlsch_64qam_llr: symbol %d,nb_rb %d, len %d,pbch_pss_sss_adjust %d\n",symbol,nb_rb,len,pbch_pss_sss_adjust);
// printf("nr_dlsch_64qam_llr: symbol %d,nb_rb %d, len %d,pbch_pss_sss_adjust %d\n",symbol,nb_rb,len,pbch_pss_sss_adjust);
/* LOG_I(PHY,"nr_dlsch_64qam_llr [symb %d / FirstSym %d / Length %d]: @LLR Buff %x \n",
/* LOG_I(PHY,"nr_dlsch_64qam_llr [symb %d / Length %d]: @LLR Buff %x \n",
symbol,
first_symbol_flag,
len,
dlsch_llr,
pllr_symbol);*/
......@@ -243,19 +226,16 @@ void nr_dlsch_64qam_llr(NR_DL_FRAME_PARMS *frame_parms,
// 256-QAM
//----------------------------------------------------------------------------------------------
void nr_dlsch_256qam_llr(NR_DL_FRAME_PARMS *frame_parms,
int32_t *rxdataF_comp,
void nr_dlsch_256qam_llr(const NR_DL_FRAME_PARMS *frame_parms,
const c16_t *rxdataF_comp,
int16_t *dlsch_llr,
int32_t *dl_ch_mag,
int32_t *dl_ch_magb,
int32_t *dl_ch_magr,
uint8_t symbol,
uint32_t len,
uint8_t first_symbol_flag,
uint16_t nb_rb)
const c16_t *dl_ch_mag,
const c16_t *dl_ch_magb,
const c16_t *dl_ch_magr,
const uint32_t len,
const uint16_t nb_rb)
{
simde__m128i *rxF = (simde__m128i*)&rxdataF_comp[(symbol*nb_rb*12)];
simde__m128i *ch_mag,*ch_magb,*ch_magr;
const simde__m128i *rxF = (simde__m128i *)rxdataF_comp;
int i,len2;
unsigned char len_mod4;
......@@ -263,9 +243,9 @@ void nr_dlsch_256qam_llr(NR_DL_FRAME_PARMS *frame_parms,
llr2 = dlsch_llr;
ch_mag = (simde__m128i *)dl_ch_mag;
ch_magb = (simde__m128i *)dl_ch_magb;
ch_magr = (simde__m128i *)dl_ch_magr;
const simde__m128i *ch_mag = (simde__m128i *)dl_ch_mag;
const simde__m128i *ch_magb = (simde__m128i *)dl_ch_magb;
const simde__m128i *ch_magr = (simde__m128i *)dl_ch_magr;
len_mod4 =len&3;
len2=len>>2; // length in quad words (4 REs)
......
......@@ -44,6 +44,7 @@
#include "PHY/NR_REFSIG/pss_nr.h"
#include "PHY/NR_REFSIG/sss_nr.h"
#include "PHY/NR_REFSIG/refsig_defs_ue.h"
#include "openair1/PHY/NR_UE_TRANSPORT/nr_transport_proto_ue.h"
extern openair0_config_t openair0_cfg[];
//static nfapi_nr_config_request_t config_t;
......@@ -100,8 +101,10 @@ void free_list(NR_UE_SSB *node) {
free(node);
}
int nr_pbch_detection(UE_nr_rxtx_proc_t * proc, PHY_VARS_NR_UE *ue, int pbch_initial_symbol, c16_t rxdataF[][ue->frame_parms.samples_per_slot_wCP])
int nr_pbch_detection(UE_nr_rxtx_proc_t *proc,
PHY_VARS_NR_UE *ue,
const int pbch_initial_symbol,
const c16_t rxdataF[NR_N_SYMBOLS_SSB][ue->frame_parms.nb_antennas_rx][ue->frame_parms.ofdm_symbol_size])
{
NR_DL_FRAME_PARMS *frame_parms=&ue->frame_parms;
int ret =-1;
......@@ -114,8 +117,8 @@ int nr_pbch_detection(UE_nr_rxtx_proc_t * proc, PHY_VARS_NR_UE *ue, int pbch_ini
ue->rx_offset);
#endif
uint8_t N_L = (frame_parms->Lmax == 4)? 4:8;
uint8_t N_hf = (frame_parms->Lmax == 4)? 2:1;
const uint8_t N_L = (frame_parms->Lmax == 4) ? 4 : 8;
const uint8_t N_hf = (frame_parms->Lmax == 4) ? 2 : 1;
// loops over possible pbch dmrs cases to retrive best estimated i_ssb (and n_hf for Lmax=4) for multiple ssb detection
for (int hf = 0; hf < N_hf; hf++) {
......@@ -124,11 +127,9 @@ int nr_pbch_detection(UE_nr_rxtx_proc_t * proc, PHY_VARS_NR_UE *ue, int pbch_ini
// initialization of structure
current_ssb = create_ssb_node(l,hf);
start_meas(&ue->dlsch_channel_estimation_stats);
// computing correlation between received DMRS symbols and transmitted sequence for current i_ssb and n_hf
for(int i=pbch_initial_symbol; i<pbch_initial_symbol+3;i++)
nr_pbch_dmrs_correlation(ue,proc,i,i-pbch_initial_symbol,current_ssb,rxdataF);
stop_meas(&ue->dlsch_channel_estimation_stats);
nr_pbch_dmrs_correlation(ue, proc, i, i - pbch_initial_symbol, current_ssb, rxdataF[i]);
current_ssb->metric = current_ssb->c_re*current_ssb->c_re + current_ssb->c_im*current_ssb->c_im;
......@@ -142,35 +143,31 @@ int nr_pbch_detection(UE_nr_rxtx_proc_t * proc, PHY_VARS_NR_UE *ue, int pbch_ini
}
NR_UE_SSB *temp_ptr=best_ssb;
while (ret!=0 && temp_ptr != NULL) {
start_meas(&ue->dlsch_channel_estimation_stats);
while (ret != 0 && temp_ptr != NULL) {
// computing channel estimation for selected best ssb
const int estimateSz = frame_parms->symbols_per_slot * frame_parms->ofdm_symbol_size;
__attribute__ ((aligned(32))) struct complex16 dl_ch_estimates[frame_parms->nb_antennas_rx][estimateSz];
__attribute__ ((aligned(32))) struct complex16 dl_ch_estimates_time[frame_parms->nb_antennas_rx][frame_parms->ofdm_symbol_size];
int16_t pbch_e_rx[NR_POLAR_PBCH_E];
for(int i=pbch_initial_symbol; i<pbch_initial_symbol+3;i++)
nr_pbch_channel_estimation(ue,estimateSz, dl_ch_estimates, dl_ch_estimates_time,
proc,i,i-pbch_initial_symbol,temp_ptr->i_ssb,temp_ptr->n_hf,rxdataF);
stop_meas(&ue->dlsch_channel_estimation_stats);
fapiPbch_t result = {0};
ret = nr_rx_pbch(ue,
proc,
estimateSz,
dl_ch_estimates,
frame_parms,
for (int i = pbch_initial_symbol; i < pbch_initial_symbol + 3; i++) {
for (int aarx = 0; aarx < ue->frame_parms.nb_antennas_rx; aarx++) {
nr_pbch_channel_estimation(ue,
i - pbch_initial_symbol,
temp_ptr->i_ssb,
SISO,
&result,
rxdataF);
temp_ptr->n_hf,
rxdataF[i][aarx],
dl_ch_estimates[aarx]);
}
nr_generate_pbch_llr(ue, i - pbch_initial_symbol + 1, temp_ptr->i_ssb, rxdataF[i], dl_ch_estimates, pbch_e_rx);
}
fapiPbch_t pbchResult = {0}; /* TODO: Not used anywhere. To be cleaned later */
ret = nr_pbch_decode(ue, proc, temp_ptr->i_ssb, pbch_e_rx, &pbchResult);
if (DUMP_PBCH_CH_ESTIMATES && (ret == 0)) {
write_output("pbch_ch_estimates.m", "pbch_ch_estimates", dl_ch_estimates, frame_parms->nb_antennas_rx*estimateSz, 1, 1);
write_output("pbch_ch_estimates_time.m", "pbch_ch_estimates_time", dl_ch_estimates_time, frame_parms->nb_antennas_rx*frame_parms->ofdm_symbol_size, 1, 1);
write_output("pbch_ch_estimates.m", "pbch_ch_estimates", dl_ch_estimates, frame_parms->nb_antennas_rx * estimateSz, 1, 1);
}
ue->init_sync_ssbIdx = temp_ptr->i_ssb;
temp_ptr=temp_ptr->next_ssb;
}
......@@ -228,8 +225,6 @@ int nr_initial_sync(UE_nr_rxtx_proc_t *proc,
* sync_pos SS/PBCH block
*/
const uint32_t rxdataF_sz = ue->frame_parms.samples_per_slot_wCP;
__attribute__ ((aligned(32))) c16_t rxdataF[ue->frame_parms.nb_antennas_rx][rxdataF_sz];
cnt++;
if (1){ // (cnt>100)
cnt =0;
......@@ -279,8 +274,23 @@ int nr_initial_sync(UE_nr_rxtx_proc_t *proc,
/* time samples in buffer rxdata are used as input of FFT -> FFT results are stored in the frequency buffer rxdataF */
/* rxdataF stores SS/PBCH from beginning of buffers in the same symbol order as in time domain */
for (int i = 0; i < NR_N_SYMBOLS_SSB; i++)
nr_slot_fep_init_sync(ue, proc, i, frame_id * fp->samples_per_frame + ue->ssb_offset, false, rxdataF, link_type_dl);
__attribute__((aligned(32)))
c16_t rxdata[NR_N_SYMBOLS_SSB][fp->nb_antennas_rx][fp->ofdm_symbol_size + fp->nb_prefix_samples0];
__attribute__((aligned(32))) c16_t rxdataF[NR_N_SYMBOLS_SSB][fp->nb_antennas_rx][fp->ofdm_symbol_size];
for (int aarx = 0; aarx < fp->nb_antennas_rx; aarx++) {
const int symbolSamples = (fp->ofdm_symbol_size + fp->nb_prefix_samples);
for (int symbol = 0; symbol < NR_N_SYMBOLS_SSB; symbol++) {
memcpy(rxdata[symbol][aarx],
&ue->common_vars.rxdata[aarx][frame_id * fp->samples_per_frame + ue->ssb_offset + (symbol * symbolSamples)
+ fp->nb_prefix_samples],
sizeof(c16_t) * fp->ofdm_symbol_size);
}
}
for (int i = 0; i < NR_N_SYMBOLS_SSB; i++) {
nr_symbol_fep(ue, proc->nr_slot_rx, i, link_type_dl, rxdata[i], rxdataF[i]);
}
#ifdef DEBUG_INITIAL_SYNCH
LOG_I(PHY,"Calling sss detection (normal CP)\n");
......@@ -332,7 +342,7 @@ int nr_initial_sync(UE_nr_rxtx_proc_t *proc,
// compute the scrambling IDs for PDSCH DMRS
for (int i=0; i<NR_NB_NSCID; i++) {
ue->scramblingID_dlsch[i]=fp->Nid_cell;
nr_gold_pdsch(ue, i, ue->scramblingID_dlsch[i]);
nr_gold_pdsch(i, ue->scramblingID_dlsch[i], ue);
}
nr_init_csi_rs(fp, ue->nr_csi_info->nr_gold_csi_rs, fp->Nid_cell);
......
This diff is collapsed.
......@@ -253,13 +253,7 @@ void nr_ue_ulsch_procedures(PHY_VARS_NR_UE *UE,
beta_ptrs = 1; // temp value until power control is implemented
ulsch_ue->ptrs_symbols = 0;
set_ptrs_symb_idx(&ulsch_ue->ptrs_symbols,
number_of_symbols,
start_symbol,
L_ptrs,
ul_dmrs_symb_pos);
ulsch_ue->ptrs_symbols = get_ptrs_symb_idx(number_of_symbols, start_symbol, L_ptrs, ul_dmrs_symb_pos);
}
///////////
......
This diff is collapsed.
......@@ -155,12 +155,7 @@ int mult_cpx_vector(int16_t *x1, //Q15
return(0);
}
int multadd_cpx_vector(int16_t *x1,
int16_t *x2,
int16_t *y,
uint8_t zero_flag,
uint32_t N,
int output_shift)
int multadd_cpx_vector(int16_t *x1, const int16_t *x2, int16_t *y, uint8_t zero_flag, uint32_t N, int output_shift)
{
// Multiply elementwise the complex conjugate of x1 with x2.
// x1 - input 1 in the format |Re0 Im0 Re1 Im1|,......,|Re(N-2) Im(N-2) Re(N-1) Im(N-1)|
......
......@@ -19,7 +19,7 @@
* contact@openairinterface.org
*/
unsigned char log2_approx(unsigned int x)
unsigned char log2_approx(const unsigned int x)
{
int i;
......
......@@ -58,7 +58,7 @@ int end_forms(void) {
return -1;
}
void copyData(void *scopeData, enum scopeDataType type, void *dataIn, int elementSz, int colSz, int lineSz, int offset)
void copyData(void *scopeData, enum scopeDataType type, const void *dataIn, int elementSz, int colSz, int lineSz, int offset)
{
scopeData_t *tmp = (scopeData_t *)scopeData;
......
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
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