Fixed and tested AGC

This commit is contained in:
Ismael Gomez 2017-11-23 12:38:44 +01:00
parent 6196c096af
commit 8b6bd607a7
5 changed files with 20 additions and 15 deletions

View File

@ -117,7 +117,7 @@ void srslte_agc_lock(srslte_agc_t *q, bool enable) {
void srslte_agc_process(srslte_agc_t *q, cf_t *signal, uint32_t len) {
if (!q->lock) {
float gain_db = 10*log10(q->gain);
float gain_uhd_db = 1.0;
float gain_uhd_db = 50.0;
//float gain_uhd = 1.0;
float y = 0;
// Apply current gain to input signal
@ -125,12 +125,12 @@ void srslte_agc_process(srslte_agc_t *q, cf_t *signal, uint32_t len) {
srslte_vec_sc_prod_cfc(signal, q->gain, signal, len);
} else {
if (gain_db < 0) {
gain_db = 0.0;
gain_db = 5.0;
}
if (isinf(gain_db) || isnan(gain_db)) {
gain_db = 10.0;
gain_db = 40.0;
} else {
gain_uhd_db = q->set_gain_callback(q->uhd_handler, gain_db);
gain_uhd_db = q->set_gain_callback(q->uhd_handler, gain_db);
q->gain = pow(10, gain_uhd_db/10);
}
}
@ -166,7 +166,7 @@ void srslte_agc_process(srslte_agc_t *q, cf_t *signal, uint32_t len) {
}
}
double gg = 1.0;
double gg = 1.0;
if (q->isfirst) {
q->y_out = y;
q->isfirst = false;
@ -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);
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);
}
}
}

View File

@ -41,7 +41,7 @@ int rf_get_available_devices(char **devnames, int max_strlen) {
double srslte_rf_set_rx_gain_th(srslte_rf_t *rf, double gain)
{
if (gain > rf->new_rx_gain + 0.5 || gain < rf->new_rx_gain - 0.5) {
if (gain > rf->new_rx_gain + 2 || gain < rf->new_rx_gain - 2) {
pthread_mutex_lock(&rf->mutex);
rf->new_rx_gain = gain;
pthread_cond_signal(&rf->cond);
@ -69,6 +69,7 @@ static void* thread_gain_fcn(void *h) {
srslte_rf_set_rx_gain(h, rf->cur_rx_gain);
}
if (rf->tx_gain_same_rx) {
printf("setting also tx\n");
srslte_rf_set_tx_gain(h, rf->cur_rx_gain+rf->tx_rx_gain_offset);
}
pthread_mutex_unlock(&rf->mutex);

View File

@ -122,6 +122,8 @@ int srslte_ue_sync_start_agc(srslte_ue_sync_t *q, double (set_gain_callback)(voi
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);
}
return n;
}

View File

@ -57,8 +57,9 @@ int radio_recv_wrapper_cs(void *obj, cf_t *data[SRSLTE_MAX_PORTS], uint32_t nsam
}
double callback_set_rx_gain(void *h, double gain) {
srslte::radio_multi *radio_handler = (srslte::radio_multi *) h;
return radio_handler->set_rx_gain_th(gain);
phch_recv *obj = (phch_recv*) h;
srslte::radio_multi *radio_h = obj->radio_h;
return radio_h->set_rx_gain_th(gain);
}
@ -100,6 +101,7 @@ void phch_recv:: init(srslte::radio_multi *_radio_handler, mac_interface_phy *_
// Set options defined in expert section
set_ue_sync_opts(&cs.ue_sync);
last_gain = 40;
if (do_agc) {
srslte_ue_sync_start_agc(&cs.ue_sync, callback_set_rx_gain, last_gain);
}
@ -553,8 +555,6 @@ bool phch_recv::cell_select(uint32_t earfcn, srslte_cell_t cell) {
current_earfcn = earfcn;
printf("cell select called set frequency\n");
if (set_frequency()) {
this->cell = cell;
log_h->info("Cell Select: Configuring cell...\n");
@ -670,7 +670,7 @@ void phch_recv::run_thread() {
switch (cell_sync_sfn()) {
case 1:
srslte_ue_sync_set_agc_period(&ue_sync, 20);
srslte_ue_sync_set_agc_period(&ue_sync, 4);
if (!cell_search_in_progress) {
phy_state = CELL_CAMP;
log_h->info("Sync OK. Camping on cell PCI=%d...\n", cell.id);

View File

@ -117,7 +117,11 @@ bool ue::init(all_args_t *args_)
// Init layers
// PHY initis in background, start before radio
if (args->rf.rx_gain < 0) {
phy.set_agc_enable(true);
}
// PHY initis 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);
@ -160,8 +164,6 @@ bool ue::init(all_args_t *args_)
if (args->rf.rx_gain < 0) {
radio.start_agc(false);
radio.set_tx_rx_gain_offset(10);
phy.set_agc_enable(true);
} else {
radio.set_rx_gain(args->rf.rx_gain);
}