]> git.rkrishnan.org Git - pihpsdr.git/commitdiff
Do all the "TX set filter" logic in tx_set_filter(), also handling
authorc vw <dl1ycf@darc.de>
Mon, 7 Dec 2020 19:10:53 +0000 (20:10 +0100)
committerc vw <dl1ycf@darc.de>
Mon, 7 Dec 2020 19:10:53 +0000 (20:10 +0100)
the "UseRxFilter" case.

receiver.c
transmitter.c
transmitter.h
tx_menu.c

index 7b3e4e9da324f07df4a1caf5518738f43414cfea..6164b4308bc60224ac918a592050456e9761f629 100644 (file)
@@ -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);
+    } 
   }
 }
 
index 443d1827814adf77bbe5d78c0097cd541d61a6c2..db1ce5deb371eac27278a7cc25496fdd74945801 100644 (file)
@@ -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;
index 2e9fc288d64129bce3b23b2b919159613356d587..ed6ca46573489da083901d6afe0957b1ccc449eb 100644 (file)
@@ -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);
index 0211df66c7d7436d3127c28cf0da76b55a913a26..ef7e4780b555c40aede51f52a2ab9db70b169533 100644 (file)
--- 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);