Fixed channel estimator noise estimation

master
Xavier Arteaga 7 years ago
parent 9aea121528
commit 2f08a13504

@ -256,12 +256,16 @@ int srslte_chest_dl_set_cell(srslte_chest_dl_t *q, srslte_cell_t cell)
} }
/* Uses the difference between the averaged and non-averaged pilot estimates */ /* Uses the difference between the averaged and non-averaged pilot estimates */
static float estimate_noise_pilots(srslte_chest_dl_t *q, uint32_t port_id) static float estimate_noise_pilots(srslte_chest_dl_t *q, uint32_t port_id, srslte_sf_t ch_mode)
{ {
int nref=SRSLTE_REFSIGNAL_NUM_SF(q->cell.nof_prb, port_id); int nref=SRSLTE_REFSIGNAL_NUM_SF(q->cell.nof_prb, port_id);
if (q->average_subframe) { if (q->average_subframe) {
if (ch_mode == SRSLTE_SF_MBSFN) {
nref /= 4; nref /= 4;
} else {
nref /= 2;
}
} }
/* Substract noisy pilot estimates */ /* Substract noisy pilot estimates */
@ -443,7 +447,7 @@ static void average_pilots(srslte_chest_dl_t *q, cf_t *input, cf_t *output, uint
srslte_vec_sc_prod_cfc(input, 1.0f / ((float) nsymbols), input, nref); srslte_vec_sc_prod_cfc(input, 1.0f / ((float) nsymbols), input, nref);
nsymbols = 1; nsymbols = 1;
} else { } else {
cf_t *temp = &output[nref * 2]; cf_t *temp = output; // Use ouput as temporal buffer
if (srslte_refsignal_cs_fidx(q->cell, 0, port_id, 0) < 3) { if (srslte_refsignal_cs_fidx(q->cell, 0, port_id, 0) < 3) {
srslte_vec_interleave(input, &input[nref], temp, nref); srslte_vec_interleave(input, &input[nref], temp, nref);
@ -456,10 +460,10 @@ static void average_pilots(srslte_chest_dl_t *q, cf_t *input, cf_t *output, uint
srslte_vec_interleave_add(&input[(l + 1) * nref], &input[l * nref], temp, nref); srslte_vec_interleave_add(&input[(l + 1) * nref], &input[l * nref], temp, nref);
} }
} }
srslte_vec_sc_prod_cfc(temp, 2.0f / (float) nsymbols, temp, 2 * nref); nref *= 2;
srslte_conv_same_cf(temp, q->smooth_filter, output, 2 * nref, q->smooth_filter_len); srslte_vec_sc_prod_cfc(temp, 2.0f / (float) nsymbols, input, nref);
return; nsymbols = 1;
} }
} }
@ -521,7 +525,7 @@ void chest_interpolate_noise_est(srslte_chest_dl_t *q, cf_t *input, cf_t *ce, ui
/* Estimate noise power */ /* Estimate noise power */
if (q->noise_alg == SRSLTE_NOISE_ALG_REFS && q->smooth_filter_len > 0) { if (q->noise_alg == SRSLTE_NOISE_ALG_REFS && q->smooth_filter_len > 0) {
q->noise_estimate[rxant_id][port_id] = estimate_noise_pilots(q, port_id); q->noise_estimate[rxant_id][port_id] = estimate_noise_pilots(q, port_id, ch_mode);
} else if (q->noise_alg == SRSLTE_NOISE_ALG_PSS) { } else if (q->noise_alg == SRSLTE_NOISE_ALG_PSS) {
if (sf_idx == 0 || sf_idx == 5) { if (sf_idx == 0 || sf_idx == 5) {
q->noise_estimate[rxant_id][port_id] = estimate_noise_pss(q, input, ce); q->noise_estimate[rxant_id][port_id] = estimate_noise_pss(q, input, ce);

Loading…
Cancel
Save