From d9560dc155ed998a9abff1e6a4e35eede6cc2277 Mon Sep 17 00:00:00 2001 From: Ismael Gomez Date: Tue, 30 Jan 2018 18:23:51 +0100 Subject: [PATCH] Fixed RSRP increasing with traffic --- srsue/hdr/phy/phch_common.h | 2 ++ srsue/hdr/phy/phch_worker.h | 2 ++ srsue/src/phy/phch_worker.cc | 55 ++++++++++++++++++++++++------------ 3 files changed, 41 insertions(+), 18 deletions(-) diff --git a/srsue/hdr/phy/phch_common.h b/srsue/hdr/phy/phch_common.h index 77fd50ff9..31bf06122 100644 --- a/srsue/hdr/phy/phch_common.h +++ b/srsue/hdr/phy/phch_common.h @@ -70,6 +70,8 @@ public: float avg_rsrp; float avg_rsrp_dbm; float avg_rsrq_db; + float avg_rssi_dbm; + float last_radio_rssi; float rx_gain_offset; float avg_snr_db; float avg_noise; diff --git a/srsue/hdr/phy/phch_worker.h b/srsue/hdr/phy/phch_worker.h index 5430a2d18..d73214514 100644 --- a/srsue/hdr/phy/phch_worker.h +++ b/srsue/hdr/phy/phch_worker.h @@ -158,6 +158,8 @@ private: float cfo; bool rar_cqi_request; + uint32_t rssi_read_cnt; + // Metrics dl_metrics_t dl_metrics; ul_metrics_t ul_metrics; diff --git a/srsue/src/phy/phch_worker.cc b/srsue/src/phy/phch_worker.cc index 76fd4eb44..df0d3f458 100644 --- a/srsue/src/phy/phch_worker.cc +++ b/srsue/src/phy/phch_worker.cc @@ -100,6 +100,7 @@ void phch_worker::reset() rar_cqi_request = false; I_sr = 0; cfi = 0; + rssi_read_cnt = 0; } void phch_worker::set_common(phch_common* phy_) @@ -230,6 +231,15 @@ void phch_worker::work_imp() mac_interface_phy::tb_action_ul_t ul_action; bzero(&ul_action, sizeof(mac_interface_phy::tb_action_ul_t)); + + /** Calculate RSSI on the input signal before generating the output */ + + // Average RSSI over all symbols + float rssi_dbm = 10*log10(srslte_vec_avg_power_cf(signal_buffer[0], SRSLTE_SF_LEN_PRB(cell.nof_prb))) + 30; + if (isnormal(rssi_dbm)) { + phy->avg_rssi_dbm = SRSLTE_VEC_EMA(rssi_dbm, phy->avg_rssi_dbm, phy->args->snr_ema_coeff); + } + /* Do FFT and extract PDCCH LLR, or quit if no actions are required in this subframe */ bool chest_ok = extract_fft_and_pdcch_llr(); @@ -287,7 +297,8 @@ void phch_worker::work_imp() // Decode PHICH bool ul_ack = false; - bool ul_ack_available = decode_phich(&ul_ack); + bool ul_ack_available = decode_phich(&ul_ack); + /***** Uplink Processing + Transmission *******/ @@ -1325,42 +1336,50 @@ void phch_worker::update_measurements() { float snr_ema_coeff = phy->args->snr_ema_coeff; if (chest_done) { - /* Compute ADC/RX gain offset every ~10s */ - if (tti== 0 || phy->rx_gain_offset == 0) { - float rx_gain_offset = 0; - if (phy->get_radio()->has_rssi() && phy->args->rssi_sensor_enabled) { - float rssi_all_signal = 30+10*log10(srslte_vec_avg_power_cf(signal_buffer[0],SRSLTE_SF_LEN(srslte_symbol_sz(cell.nof_prb)))); - rx_gain_offset = 30+rssi_all_signal-phy->get_radio()->get_rssi(); - } else { - rx_gain_offset = phy->get_radio()->get_rx_gain(); + + /* Only worker 0 reads the RSSI sensor every ~1-nof_cores s */ + if (get_id() == 0) { + if (rssi_read_cnt) { + if (phy->get_radio()->has_rssi() && phy->args->rssi_sensor_enabled) { + phy->last_radio_rssi = phy->get_radio()->get_rssi(); + phy->rx_gain_offset = phy->avg_rssi_dbm - phy->last_radio_rssi + 30; + } else { + phy->rx_gain_offset = phy->get_radio()->get_rx_gain(); + } } - if (phy->rx_gain_offset) { - phy->rx_gain_offset = SRSLTE_VEC_EMA(rx_gain_offset, phy->rx_gain_offset, 0.5); - } else { - phy->rx_gain_offset = rx_gain_offset; + rssi_read_cnt++; + if (rssi_read_cnt == 1000) { + rssi_read_cnt = 0; } } // Average RSRQ float rsrq_db = 10*log10(srslte_chest_dl_get_rsrq(&ue_dl.chest)); if (isnormal(rsrq_db)) { - phy->avg_rsrq_db = SRSLTE_VEC_EMA(rsrq_db, phy->avg_rsrq_db, snr_ema_coeff); + if (!phy->avg_rsrq_db) { + phy->avg_rsrq_db = SRSLTE_VEC_EMA(rsrq_db, phy->avg_rsrq_db, snr_ema_coeff); + } else { + phy->avg_rsrq_db = rsrq_db; + } } // Average RSRP float rsrp_lin = srslte_chest_dl_get_rsrp(&ue_dl.chest); if (isnormal(rsrp_lin)) { - phy->avg_rsrp = SRSLTE_VEC_EMA(rsrp_lin, phy->avg_rsrp, snr_ema_coeff); + if (!phy->avg_rsrp) { + phy->avg_rsrp = SRSLTE_VEC_EMA(rsrp_lin, phy->avg_rsrp, snr_ema_coeff); + } else { + phy->avg_rsrp = rsrp_lin; + } } /* Correct absolute power measurements by RX gain offset */ float rsrp_dbm = 10*log10(rsrp_lin) + 30 - phy->rx_gain_offset; - float rssi_db = 10*log10(srslte_chest_dl_get_rssi(&ue_dl.chest)) + 30 - phy->rx_gain_offset; // Serving cell measurements are averaged over DEFAULT_MEAS_PERIOD_MS then sent to RRC if (isnormal(rsrp_dbm)) { if (!phy->avg_rsrp_dbm) { - phy->avg_rsrp_dbm= rsrp_dbm; + phy->avg_rsrp_dbm = rsrp_dbm; } else { phy->avg_rsrp_dbm = SRSLTE_VEC_EMA(rsrp_dbm, phy->avg_rsrp_dbm, snr_ema_coeff); } @@ -1390,7 +1409,7 @@ void phch_worker::update_measurements() dl_metrics.n = phy->avg_noise; dl_metrics.rsrp = phy->avg_rsrp_dbm; dl_metrics.rsrq = phy->avg_rsrq_db; - dl_metrics.rssi = rssi_db; + dl_metrics.rssi = phy->avg_rssi_dbm; dl_metrics.pathloss = phy->pathloss; dl_metrics.sinr = phy->avg_snr_db; dl_metrics.turbo_iters = srslte_pdsch_last_noi(&ue_dl.pdsch);