added time-domain windowing to EQ functions to eliminate artifacts
authordttsp <dttsp>
Mon, 2 May 2005 17:37:05 +0000 (17:37 +0000)
committerdttsp <dttsp>
Mon, 2 May 2005 17:37:05 +0000 (17:37 +0000)
jDttSP/sdr.c
jDttSP/update.c

index b3b2818c0e79568117d033abb545c2fdba6683d5..ead39f0e61391978bd1f065ad70de6c3497f1be3 100644 (file)
@@ -209,7 +209,6 @@ setup_rx(int k) {
     REAL pos = 0.5, // 0 <= pos <= 1, left->right
          theta = (1.0 - pos) * M_PI / 2.0;
     rx[k].azim = Cmplx(cos(theta), sin(theta));
-    fprintf(stderr, "azim %f %f\n", rx[k].azim.re, rx[k].azim.im);
   }
 
   rx[k].tick = 0;
@@ -511,10 +510,6 @@ do_rx_post(int k) {
     }
   }
 
-  //
-  // mix in sidetone here?
-  //
-
   // final scaling
 
   if (rx[k].scl.post.flag)
@@ -528,12 +523,6 @@ do_rx_post(int k) {
   if (!rx[k].bin.flag)
     for (i = 0; i < n; i++)
       CXBdata(rx[k].buf.o, i) = Cscl(rx[k].azim, CXBreal(rx[k].buf.o, i));
-
-#if 0
-  if (!rx[k].bin.flag)
-    for (i = 0; i < n; i++)
-      CXBimag(rx[k].buf.o, i) = CXBreal(rx[k].buf.o, i);
-#endif
 }
 
 /* demod processing */
@@ -602,10 +591,6 @@ do_tx_pre(void) {
       CXBdata(tx.buf.i, i) = Cmplx(CXBreal(tx.buf.i, i) * tx.scl.pre.val, 0.0);
   }
 
-  //
-  // mix in CW tone here?
-  //
-
   correctIQ(tx.buf.i, tx.iqfix);
 
   if (tx.spr.flag) SpeechProcessor(tx.spr.gen);
index 4552cd29e1bc1d80fc6d41557d28a7e9daeaef4d..cb6ae7a54c6f90df5dfe9097fd37497948c832d2 100644 (file)
@@ -383,6 +383,33 @@ setTXSpeechCompressionGain(int n, char **p) {
 
 //============================================================
 
+PRIVATE void
+re_window(COMPLEX *vec, int len) {
+  int i;
+  REAL *win = newvec_REAL(len, "re_window win vec");
+  COMPLEX *ztmp = newvec_COMPLEX(len, "re_window z buf");
+
+  fftw_plan ptmp = fftw_create_plan(len, FFTW_BACKWARD, uni.wisdom.bits);
+  fftw_one(ptmp, (fftw_complex *) vec, (fftw_complex *) ztmp);
+  fftw_destroy_plan(ptmp);
+
+  (void) makewindow(BLACKMANHARRIS_WINDOW, len, win);
+
+  for (i = 0; i < len; i++)
+    ztmp[i] = Cscl(ztmp[i], win[i]);
+
+  ptmp = fftw_create_plan(len, FFTW_FORWARD, uni.wisdom.bits);
+  fftw_one(ptmp, (fftw_complex *) ztmp, (fftw_complex *) vec);
+  fftw_destroy_plan(ptmp);
+
+  delvec_COMPLEX(ztmp);
+  delvec_REAL(win);
+  
+  normalize_vec_COMPLEX(vec, len);
+}
+
+//============================================================
+
 PRIVATE int
 f2x(REAL f) {
   REAL fix = tx.filt.ovsv->fftlen * f / uni.samplerate;
@@ -432,6 +459,7 @@ setTXEQ(int n, char **p) {
       apply_txeq_band(lof, dB, hif);
       lof = hif;
     }
+    re_window(rx[RL].filt.ovsv->zfvec, rx[RL].filt.ovsv->fftlen);
     return 0;
   }
 }
@@ -474,6 +502,7 @@ setRXEQ(int n, char **p) {
       apply_rxeq_band(lof, dB, hif);
       lof = hif;
     }
+    re_window(rx[RL].filt.ovsv->zfvec, rx[RL].filt.ovsv->fftlen);
     return 0;
   }
 }