changes to speechproc, correct IQ -- restore squelch in sdr.c -- other minor stuff
authordttsp <dttsp>
Fri, 29 Apr 2005 21:39:06 +0000 (21:39 +0000)
committerdttsp <dttsp>
Fri, 29 Apr 2005 21:39:06 +0000 (21:39 +0000)
jDttSP/correctIQ.c
jDttSP/correctIQ.h
jDttSP/sdr.c
jDttSP/speechproc.c
jDttSP/speechproc.h

index 3fc3e52a6ba0321e19808cb599bc6542eb9e600b..ef261f74a30d6ece6d0a55a3e7fffeed06083fd5 100644 (file)
@@ -37,10 +37,10 @@ Bridgewater, NJ 08807
 #include <common.h>
 
 IQ
-newCorrectIQ(REAL phaseadjustment, REAL gainadjustment) {
+newCorrectIQ(REAL phase, REAL gain) {
   IQ iq = (IQ) safealloc(1, sizeof(iqstate), "IQ state");
-  iq->phase = phaseadjustment;
-  iq->gain = gainadjustment;
+  iq->phase = phase;
+  iq->gain = gain;
   return iq;
 }
 
index 0077a0ad7112314e41c2dc5b4e4ca082ed51cb39..fcbf7496287d6b08177609d4c5e7280ca2346eae 100644 (file)
@@ -7,7 +7,7 @@ typedef  struct _iqstate {
   REAL phase, gain;
 } *IQ, iqstate;
 
-extern IQ newCorrectIQ(REAL phaseadjusment, REAL gainadjustment);
+extern IQ newCorrectIQ(REAL phase, REAL gain);
 extern void delCorrectIQ(IQ iq);
 extern void correctIQ(CXB sigbuf, IQ iq);
 
index a198d21e7cc613cd55fcf9702a3e72223315b8f5..5028ac3ec952dd6075e39566e8153b3a60f711e9 100644 (file)
@@ -444,12 +444,13 @@ do_rx_pre(void) {
                                  OSCCdata(rx.osc.gen, i));
   } 
 
-  /* filtering, metering, & AGC */
+  /* filtering, metering, squelch, & 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);
+    if (uni.meter.flag) do_meter(CXBbase(rx.buf.o), uni.buflen);
+    if (should_do_rx_squelch()) do_squelch();
     if (rx.agc.flag) DigitalAgc(rx.agc.gen, rx.tick);
   } else if (uni.meter.flag)
     do_meter(CXBbase(rx.buf.o), uni.buflen);
@@ -671,7 +672,7 @@ process_samples(float *bufl, float *bufr, int n) {
     do_rx(), rx.tick++;
 
     for (i = 0; i < n; i++)
-      bufl[i] = (float)CXBimag(rx.buf.o, i), bufr[i] = (float)CXBreal(rx.buf.o, i);
+      bufl[i] = (float) CXBimag(rx.buf.o, i), bufr[i] = (float) CXBreal(rx.buf.o, i);
     CXBhave(rx.buf.o) = n;
     break;
 
@@ -683,7 +684,7 @@ process_samples(float *bufl, float *bufr, int n) {
     do_tx(), tx.tick++;
 
     for (i = 0; i < n; i++)
-      bufl[i] = (float)CXBimag(tx.buf.o, i), bufr[i] = (float)CXBreal(tx.buf.o, i);
+      bufl[i] = (float) CXBimag(tx.buf.o, i), bufr[i] = (float) CXBreal(tx.buf.o, i);
     CXBhave(tx.buf.o) = n;
     break;
   }
index 505304d10e8c2986fbbdbf491632d1ad01a9ec1b..2d3112601334b10a431e9f2c214a120378b8a3ad 100644 (file)
@@ -1,8 +1,9 @@
-/* speechproc.c
+/* speechproc.h
    
   This file is part of a program that implements a Software-Defined Radio.
 
-Copyright (C) 2004 by Frank Brickle, AB2KT and Bob McGwier, N4HY
+Copyright (C) 2004 by Frank Brickle, AB2KT and Bob McGwier, N4HY, Phil Harman, VK6APH
+Based on Visual Basic code for SDR by Phil Harman
 
 This program is free software; you can redistribute it and/or modify
 it under the terms of the GNU General Public License as published by
@@ -48,6 +49,7 @@ newSpeechProc(REAL K, REAL MaxCompression, COMPLEX *spdat, int size) {
 void
 delSpeechProc(SpeechProc sp) {
   if (sp) {
+    delRLB(sp->CG);
     delCXB(sp->SpeechProcessorBuffer);
     safefree((char *) sp);
   }
@@ -57,27 +59,24 @@ void
 SpeechProcessor(SpeechProc sp) {
   int i;
   REAL r = 0.0, Mag;
+
+  // K was 0.4 in VB version, this value is better, perhaps due to filters that follow?
   for (i = 0; i < sp->size; i++)
-    r = max(r, Cmag(CXBdata(sp->SpeechProcessorBuffer, i)));
-  Mag = Cmag(CXBdata(sp->SpeechProcessorBuffer, 0));
-  if (Mag > 0.0) {
-    RLBdata(sp->CG, 0) = sp->LastCG * (1.0 - sp->K) + (sp->K * r / Mag);
-    if (RLBdata(sp->CG, 0) > sp->MaxGain)
-      RLBdata(sp->CG, 0) = sp->MaxGain;
-  } else
-    RLBdata(sp->CG, 0) = 1.0;
-  for (i = 1; i < sp->size; i++) {
-    Mag = Cmag(CXBdata(sp->SpeechProcessorBuffer, i));
-    if (Mag > 0.0) {
-      RLBdata(sp->CG, i) =
-       RLBdata(sp->CG, i - 1) * (1 - sp->K) + (sp->K * r / Mag);
+    r = max(r, Cmag(CXBdata(sp->SpeechProcessorBuffer, i))); // find the peak magnitude value in the sample buffer 
+  RLBdata(sp->CG, 0) = sp->LastCG; // restore from last time
+  for (i = 1; i <= sp->size ; i++) {
+    Mag = Cmag(CXBdata(sp->SpeechProcessorBuffer, i - 1));
+    if (Mag != 0.0) {
+      RLBdata(sp->CG, i) = RLBdata(sp->CG, i - 1) * (1 - sp->K) + (sp->K * r / Mag); // Frerking's formula
       if (RLBdata(sp->CG, i) > sp->MaxGain)
        RLBdata(sp->CG, i) = sp->MaxGain;
     } else
-      RLBdata(sp->CG, i) = 1.0;
+      RLBdata(sp->CG, i) = sp->MaxGain;
   }
-  sp->LastCG = RLBdata(sp->CG, sp->size - 1);
-  for (i = 0; i < sp->size; i++)
-    CXBdata(sp->SpeechProcessorBuffer, i) =
-      Cscl(CXBdata(sp->SpeechProcessorBuffer, i), RLBdata(sp->CG, i));
+  sp->LastCG = RLBdata(sp->CG, sp->size); // save for next time 
+  
+  for (i = 0; i < sp->size; i++) // multiply each sample by its gain constant 
+    CXBdata(sp->SpeechProcessorBuffer, i) = Cscl(CXBdata(sp->SpeechProcessorBuffer, i),
+                                                RLBdata(sp->CG, i));
 }
+
index cd693310c28d1706afe4ce103f05010c0aaee0d7..3112078ad43987121508cba63cf48754bd8e59e9 100644 (file)
@@ -44,7 +44,7 @@ typedef struct _speechprocessor {
   int size;
   RLB CG;
   CXB SpeechProcessorBuffer;
-  REAL LastCG, K, MaxGain;
+  REAL LastCG, K, MaxGain, Threshold;
 } speech_proc, *SpeechProc;
 
 extern SpeechProc newSpeechProc(REAL, REAL, COMPLEX *, int);