]> git.rkrishnan.org Git - pihpsdr.git/commitdiff
Correced the use of "RX filter edges" for TX
authorDL1YCF <dl1ycf@darc.de>
Sat, 5 Dec 2020 12:48:40 +0000 (13:48 +0100)
committerDL1YCF <dl1ycf@darc.de>
Sat, 5 Dec 2020 12:48:40 +0000 (13:48 +0100)
receiver.c
transmitter.c
tx_menu.c

index 8562d2d881e1ba8d26db6098b8dde6dc8ce41742..7b3e4e9da324f07df4a1caf5518738f43414cfea 100644 (file)
@@ -1300,8 +1300,8 @@ void receiver_filter_changed(RECEIVER *rx) {
   int m=vfo[rx->id].mode;
   if(m==modeFMN) {
     if(rx->deviation==2500) {
-      filter_low=-4000;
-      filter_high=4000;
+      filter_low=-5500;
+      filter_high=5500;
     } else {
       filter_low=-8000;
       filter_high=8000;
@@ -1316,10 +1316,32 @@ 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) {
-        tx_set_filter(transmitter,filter_low,filter_high);
+        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;
+        }
       }
     }
   }
index fe60549a9d1ff38ea2e5271da681a5abaeace075..443d1827814adf77bbe5d78c0097cd541d61a6c2 100644 (file)
@@ -956,24 +956,34 @@ void tx_set_filter(TRANSMITTER *tx,int low,int high) {
   int txmode=get_tx_mode();
 
   switch(txmode) {
-    case modeLSB:
+    //
+    // 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.
+    //
+    // LSB/DIGL "mirror" filter edges
+    //
     case modeCWL:
+    case modeCWU:
+    case modeDSB:
+    case modeAM:
+    case modeSAM:
+    case modeSPEC:
+      tx->filter_low =-high;
+      tx->filter_high=high;
+      break;
+    case modeLSB:
     case modeDIGL:
       tx->filter_low=-high;
       tx->filter_high=-low;
       break;
     case modeUSB:
-    case modeCWU:
     case modeDIGU:
       tx->filter_low=low;
       tx->filter_high=high;
       break;
-    case modeDSB:
-    case modeAM:
-    case modeSAM:
-      tx->filter_low=-high;
-      tx->filter_high=high;
-      break;
     case modeFMN:
       if(tx->deviation==2500) {
         tx->filter_low=-5500;
index 080363fc00d2e65ba0c66614b3fc1b0b299538b9..0211df66c7d7436d3127c28cf0da76b55a913a26 100644 (file)
--- a/tx_menu.c
+++ b/tx_menu.c
@@ -130,21 +130,38 @@ 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;
-    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;
+    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;