mirror of https://github.com/PentHertz/srsLTE.git
Fixes #6 AGC
This commit is contained in:
parent
fd1e22a710
commit
70dfa3b2a9
|
@ -42,8 +42,8 @@
|
|||
|
||||
#include "srslte/config.h"
|
||||
|
||||
#define SRSLTE_AGC_DEFAULT_TARGET 0.7
|
||||
#define SRSLTE_AGC_DEFAULT_BW (5e-1)
|
||||
#define SRSLTE_AGC_DEFAULT_TARGET 0.3
|
||||
#define SRSLTE_AGC_DEFAULT_BW 0.7
|
||||
|
||||
typedef enum SRSLTE_API {
|
||||
SRSLTE_AGC_MODE_ENERGY = 0,
|
||||
|
|
|
@ -177,7 +177,7 @@ void srslte_agc_process(srslte_agc_t *q, cf_t *signal, uint32_t len) {
|
|||
gg = expf(-0.5*q->bandwidth*logf(q->y_out/q->target));
|
||||
q->gain *= gg;
|
||||
}
|
||||
DEBUG("AGC gain: %.2f (%.2f) y_out=%.3f, y=%.3f target=%.1f gg=%.2f\n", gain_db, gain_uhd_db, q->y_out, y, q->target, gg);
|
||||
INFO("AGC gain: %.2f (%.2f) y_out=%.3f, y=%.3f target=%.1f gg=%.2f\n", gain_db, gain_uhd_db, q->y_out, y, q->target, gg);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -144,18 +144,11 @@ void srslte_ue_sync_reset(srslte_ue_sync_t *q) {
|
|||
|
||||
|
||||
int srslte_ue_sync_start_agc(srslte_ue_sync_t *q, double (set_gain_callback)(void*, double), float init_gain_value) {
|
||||
uint32_t nframes;
|
||||
if (q->nof_recv_sf == 1) {
|
||||
nframes = 10;
|
||||
} else {
|
||||
nframes = 0;
|
||||
}
|
||||
int n = srslte_agc_init_uhd(&q->agc, SRSLTE_AGC_MODE_PEAK_AMPLITUDE, nframes, set_gain_callback, q->stream);
|
||||
int n = srslte_agc_init_uhd(&q->agc, SRSLTE_AGC_MODE_PEAK_AMPLITUDE, 0, set_gain_callback, q->stream);
|
||||
q->do_agc = n==0?true:false;
|
||||
if (q->do_agc) {
|
||||
srslte_agc_set_gain(&q->agc, init_gain_value);
|
||||
srslte_agc_set_target(&q->agc, 0.3);
|
||||
srslte_agc_set_bandwidth(&q->agc, 0.8);
|
||||
srslte_ue_sync_set_agc_period(q, 4);
|
||||
}
|
||||
return n;
|
||||
}
|
||||
|
@ -329,7 +322,6 @@ int srslte_ue_sync_set_cell(srslte_ue_sync_t *q, srslte_cell_t cell)
|
|||
memcpy(&q->cell, &cell, sizeof(srslte_cell_t));
|
||||
q->fft_size = srslte_symbol_sz(q->cell.nof_prb);
|
||||
q->sf_len = SRSLTE_SF_LEN(q->fft_size);
|
||||
q->agc_period = 0;
|
||||
|
||||
if (cell.id == 1000) {
|
||||
|
||||
|
@ -789,7 +781,7 @@ int srslte_ue_sync_zerocopy_multi(srslte_ue_sync_t *q, cf_t *input_buffer[SRSLTE
|
|||
if (q->do_agc && (q->agc_period == 0 ||
|
||||
(q->agc_period && (q->frame_total_cnt%q->agc_period) == 0)))
|
||||
{
|
||||
srslte_agc_process(&q->agc, input_buffer[0], q->sf_len);
|
||||
srslte_agc_process(&q->agc, input_buffer[0], q->sf_len);
|
||||
}
|
||||
|
||||
/* Track PSS/SSS around the expected PSS position
|
||||
|
|
|
@ -125,6 +125,7 @@ private:
|
|||
float get_last_gain();
|
||||
float get_last_cfo();
|
||||
void set_N_id_2(int N_id_2);
|
||||
void set_agc_enable(bool enable);
|
||||
ret_code run(srslte_cell_t *cell);
|
||||
|
||||
private:
|
||||
|
|
|
@ -174,6 +174,16 @@ bool phch_recv::wait_radio_reset() {
|
|||
void phch_recv::set_agc_enable(bool enable)
|
||||
{
|
||||
do_agc = enable;
|
||||
if (do_agc) {
|
||||
if (running && radio_h) {
|
||||
srslte_ue_sync_start_agc(&ue_sync, callback_set_rx_gain, radio_h->get_rx_gain());
|
||||
search_p.set_agc_enable(true);
|
||||
} else {
|
||||
fprintf(stderr, "Error setting AGC: PHY not initiatec\n");
|
||||
}
|
||||
} else {
|
||||
fprintf(stderr, "Error stopping AGC: not implemented\n");
|
||||
}
|
||||
}
|
||||
|
||||
void phch_recv::set_time_adv_sec(float _time_adv_sec)
|
||||
|
@ -832,6 +842,14 @@ float phch_recv::search::get_last_cfo()
|
|||
return srslte_ue_sync_get_cfo(&ue_mib_sync.ue_sync);
|
||||
}
|
||||
|
||||
void phch_recv::search::set_agc_enable(bool enable) {
|
||||
if (enable) {
|
||||
srslte_ue_sync_start_agc(&ue_mib_sync.ue_sync, callback_set_rx_gain, p->radio_h->get_rx_gain());
|
||||
} else {
|
||||
fprintf(stderr, "Error stop AGC not implemented\n");
|
||||
}
|
||||
}
|
||||
|
||||
phch_recv::search::ret_code phch_recv::search::run(srslte_cell_t *cell)
|
||||
{
|
||||
|
||||
|
@ -891,11 +909,6 @@ phch_recv::search::ret_code phch_recv::search::run(srslte_cell_t *cell)
|
|||
// Set options defined in expert section
|
||||
p->set_ue_sync_opts(&ue_mib_sync.ue_sync, cfo);
|
||||
|
||||
// Start AGC after initial cell search
|
||||
if (p->do_agc) {
|
||||
srslte_ue_sync_start_agc(&ue_mib_sync.ue_sync, callback_set_rx_gain, p->radio_h->get_rx_gain());
|
||||
}
|
||||
|
||||
srslte_ue_sync_reset(&ue_mib_sync.ue_sync);
|
||||
|
||||
/* Find and decode MIB */
|
||||
|
@ -1011,7 +1024,6 @@ phch_recv::sfn_sync::ret_code phch_recv::sfn_sync::run_subframe(srslte_cell_t *c
|
|||
Info("SYNC: DONE, TTI=%d, sfn_offset=%d\n", *tti_cnt, sfn_offset);
|
||||
}
|
||||
|
||||
srslte_ue_sync_set_agc_period(ue_sync, 20);
|
||||
srslte_ue_sync_decode_sss_on_track(ue_sync, true);
|
||||
reset();
|
||||
return SFN_FOUND;
|
||||
|
|
|
@ -1436,7 +1436,7 @@ void phch_worker::update_measurements()
|
|||
dl_metrics.rsrp = phy->avg_rsrp_dbm;
|
||||
dl_metrics.rsrq = phy->avg_rsrq_db;
|
||||
dl_metrics.rssi = phy->avg_rssi_dbm;
|
||||
dl_metrics.pathloss = phy->pathloss;
|
||||
dl_metrics.pathloss = phy->get_radio()->get_rx_gain();
|
||||
dl_metrics.sinr = phy->avg_snr_db;
|
||||
dl_metrics.turbo_iters = srslte_pdsch_last_noi(&ue_dl.pdsch);
|
||||
phy->set_dl_metrics(dl_metrics);
|
||||
|
|
|
@ -130,11 +130,7 @@ bool ue::init(all_args_t *args_)
|
|||
|
||||
// Init layers
|
||||
|
||||
if (args->rf.rx_gain < 0) {
|
||||
phy.set_agc_enable(true);
|
||||
}
|
||||
|
||||
// PHY initis in background, start before radio
|
||||
// PHY inits in background, start before radio
|
||||
args->expert.phy.nof_rx_ant = args->rf.nof_rx_ant;
|
||||
phy.init(&radio, &mac, &rrc, phy_log, &args->expert.phy);
|
||||
|
||||
|
@ -222,6 +218,11 @@ bool ue::init(all_args_t *args_)
|
|||
phy.wait_initialize();
|
||||
phy.configure_ul_params();
|
||||
|
||||
// Enable AGC once PHY is initialized
|
||||
if (args->rf.rx_gain < 0) {
|
||||
phy.set_agc_enable(true);
|
||||
}
|
||||
|
||||
printf("...\n");
|
||||
nas.attach_request();
|
||||
|
||||
|
|
|
@ -1062,6 +1062,7 @@ bool rrc::ho_prepare() {
|
|||
|
||||
int target_cell_idx = find_neighbour_cell(serving_cell->earfcn, mob_reconf.mob_ctrl_info.target_pci);
|
||||
if (target_cell_idx < 0) {
|
||||
rrc_log->console("Received HO command to unknown PCI=%d\n", mob_reconf.mob_ctrl_info.target_pci);
|
||||
rrc_log->error("Could not find target cell earfcn=%d, pci=%d\n", serving_cell->earfcn, mob_reconf.mob_ctrl_info.target_pci);
|
||||
return false;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue