]> git.rkrishnan.org Git - dttsp.git/blobdiff - jDttSP/sdr.c
Bug fixes to jsdr, keyer
[dttsp.git] / jDttSP / sdr.c
index f04d641d52a9a0d3c472a1129db8b7dc6ce24627..a198d21e7cc613cd55fcf9702a3e72223315b8f5 100644 (file)
@@ -318,6 +318,18 @@ destroy_workspace(void) {
 // execution
 //////////////////////////////////////////////////////////////////////////
 
+//========================================================================
+// util
+
+PRIVATE REAL
+CXBnorm(CXB buff) {
+  int i;
+  double sum = 0.0;
+  for (i = 0; i < CXBhave(buff); i++)
+    sum += Csqrmag(CXBdata(buff, i));
+  return sqrt(sum);
+}
+
 //========================================================================
 /* all */
 
@@ -367,15 +379,10 @@ PRIVATE BOOLEAN
 should_do_rx_squelch(void) {
   if (rx.squelch.flag) {
     int i, n = CXBhave(rx.buf.o);
-    REAL tst;
     rx.squelch.power = 0.0;
     for (i = 0; i < n; i++)
       rx.squelch.power += Csqrmag(CXBdata(rx.buf.o, i));
-    tst = (10.0 * log10(rx.squelch.power)
-           + rx.squelch.offset.meter
-           + rx.squelch.offset.att
-           + rx.squelch.offset.gain);
-    return rx.squelch.thresh > tst;
+    return rx.squelch.thresh > 10.0 * log10(rx.squelch.power);
   } else
     return rx.squelch.set = FALSE;
 }
@@ -439,6 +446,7 @@ do_rx_pre(void) {
 
   /* filtering, metering, & AGC */
   if (rx.mode != SPEC) {
+    if (rx.tick == 0) reset_OvSv(rx.filt.ovsv);
     filter_OvSv(rx.filt.ovsv);
     CXBhave(rx.buf.o) = CXBhave(rx.buf.i);
     if (uni.meter.flag)        do_meter(CXBbase(rx.buf.o), uni.buflen);
@@ -449,7 +457,7 @@ do_rx_pre(void) {
 
 PRIVATE void
 do_rx_post(void) {
-  int i, n = CXBhave(rx.buf.o);;
+  int i, n = CXBhave(rx.buf.o);
 
   if (!rx.squelch.set)  {
     no_squelch();
@@ -537,6 +545,7 @@ do_rx(void) {
 
 PRIVATE void
 do_tx_pre(void) {
+
   if (tx.scl.pre.flag) {
     int i, n = CXBhave(tx.buf.i);
     for (i = 0; i < n; i++)
@@ -544,12 +553,14 @@ do_tx_pre(void) {
   }
 
   //
-  // mix in CW tone here
+  // mix in CW tone here?
   //
 
   correctIQ(tx.buf.i, tx.iqfix);
 
   if (tx.spr.flag) SpeechProcessor(tx.spr.gen);
+
+  if (tx.tick == 0) reset_OvSv(tx.filt.ovsv);
   filter_OvSv(tx.filt.ovsv);
 }
 
@@ -576,38 +587,43 @@ do_tx_post(void) {
 
 PRIVATE void
 do_tx_SBCW(void) {
-  int i, n = min(CXBhave(tx.buf.i), uni.buflen); 
-  for (i = 0; i < n; i++) {
-    tx.scl.dc = Cadd(Cscl(tx.scl.dc, 0.99),
-                    Cscl(CXBdata(tx.buf.o,i), -0.01));
-    CXBdata(tx.buf.o, i) = Cadd(CXBdata(tx.buf.o,i), tx.scl.dc);
-  }
+  int i, n = min(CXBhave(tx.buf.o), uni.buflen); 
+
+  if ((tx.norm = CXBnorm(tx.buf.o)) > 0.0)
+    for (i = 0; i < n; i++) {
+      tx.scl.dc = Cadd(Cscl(tx.scl.dc, 0.99),
+                      Cscl(CXBdata(tx.buf.o, i), -0.01));
+      CXBdata(tx.buf.o, i) = Cadd(CXBdata(tx.buf.o, i), tx.scl.dc);
+    }
 }
 
 PRIVATE void
 do_tx_AM(void) {
-  int i, n = min(CXBhave(tx.buf.i), uni.buflen); 
-  for (i = 0; i < n; i++) { 
-    tx.scl.dc = Cadd(Cscl(tx.scl.dc, 0.999),
-                    Cscl(CXBdata(tx.buf.o,i), -0.001));
-    CXBreal(tx.buf.o, i) =
-      0.49995 + 0.49995 * (CXBreal(tx.buf.o,i) - tx.scl.dc.re);
-    CXBimag(tx.buf.o, i) = 0.0;
-  }
+  int i, n = min(CXBhave(tx.buf.o), uni.buflen); 
+
+  if ((tx.norm = CXBnorm(tx.buf.o)) > 0.0)
+    for (i = 0; i < n; i++) { 
+      tx.scl.dc = Cadd(Cscl(tx.scl.dc, 0.999),
+                      Cscl(CXBdata(tx.buf.o, i), -0.001));
+      CXBreal(tx.buf.o, i) =
+       0.49995 + 0.49995 * (CXBreal(tx.buf.o, i) - tx.scl.dc.re);
+      CXBimag(tx.buf.o, i) = 0.0;
+    }
 }
 
 PRIVATE void
 do_tx_FM(void) {
-  int i, n = min(CXBhave(tx.buf.i), uni.buflen);
-  for (i = 0; i < n; i++) {
-    tx.scl.dc = Cadd(Cscl(tx.scl.dc,0.999),
-                    Cscl(CXBdata(tx.buf.o,i), 0.001));
-    tx.osc.phase += (CXBreal(tx.buf.o, i)- tx.scl.dc.re) * CvtMod2Freq;
-    if (tx.osc.phase >= TWOPI) tx.osc.phase -= TWOPI;
-    if (tx.osc.phase < 0.0) tx.osc.phase += TWOPI;
-    CXBdata(tx.buf.o, i) =
-      Cscl(Cmplx(cos(tx.osc.phase), sin(tx.osc.phase)), 0.99999);
-  }
+  int i, n = min(CXBhave(tx.buf.o), uni.buflen);
+  if ((tx.norm = CXBnorm(tx.buf.o)) > 0.0)
+    for (i = 0; i < n; i++) {
+      tx.scl.dc = Cadd(Cscl(tx.scl.dc, 0.999),
+                      Cscl(CXBdata(tx.buf.o, i), 0.001));
+      tx.osc.phase += (CXBreal(tx.buf.o, i) - tx.scl.dc.re) * CvtMod2Freq;
+      if (tx.osc.phase >= TWOPI) tx.osc.phase -= TWOPI;
+      if (tx.osc.phase < 0.0) tx.osc.phase += TWOPI;
+      CXBdata(tx.buf.o, i) =
+       Cscl(Cmplx(cos(tx.osc.phase), sin(tx.osc.phase)), 0.99999);
+    }
 }
 
 PRIVATE void
@@ -668,7 +684,7 @@ process_samples(float *bufl, float *bufr, int n) {
 
     for (i = 0; i < n; i++)
       bufl[i] = (float)CXBimag(tx.buf.o, i), bufr[i] = (float)CXBreal(tx.buf.o, i);
-    CXBhave(rx.buf.o) = n;
+    CXBhave(tx.buf.o) = n;
     break;
   }