From f290b04332abf8f8da972e138cfa938a298d3aae Mon Sep 17 00:00:00 2001 From: c vw Date: Mon, 7 Dec 2020 20:10:53 +0100 Subject: [PATCH] Do all the "TX set filter" logic in tx_set_filter(), also handling the "UseRxFilter" case. --- receiver.c | 28 ++---------------- transmitter.c | 81 ++++++++++++++++++++++++++++++--------------------- transmitter.h | 2 +- tx_menu.c | 45 ++-------------------------- 4 files changed, 54 insertions(+), 102 deletions(-) diff --git a/receiver.c b/receiver.c index 7b3e4e9..6164b43 100644 --- a/receiver.c +++ b/receiver.c @@ -1316,34 +1316,10 @@ void receiver_filter_changed(RECEIVER *rx) { set_filter(rx,filter_low,filter_high); } - // - // tx_set_filter mirrors the filter edges for LSB, DIGL - // if(can_transmit && transmitter!=NULL) { if(transmitter->use_rx_filter) { - if(rx==active_receiver) { - switch (m) { - case modeCWU: - case modeCWL: - case modeDSB: - case modeAM: - case modeSAM: - case modeFMN: - case modeDRM: - case modeSPEC: - tx_set_filter(transmitter,-filter_high,filter_high); - break; - case modeUSB: - case modeDIGU: - tx_set_filter(transmitter,filter_low,filter_high); - break; - case modeLSB: - case modeDIGL: - tx_set_filter(transmitter,-filter_high,-filter_low); - break; - } - } - } + tx_set_filter(transmitter); + } } } diff --git a/transmitter.c b/transmitter.c index 443d182..db1ce5d 100644 --- a/transmitter.c +++ b/transmitter.c @@ -928,68 +928,83 @@ void tx_set_mode(TRANSMITTER* tx,int mode) { int filter_low, filter_high; tx->mode=mode; SetTXAMode(tx->id, tx->mode); - if(tx->use_rx_filter) { - int m=vfo[active_receiver->id].mode; - if(m==modeFMN) { - if(active_receiver->deviation==2500) { - filter_low=-5500; - filter_high=5500; - } else { - filter_low=-8000; - filter_high=8000; - } - } else { - FILTER *mode_filters=filters[m]; - FILTER *filter=&mode_filters[vfo[active_receiver->id].filter]; - filter_low=filter->low; - filter_high=filter->high; - } - } else { - filter_low=tx_filter_low; - filter_high=tx_filter_high; - } - tx_set_filter(tx,filter_low,filter_high); + tx_set_filter(tx); } } -void tx_set_filter(TRANSMITTER *tx,int low,int high) { +void tx_set_filter(TRANSMITTER *tx) { int txmode=get_tx_mode(); - switch(txmode) { - // - // In CW TX, WDSP is not unused anyway but CW signals - // are sent at zero frequency, therefore - // TX filter should be centered around zero. - // - // FMN and DRM set fixed TX filter sizes. + // load default values + int low = tx_filter_low; + int high = tx_filter_high; // 0 < low < high + + if (tx->use_rx_filter) { // - // LSB/DIGL "mirror" filter edges + // Use only 'compatible' parts of RX filter settings + // to change TX values (importrant for split operation) // + int id=active_receiver->id; + int rxmode=vfo[id].mode; + FILTER *mode_filters=filters[rxmode]; + FILTER *filter=&mode_filters[vfo[id].filter]; + + switch (rxmode) { + case modeDSB: + case modeAM: + case modeSAM: + case modeSPEC: + high = filter->high; + break; + case modeLSB: + case modeDIGL: + high = -filter->low; + low = -filter->high; + break; + case modeUSB: + case modeDIGU: + high = filter->high; + low = filter->low; + break; + } + } + + switch(txmode) { case modeCWL: case modeCWU: + // default filter setting (low=150, high=2850) and "use rx filter" unreasonable here + // note currently WDSP is by-passed in CW anyway. + tx->filter_low =-150; + tx->filter_high = 150; + break; case modeDSB: case modeAM: case modeSAM: case modeSPEC: + // disregard the "low" value and use (-high, high) tx->filter_low =-high; tx->filter_high=high; break; case modeLSB: case modeDIGL: + // in IQ space, the filter edges are (-high, -low) tx->filter_low=-high; tx->filter_high=-low; break; case modeUSB: case modeDIGU: + // in IQ space, the filter edges are (low, high) tx->filter_low=low; tx->filter_high=high; break; case modeFMN: + // calculate filter size from deviation, + // assuming that the highest AF frequency is 3000 if(tx->deviation==2500) { - tx->filter_low=-5500; - tx->filter_high=5500; + tx->filter_low=-5500; // Carson's rule: +/-(deviation + max_af_frequency) + tx->filter_high=5500; // deviation=2500, max freq = 3000 } else { - tx->filter_low=-8000; + tx->filter_low=-8000; // deviation=5000, max freq = 3000 tx->filter_high=8000; } break; diff --git a/transmitter.h b/transmitter.h index 2e9fc28..ed6ca46 100644 --- a/transmitter.h +++ b/transmitter.h @@ -127,7 +127,7 @@ extern int cw_key_down; extern int cw_not_ready; extern void tx_set_mode(TRANSMITTER* tx,int m); -extern void tx_set_filter(TRANSMITTER *tx,int low,int high); +extern void tx_set_filter(TRANSMITTER *tx); extern void transmitter_set_deviation(TRANSMITTER *tx); extern void transmitter_set_am_carrier_level(TRANSMITTER *tx); extern void tx_set_pre_emphasize(TRANSMITTER *tx,int state); diff --git a/tx_menu.c b/tx_menu.c index 0211df6..ef7e478 100644 --- a/tx_menu.c +++ b/tx_menu.c @@ -72,12 +72,12 @@ static void comp_cb(GtkWidget *widget, gpointer data) { static void tx_spin_low_cb (GtkWidget *widget, gpointer data) { tx_filter_low=gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(widget)); - tx_set_filter(transmitter,tx_filter_low,tx_filter_high); + tx_set_filter(transmitter); } static void tx_spin_high_cb (GtkWidget *widget, gpointer data) { tx_filter_high=gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(widget)); - tx_set_filter(transmitter,tx_filter_low,tx_filter_high); + tx_set_filter(transmitter); } static void micboost_cb(GtkWidget *widget, gpointer data) { @@ -128,47 +128,8 @@ static void tune_percent_cb (GtkWidget *widget, gpointer data) { static void use_rx_filter_cb(GtkWidget *widget, gpointer data) { transmitter->use_rx_filter=gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget)); - int filter_low,filter_high; - // - // The result is unreasonable if e.g. the RX mode is FM and the TX mode is USB - // but it is designed to do something useful if RX mode is USB and TX mode is LSB - // which may occur in cross-band QSOs - // - if(transmitter->use_rx_filter) { - int m=vfo[active_receiver->id].mode; - FILTER *mode_filters=filters[m]; - FILTER *filter=&mode_filters[vfo[active_receiver->id].filter]; - switch (m) { - case modeFMN: - case modeDRM: - case modeCWU: - case modeCWL: - case modeAM: - case modeDSB: - case modeSAM: - case modeSPEC: - filter_low =-filter->high; - filter_high= filter->high; - break; - case modeLSB: - case modeDIGL: - // filter edges are in the IQ domain (negative) - filter_low=-filter->high; - filter_high=-filter->low; - break; - case modeUSB: - case modeDIGU: - filter_low=filter->low; - filter_high=filter->high; - break; - } - } else { - filter_low=tx_filter_low; - filter_high=tx_filter_high; - } - - tx_set_filter(transmitter,filter_low,filter_high); + tx_set_filter(transmitter); if(transmitter->use_rx_filter) { gtk_widget_set_sensitive (tx_spin_low, FALSE); -- 2.45.2