--lspd mode with scalr LSP differences for lsp1-4, then VQ in log domain of lsp5...
authordrowe67 <drowe67@01035d8c-6547-0410-b346-abe4f91aad63>
Mon, 31 Oct 2011 07:22:39 +0000 (07:22 +0000)
committerdrowe67 <drowe67@01035d8c-6547-0410-b346-abe4f91aad63>
Mon, 31 Oct 2011 07:22:39 +0000 (07:22 +0000)
git-svn-id: https://svn.code.sf.net/p/freetel/code@294 01035d8c-6547-0410-b346-abe4f91aad63

codec2-dev/src/Makefile.am
codec2-dev/src/Makefile.in
codec2-dev/src/c2sim.c
codec2-dev/src/quantise.c
codec2-dev/unittest/genlsp.c
codec2-dev/unittest/vqtrain.c

index b890b101eddcbf813e02c0de16df5e3b5cf29a04..93995db94f007e7e10ab7019406078f40e1ff6af 100644 (file)
@@ -26,12 +26,7 @@ CODEBOOKSD= \
   $D/dlsp2.txt \
   $D/dlsp3.txt \
   $D/dlsp4.txt \
-  $D/dlsp5.txt \
-  $D/dlsp6.txt \
-  $D/dlsp7.txt \
-  $D/dlsp8.txt \
-  $D/dlsp9.txt \
-  $D/dlsp10.txt
+  $(top_srcdir)/unittest/lspdlog5-10_1024.txt
 
 # lspd VQ quantisers
 
index ab73357c1dfb4aa43ebcee8c51092f8abc704713..0c3274c4184701352c6f85ebc3b99a6e9e9916b0 100644 (file)
@@ -240,12 +240,7 @@ CODEBOOKSD = \
   $D/dlsp2.txt \
   $D/dlsp3.txt \
   $D/dlsp4.txt \
-  $D/dlsp5.txt \
-  $D/dlsp6.txt \
-  $D/dlsp7.txt \
-  $D/dlsp8.txt \
-  $D/dlsp9.txt \
-  $D/dlsp10.txt
+  $(top_srcdir)/unittest/lspdlog5-10_1024.txt
 
 
 # lspd VQ quantisers
index 8c12786f08df1645e4e7506e09b4fe0d2d01f18a..f6df412c06cca18f32aae8b51d81c18683accfba 100644 (file)
@@ -369,6 +369,7 @@ int main(int argc, char *argv[])
 #endif
     }
 
+#ifdef RESAMPLE
     /* optional resampling of model amplitudes */
 
     //printf("frames=%d\n", frames);
@@ -379,6 +380,7 @@ int main(int argc, char *argv[])
         dump_quantised_model(&model);
 #endif
     }
+#endif
 
     /* option decimation to 20ms rate, which enables interpolation
        routine to synthesise in between frame */
index 58e5d2d412e487dad935b2775bccc8c7702af60c..1f3443fe65935be22d35fe32771b847a520d5567 100644 (file)
@@ -120,7 +120,7 @@ long quantise(const float * cb, float vec[], float w[], int k, int m, float *se)
                                                                              
   lspd_quantise
 
-  Scalar lsp difference quantiser.
+  Scalar/VQ LSP difference quantiser.
 
 \*---------------------------------------------------------------------------*/
 
