Commit e5e4dead authored by Florian Kaltenberger's avatar Florian Kaltenberger Committed by Florian Kaltenberger

fixing a bug in nr_est_timing_advance_srs

parent ae21d9a9
......@@ -46,8 +46,9 @@
/* Generic function to find the peak of channel estimation buffer */
int32_t nr_est_toa_ns_srs(NR_DL_FRAME_PARMS *frame_parms,
uint8_t N_arx,
uint8_t N_ap,
int32_t srs_estimated_channel_freq[N_ap][frame_parms->ofdm_symbol_size],
int32_t srs_estimated_channel_freq[N_arx][N_ap][frame_parms->ofdm_symbol_size],
int16_t *srs_toa_ns)
{
......@@ -59,24 +60,26 @@ int32_t nr_est_toa_ns_srs(NR_DL_FRAME_PARMS *frame_parms,
int32_t max_val = 0, max_idx = 0, abs_val = 0, mean_val = 0;
int16_t start_offset = (NR_SRS_IDFT_OVERSAMP_FACTOR*frame_parms->ofdm_symbol_size)-(frame_parms->ofdm_symbol_size>>1);
for (int arx_index = 0; arx_index < N_arx; arx_index++) {
for (int p_index = 0; p_index < N_ap; p_index++) {
// Place SRS channel estimates in FFT shifted format for oversampling
memcpy((int16_t *)&chF_interpol[p_index][0], &srs_estimated_channel_freq[p_index][0], (frame_parms->ofdm_symbol_size>>1) * sizeof(int32_t));
memcpy((int16_t *)&chF_interpol[p_index][start_offset], &srs_estimated_channel_freq[p_index][frame_parms->ofdm_symbol_size>>1], (frame_parms->ofdm_symbol_size>>1) * sizeof(int32_t));
for (int ap_index = 0; ap_index < N_ap; ap_index++) {
// Convert to time domain oversampled
freq2time(frame_parms->ofdm_symbol_size*NR_SRS_IDFT_OVERSAMP_FACTOR,
(int16_t*) chF_interpol[p_index],
(int16_t*) chT_interpol[p_index]);
}
// Place SRS channel estimates in FFT shifted format for oversampling
memcpy((int16_t *)&chF_interpol[ap_index][0], &srs_estimated_channel_freq[arx_index][ap_index][0], (frame_parms->ofdm_symbol_size>>1) * sizeof(int32_t));
memcpy((int16_t *)&chF_interpol[ap_index][start_offset], &srs_estimated_channel_freq[arx_index][ap_index][frame_parms->ofdm_symbol_size>>1], (frame_parms->ofdm_symbol_size>>1) * sizeof(int32_t));
// Convert to time domain oversampled
freq2time(frame_parms->ofdm_symbol_size*NR_SRS_IDFT_OVERSAMP_FACTOR,
(int16_t*) chF_interpol[ap_index],
(int16_t*) chT_interpol[ap_index]);
}
for (int p_index = 0; p_index < N_ap; p_index++) {
for(int k = 0; k < NR_SRS_IDFT_OVERSAMP_FACTOR*frame_parms->ofdm_symbol_size; k++) {
abs_val = 0;
abs_val += squaredMod(((c16_t*)chT_interpol[p_index])[k]);
for (int p_index = 0; p_index < N_ap; p_index++)
abs_val += squaredMod(((c16_t*)chT_interpol[p_index])[k]);
mean_val += (abs_val - mean_val)/(k+1);
if(abs_val > max_val) {
max_val = abs_val;
......@@ -88,11 +91,11 @@ int32_t nr_est_toa_ns_srs(NR_DL_FRAME_PARMS *frame_parms,
max_idx = max_idx - NR_SRS_IDFT_OVERSAMP_FACTOR*frame_parms->ofdm_symbol_size;
// Check for detection threshold
LOG_D(PHY, "SRS ToA estimator (ant %d): max_val %d, mean_val %d, max_idx %d\n", p_index, max_val, mean_val, max_idx);
LOG_D(PHY, "SRS ToA estimator (RX ant %d): max_val %d, mean_val %d, max_idx %d\n", arx_index, max_val, mean_val, max_idx);
if ((mean_val != 0) && (max_val / mean_val > 10)) {
srs_toa_ns[p_index] = (max_idx*1e9)/(NR_SRS_IDFT_OVERSAMP_FACTOR*frame_parms->samples_per_frame*100);
srs_toa_ns[arx_index] = (max_idx*1e9)/(NR_SRS_IDFT_OVERSAMP_FACTOR*frame_parms->samples_per_frame*100);
} else {
srs_toa_ns[p_index] = 0xFFFF;
srs_toa_ns[arx_index] = 0xFFFF;
}
}
......
......@@ -67,8 +67,9 @@ int nr_est_timing_advance_srs(const NR_DL_FRAME_PARMS *frame_parms,
const int32_t srs_estimated_channel_time[N_ap][frame_parms->ofdm_symbol_size]);
int32_t nr_est_toa_ns_srs(NR_DL_FRAME_PARMS *frame_parms,
uint8_t N_arx,
uint8_t N_ap,
int32_t srs_estimated_channel_freq[N_ap][frame_parms->ofdm_symbol_size],
int32_t srs_estimated_channel_freq[N_arx][N_ap][frame_parms->ofdm_symbol_size],
int16_t *srs_toa_ns);
void nr_pusch_ptrs_processing(PHY_VARS_gNB *gNB,
......
......@@ -976,22 +976,25 @@ int phy_procedures_gNB_uespec_RX(PHY_VARS_gNB *gNB, int frame_rx, int slot_rx)
srs_est = -1;
}
for (int ant_rx = 0; ant_rx < gNB->frame_parms.nb_antennas_rx; ant_rx++) {
T(T_GNB_PHY_UL_FREQ_CHANNEL_ESTIMATE,
T_INT(0),
T_INT(gNB->Mod_id),
T_INT(srs_pdu->rnti),
T_INT(frame_rx),
T_INT(0),
T_INT(0),
T_BUFFER(srs_estimated_channel_freq[0][0], frame_parms->ofdm_symbol_size * sizeof(int32_t)));
T_INT(slot_rx),
T_INT(ant_rx),
T_BUFFER(srs_estimated_channel_freq[ant_rx][0], frame_parms->ofdm_symbol_size * sizeof(int32_t)));
T(T_GNB_PHY_UL_TIME_CHANNEL_ESTIMATE,
T_INT(0),
T_INT(gNB->Mod_id),
T_INT(srs_pdu->rnti),
T_INT(frame_rx),
T_INT(0),
T_INT(0),
T_BUFFER(srs_estimated_channel_time_shifted[0][0], frame_parms->ofdm_symbol_size * sizeof(int32_t)));
T_INT(slot_rx),
T_INT(ant_rx),
T_BUFFER(srs_estimated_channel_time_shifted[ant_rx][0], frame_parms->ofdm_symbol_size * sizeof(int32_t)));
}
gNB->UL_INFO.srs_ind.pdu_list = &gNB->srs_pdu_list[0];
gNB->UL_INFO.srs_ind.sfn = frame_rx;
gNB->UL_INFO.srs_ind.slot = slot_rx;
......@@ -1001,12 +1004,13 @@ int phy_procedures_gNB_uespec_RX(PHY_VARS_gNB *gNB, int frame_rx, int slot_rx)
srs_indication->rnti = srs_pdu->rnti;
uint8_t N_ap = 1<<srs_pdu->num_ant_ports;
int16_t srs_toa_ns[N_ap];
uint8_t N_ant_rx = gNB->frame_parms.nb_antennas_rx;
int16_t srs_toa_ns[N_ant_rx];
start_meas(&gNB->srs_timing_advance_stats);
srs_indication->timing_advance_offset = srs_est >= 0 ? nr_est_timing_advance_srs(frame_parms, N_ap, srs_estimated_channel_time[0]) : 0xFFFF;
stop_meas(&gNB->srs_timing_advance_stats);
srs_indication->timing_advance_offset_nsec = srs_est >= 0 ? nr_est_toa_ns_srs(frame_parms, N_ap, srs_estimated_channel_freq[0], srs_toa_ns) : 0xFFFF;
srs_indication->timing_advance_offset_nsec = srs_est >= 0 ? nr_est_toa_ns_srs(frame_parms, N_ant_rx, N_ap, srs_estimated_channel_freq, srs_toa_ns) : 0xFFFF;
//(int16_t)((((int32_t)srs_indication->timing_advance_offset - 31) * ((int32_t)TC_NSEC_x32768)) >> 15) : 0xFFFF;
switch (srs_pdu->srs_parameters_v4.usage) {
......@@ -1134,13 +1138,13 @@ int phy_procedures_gNB_uespec_RX(PHY_VARS_gNB *gNB, int frame_rx, int slot_rx)
case NFAPI_NR_SRS_LOCALIZATION: {
// this is a custom usage not in the standard
// we send Timing advance offset in nanoseconds for each TRP (= antenna)
// we send Timing advance offset in nanoseconds for each TRP (= RX antenna)
uint8_t *pWritePackedMessage = (uint8_t*) report_tlv->value;
uint8_t *end = (uint8_t*) report_tlv->value + sizeof(report_tlv->value);
for (int p_index = 0; p_index < N_ap; p_index++) {
report_tlv->length += push16(srs_toa_ns[p_index],&pWritePackedMessage,end);
for (int arx_index = 0; arx_index < N_ant_rx; arx_index++) {
report_tlv->length += push16(srs_toa_ns[arx_index],&pWritePackedMessage,end);
}
break;
}
......
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