]> git.rkrishnan.org Git - dttsp.git/blobdiff - jDttSP/update.c
added time-domain windowing to EQ functions to eliminate artifacts
[dttsp.git] / jDttSP / update.c
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;
   }
 }