fixed buffer update bug in nlp
authordrowe67 <drowe67@01035d8c-6547-0410-b346-abe4f91aad63>
Tue, 8 Sep 2009 21:53:28 +0000 (21:53 +0000)
committerdrowe67 <drowe67@01035d8c-6547-0410-b346-abe4f91aad63>
Tue, 8 Sep 2009 21:53:28 +0000 (21:53 +0000)
git-svn-id: https://svn.code.sf.net/p/freetel/code@47 01035d8c-6547-0410-b346-abe4f91aad63

codec2/README.txt
codec2/raw/mmt1.raw [new file with mode: 0644]
codec2/src/dump.c
codec2/src/dump.h
codec2/src/nlp.c
codec2/src/nlp.h
codec2/unittest/tnlp.c

index 4585ead6e2191dace66280cf1fe1ed1572f67c44..7a86c5df6115ac85a7f362c0861622cff4ac0da5 100644 (file)
@@ -31,7 +31,7 @@ Status
 3. Phase model developed that uses 0 bits for phase and 1 bit/frame
    for voiced/unvoiced decision.
 
-[[source code]]
+[[source]]
 The Source Code
 ---------------
 
@@ -270,14 +270,14 @@ References
 ----------
 
 [1] http://perens.com/[Bruce Perens] introducing the
-    http://codec2.org/[codec2 project concept]:
+    http://codec2.org/[codec2 project concept]
 
 [2] David's PhD Thesis,
     http://www.itr.unisa.edu.au/~steven/thesis/dgr.pdf["Techniques for
-    Harmonic Sinusoidal Coding"], used for baseline algorithm:
+    Harmonic Sinusoidal Coding"], used for baseline algorithm
 
 [3] http://www.rowetel.com/blog/?p=128[Open Source Low rate Speech
-    Codec Part 1 - Introduction:]
+    Codec Part 1 - Introduction]
     
 [4] http://www.rowetel.com/blog/?p=130[Open Source Low rate Speech
     Codec Part 1 - Spectral Magnitudes]
diff --git a/codec2/raw/mmt1.raw b/codec2/raw/mmt1.raw
new file mode 100644 (file)
index 0000000..40638a5
Binary files /dev/null and b/codec2/raw/mmt1.raw differ
index 1295074bee2629370b2be60ab7fd810e547b6b3f..02a354d57419187babf8523ccfaffbaab5341204 100644 (file)
@@ -43,6 +43,8 @@ static FILE *fphase = NULL;
 static FILE *fphase_ = NULL;
 static FILE *ffw = NULL;
 static FILE *fe = NULL;
+static FILE *fsq = NULL;
+static FILE *fdec = NULL;
 
 static char  prefix[MAX_STR];
 