@@ -130,16 +130,20 @@ void lspd_quantise(
   int   order
 ) 
 {
-    int   i,k,m;
+    int   i,k,m,ncb, nlsp, index;
     float lsp_hz[LPC_MAX];
     float lsp__hz[LPC_MAX];
     float dlsp[LPC_MAX];
     float dlsp_[LPC_MAX];
-    float  wt[1];
+    float wt[LPC_MAX];
     const float *cb;
     float se;
     int   indexes[LPC_MAX];
 
+    for(i=0; i<LPC_ORD; i++) {
+       wt[i] = 1.0;
+    }
+
     /* convert from radians to Hz so we can use human readable
        frequencies */
 
@@ -150,7 +154,7 @@ void lspd_quantise(
     for(i=1; i<order; i++)
        dlsp[i] = lsp_hz[i] - lsp_hz[i-1];
 
-    /* simple uniform scalar quantisers */
+    /* simple uniform scalar quantisers for LSP differences 1..4 */
 
     wt[0] = 1.0;
     for(i=0; i<4; i++) {
@@ -170,9 +174,39 @@ void lspd_quantise(
        else
            lsp__hz[0] = dlsp_[0];
     }
+
+    /* VQ LSP differences 5..10 in log domain */
+
+    ncb = 4;
+    nlsp = 4;
+    k = lsp_cbd[ncb].k;
+    m = lsp_cbd[ncb].m;
+    cb = lsp_cbd[ncb].cb;
+    for(i=4; i<order; i++) {
+       dlsp[i] = log10((PI/4000.0)*dlsp[i]);
+       printf("%f ", dlsp[i]);
+    }
+    printf("\n");
+    index = quantise(cb, &dlsp[nlsp], &wt[nlsp], k, m, &se);
+    for(i=0; i<6; i++)
+       printf("%f ", cb[i]);
+    printf("\n");
+    printf("index = %d\n", index);
+    for(i=4; i<order; i++) {
+       dlsp_[i] = (4000.0/PI)*pow(10.0, cb[index*k+i-nlsp]);
+       printf("%f ", cb[index*k+i-nlsp]);
+       lsp__hz[i] = lsp__hz[i-1] + dlsp_[i];
+    }
+    printf("\n");
+    for(i=4; i<order; i++)
+       printf("%f ", dlsp_[i]);
+    printf("\n\n");
+
+    /*
     for(; i<order; i++)
        lsp__hz[i] = lsp_hz[i];
-    
+    */
+
     /* convert back to radians */
 
     for(i=0; i<order; i++)
index 35417d9c990acb99357a238779e03301499255d9..c284a9e32e7b26da4aeba8d41e3a12c7fcc9f312 100644 (file)
@@ -31,6 +31,7 @@
 #define NW     279     /* frame size in samples                        */
 #define        N       80      /* frame to frame shift                         */
 #define THRESH 40.0    /* threshold energy/sample for frame inclusion  */
+#define PI         3.141592654 /* mathematical constant                */
 
 #include <stdio.h>
 #include <stdlib.h>
@@ -132,7 +133,7 @@ int main(int argc, char *argv[]) {
                        fprintf(flsp,"%f ",log10(lsp[0]));
                        for(i=1; i<P; i++) {
                            diff = lsp[i]-lsp[i-1];
-                           if (diff < 25.0) diff = 25.0;
+                           if (diff < (PI/4000.0)*25.0) diff = (PI/4000.0)*25.0;
                            fprintf(flsp,"%f ",log10(diff));
                        }
                    } 
index 9ca7b03dc6177c420b2595ab6954e4b0b37751c8..ef423158824215623158d9a78014877f53fbd699 100644 (file)
@@ -57,9 +57,6 @@ void zero(float v[], int k);
 void acc(float v1[], float v2[], int k);
 void norm(float v[], int k, long n);
 long quantise(float cb[], float vec[], int k, int m, float *se);
-void jnd(float x[], int k);
-
-float pi;
 
 /*-----------------------------------------------------------------------* \
 
@@ -81,8 +78,7 @@ int main(int argc, char *argv[]) {
     float  delta;      /* improvement in distortion                    */
     FILE   *ftrain;    /* file containing training set                 */
     FILE   *fvq;       /* file containing vector quantiser             */
-
-    pi = 4.0*atan(1.0);
+    int     ret;
 
     /* Interpret command line arguments */
 
@@ -123,7 +119,7 @@ int main(int argc, char *argv[]) {
     /* set up initial codebook state from samples of training set */
 
     rewind(ftrain);
-    fread(cb, sizeof(float), k*m, ftrain);
+    ret = fread(cb, sizeof(float), k*m, ftrain);
 
     /* main loop */
 
@@ -144,7 +140,7 @@ int main(int argc, char *argv[]) {
        se = 0.0;
        rewind(ftrain);
        for(i=0; i<J; i++) {
-           fread(vec, sizeof(float), k, ftrain);
+           ret = fread(vec, sizeof(float), k, ftrain);
            ind = quantise(cb, vec, k, m, &se);
            n[ind]++;
            acc(&cent[ind*k], vec, k);
@@ -167,30 +163,6 @@ int main(int argc, char *argv[]) {
 
     } while (delta > DELTAQ);
 
-    /* check % within JND */
-
-    {
-       long jnd;
-        int  cur_jnd;
-       float diff, jnd_thresh = 50.0*pi/4000.0;
-
-       jnd = 0;
-       se = 0.0;
-       rewind(ftrain);
-       for(i=0; i<J; i++) {
-           fread(vec, sizeof(float), k, ftrain);
-           ind = quantise(cb, vec, k, m, &se);
-           cur_jnd = 0;
-           for(j=0; j<k; j++) {
-               diff = cb[k*ind+j] - vec[j];
-               if (fabs(diff) > jnd_thresh)
-                   cur_jnd = 1;
-               if (cur_jnd) jnd++;
-           }
-       }
-       printf("jnd %3.2f %%\n", 100.0*(float)jnd/(J*k));
-    }
-
     /* save codebook to disk */
 
     fvq = fopen(argv[4],"wt");
@@ -327,18 +299,3 @@ long quantise(float cb[], float vec[], int k, int m, float *se)
    return(besti);
 }
 
-void jnd(float x[], int k) {
-    float lsp_hz, step = 100.0;
-    int   i;
-
-    for(i=0; i<k; i++) {
-       lsp_hz = x[i]*4000.0/pi;
-       lsp_hz = floor(lsp_hz/step + 0.5)*step;
-       x[i] = lsp_hz*pi/4000.0;
-       if (i) {
-           if (x[i] == x[i-1])
-               x[i] += step*pi/4000.0;
-
-       }
-    }
-}