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, ...@@ -310,8 +310,8 @@ int cce_to_reg_interleaving(const int R, int k, int n_shift, const int C, int L,
return f; 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; uint8_t count=0, start=0, start_set=0;
uint64_t bitmap = (((uint64_t)FreqDomainResource[0])<<37)| uint64_t bitmap = (((uint64_t)FreqDomainResource[0])<<37)|
......
...@@ -95,7 +95,7 @@ uint64_t reverse_bits(uint64_t in, int n_bits); ...@@ -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 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 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); 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); int get_nr_table_idx(int nr_bandP, uint8_t scs_index);
int32_t get_delta_duplex(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); 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, ...@@ -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); 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 CEILIDIV(a,b) ((a+b-1)/b)
#define ROUNDIDIV(a,b) (((a<<1)+b)/(b<<1)) #define ROUNDIDIV(a,b) (((a<<1)+b)/(b<<1))
......
...@@ -246,7 +246,8 @@ void rx_func(void *param) ...@@ -246,7 +246,8 @@ void rx_func(void *param)
gNB->frame_parms.N_RB_UL, gNB->frame_parms.N_RB_UL,
soffset, soffset,
0, 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); phy_procedures_gNB_uespec_RX(gNB, frame_rx, slot_rx);
......
This diff is collapsed.
...@@ -68,7 +68,7 @@ typedef struct { ...@@ -68,7 +68,7 @@ typedef struct {
typedef struct { typedef struct {
/// frequency_domain_resource; /// frequency_domain_resource;
uint8_t frequency_domain_resource[6]; uint8_t frequency_domain_resource[6];
uint8_t StartSymbolIndex; uint16_t StartSymbolBitmap;
uint8_t duration; uint8_t duration;
uint8_t CceRegMappingType; // interleaved or noninterleaved uint8_t CceRegMappingType; // interleaved or noninterleaved
uint8_t RegBundleSize; // valid if CCE to REG mapping type is interleaved type 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) { ...@@ -607,10 +607,10 @@ void init_polar_deinterleaver_table(t_nrPolar_params *polarParams) {
uint32_t polar_decoder_int16(int16_t *input, uint32_t polar_decoder_int16(int16_t *input,
uint64_t *out, uint64_t *out,
uint8_t ones_flag, const uint8_t ones_flag,
int8_t messageType, const int8_t messageType,
uint16_t messageLength, const uint16_t messageLength,
uint8_t aggregation_level ) const uint8_t aggregation_level)
{ {
t_nrPolar_params *polarParams=nr_polar_params(messageType, messageLength, aggregation_level, true); t_nrPolar_params *polarParams=nr_polar_params(messageType, messageLength, aggregation_level, true);
......
...@@ -168,10 +168,10 @@ int8_t polar_decoder(double *input, ...@@ -168,10 +168,10 @@ int8_t polar_decoder(double *input,
uint32_t polar_decoder_int16(int16_t *input, uint32_t polar_decoder_int16(int16_t *input,
uint64_t *out, uint64_t *out,
uint8_t ones_flag, const uint8_t ones_flag,
int8_t messageType, const int8_t messageType,
uint16_t messageLength, const uint16_t messageLength,
uint8_t aggregation_level); const uint8_t aggregation_level);
int8_t polar_decoder_dci(double *input, int8_t polar_decoder_dci(double *input,
uint32_t *out, uint32_t *out,
...@@ -230,12 +230,7 @@ void nr_polar_rate_matching_pattern(uint16_t *rmp, ...@@ -230,12 +230,7 @@ void nr_polar_rate_matching_pattern(uint16_t *rmp,
uint16_t N, uint16_t N,
uint16_t E); uint16_t E);
void nr_polar_rate_matching(double *input, void nr_polar_rate_matching(const double *input, double *output, uint16_t *rmp, uint16_t K, uint16_t N, uint16_t E);
double *output,
uint16_t *rmp,
uint16_t K,
uint16_t N,
uint16_t E);
void nr_polar_rate_matching_int16(int16_t *input, void nr_polar_rate_matching_int16(int16_t *input,
int16_t *output, int16_t *output,
......
...@@ -425,13 +425,7 @@ void nr_polar_rate_matching_pattern(uint16_t *rmp, ...@@ -425,13 +425,7 @@ void nr_polar_rate_matching_pattern(uint16_t *rmp,
free(y); free(y);
} }
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(double *input,
double *output,
uint16_t *rmp,
uint16_t K,
uint16_t N,
uint16_t E)
{ {
if (E>=N) { //repetition if (E>=N) { //repetition
for (int i=0; i<=N-1; i++) output[i]=0; 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) ...@@ -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 *)); 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); 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++) { 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)); 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); 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);
...@@ -195,12 +201,10 @@ int init_nr_ue_signal(PHY_VARS_NR_UE *ue, int nb_connected_gNB) ...@@ -195,12 +201,10 @@ int init_nr_ue_signal(PHY_VARS_NR_UE *ue, int nb_connected_gNB)
// create shortcuts // create shortcuts
NR_DL_FRAME_PARMS *const fp = &ue->frame_parms; NR_DL_FRAME_PARMS *const fp = &ue->frame_parms;
NR_UE_COMMON *const common_vars = &ue->common_vars; NR_UE_COMMON *const common_vars = &ue->common_vars;
NR_UE_PRACH **const prach_vars = ue->prach_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; 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); 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) ...@@ -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" ); AssertFatal( nb_connected_gNB <= NUMBER_OF_CONNECTED_gNB_MAX, "n_connected_gNB is too large" );
// init phy_vars_ue // 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; 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_max[i] = 135;
ue->rx_gain_med[i] = 128; ue->rx_gain_med[i] = 128;
ue->rx_gain_byp[i] = 120; ue->rx_gain_byp[i] = 120;
...@@ -283,20 +287,20 @@ int init_nr_ue_signal(PHY_VARS_NR_UE *ue, int nb_connected_gNB) ...@@ -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; ue->tx_power_dBm[i]=-127;
// init TX buffers // init TX buffers
common_vars->txData = malloc16(fp->nb_antennas_tx * sizeof(c16_t *)); 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)); common_vars->txData[i] = malloc16_clear((fp->samples_per_frame) * sizeof(c16_t));
} }
// init RX buffers // init RX buffers
common_vars->rxdata = malloc16(fp->nb_antennas_rx * sizeof(c16_t *)); 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)); 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) ...@@ -342,12 +346,8 @@ int init_nr_ue_signal(PHY_VARS_NR_UE *ue, int nb_connected_gNB)
// DLSCH // DLSCH
for (gNB_id = 0; gNB_id < ue->n_connected_gNB; gNB_id++) { for (gNB_id = 0; gNB_id < ue->n_connected_gNB; gNB_id++) {
prach_vars[gNB_id] = malloc16_clear(sizeof(NR_UE_PRACH)); 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)); 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; srs_vars[gNB_id]->active = false;
// ceil((NB_RB*8(max allocation per RB)*2(QPSK))/32) // 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) ...@@ -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); 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 *)); ue->nr_csi_info->csi_rs_generated_signal = malloc16(NR_MAX_NB_PORTS * sizeof(*ue->nr_csi_info->csi_rs_generated_signal));
for (i=0; i<NR_MAX_NB_PORTS; i++) { 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(int32_t)); 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)); 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) ...@@ -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->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->srs_vars[gNB_id]);
free_and_zero(ue->prach_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) ...@@ -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[j]);
} }
free_and_zero(ue->prs_vars[idx]->prs_resource[k].prs_meas); 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]); free_and_zero(ue->prs_vars[idx]);
......
...@@ -65,9 +65,8 @@ void set_Lmax(NR_DL_FRAME_PARMS *fp) { ...@@ -65,9 +65,8 @@ void set_Lmax(NR_DL_FRAME_PARMS *fp) {
} }
} }
int nr_get_ssb_start_symbol(const NR_DL_FRAME_PARMS *fp, const uint8_t i_ssb)
int nr_get_ssb_start_symbol(NR_DL_FRAME_PARMS *fp,uint8_t i_ssb) { {
int mu = fp->numerology_index; int mu = fp->numerology_index;
int symbol = 0; int symbol = 0;
uint8_t n, n_temp; uint8_t n, n_temp;
...@@ -187,15 +186,15 @@ uint32_t get_samples_per_slot(int slot, const NR_DL_FRAME_PARMS *fp) ...@@ -187,15 +186,15 @@ 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 get_slot_from_timestamp(openair0_timestamp timestamp_rx, const NR_DL_FRAME_PARMS *fp)
{ {
uint32_t slot_idx = 0; uint32_t slot_idx = 0;
int samples_till_the_slot = fp->get_samples_per_slot(slot_idx,fp)-1; int samples_till_the_slot = fp->get_samples_per_slot(slot_idx, fp) - 1;
timestamp_rx = timestamp_rx%fp->samples_per_frame; timestamp_rx = timestamp_rx % fp->samples_per_frame;
while (timestamp_rx > samples_till_the_slot) { while (timestamp_rx > samples_till_the_slot) {
slot_idx++; 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; return slot_idx;
} }
uint32_t get_samples_slot_timestamp(int slot, const NR_DL_FRAME_PARMS *fp, uint8_t sl_ahead) uint32_t get_samples_slot_timestamp(int slot, const NR_DL_FRAME_PARMS *fp, uint8_t sl_ahead)
......
...@@ -25,7 +25,7 @@ ...@@ -25,7 +25,7 @@
#include "PHY/defs_gNB.h" #include "PHY/defs_gNB.h"
#include "PHY/defs_nr_UE.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(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); 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); 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, ...@@ -48,18 +48,13 @@ int slot_fep(PHY_VARS_UE *phy_vars_ue,
int no_prefix, int no_prefix,
int reset_freq_est); int reset_freq_est);
int nr_slot_fep(PHY_VARS_NR_UE *ue, void nr_symbol_fep(
UE_nr_rxtx_proc_t *proc, const PHY_VARS_NR_UE *ue,
unsigned char symbol, const int slot,
c16_t rxdataF[][ue->frame_parms.samples_per_slot_wCP]); const unsigned char symbol,
const int link_type,
int nr_slot_fep_init_sync(PHY_VARS_NR_UE *ue, const c16_t rxdata[ue->frame_parms.nb_antennas_rx][ue->frame_parms.ofdm_symbol_size + ue->frame_parms.nb_prefix_samples0],
UE_nr_rxtx_proc_t *proc, c16_t rxdataF[ue->frame_parms.nb_antennas_rx][ue->frame_parms.ofdm_symbol_size]);
unsigned char symbol,
int sample_offset,
bool pbch_decoded,
c16_t rxdataF[][ue->frame_parms.samples_per_slot_wCP],
int link_type);
int slot_fep_mbsfn(PHY_VARS_UE *phy_vars_ue, int slot_fep_mbsfn(PHY_VARS_UE *phy_vars_ue,
unsigned char l, unsigned char l,
......
...@@ -120,14 +120,15 @@ void init_symbol_rotation(NR_DL_FRAME_PARMS *fp); ...@@ -120,14 +120,15 @@ void init_symbol_rotation(NR_DL_FRAME_PARMS *fp);
void init_timeshift_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 *rxdataF,
c16_t *rot, const c16_t *rot,
int slot, const int slot,
int nb_rb, const int nb_rb,
int soffset, const int soffset,
int first_symbol, const int first_symbol,
int nsymb); const int nsymb,
const bool isUE);
/*! \brief Perform NR precoding. TS 38.211 V15.4.0 subclause 6.3.1.5 /*! \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 @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, ...@@ -529,12 +529,7 @@ void nr_pusch_ptrs_processing(PHY_VARS_gNB *gNB,
} }
if(symbol == *startSymbIndex) { if(symbol == *startSymbIndex) {
*ptrsSymbPos = 0; *ptrsSymbPos = get_ptrs_symb_idx(*nbSymb, *startSymbIndex, 1 << *L_ptrs, *dmrsSymbPos);
set_ptrs_symb_idx(ptrsSymbPos,
*nbSymb,
*startSymbIndex,
1<< *L_ptrs,
*dmrsSymbPos);
} }
/* if not PTRS symbol set current ptrs symbol index to zero*/ /* if not PTRS symbol set current ptrs symbol index to zero*/
...@@ -554,8 +549,8 @@ void nr_pusch_ptrs_processing(PHY_VARS_gNB *gNB, ...@@ -554,8 +549,8 @@ void nr_pusch_ptrs_processing(PHY_VARS_gNB *gNB,
nr_tti_rx, nr_tti_rx,
symbol, symbol,
frame_parms->ofdm_symbol_size, 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], 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], (int16_t *)&phase_per_symbol[symbol],
ptrs_re_symbol); ptrs_re_symbol);
} }
......
...@@ -317,6 +317,15 @@ uint8_t get_dmrs_symbols_in_slot(uint16_t l_prime_mask, uint16_t nb_symb) ...@@ -317,6 +317,15 @@ uint8_t get_dmrs_symbols_in_slot(uint16_t l_prime_mask, uint16_t nb_symb)
return tmp; 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 */ /* 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) int8_t get_valid_dmrs_idx_for_channel_est(uint16_t dmrs_symb_pos, uint8_t counter)
{ {
...@@ -339,79 +348,130 @@ int8_t get_valid_dmrs_idx_for_channel_est(uint16_t dmrs_symb_pos, uint8_t count ...@@ -339,79 +348,130 @@ int8_t get_valid_dmrs_idx_for_channel_est(uint16_t dmrs_symb_pos, uint8_t count
return symbIdx; 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 */ /* perform averaging of channel estimates and store result in first symbol buffer */
void nr_chest_time_domain_avg(NR_DL_FRAME_PARMS *frame_parms, void nr_chest_time_domain_avg(const NR_DL_FRAME_PARMS *frame_parms,
int32_t **ch_estimates, const int num_symbols,
uint8_t num_symbols, const int start_symbol,
uint8_t start_symbol, const int dmrs_bitmap,
uint16_t dmrs_bitmap, const int num_rbs,
uint16_t 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_0;
simde__m128i *ul_ch128_1; simde__m128i *ul_ch128_1;
int16_t *ul_ch16_0; 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); const int total_symbols = start_symbol + num_symbols;
int first_dmrs_symb = get_next_dmrs_symbol_in_slot(dmrs_bitmap, start_symbol, total_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"); 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++) { const int symb_offset = Nl * frame_parms->nb_antennas_rx * frame_parms->ofdm_symbol_size;
ul_ch128_0 = (simde__m128i *)&ch_estimates[aarx][first_dmrs_symb*frame_parms->ofdm_symbol_size]; const int layer_offset = frame_parms->nb_antennas_rx * frame_parms->ofdm_symbol_size;
if ((dmrs_bitmap >> symb) & 0x01) { for (int symb = first_dmrs_symb + 1; symb < total_symbols; symb++) {
ul_ch128_1 = (simde__m128i *)&ch_estimates[aarx][symb*frame_parms->ofdm_symbol_size]; ul_ch128_0 = isUE ? (simde__m128i *)&ch_estimates[first_dmrs_symb * symb_offset + layerIdx * layer_offset
for (int rbIdx = 0; rbIdx < num_rbs; rbIdx++) { + antIdx * frame_parms->ofdm_symbol_size]
ul_ch128_0[0] = simde_mm_adds_epi16(ul_ch128_0[0], ul_ch128_1[0]); : (simde__m128i *)&ch_estimates[first_dmrs_symb * frame_parms->ofdm_symbol_size];
ul_ch128_0[1] = simde_mm_adds_epi16(ul_ch128_0[1], ul_ch128_1[1]); if ((dmrs_bitmap >> symb) & 0x01) {
ul_ch128_0[2] = simde_mm_adds_epi16(ul_ch128_0[2], ul_ch128_1[2]); ul_ch128_1 =
ul_ch128_0 += 3; isUE
ul_ch128_1 += 3; ? (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];
}
}
ul_ch128_0 = (simde__m128i *)&ch_estimates[aarx][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);
ul_ch128_0[1] = simde_mm_srai_epi16(ul_ch128_0[1], 1);
ul_ch128_0[2] = simde_mm_srai_epi16(ul_ch128_0[2], 1);
ul_ch128_0 += 3;
}
} else if (num_dmrs_symb == 4) {
for (int rbIdx = 0; rbIdx < num_rbs; rbIdx++) { for (int rbIdx = 0; rbIdx < num_rbs; rbIdx++) {
ul_ch128_0[0] = simde_mm_srai_epi16(ul_ch128_0[0], 2); ul_ch128_0[0] = simde_mm_adds_epi16(ul_ch128_0[0], ul_ch128_1[0]);
ul_ch128_0[1] = simde_mm_srai_epi16(ul_ch128_0[1], 2); ul_ch128_0[1] = simde_mm_adds_epi16(ul_ch128_0[1], ul_ch128_1[1]);
ul_ch128_0[2] = simde_mm_srai_epi16(ul_ch128_0[2], 2); ul_ch128_0[2] = simde_mm_adds_epi16(ul_ch128_0[2], ul_ch128_1[2]);
ul_ch128_0 += 3; ul_ch128_0 += 3;
ul_ch128_1 += 3;
} }
} else if (num_dmrs_symb == 3) { }
ul_ch16_0 = (int16_t *)&ch_estimates[aarx][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;
ul_ch16_0[2] /= 3;
ul_ch16_0[3] /= 3;
ul_ch16_0[4] /= 3;
ul_ch16_0[5] /= 3;
ul_ch16_0[6] /= 3;
ul_ch16_0[7] /= 3;
ul_ch16_0[8] /= 3;
ul_ch16_0[9] /= 3;
ul_ch16_0[10] /= 3;
ul_ch16_0[11] /= 3;
ul_ch16_0[12] /= 3;
ul_ch16_0[13] /= 3;
ul_ch16_0[14] /= 3;
ul_ch16_0[15] /= 3;
ul_ch16_0[16] /= 3;
ul_ch16_0[17] /= 3;
ul_ch16_0[18] /= 3;
ul_ch16_0[19] /= 3;
ul_ch16_0[20] /= 3;
ul_ch16_0[21] /= 3;
ul_ch16_0[22] /= 3;
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");
} }
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);
ul_ch128_0[1] = simde_mm_srai_epi16(ul_ch128_0[1], 1);
ul_ch128_0[2] = simde_mm_srai_epi16(ul_ch128_0[2], 1);
ul_ch128_0 += 3;
}
} else if (num_dmrs_symb == 4) {
for (int rbIdx = 0; rbIdx < num_rbs; rbIdx++) {
ul_ch128_0[0] = simde_mm_srai_epi16(ul_ch128_0[0], 2);
ul_ch128_0[1] = simde_mm_srai_epi16(ul_ch128_0[1], 2);
ul_ch128_0[2] = simde_mm_srai_epi16(ul_ch128_0[2], 2);
ul_ch128_0 += 3;
}
} else if (num_dmrs_symb == 3) {
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;
ul_ch16_0[2] /= 3;
ul_ch16_0[3] /= 3;
ul_ch16_0[4] /= 3;
ul_ch16_0[5] /= 3;
ul_ch16_0[6] /= 3;
ul_ch16_0[7] /= 3;
ul_ch16_0[8] /= 3;
ul_ch16_0[9] /= 3;
ul_ch16_0[10] /= 3;
ul_ch16_0[11] /= 3;
ul_ch16_0[12] /= 3;
ul_ch16_0[13] /= 3;
ul_ch16_0[14] /= 3;
ul_ch16_0[15] /= 3;
ul_ch16_0[16] /= 3;
ul_ch16_0[17] /= 3;
ul_ch16_0[18] /= 3;
ul_ch16_0[19] /= 3;
ul_ch16_0[20] /= 3;
ul_ch16_0[21] /= 3;
ul_ch16_0[22] /= 3;
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");
} }
...@@ -61,22 +61,32 @@ uint8_t allowed_xlsch_re_in_dmrs_symbol(uint16_t k, ...@@ -61,22 +61,32 @@ uint8_t allowed_xlsch_re_in_dmrs_symbol(uint16_t k,
uint8_t numDmrsCdmGrpsNoData, uint8_t numDmrsCdmGrpsNoData,
uint8_t dmrs_type); 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); 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); 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); 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, void nr_chest_time_domain_avg(const NR_DL_FRAME_PARMS *frame_parms,
int32_t **ch_estimates, const int num_symbols,
uint8_t num_symbols, const int start_symbol,
uint8_t start_symbol, const int dmrs_bitmap,
uint16_t dmrs_bitmap, const int num_rbs,
uint16_t num_rbs); const int antIdx,
const int layerIdx,
static inline uint8_t is_dmrs_symbol(uint8_t l, uint16_t dmrsSymbMask) 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); DevAssert(l < 32);
return ((dmrsSymbMask >> l) & 0x1); 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 #undef EXTERN
#endif /* DMRS_NR_H */ #endif /* DMRS_NR_H */
......
...@@ -114,15 +114,14 @@ int nr_pusch_dmrs_rx(PHY_VARS_gNB *gNB, ...@@ -114,15 +114,14 @@ int nr_pusch_dmrs_rx(PHY_VARS_gNB *gNB,
return(0); return(0);
} }
int nr_pdsch_dmrs_rx(const PHY_VARS_NR_UE *ue,
int nr_pdsch_dmrs_rx(PHY_VARS_NR_UE *ue, const unsigned int Ns,
unsigned int Ns, const unsigned int *nr_gold_pdsch,
unsigned int *nr_gold_pdsch, const unsigned short p,
int32_t *output, const unsigned char lp,
unsigned short p, const unsigned short nb_pdsch_rb,
unsigned char lp, const uint8_t config_type,
unsigned short nb_pdsch_rb, int32_t *output)
uint8_t config_type)
{ {
int8_t w; int8_t w;
unsigned char idx=0; unsigned char idx=0;
...@@ -166,13 +165,7 @@ int nr_pdsch_dmrs_rx(PHY_VARS_NR_UE *ue, ...@@ -166,13 +165,7 @@ int nr_pdsch_dmrs_rx(PHY_VARS_NR_UE *ue,
return(0); return(0);
} }
int nr_pdcch_dmrs_rx(const unsigned int *nr_gold_pdcch, int32_t *output, const unsigned short p, const unsigned short nb_rb_coreset)
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)
{ {
uint8_t idx=0; uint8_t idx=0;
//uint8_t pdcch_rb_offset =0; //uint8_t pdcch_rb_offset =0;
...@@ -194,13 +187,9 @@ int nr_pdcch_dmrs_rx(PHY_VARS_NR_UE *ue, ...@@ -194,13 +187,9 @@ int nr_pdcch_dmrs_rx(PHY_VARS_NR_UE *ue,
return(0); return(0);
} }
int nr_pbch_dmrs_rx(const int symbol, const unsigned int *nr_gold_pbch, int32_t *output)
int nr_pbch_dmrs_rx(int symbol,
unsigned int *nr_gold_pbch,
int32_t *output)
{ {
int m,m0,m1; int m, m0, m1;
uint8_t idx=0;
AssertFatal(symbol>=0 && symbol <3,"illegal symbol %d\n",symbol); AssertFatal(symbol>=0 && symbol <3,"illegal symbol %d\n",symbol);
if (symbol == 0) { if (symbol == 0) {
m0=0; m0=0;
...@@ -217,7 +206,8 @@ int nr_pbch_dmrs_rx(int symbol, ...@@ -217,7 +206,8 @@ int nr_pbch_dmrs_rx(int symbol,
// printf("Generating pilots symbol %d, m0 %d, m1 %d\n",symbol,m0,m1); // printf("Generating pilots symbol %d, m0 %d, m1 %d\n",symbol,m0,m1);
/// QPSK modulation /// QPSK modulation
for (m=m0; m<m1; m++) { 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] = 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]; ((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, ...@@ -238,7 +228,7 @@ int nr_pbch_dmrs_rx(int symbol,
\param length is number of RE in a OFDM symbol \param length is number of RE in a OFDM symbol
\param *output pointer to all ptrs 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; uint8_t idx, b_idx;
for (int i=0; i<length/mod_order; i++) for (int i=0; i<length/mod_order; i++)
......
...@@ -72,12 +72,13 @@ void nr_gold_pdcch(PHY_VARS_NR_UE* ue, ...@@ -72,12 +72,13 @@ void nr_gold_pdcch(PHY_VARS_NR_UE* ue,
} }
} }
void nr_gold_pdsch(PHY_VARS_NR_UE* ue, void nr_gold_pdsch(const int nscid, const unsigned int nid, PHY_VARS_NR_UE* ue)
int nscid, {
uint32_t nid) { unsigned int x1 = 0;
unsigned int x1 = 0, x2 = 0, x2tmp0 = 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; 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++) { 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 ...@@ -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; return k_RE_ref;
} }
/******************************************************************* /*******************************************************************
* *
* NAME : set_ptrs_symb_idx * NAME : get_ptrs_symb_idx
* *
* PARAMETERS : ptrs_symbols PTRS OFDM symbol indicies bit mask * PARAMETERS : duration_in_symbols number of scheduled PUSCH ofdm symbols
* duration_in_symbols number of scheduled PUSCH ofdm symbols * start_symbol first ofdm symbol of PUSCH within slot
* start_symbol first ofdm symbol of PUSCH within slot * L_ptrs the parameter L_ptrs
* L_ptrs the parameter L_ptrs * ul_dmrs_symb_pos bitmap of the time domain positions of the DMRS symbols in the scheduled PUSCH
* 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
* RETURN : sets the bit map of PTRS ofdm symbol indicies *
* * DESCRIPTION : 3GPP TS 38.211 6.4.1.2.2.1
* 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) {
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 i = 0;
int l_ref = start_symbol; int l_ref = start_symbol;
const int last_symbol = start_symbol + duration_in_symbols - 1; int ptrs_symbols = 0;
if (L_ptrs==0) { if (L_ptrs==0) {
LOG_E(PHY,"bug: impossible L_ptrs\n"); LOG_E(PHY,"bug: impossible L_ptrs\n");
*ptrs_symbols = 0; return 0;
return;
} }
while ( (l_ref + i*L_ptrs) <= last_symbol) { while ( (l_ref + i*L_ptrs) <= last_symbol) {
...@@ -132,9 +124,10 @@ void set_ptrs_symb_idx(uint16_t *ptrs_symbols, ...@@ -132,9 +124,10 @@ void set_ptrs_symb_idx(uint16_t *ptrs_symbols,
continue; continue;
} }
*ptrs_symbols = *ptrs_symbols | (1<<(l_ref + i*L_ptrs)); ptrs_symbols = ptrs_symbols | (1 << (l_ref + i * L_ptrs));
i++; i++;
} }
return ptrs_symbols;
} }
/******************************************************************* /*******************************************************************
...@@ -242,20 +235,19 @@ int8_t get_next_estimate_in_slot(uint16_t ptrsSymbPos,uint16_t dmrsSymbPos, ui ...@@ -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 * perform phase estimation from regenerated PTRS SC and channel compensated
* signal * signal
*********************************************************************/ *********************************************************************/
void nr_ptrs_cpe_estimation(uint8_t K_ptrs, void nr_ptrs_cpe_estimation(const uint8_t K_ptrs,
uint8_t ptrsReOffset, const uint8_t ptrsReOffset,
uint8_t dmrsConfigType, const uint8_t dmrsConfigType,
uint16_t nb_rb, const uint16_t nb_rb,
uint16_t rnti, const uint16_t rnti,
unsigned char Ns, const unsigned char Ns,
unsigned char symbol, const unsigned char symbol,
uint16_t ofdm_symbol_size, const uint16_t ofdm_symbol_size,
const uint32_t *gold_seq,
int16_t *rxF_comp, int16_t *rxF_comp,
uint32_t *gold_seq,
int16_t *error_est, int16_t *error_est,
int32_t *ptrs_sc) int32_t *ptrs_sc)
{ {
//#define DEBUG_PTRS 1
uint8_t is_ptrs_re = 0; uint8_t is_ptrs_re = 0;
uint16_t re_cnt = 0; uint16_t re_cnt = 0;
uint16_t cnt = 0; uint16_t cnt = 0;
...@@ -270,10 +262,7 @@ void nr_ptrs_cpe_estimation(uint8_t K_ptrs, ...@@ -270,10 +262,7 @@ void nr_ptrs_cpe_estimation(uint8_t K_ptrs,
c16_t dmrs_comp_p[(1 + sc_per_symbol/4)*4]; c16_t dmrs_comp_p[(1 + sc_per_symbol/4)*4];
double abs = 0.0; double abs = 0.0;
double real = 0.0; double real = 0.0;
double imag = 0.0; double imag = 0.0;
#ifdef DEBUG_PTRS
double alpha = 0;
#endif
/* generate PTRS RE for the symbol */ /* 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 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, ...@@ -313,7 +302,7 @@ void nr_ptrs_cpe_estimation(uint8_t K_ptrs,
imag += ptrs_ch_p[i].i; imag += ptrs_ch_p[i].i;
} }
#ifdef DEBUG_PTRS #ifdef DEBUG_PTRS
alpha = atan(imag/real); double alpha = atan(imag / real);
printf("[PHY][PTRS]: Symbol %d atan(Im,real):= %f \n",symbol, alpha ); printf("[PHY][PTRS]: Symbol %d atan(Im,real):= %f \n",symbol, alpha );
#endif #endif
/* mean */ /* mean */
...@@ -330,7 +319,6 @@ void nr_ptrs_cpe_estimation(uint8_t K_ptrs, ...@@ -330,7 +319,6 @@ void nr_ptrs_cpe_estimation(uint8_t K_ptrs,
#endif #endif
} }
/******************************************************************* /*******************************************************************
* *
* NAME : nr_ptrs_process_slot * NAME : nr_ptrs_process_slot
......
...@@ -49,11 +49,7 @@ ...@@ -49,11 +49,7 @@
int16_t get_kRE_ref(uint8_t dmrs_antenna_port, uint8_t pusch_dmrs_type, uint8_t resourceElementOffset); 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, 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 duration_in_symbols,
uint8_t start_symbol,
uint8_t L_ptrs,
uint16_t ul_dmrs_symb_pos);
uint8_t is_ptrs_subcarrier(uint16_t k, uint8_t is_ptrs_subcarrier(uint16_t k,
uint16_t n_rnti, uint16_t n_rnti,
...@@ -78,7 +74,10 @@ uint8_t is_ptrs_subcarrier(uint16_t k, ...@@ -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); 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); 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, ...@@ -91,16 +90,16 @@ int8_t nr_ptrs_process_slot(uint16_t dmrsSymbPos,
uint16_t noSymb uint16_t noSymb
); );
/* general function to estimate common phase error based upon PTRS */ /* general function to estimate common phase error based upon PTRS */
void nr_ptrs_cpe_estimation(uint8_t K_ptrs, void nr_ptrs_cpe_estimation(const uint8_t K_ptrs,
uint8_t ptrsReOffset, const uint8_t ptrsReOffset,
uint8_t dmrsConfigType, const uint8_t dmrsConfigType,
uint16_t nb_rb, const uint16_t nb_rb,
uint16_t rnti, const uint16_t rnti,
unsigned char Ns, const unsigned char Ns,
unsigned char symbol, const unsigned char symbol,
uint16_t ofdm_symbol_size, const uint16_t ofdm_symbol_size,
const uint32_t *gold_seq,
int16_t *rxF_comp, int16_t *rxF_comp,
uint32_t *gold_seq,
int16_t *error_est, int16_t *error_est,
int32_t *ptrs_sc); int32_t *ptrs_sc);
......
...@@ -31,37 +31,31 @@ ...@@ -31,37 +31,31 @@
/*!\brief This function generates the NR Gold sequence (38-211, Sec 5.2.1) for the PBCH DMRS. /*!\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 @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, int nr_pbch_dmrs_rx(const int dmrss, const unsigned int *nr_gold_pbch, int32_t *output);
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. /*!\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 @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, int nr_pdcch_dmrs_rx(const unsigned int *nr_gold_pdcch,
unsigned int Ns,
unsigned int *nr_gold_pdcch,
int32_t *output, int32_t *output,
unsigned short p, const unsigned short p,
unsigned short nb_rb_corset); const unsigned short nb_rb_coreset);
int nr_pdsch_dmrs_rx(PHY_VARS_NR_UE *ue, int nr_pdsch_dmrs_rx(const PHY_VARS_NR_UE *ue,
unsigned int Ns, const unsigned int Ns,
unsigned int *nr_gold_pdsch, const unsigned int *nr_gold_pdsch,
int32_t *output, const unsigned short p,
unsigned short p, const unsigned char lp,
unsigned char lp, const unsigned short nb_pdsch_rb,
unsigned short nb_pdsch_rb, const uint8_t config_type,
uint8_t config_type); int32_t *output);
void nr_gold_pbch(PHY_VARS_NR_UE* ue); void nr_gold_pbch(PHY_VARS_NR_UE* ue);
void nr_gold_pdcch(PHY_VARS_NR_UE* ue, void nr_gold_pdcch(PHY_VARS_NR_UE* ue,
unsigned short n_idDMRS); unsigned short n_idDMRS);
void nr_gold_pdsch(PHY_VARS_NR_UE* ue, void nr_gold_pdsch(const int nscid, const unsigned int nid, PHY_VARS_NR_UE *ue);
int nscid,
uint32_t nid);
void nr_init_pusch_dmrs(PHY_VARS_NR_UE* ue, void nr_init_pusch_dmrs(PHY_VARS_NR_UE* ue,
uint16_t N_n_scid, uint16_t N_n_scid,
......
...@@ -80,6 +80,6 @@ bool rx_sss_nr(PHY_VARS_NR_UE *ue, ...@@ -80,6 +80,6 @@ bool rx_sss_nr(PHY_VARS_NR_UE *ue,
int32_t *tot_metric, int32_t *tot_metric,
uint8_t *phase_max, uint8_t *phase_max,
int *freq_offset_sss, 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 */ #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 ...@@ -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, void nr_generate_csi_rs(const NR_DL_FRAME_PARMS *frame_parms,
int32_t **dataF,
const int16_t amp, 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, const int slot,
uint8_t *N_cdm_groups, const nfapi_nr_dl_tti_csi_rs_pdu_rel15_t *csi_params,
uint8_t *CDM_group_size, c16_t **dataF,
uint8_t *k_prime, nr_csi_info_t *nr_csi_info,
uint8_t *l_prime, nr_csi_phy_parms_t *csi_phy_parms)
uint8_t *N_ports, {
uint8_t *j_cdm,
uint8_t *k_overline,
uint8_t *l_overline) {
#ifdef NR_CSIRS_DEBUG #ifdef NR_CSIRS_DEBUG
LOG_I(NR_PHY, "csi_params->subcarrier_spacing = %i\n", csi_params->subcarrier_spacing); 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); 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, ...@@ -628,12 +621,12 @@ void nr_generate_csi_rs(const NR_DL_FRAME_PARMS *frame_parms,
// ZP CSI RS // ZP CSI RS
if (csi_params->csi_type == 2) { if (csi_params->csi_type == 2) {
((int16_t*)dataF[p])[((l*frame_parms->ofdm_symbol_size + k)<<1)+(2*dataF_offset)] = 0; dataF[p][l * frame_parms->ofdm_symbol_size + k + dataF_offset] = (c16_t){0};
((int16_t*)dataF[p])[((l*frame_parms->ofdm_symbol_size + k)<<1)+1+(2*dataF_offset)] = 0;
} }
else { 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; dataF[p][l * frame_parms->ofdm_symbol_size + k + dataF_offset].r = (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].i =
(beta * wt * wf * mod_csi[l][(mprime << 1) + 1]) >> 15;
} }
#ifdef NR_CSIRS_DEBUG #ifdef NR_CSIRS_DEBUG
printf("l,k (%d,%d) seq. index %d \t port %d \t (%d,%d)\n",l,k,mprime,p+3000, 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, ...@@ -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 (csi_phy_parms) {
if (k_prime) *k_prime = kprime; csi_phy_parms->N_cdm_groups = size;
if (l_prime) *l_prime = lprime; csi_phy_parms->CDM_group_size = gs;
if (N_ports) *N_ports = ports; csi_phy_parms->k_prime = kprime;
if (j_cdm) memcpy(j_cdm,j,16*sizeof(uint8_t)); csi_phy_parms->l_prime = lprime;
if (k_overline) memcpy(k_overline,koverline,16*sizeof(uint8_t)); csi_phy_parms->N_ports = ports;
if (l_overline) memcpy(l_overline,loverline,16*sizeof(uint8_t)); 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 #ifdef NR_CSIRS_DEBUG
if (N_ports) LOG_I(NR_PHY, "nr_csi_info->N_ports = %d\n", *N_ports); 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, ...@@ -116,11 +116,8 @@ void nr_generate_pdsch(processingData_L1tx_t *msgTx,
uint16_t ptrs_idx = 0; uint16_t ptrs_idx = 0;
uint8_t is_ptrs_re = 0; uint8_t is_ptrs_re = 0;
if(rel15->pduBitmap & 0x1) { if(rel15->pduBitmap & 0x1) {
set_ptrs_symb_idx(&dlPtrsSymPos, dlPtrsSymPos =
rel15->NrOfSymbols, get_ptrs_symb_idx(rel15->NrOfSymbols, rel15->StartSymbolIndex, 1 << rel15->PTRSTimeDensity, rel15->dlDmrsSymbPos);
rel15->StartSymbolIndex,
1<<rel15->PTRSTimeDensity,
rel15->dlDmrsSymbPos);
n_ptrs = (rel15->rbSize + rel15->PTRSFreqDensity - 1)/rel15->PTRSFreqDensity; 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); ...@@ -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); uint8_t get_nr_prach_duration(uint8_t prach_format);
void nr_generate_csi_rs(const NR_DL_FRAME_PARMS *frame_parms, void nr_generate_csi_rs(const NR_DL_FRAME_PARMS *frame_parms,
int32_t **dataF,
const int16_t amp, 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, const int slot,
uint8_t *N_cdm_groups, const nfapi_nr_dl_tti_csi_rs_pdu_rel15_t *csi_params,
uint8_t *CDM_group_size, c16_t **dataF,
uint8_t *k_prime, nr_csi_info_t *nr_csi_info,
uint8_t *l_prime, nr_csi_phy_parms_t *csi_phy_parms);
uint8_t *N_ports,
uint8_t *j_cdm,
uint8_t *k_overline,
uint8_t *l_overline);
void free_nr_prach_entry(PHY_VARS_gNB *gNB, int prach_id); 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, ...@@ -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); nvar /= (rel15_ul->nr_of_symbols * rel15_ul->nrOfLayers * frame_parms->nb_antennas_rx);
// averaging time domain channel estimates if (gNB->chest_time == 1) { // averaging time domain channel estimates
if (gNB->chest_time == 1) for (int aarx = 0; aarx < frame_parms->nb_antennas_rx; aarx++) {
{ nr_chest_time_domain_avg(frame_parms,
nr_chest_time_domain_avg(frame_parms, rel15_ul->nr_of_symbols,
pusch_vars->ul_ch_estimates, rel15_ul->start_symbol_index,
rel15_ul->nr_of_symbols, rel15_ul->ul_dmrs_symb_pos,
rel15_ul->start_symbol_index, rel15_ul->rb_size,
rel15_ul->ul_dmrs_symb_pos, 0,
rel15_ul->rb_size); 0,
pusch_vars->dmrs_symbol = get_next_dmrs_symbol_in_slot(rel15_ul->ul_dmrs_symb_pos, 0,
rel15_ul->start_symbol_index, false,
rel15_ul->nr_of_symbols); (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); stop_meas(&gNB->ulsch_channel_estimation_stats);
......
...@@ -33,15 +33,15 @@ ...@@ -33,15 +33,15 @@
// The adjustment is performed once per frame based on the // The adjustment is performed once per frame based on the
// last channel estimate of the receiver // last channel estimate of the receiver
void nr_adjust_synch_ue(NR_DL_FRAME_PARMS *frame_parms, void nr_adjust_synch_ue(PHY_VARS_NR_UE *ue,
PHY_VARS_NR_UE *ue, const c16_t dl_ch_estimates_time[][ue->frame_parms.ofdm_symbol_size],
module_id_t gNB_id, const uint8_t frame,
const int estimateSz, const uint8_t subframe,
struct complex16 dl_ch_estimates_time[][estimateSz], const unsigned char clear,
uint8_t frame, const short coef,
uint8_t subframe, int64_t *max_pos_fil,
unsigned char clear, int *rx_offset,
short coef) int *time_sync_cell)
{ {
static int count_max_pos_ok = 0; static int count_max_pos_ok = 0;
...@@ -49,12 +49,13 @@ void nr_adjust_synch_ue(NR_DL_FRAME_PARMS *frame_parms, ...@@ -49,12 +49,13 @@ void nr_adjust_synch_ue(NR_DL_FRAME_PARMS *frame_parms,
int max_val = 0, max_pos = 0; int max_val = 0, max_pos = 0;
const int sync_pos = 0; const int sync_pos = 0;
uint8_t sync_offset = 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); VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_ADJUST_SYNCH, VCD_FUNCTION_IN);
short ncoef = 32767 - coef; 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 // 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++) { 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, ...@@ -75,9 +76,9 @@ void nr_adjust_synch_ue(NR_DL_FRAME_PARMS *frame_parms,
// filter position to reduce jitter // filter position to reduce jitter
if (clear == 1) if (clear == 1)
ue->max_pos_fil = max_pos << 15; *max_pos_fil = max_pos << 15;
else 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 // do not filter to have proactive timing adjustment
//ue->max_pos_fil = max_pos << 15; //ue->max_pos_fil = max_pos << 15;
...@@ -90,9 +91,9 @@ void nr_adjust_synch_ue(NR_DL_FRAME_PARMS *frame_parms, ...@@ -90,9 +91,9 @@ void nr_adjust_synch_ue(NR_DL_FRAME_PARMS *frame_parms,
sync_offset = 0; sync_offset = 0;
if ( abs(diff) < (SYNCH_HYST+sync_offset) ) if ( abs(diff) < (SYNCH_HYST+sync_offset) )
ue->rx_offset = 0; *rx_offset = 0;
else else
ue->rx_offset = diff; *rx_offset = diff;
const int sample_shift = -(ue->rx_offset>>1); const int sample_shift = -(ue->rx_offset>>1);
// reset IIR filter for next offset calculation // reset IIR filter for next offset calculation
...@@ -107,11 +108,14 @@ void nr_adjust_synch_ue(NR_DL_FRAME_PARMS *frame_parms, ...@@ -107,11 +108,14 @@ void nr_adjust_synch_ue(NR_DL_FRAME_PARMS *frame_parms,
if(count_max_pos_ok > 10 && first_time == 1) { if(count_max_pos_ok > 10 && first_time == 1) {
first_time = 0; first_time = 0;
ue->time_sync_cell = 1; *time_sync_cell = 1;
} }
#ifdef DEBUG_PHY #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, subframe,
diff, diff,
ue->rx_offset, ue->rx_offset,
......
...@@ -179,29 +179,22 @@ void nr_ue_measurements(PHY_VARS_NR_UE *ue, ...@@ -179,29 +179,22 @@ void nr_ue_measurements(PHY_VARS_NR_UE *ue,
// - RSRP: W (dBW) // - RSRP: W (dBW)
// - RX Gain dB // - RX Gain dB
void nr_ue_ssb_rsrp_measurements(PHY_VARS_NR_UE *ue, void nr_ue_ssb_rsrp_measurements(PHY_VARS_NR_UE *ue,
int ssb_index, const int ssb_index,
UE_nr_rxtx_proc_t *proc, const UE_nr_rxtx_proc_t *proc,
c16_t rxdataF[][ue->frame_parms.samples_per_slot_wCP]) { const c16_t rxdataF[ue->frame_parms.nb_antennas_rx][ue->frame_parms.ofdm_symbol_size])
{
int k_start = 56; const int k_start = 56;
int k_end = 183; const int k_end = 183;
int slot = proc->nr_slot_rx; const int slot = proc->nr_slot_rx;
unsigned int ssb_offset = ue->frame_parms.first_carrier_offset + ue->frame_parms.ssb_start_subcarrier; const 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;
uint32_t rsrp = 0; 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; int nb_re = 0;
for (int aarx = 0; aarx < ue->frame_parms.nb_antennas_rx; aarx++) { for (int aarx = 0; aarx < ue->frame_parms.nb_antennas_rx; aarx++) {
int16_t *rxF_sss = (int16_t *)rxdataF[aarx];
int16_t *rxF_sss = (int16_t *)&rxdataF[aarx][l_sss*ue->frame_parms.ofdm_symbol_size];
for(int k = k_start; k < k_end; k++){ for(int k = k_start; k < k_end; k++){
...@@ -235,60 +228,53 @@ void nr_ue_ssb_rsrp_measurements(PHY_VARS_NR_UE *ue, ...@@ -235,60 +228,53 @@ void nr_ue_ssb_rsrp_measurements(PHY_VARS_NR_UE *ue,
// Measurement units: // Measurement units:
// - psd_awgn (AWGN power spectral density): dBm/Hz // - psd_awgn (AWGN power spectral density): dBm/Hz
void nr_ue_rrc_measurements(PHY_VARS_NR_UE *ue, void nr_ue_rrc_measurements(PHY_VARS_NR_UE *ue,
UE_nr_rxtx_proc_t *proc, const UE_nr_rxtx_proc_t *proc,
c16_t rxdataF[][ue->frame_parms.samples_per_slot_wCP]){ const c16_t rxdataF[ue->frame_parms.nb_antennas_rx][ue->frame_parms.ofdm_symbol_size])
{
uint8_t k; const int slot = proc->nr_slot_rx;
int slot = proc->nr_slot_rx; const int16_t *rxF_sss;
int aarx;
int16_t *rxF_sss;
const uint8_t k_left = 48; const uint8_t k_left = 48;
const uint8_t k_right = 183; const uint8_t k_right = 183;
const uint8_t k_length = 8; const uint8_t k_length = 8;
uint8_t l_sss = (ue->symbol_offset + 2) % ue->frame_parms.symbols_per_slot; const unsigned int ssb_offset = ue->frame_parms.first_carrier_offset + ue->frame_parms.ssb_start_subcarrier;
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];
double rx_gain = openair0_cfg[0].rx_gain[0]; const double rx_gain_offset = openair0_cfg[0].rx_gain_offset[0];
double rx_gain_offset = openair0_cfg[0].rx_gain_offset[0];
ue->measurements.n0_power_tot = 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); LOG_D(PHY, "In %s doing measurements for ssb_offset %d \n", __FUNCTION__, ssb_offset);
for (aarx = 0; aarx<ue->frame_parms.nb_antennas_rx; aarx++) {
for (int aarx = 0; aarx < ue->frame_parms.nb_antennas_rx; aarx++) {
ue->measurements.n0_power[aarx] = 0; 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 //-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; int re = (ssb_offset + k) % ue->frame_parms.ofdm_symbol_size;
#ifdef DEBUG_MEAS_RRC #ifdef DEBUG_MEAS_RRC
LOG_I(PHY, "In %s -rxF_sss %d %d\n", __FUNCTION__, rxF_sss[re*2], rxF_sss[re*2 + 1]); LOG_I(PHY, "In %s -rxF_sss %d %d\n", __FUNCTION__, rxF_sss[re*2], rxF_sss[re*2 + 1]);
#endif #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 //+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; int re = (ssb_offset + k) % ue->frame_parms.ofdm_symbol_size;
#ifdef DEBUG_MEAS_RRC #ifdef DEBUG_MEAS_RRC
LOG_I(PHY, "In %s +rxF_sss %d %d\n", __FUNCTION__, rxF_sss[re*2], rxF_sss[re*2 + 1]); LOG_I(PHY, "In %s +rxF_sss %d %d\n", __FUNCTION__, rxF_sss[re*2], rxF_sss[re*2 + 1]);
#endif #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[aarx] /= 2*k_length;
ue->measurements.n0_power_dB[aarx] = (unsigned short) dB_fixed(ue->measurements.n0_power[aarx]); 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 += ue->measurements.n0_power[aarx];
} }
ue->measurements.n0_power_tot_dB = (unsigned short) dB_fixed(ue->measurements.n0_power_tot); 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, ...@@ -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); LOG_D(PHY, "In [%s][slot:%d] NF USRP %d dB\n", __FUNCTION__, slot, nf_usrp);
#endif #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,
__FUNCTION__, "In [%s][slot:%d] Noise Level %d (digital level %d dB, noise power spectral density %f dBm/RE)\n",
slot, __FUNCTION__,
ue->measurements.n0_power_tot, slot,
ue->measurements.n0_power_tot_dB, ue->measurements.n0_power_tot,
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,
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}; ...@@ -48,21 +48,18 @@ int16_t nr_zeros[8] __attribute__((aligned(16))) = {0, 0, 0, 0, 0, 0, 0, 0};
// QPSK // QPSK
//---------------------------------------------------------------------------------------------- //----------------------------------------------------------------------------------------------
int nr_dlsch_qpsk_llr(NR_DL_FRAME_PARMS *frame_parms, int nr_dlsch_qpsk_llr(const NR_DL_FRAME_PARMS *frame_parms,
int32_t *rxdataF_comp, const c16_t *rxdataF_comp,
int16_t *dlsch_llr, int16_t *dlsch_llr,
uint8_t symbol, const uint32_t len,
uint32_t len, const uint16_t nb_rb)
uint8_t first_symbol_flag,
uint16_t nb_rb)
{ {
c16_t *rxF = (c16_t *)rxdataF_comp;
c16_t *rxF = (c16_t *)&rxdataF_comp[((int32_t)symbol*nb_rb*12)];
c16_t *llr32 = (c16_t *)dlsch_llr; c16_t *llr32 = (c16_t *)dlsch_llr;
int i; int i;
if (!llr32) { 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); return(-1);
} }
...@@ -89,39 +86,30 @@ int nr_dlsch_qpsk_llr(NR_DL_FRAME_PARMS *frame_parms, ...@@ -89,39 +86,30 @@ int nr_dlsch_qpsk_llr(NR_DL_FRAME_PARMS *frame_parms,
// 16-QAM // 16-QAM
//---------------------------------------------------------------------------------------------- //----------------------------------------------------------------------------------------------
void nr_dlsch_16qam_llr(NR_DL_FRAME_PARMS *frame_parms, void nr_dlsch_16qam_llr(const NR_DL_FRAME_PARMS *frame_parms,
int32_t *rxdataF_comp, const c16_t *rxdataF_comp,
int16_t *dlsch_llr, int16_t *dlsch_llr,
int32_t *dl_ch_mag, const c16_t *dl_ch_mag,
uint8_t symbol, const uint32_t len,
uint32_t len, const uint16_t nb_rb)
uint8_t first_symbol_flag,
uint16_t nb_rb)
{ {
simde__m128i *rxF = (simde__m128i *)rxdataF_comp;
simde__m128i *rxF = (simde__m128i*)&rxdataF_comp[(symbol*nb_rb*12)];
simde__m128i *ch_mag;
simde__m128i llr128[2]; simde__m128i llr128[2];
uint32_t *llr32;
int i; int i;
unsigned char len_mod4=0; unsigned char len_mod4=0;
uint32_t *llr32 = (uint32_t *)dlsch_llr;
simde__m128i *ch_mag = (simde__m128i *)dl_ch_mag;
llr32 = (uint32_t*)dlsch_llr; // printf("len=%d\n", len);
ch_mag = (simde__m128i *)dl_ch_mag;
// printf("len=%d\n", len);
len_mod4 = len&3; len_mod4 = len&3;
// printf("len_mod4=%d\n", len_mod4); // 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); // printf("len>>=2=%d\n", len);
len+=(len_mod4==0 ? 0 : 1); nlen += (len_mod4 == 0 ? 0 : 1);
// printf("len+=%d\n", len); // 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]); simde__m128i xmm0 =simde_mm_abs_epi16(rxF[i]);
xmm0 =simde_mm_subs_epi16(ch_mag[i],xmm0); xmm0 =simde_mm_subs_epi16(ch_mag[i],xmm0);
...@@ -136,8 +124,7 @@ void nr_dlsch_16qam_llr(NR_DL_FRAME_PARMS *frame_parms, ...@@ -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[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[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[7] =simde_mm_extract_epi32(llr128[1],3); //((uint32_t *)&llr128[1])[3];
llr32+=8; llr32 += 8;
} }
simde_mm_empty(); simde_mm_empty();
...@@ -148,35 +135,31 @@ void nr_dlsch_16qam_llr(NR_DL_FRAME_PARMS *frame_parms, ...@@ -148,35 +135,31 @@ void nr_dlsch_16qam_llr(NR_DL_FRAME_PARMS *frame_parms,
// 64-QAM // 64-QAM
//---------------------------------------------------------------------------------------------- //----------------------------------------------------------------------------------------------
void nr_dlsch_64qam_llr(NR_DL_FRAME_PARMS *frame_parms, void nr_dlsch_64qam_llr(const NR_DL_FRAME_PARMS *frame_parms,
int32_t *rxdataF_comp, const c16_t *rxdataF_comp,
int16_t *dlsch_llr, int16_t *dlsch_llr,
int32_t *dl_ch_mag, const c16_t *dl_ch_mag,
int32_t *dl_ch_magb, const c16_t *dl_ch_magb,
uint8_t symbol, const uint32_t len,
uint32_t len, const uint16_t nb_rb)
uint8_t first_symbol_flag,
uint16_t nb_rb)
{ {
simde__m128i *rxF = (simde__m128i*)&rxdataF_comp[(symbol*nb_rb*12)]; const simde__m128i *rxF = (simde__m128i *)rxdataF_comp;
simde__m128i *ch_mag,*ch_magb;
int i,len2; int i,len2;
unsigned char len_mod4; unsigned char len_mod4;
int16_t *llr2; int16_t *llr2;
llr2 = dlsch_llr; llr2 = dlsch_llr;
ch_mag = (simde__m128i *)dl_ch_mag; const simde__m128i *ch_mag = (simde__m128i *)dl_ch_mag;
ch_magb = (simde__m128i *)dl_ch_magb; 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, symbol,
first_symbol_flag, len,
len, dlsch_llr,
dlsch_llr, pllr_symbol);*/
pllr_symbol);*/
len_mod4 =len&3; len_mod4 =len&3;
len2=len>>2; // length in quad words (4 REs) len2=len>>2; // length in quad words (4 REs)
...@@ -243,19 +226,16 @@ void nr_dlsch_64qam_llr(NR_DL_FRAME_PARMS *frame_parms, ...@@ -243,19 +226,16 @@ void nr_dlsch_64qam_llr(NR_DL_FRAME_PARMS *frame_parms,
// 256-QAM // 256-QAM
//---------------------------------------------------------------------------------------------- //----------------------------------------------------------------------------------------------
void nr_dlsch_256qam_llr(NR_DL_FRAME_PARMS *frame_parms, void nr_dlsch_256qam_llr(const NR_DL_FRAME_PARMS *frame_parms,
int32_t *rxdataF_comp, const c16_t *rxdataF_comp,
int16_t *dlsch_llr, int16_t *dlsch_llr,
int32_t *dl_ch_mag, const c16_t *dl_ch_mag,
int32_t *dl_ch_magb, const c16_t *dl_ch_magb,
int32_t *dl_ch_magr, const c16_t *dl_ch_magr,
uint8_t symbol, const uint32_t len,
uint32_t len, const uint16_t nb_rb)
uint8_t first_symbol_flag,
uint16_t nb_rb)
{ {
simde__m128i *rxF = (simde__m128i*)&rxdataF_comp[(symbol*nb_rb*12)]; const simde__m128i *rxF = (simde__m128i *)rxdataF_comp;
simde__m128i *ch_mag,*ch_magb,*ch_magr;
int i,len2; int i,len2;
unsigned char len_mod4; unsigned char len_mod4;
...@@ -263,9 +243,9 @@ void nr_dlsch_256qam_llr(NR_DL_FRAME_PARMS *frame_parms, ...@@ -263,9 +243,9 @@ void nr_dlsch_256qam_llr(NR_DL_FRAME_PARMS *frame_parms,
llr2 = dlsch_llr; llr2 = dlsch_llr;
ch_mag = (simde__m128i *)dl_ch_mag; const simde__m128i *ch_mag = (simde__m128i *)dl_ch_mag;
ch_magb = (simde__m128i *)dl_ch_magb; const simde__m128i *ch_magb = (simde__m128i *)dl_ch_magb;
ch_magr = (simde__m128i *)dl_ch_magr; const simde__m128i *ch_magr = (simde__m128i *)dl_ch_magr;
len_mod4 =len&3; len_mod4 =len&3;
len2=len>>2; // length in quad words (4 REs) len2=len>>2; // length in quad words (4 REs)
......
...@@ -44,6 +44,7 @@ ...@@ -44,6 +44,7 @@
#include "PHY/NR_REFSIG/pss_nr.h" #include "PHY/NR_REFSIG/pss_nr.h"
#include "PHY/NR_REFSIG/sss_nr.h" #include "PHY/NR_REFSIG/sss_nr.h"
#include "PHY/NR_REFSIG/refsig_defs_ue.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[]; extern openair0_config_t openair0_cfg[];
//static nfapi_nr_config_request_t config_t; //static nfapi_nr_config_request_t config_t;
...@@ -100,8 +101,10 @@ void free_list(NR_UE_SSB *node) { ...@@ -100,8 +101,10 @@ void free_list(NR_UE_SSB *node) {
free(node); free(node);
} }
int nr_pbch_detection(UE_nr_rxtx_proc_t *proc,
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]) 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; NR_DL_FRAME_PARMS *frame_parms=&ue->frame_parms;
int ret =-1; 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 ...@@ -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); ue->rx_offset);
#endif #endif
uint8_t N_L = (frame_parms->Lmax == 4)? 4:8; const uint8_t N_L = (frame_parms->Lmax == 4) ? 4 : 8;
uint8_t N_hf = (frame_parms->Lmax == 4)? 2:1; 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 // 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++) { for (int hf = 0; hf < N_hf; hf++) {
...@@ -124,12 +127,10 @@ int nr_pbch_detection(UE_nr_rxtx_proc_t * proc, PHY_VARS_NR_UE *ue, int pbch_ini ...@@ -124,12 +127,10 @@ int nr_pbch_detection(UE_nr_rxtx_proc_t * proc, PHY_VARS_NR_UE *ue, int pbch_ini
// initialization of structure // initialization of structure
current_ssb = create_ssb_node(l,hf); 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 // 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++) 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); nr_pbch_dmrs_correlation(ue, proc, i, i - pbch_initial_symbol, current_ssb, rxdataF[i]);
stop_meas(&ue->dlsch_channel_estimation_stats);
current_ssb->metric = current_ssb->c_re*current_ssb->c_re + current_ssb->c_im*current_ssb->c_im; current_ssb->metric = current_ssb->c_re*current_ssb->c_re + current_ssb->c_im*current_ssb->c_im;
// generate a list of SSB structures // generate a list of SSB structures
...@@ -142,35 +143,31 @@ int nr_pbch_detection(UE_nr_rxtx_proc_t * proc, PHY_VARS_NR_UE *ue, int pbch_ini ...@@ -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; NR_UE_SSB *temp_ptr=best_ssb;
while (ret!=0 && temp_ptr != NULL) { while (ret != 0 && temp_ptr != NULL) {
// computing channel estimation for selected best ssb
start_meas(&ue->dlsch_channel_estimation_stats);
// computing channel estimation for selected best ssb
const int estimateSz = frame_parms->symbols_per_slot * frame_parms->ofdm_symbol_size; 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[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++) 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, for (int aarx = 0; aarx < ue->frame_parms.nb_antennas_rx; aarx++) {
proc,i,i-pbch_initial_symbol,temp_ptr->i_ssb,temp_ptr->n_hf,rxdataF); nr_pbch_channel_estimation(ue,
i - pbch_initial_symbol,
stop_meas(&ue->dlsch_channel_estimation_stats); temp_ptr->i_ssb,
fapiPbch_t result = {0}; temp_ptr->n_hf,
ret = nr_rx_pbch(ue, rxdataF[i][aarx],
proc, dl_ch_estimates[aarx]);
estimateSz, }
dl_ch_estimates, nr_generate_pbch_llr(ue, i - pbch_initial_symbol + 1, temp_ptr->i_ssb, rxdataF[i], dl_ch_estimates, pbch_e_rx);
frame_parms, }
temp_ptr->i_ssb, fapiPbch_t pbchResult = {0}; /* TODO: Not used anywhere. To be cleaned later */
SISO, ret = nr_pbch_decode(ue, proc, temp_ptr->i_ssb, pbch_e_rx, &pbchResult);
&result,
rxdataF);
if (DUMP_PBCH_CH_ESTIMATES && (ret == 0)) { 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.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);
} }
ue->init_sync_ssbIdx = temp_ptr->i_ssb;
temp_ptr=temp_ptr->next_ssb; temp_ptr=temp_ptr->next_ssb;
} }
...@@ -228,8 +225,6 @@ int nr_initial_sync(UE_nr_rxtx_proc_t *proc, ...@@ -228,8 +225,6 @@ int nr_initial_sync(UE_nr_rxtx_proc_t *proc,
* sync_pos SS/PBCH block * 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++; cnt++;
if (1){ // (cnt>100) if (1){ // (cnt>100)
cnt =0; cnt =0;
...@@ -279,8 +274,23 @@ int nr_initial_sync(UE_nr_rxtx_proc_t *proc, ...@@ -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 */ /* 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 */ /* 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++) __attribute__((aligned(32)))
nr_slot_fep_init_sync(ue, proc, i, frame_id * fp->samples_per_frame + ue->ssb_offset, false, rxdataF, link_type_dl); 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 #ifdef DEBUG_INITIAL_SYNCH
LOG_I(PHY,"Calling sss detection (normal CP)\n"); LOG_I(PHY,"Calling sss detection (normal CP)\n");
...@@ -332,7 +342,7 @@ int nr_initial_sync(UE_nr_rxtx_proc_t *proc, ...@@ -332,7 +342,7 @@ int nr_initial_sync(UE_nr_rxtx_proc_t *proc,
// compute the scrambling IDs for PDSCH DMRS // compute the scrambling IDs for PDSCH DMRS
for (int i=0; i<NR_NB_NSCID; i++) { for (int i=0; i<NR_NB_NSCID; i++) {
ue->scramblingID_dlsch[i]=fp->Nid_cell; 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); 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, ...@@ -253,13 +253,7 @@ void nr_ue_ulsch_procedures(PHY_VARS_NR_UE *UE,
beta_ptrs = 1; // temp value until power control is implemented beta_ptrs = 1; // temp value until power control is implemented
ulsch_ue->ptrs_symbols = 0; ulsch_ue->ptrs_symbols = get_ptrs_symb_idx(number_of_symbols, start_symbol, L_ptrs, ul_dmrs_symb_pos);
set_ptrs_symb_idx(&ulsch_ue->ptrs_symbols,
number_of_symbols,
start_symbol,
L_ptrs,
ul_dmrs_symb_pos);
} }
/////////// ///////////
......
...@@ -258,25 +258,24 @@ static int pss_ch_est_nr(PHY_VARS_NR_UE *ue, ...@@ -258,25 +258,24 @@ static int pss_ch_est_nr(PHY_VARS_NR_UE *ue,
static int do_pss_sss_extract_nr( static int do_pss_sss_extract_nr(
PHY_VARS_NR_UE *ue, PHY_VARS_NR_UE *ue,
UE_nr_rxtx_proc_t *proc, const UE_nr_rxtx_proc_t *proc,
c16_t pss_ext[NB_ANTENNAS_RX][LENGTH_PSS_NR], c16_t pss_ext[ue->frame_parms.nb_antennas_rx][LENGTH_PSS_NR],
c16_t sss_ext[NB_ANTENNAS_RX][LENGTH_SSS_NR], c16_t sss_ext[ue->frame_parms.nb_antennas_rx][LENGTH_SSS_NR],
uint8_t doPss, const uint8_t doPss,
uint8_t doSss, const uint8_t doSss,
uint8_t subframe, const uint8_t subframe,
c16_t rxdataF[][ue->frame_parms.samples_per_slot_wCP]) // add flag to indicate extracting only PSS, only SSS, or both const c16_t rxdataF[NR_N_SYMBOLS_SSB][ue->frame_parms.nb_antennas_rx]
[ue->frame_parms.ofdm_symbol_size]) // add flag to indicate extracting only PSS, only SSS, or both
{ {
NR_DL_FRAME_PARMS *frame_parms = &ue->frame_parms; NR_DL_FRAME_PARMS *frame_parms = &ue->frame_parms;
for (int aarx = 0; aarx < frame_parms->nb_antennas_rx; aarx++) { for (int aarx = 0; aarx < frame_parms->nb_antennas_rx; aarx++) {
int pss_symbol = 0; const int pss_symbol = 0;
int sss_symbol = get_softmodem_params()->sl_mode == 0 ? const int sss_symbol =
(SSS_SYMBOL_NB - PSS_SYMBOL_NB) : get_softmodem_params()->sl_mode == 0 ? (SSS_SYMBOL_NB - PSS_SYMBOL_NB) : (SSS0_SL_SYMBOL_NB - PSS0_SL_SYMBOL_NB);
(SSS0_SL_SYMBOL_NB - PSS0_SL_SYMBOL_NB) ;
unsigned int ofdm_symbol_size = frame_parms->ofdm_symbol_size;
c16_t *pss_rxF = rxdataF[aarx] + pss_symbol * ofdm_symbol_size; const c16_t *pss_rxF = rxdataF[pss_symbol][aarx];
c16_t *sss_rxF = rxdataF[aarx] + sss_symbol * ofdm_symbol_size; const c16_t *sss_rxF = rxdataF[sss_symbol][aarx];
c16_t *pss_rxF_ext = pss_ext[aarx]; c16_t *pss_rxF_ext = pss_ext[aarx];
c16_t *sss_rxF_ext = sss_ext[aarx]; c16_t *sss_rxF_ext = sss_ext[aarx];
...@@ -339,12 +338,13 @@ static int do_pss_sss_extract_nr( ...@@ -339,12 +338,13 @@ static int do_pss_sss_extract_nr(
* *
*********************************************************************/ *********************************************************************/
static int pss_sss_extract_nr(PHY_VARS_NR_UE *phy_vars_ue, static int pss_sss_extract_nr(
UE_nr_rxtx_proc_t *proc, PHY_VARS_NR_UE *phy_vars_ue,
c16_t pss_ext[NB_ANTENNAS_RX][LENGTH_PSS_NR], const UE_nr_rxtx_proc_t *proc,
c16_t sss_ext[NB_ANTENNAS_RX][LENGTH_SSS_NR], c16_t pss_ext[phy_vars_ue->frame_parms.nb_antennas_rx][LENGTH_PSS_NR],
uint8_t subframe, c16_t sss_ext[phy_vars_ue->frame_parms.nb_antennas_rx][LENGTH_SSS_NR],
c16_t rxdataF[][phy_vars_ue->frame_parms.samples_per_slot_wCP]) const uint8_t subframe,
const c16_t rxdataF[NR_N_SYMBOLS_SSB][phy_vars_ue->frame_parms.nb_antennas_rx][phy_vars_ue->frame_parms.ofdm_symbol_size])
{ {
return do_pss_sss_extract_nr(phy_vars_ue, proc, pss_ext, sss_ext, 1 /* doPss */, 1 /* doSss */, subframe, rxdataF); return do_pss_sss_extract_nr(phy_vars_ue, proc, pss_ext, sss_ext, 1 /* doPss */, 1 /* doSss */, subframe, rxdataF);
} }
...@@ -355,22 +355,23 @@ static int pss_sss_extract_nr(PHY_VARS_NR_UE *phy_vars_ue, ...@@ -355,22 +355,23 @@ static int pss_sss_extract_nr(PHY_VARS_NR_UE *phy_vars_ue,
* *
* PARAMETERS : none * PARAMETERS : none
* *
* RETURN : Set Nid_cell in ue context, return true if cell detected * RETURN : Set Nid_cell in ue context
* *
* DESCRIPTION : Determine element Nid1 of cell identity * DESCRIPTION : Determine element Nid1 of cell identity
* so Nid_cell in ue context is set according to Nid1 & Nid2 * so Nid_cell in ue context is set according to Nid1 & Nid2
* *
*********************************************************************/ *********************************************************************/
bool rx_sss_nr(PHY_VARS_NR_UE *ue, bool rx_sss_nr(PHY_VARS_NR_UE *ue,
UE_nr_rxtx_proc_t *proc, UE_nr_rxtx_proc_t *proc,
int32_t *tot_metric, int32_t *tot_metric,
uint8_t *phase_max, uint8_t *phase_max,
int *freq_offset_sss, 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])
{ {
uint8_t i; uint8_t i;
c16_t pss_ext[NB_ANTENNAS_RX][LENGTH_PSS_NR]; c16_t pss_ext[ue->frame_parms.nb_antennas_rx][LENGTH_PSS_NR];
c16_t sss_ext[NB_ANTENNAS_RX][LENGTH_SSS_NR]; c16_t sss_ext[ue->frame_parms.nb_antennas_rx][LENGTH_SSS_NR];
uint8_t Nid2 = GET_NID2(ue->common_vars.nid2); uint8_t Nid2 = GET_NID2(ue->common_vars.nid2);
uint16_t Nid1; uint16_t Nid1;
uint8_t phase; uint8_t phase;
......
...@@ -155,12 +155,7 @@ int mult_cpx_vector(int16_t *x1, //Q15 ...@@ -155,12 +155,7 @@ int mult_cpx_vector(int16_t *x1, //Q15
return(0); return(0);
} }
int multadd_cpx_vector(int16_t *x1, int multadd_cpx_vector(int16_t *x1, const int16_t *x2, int16_t *y, uint8_t zero_flag, uint32_t N, int output_shift)
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. // 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)| // 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 @@ ...@@ -19,7 +19,7 @@
* contact@openairinterface.org * contact@openairinterface.org
*/ */
unsigned char log2_approx(unsigned int x) unsigned char log2_approx(const unsigned int x)
{ {
int i; int i;
......
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.
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