@@ -74,6 +76,10 @@ void dump_off(){
        fclose(ffw);
     if (fe != NULL)
        fclose(fe);
+    if (fsq != NULL)
+       fclose(fsq);
+    if (fdec != NULL)
+       fclose(fdec);
 }
 
 void dump_Sn(float Sn[]) {
@@ -288,4 +294,41 @@ void dump_e(float e_hz[]) {
     fprintf(fe,"\n");    
 }
 
+void dump_sq(float sq[]) {
+    int i;
+    char s[MAX_STR];
+
+    if (!dumpon) return;
+
+    if (fsq == NULL) {
+       sprintf(s,"%s_sq.txt", prefix);
+       fsq = fopen(s, "wt");
+       assert(fsq != NULL);
+    }
+
+    for(i=0; i<M/2; i++)
+       fprintf(fsq,"%f\t",sq[i]);
+    fprintf(fsq,"\n");    
+    for(i=M/2; i<M; i++)
+       fprintf(fsq,"%f\t",sq[i]);
+    fprintf(fsq,"\n");    
+}
+
+void dump_dec(COMP Fw[]) {
+    int i;
+    char s[MAX_STR];
+
+    if (!dumpon) return;
+
+    if (fdec == NULL) {
+       sprintf(s,"%s_dec.txt", prefix);
+       fdec = fopen(s, "wt");
+       assert(fdec != NULL);
+    }
+
+    for(i=0; i<320/5; i++)
+       fprintf(fdec,"%f\t",Fw[i].real);
+    fprintf(fdec,"\n");    
+}
+
 
index b309430c745e2b59cfafb5828aff5d1033d30019..031445af6e7eac6918fc54d089cc43508a7e961e 100644 (file)
@@ -40,6 +40,11 @@ void dump_Pw(COMP Pw[]);
 void dump_lsp(float lsp[]);
 void dump_phase(float phase[]);
 void dump_phase_(float phase[]);
+
+/* NLP states */
+
+void dump_sq(float sq[]);
+void dump_dec(COMP Fw[]);
 void dump_Fw(COMP Fw[]);
 void dump_e(float e_hz[]);
 
index 47f41f3a76cf77d36cc3950ff318d572edcd5996..c2ffbde5c3331f662be3d788de8d0c0ec1271a76 100644 (file)
@@ -146,7 +146,6 @@ float nlp(
   float  Sn[],                 /* input speech vector */
   int    n,                    /* frames shift (no. new samples in Sn[]) */
   int    m,                    /* analysis window size */
-  int    d,                    /* additional delay (used for testing) */
   int    pmin,                 /* minimum pitch value */
   int    pmax,                 /* maximum pitch value */
   float *pitch,                        /* estimated pitch period in samples */
@@ -165,10 +164,10 @@ float nlp(
 
   /* Square, notch filter at DC, and LP filter vector */
 
-  for(i=0; i<n; i++)           /* square speech samples */
-    sq[i+d+m-n] = Sn[i]*Sn[i];
+  for(i=m-n; i<M; i++)                 /* square latest speech samples */
+    sq[i] = Sn[i]*Sn[i];
 
-  for(i=m-n+d; i<m+d; i++) {   /* notch filter at DC */
+  for(i=m-n; i<m; i++) {       /* notch filter at DC */
     notch = sq[i] - mem_x;
     notch += COEFF*mem_y;
     mem_x = sq[i];
@@ -176,7 +175,7 @@ float nlp(
     sq[i] = notch;
   }
 
-  for(i=m-n+d; i<m+d; i++) {   /* FIR filter vector */
+  for(i=m-n; i<m; i++) {       /* FIR filter vector */
 
     for(j=0; j<NLP_NTAP-1; j++)
       mem_fir[j] = mem_fir[j+1];
@@ -195,10 +194,12 @@ float nlp(
   }
   for(i=0; i<m/DEC; i++)
     Fw[i].real = sq[i*DEC]*(0.5 - 0.5*cos(2*PI*i/(m/DEC-1)));
+  dump_dec(Fw);
   four1(&Fw[-1].imag,PE_FFT_SIZE,1);
   for(i=0; i<PE_FFT_SIZE; i++)
     Fw[i].real = Fw[i].real*Fw[i].real + Fw[i].imag*Fw[i].imag;
 
+  dump_sq(sq);
   dump_Fw(Fw);
 
   /* find global peak */
@@ -219,7 +220,7 @@ float nlp(
 
   /* Shift samples in buffer to make room for new samples */
 
-  for(i=0; i<m-n+d; i++)
+  for(i=0; i<m-n; i++)
     sq[i] = sq[i+n];
 
   /* return pitch and F0 estimate */
index 5479af371e3fa004c9b7cda7491410399c27db7b..b39c02e7373e35ff71142414bfb6920e0bb4cae8 100644 (file)
@@ -33,7 +33,6 @@
 
 #define NLP_NTAP 48     /* Decimation LPF order */
 
-float nlp(float Sn[], int n, int m, int d, int pmin, int pmax, float *pitch,
-         COMP  Sw[]);
+float nlp(float Sn[], int n, int m, int pmin, int pmax, float *pitch, COMP  Sw[]);
 
 #endif
index d4fedbbe1c24ddef3cd4b66065a3194b0e3d05f1..b15704852616cb930991eb7432fe4db353087be9 100644 (file)
@@ -34,6 +34,7 @@
 
 #include <stdlib.h>
 #include <stdio.h>
+#include <string.h>
 #include <math.h>
 #include "nlp.h"
 #include "dump.h"
@@ -122,7 +123,7 @@ char *argv[];
       dft_speech();
       dump_Sn(Sn); dump_Sw(Sw); 
 
-      nlp(Sn,N,M,N-NLP_NTAP/2,PITCH_MIN,PITCH_MAX,&pitch,Sw);
+      nlp(Sn,N,M,PITCH_MIN,PITCH_MAX,&pitch,Sw);
 
       fprintf(fout,"%f\n",pitch);