Excitation codebook stuff, but it doesn't work;-(
authorjmvalin <jmvalin@0101bb08-14d6-0310-b084-bc0e0c8e3800>
Tue, 19 Feb 2002 22:44:28 +0000 (22:44 +0000)
committerjmvalin <jmvalin@0101bb08-14d6-0310-b084-bc0e0c8e3800>
Tue, 19 Feb 2002 22:44:28 +0000 (22:44 +0000)
git-svn-id: http://svn.xiph.org/trunk/speex@3077 0101bb08-14d6-0310-b084-bc0e0c8e3800

libspeex/Makefile.am
libspeex/cb_search.c [new file with mode: 0644]
libspeex/cb_search.h [new file with mode: 0644]
libspeex/speex.c
libspeex/stoc.c [new file with mode: 0644]

index e539256..0fb6372 100644 (file)
@@ -1,6 +1,6 @@
 ## Process this file with automake to produce Makefile.in. -*-Makefile-*-
 
-# $Id: Makefile.am,v 1.2 2002/02/19 03:14:03 jmvalin Exp $
+# $Id: Makefile.am,v 1.3 2002/02/19 22:44:28 jmvalin Exp $
 
 # Disable automatic dependency tracking if using other tools than gcc and gmake
 #AUTOMAKE_OPTIONS = no-dependencies
@@ -14,14 +14,17 @@ libspeex_la_SOURCES = speex.c \
        lsp.c \
        quant_lsp.c \
        lsp_tables_nb.c \
-       gain_table.c
+       gain_table.c \
+       cb_search.c \
+       stoc.c
 
 include_HEADERS = speex.h
 
 noinst_HEADERS = lsp.h \
        lpc.h \
        ltp.h \
-       quant_lsp.h
+       quant_lsp.h \
+       cb_search.h
        
        
 libspeex_la_LDFLAGS = -release $(LT_RELEASE)
diff --git a/libspeex/cb_search.c b/libspeex/cb_search.c
new file mode 100644 (file)
index 0000000..551fd3b
--- /dev/null
@@ -0,0 +1,131 @@
+/*-----------------------------------------------------------------------*\
+
+    FILE........: GAINSHAPE.C
+    TYPE........: C Module
+    AUTHOR......: David Rowe
+    COMPANY.....: Voicetronix
+    DATE CREATED: 19/2/02
+
+    General gain-shape codebbok search.
+
+\*-----------------------------------------------------------------------*/
+
+/* Modified by Jean-Marc Valin 2002 */
+
+
+#include <stdlib.h>
+#include <cb_search.h>
+
+#define min(a,b) ((a) < (b) ? (a) : (b))
+
+/*---------------------------------------------------------------------------*\
+                                                                             
+ void overlap_cb_search()                                                            
+                                                                             
+ Searches a gain/shape codebook consisting of overlapping entries for the    
+ closest vector to the target.  Gives identical results to search() above   
+ buts uses fast end correction algorithm for the synthesis of response       
+ vectors.                                                                    
+                                                                             
+\*---------------------------------------------------------------------------*/
+
+void overlap_cb_search(
+float target[],                        /* target vector */
+float ak[],                    /* LPCs for this subframe */
+float awk[],                   /* Weighted LPCs for this subframe */
+float codebook[],              /* overlapping codebook */
+int   entries,                 /* number of overlapping entries to search */
+float *gain,                   /* gain of optimum entry */
+int   *index,                  /* index of optimum entry */
+int   p,                        /* number of LPC coeffs */
+int   nsf                       /* number of samples in subframe */
+)
+{
+  float *resp;                 /* zero state response to current entry */
+  float *h;                    /* impulse response of synthesis filter */
+  float *impulse;              /* excitation vector containing one impulse */
+  float d,e,g,score;           /* codebook searching variables */
+  float bscore;                        /* score of "best" vector so far */
+  int i,j,k;                   /* loop variables */
+
+  /* Initialise */
+  
+  resp = (float*)malloc(sizeof(float)*(p+nsf));
+  h = (float*)malloc(sizeof(float)*(p+nsf));
+  impulse = (float*)malloc(sizeof(float)*(p+nsf));
+
+  for(i=0; i<p+nsf; i++)
+    impulse[i] = 0.0;
+  for(i=0; i<p; i++) {
+    h[i] = 0.0;
+    resp[i] = 0.0;
+  }  
+   
+  *gain = 0.0;
+  *index = 0;
+  bscore = 0.0;
+  impulse[p] = 1.0;
+
+  /*synthesis_filter(impulse,ak,nsf,p,&h[p]);*/
+  for (i=0;i<nsf;i++)
+  {
+     h[p+i] = impulse[p+i];
+     for (k=1;k<=p;k++)
+        h[p+i] += awk[k]*impulse[p+i-k] - ak[k]*h[p+i-k];
+  }
+
+  for (i=0;i<nsf;i++)
+  {
+     resp[p+i] = codebook[entries-1];
+     for (k=1;k<=min(p,i);k++)
+        resp[p+i] += awk[k]*codebook[entries-1+i-k];
+     for (k=1;k<p+1;k++)
+        resp[p+i] -= ak[k]*resp[p+i-k];
+  }
+
+  /*synthesis_filter(&codebook[entries-1],ak,nsf,p,&resp[p]);  */  
+    
+  /* Search codebook backwards using end correction for synthesis */
+  
+  for(k=entries-1; k>=0; k--) {
+
+     /*FIXME: This is horribly slow, but I've got problems with the faster version.
+      This loop should not be there at all once the bug is fixed*/
+     for (i=0;i<nsf;i++)
+     {
+        resp[p+i] = codebook[k];
+        for (j=1;j<=min(p,i);j++)
+           resp[p+i] += awk[j]*codebook[k+i-j];
+        for (j=1;j<p+1;j++)
+           resp[p+i] -= ak[j]*resp[p+i-j];
+     }
+
+    d = 0.0; e = 0.0;
+    for(i=0; i<nsf; i++) {
+      d += target[i]*resp[p+i];
+      e += resp[p+i]*resp[p+i];
+    }
+    g = d/e;
+    score = g*d;
+    /*printf ("score: %f %f %f %f\n", target[0],d,e,score);*/
+    if (score >= bscore) {
+      bscore = score;
+      *gain = g;
+      *index = k;
+    }
+    
+    /* Synthesise next entry */
+    
+    if (k) {
+      for(i=nsf-1; i>=1; i--)
+        resp[i+p] = resp[i+p-1] + codebook[k-1]*h[p+i];
+      resp[p] = codebook[k-1]*h[p];
+    }
+  }
+
+  free(resp);
+  free(h);
+  free(impulse);
+
+}
+
diff --git a/libspeex/cb_search.h b/libspeex/cb_search.h
new file mode 100644 (file)
index 0000000..777e8cf
--- /dev/null
@@ -0,0 +1,35 @@
+/* Copyright (C) 2002 Jean-Marc Valin & David Rowe
+   File: cb_search.c
+   Overlapped codebook search
+
+   This library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+   
+   This library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+   
+   You should have received a copy of the GNU Lesser General Public
+   License along with this library; if not, write to the Free Software
+   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+*/
+
+#ifndef CB_SEARCH_H
+#define CB_SEARCH_H
+
+void overlap_cb_search(
+float target[],                        /* target vector */
+float ak[],                    /* LPCs for this subframe */
+float awk[],                   /* Weighted LPCs for this subframe */
+float codebook[],              /* overlapping codebook */
+int   entries,                 /* number of overlapping entries to search */
+float *gain,                   /* gain of optimum entry */
+int   *index,                  /* index of optimum entry */
+int   p,                        /* number of LPC coeffs */
+int   nsf                       /* number of samples in subframe */
+);
+
+#endif
index 8be1ba7..6aef92e 100644 (file)
 #include "lsp.h"
 #include "ltp.h"
 #include "quant_lsp.h"
+#include "cb_search.h"
+
+extern float stoc[];
 
 #ifndef M_PI
 #define M_PI           3.14159265358979323846  /* pi */
 #endif
 
 #define sqr(x) ((x)*(x))
+#define min(a,b) ((a) < (b) ? (a) : (b))
 
 void encoder_init(EncState *st)
 {
@@ -225,8 +229,8 @@ void encode(EncState *st, float *in, int *outSize, void *bits)
         st->tframe[i-st->subframeSize]=st->wframe[i-st->subframeSize];*/
 
       /* Find pitch gain and delay, gains are already quantized*/
-      //pitch = ltp_closed_loop(st->tframe+offset, st->subframeSize, 20, 120, gain);
-      pitch = three_tap_ltp(st->tframe+offset, st->subframeSize, 20, 120, gain);
+      pitch = ltp_closed_loop(st->tframe+offset, st->subframeSize, 20, 120, gain);
+      /*pitch = three_tap_ltp(st->tframe+offset, st->subframeSize, 20, 120, gain);*/
 
       /* Replace weighted frame with target frame */
       /*for (i=0;i<st->subframeSize;i++)
@@ -259,7 +263,31 @@ void encode(EncState *st, float *in, int *outSize, void *bits)
       }
       /*printf ("\n");*/
       
+#if 0
       /*Analysis by synthesis and excitation quantization here*/
+      {
+         float cb_gain;
+         int cb_index;
+         overlap_cb_search(st->tframe+offset,st->interp_lpc, st->bw_lpc,stoc,512,&cb_gain,&cb_index, st->lpcSize, st->subframeSize);
+         printf ("cb index = %d, cb gain = %f\n", cb_index, cb_gain);
+         for (i=0;i<st->subframeSize;i++)
+           st->exc_frame[offset+i] = cb_gain*stoc[i+cb_index];
+         /*for (i=0;i<st->subframeSize;i++)
+            printf ("%f ", st->tframe[offset+i]);
+            printf ("bef\n");*/
+         for (i=0;i<st->subframeSize;i++)
+         {
+            st->tframe[offset+i]=st->exc_frame[offset+i];
+            for (j=1;j<=min(st->lpcSize,i);j++)
+               st->tframe[offset+i] += st->exc_frame[offset+i-j]*st->bw_lpc[j] 
+               - st->tframe[offset+i-j]*st->interp_lpc[j];
+         }
+         /*for (i=0;i<st->subframeSize;i++)
+            printf ("%f ", st->tframe[offset+i]);
+         printf ("aft\n");
+         */
+      }
+#endif
 
       /* Reverse the 3-tab pitch predictor (IIR)*/
       inverse_three_tap(st->tframe+offset, st->subframeSize, pitch, gain);
diff --git a/libspeex/stoc.c b/libspeex/stoc.c
new file mode 100644 (file)
index 0000000..37de1a2
--- /dev/null
@@ -0,0 +1,70 @@
+/*---------------------------------------------------------------------------*\\r
+|                                                                             |\r
+| FILE: STOC.C                                                                |\r
+| TYPE: Unix C data file                                                      |\r
+| AUTHOR: David Rowe                                                          |\r
+| DATE CREATED: 23/3/93                                                       |\r
+| LAST MODIFIED: 23/3/93                                                      |\r
+|                                                                             |\r
+| DoD CELP 3.2 stochastic codebook.                                          |\r
+|                                                                             |\r
+\*---------------------------------------------------------------------------*/\r
+\r
+\r
+float stoc[] = {\r
+   0.,  1.,  0.,  0.,  0.,  1.,  0.,  0.,  0.,  0.,  0.,  0.,  1.,  0.,  1.,  0.,  0.,  0.,  0., -1.,\r
+   0.,  0., -1.,  0., -1.,  0.,  1.,  0.,  0.,  0.,  0.,  0.,  0.,  0., -1.,  0., -1., -1.,  0.,  0.,\r
+  -1.,  0., -1.,  0., -1.,  0., -1.,  0.,  0.,  0.,  0.,  0.,  0.,  0., -1.,  0.,  0.,  0.,  1.,  0.,\r
+   0.,  0.,  0., -1.,  0.,  0.,  0.,  0.,  1.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  1., -1.,  0.,\r
+   1.,  0.,  1.,  0., -1.,  1.,  0.,  0.,  0.,  0.,  0., -1.,  0.,  0.,  1.,  0.,  0.,  0., -1.,  0.,\r
+   0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,\r
+   0., -1., -1.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0., -1., -1.,\r
+   0.,  1., -1.,  0.,  0., -1., -1.,  0.,  0.,  0.,  0.,  1.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,\r
+   0.,  0.,  0., -1.,  0., -1., -1.,  0.,  0., -1.,  0.,  1.,  0.,  0.,  0.,  1.,  0.,  0.,  0.,  0.,\r
+   0., -1.,  0.,  0.,  0., -1.,  0.,  0.,  0.,  0.,  0.,  0., -1.,  0.,  1.,  0.,  0.,  0.,  0.,  0.,\r
+   0.,  0., -1.,  1.,  0.,  0.,  0., -1.,  1.,  0.,  0.,  1.,  0.,  0., -1.,  0.,  0.,  0.,  0.,  0.,\r
+   0., -1.,  0.,  0.,  1., -1.,  0.,  0.,  1.,  0.,  0.,  0.,  0.,  0.,  0.,  1.,  1.,  1.,  0.,  0.,\r
+   1.,  1.,  0.,  0.,  0., -1.,  0.,  0.,  0., -1.,  0.,  0., -1.,  1.,  0.,  0.,  0.,  0.,  0., -1.,\r
+  -1.,  0.,  0.,  0.,  0., -1.,  0.,  0.,  0.,  0.,  0., -1.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,\r
+   0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  1.,  1.,  0., -1., -1.,  0.,  0.,  1.,  0.,\r
+   0.,  0.,  0.,  0.,  0., -1.,  0.,  0., -1.,  1.,  0.,  0.,  0.,  0.,  0.,  0., -1.,  0.,  0., -1.,\r
+   0.,  0.,  0.,  0.,  0., -1.,  0.,  0., -1.,  0.,  0.,  0.,  0.,  0., -1., -1., -1.,  0., -1., -1.,\r
+   0.,  1.,  0.,  0.,  0.,  0.,  1.,  0.,  0.,  0.,  1.,  0.,  0.,  0.,  0.,  1., -1.,  0.,  0.,  0.,\r
+   0.,  0.,  0.,  1., -1.,  0.,  0., -1.,  0., -1.,  0.,  0., -1.,  0.,  0.,  1.,  0.,  0.,  0.,  0.,\r
+  -1., -1.,  0., -1.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  1.,  0.,  0., -1.,  0.,  0.,  0.,\r
+  -1.,  0.,  1.,  0.,  0., -1.,  0.,  0.,  0., -1.,  0.,  0.,  0., -1.,  0.,  0.,  0.,  0., -1.,  0.,\r
+   0., -1., -1.,  0.,  0.,  0.,  1.,  0., -1.,  0.,  0.,  0.,  0.,  0.,  1.,  0.,  0.,  0.,  0.,  0.,\r
+   0.,  0.,  1.,  1.,  0.,  0.,  0.,  1.,  1.,  0.,  0.,  0., -1.,  0.,  0.,  0.,  0.,  0., -1.,  1.,\r
+   1.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  1.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,\r
+   0.,  0.,  0.,  0.,  0.,  0.,  0.,  0., -1.,  0.,  1.,  1.,  0.,  0.,  0.,  0.,  1.,  0.,  0.,  1.,\r
+   0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  1.,  0.,  0.,  1.,  0., -1.,\r
+  -1.,  1.,  0.,  0.,  0.,  1.,  0.,  1.,  0.,  1.,  0.,  0., -1.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,\r
+   0., -1.,  0., -1.,  0.,  0.,  0., -1.,  0.,  0., -1.,  0.,  1.,  1.,  0.,  0.,  0.,  0.,  0.,  0.,\r
+   0.,  0.,  0.,  0.,  0.,  0.,  0., -1., -1.,  0.,  0.,  0.,  0.,  1.,  0.,  0.,  0.,  0.,  0.,  0.,\r
+  -1.,  0., -1., -1.,  0.,  0., -1.,  0., -1.,  0.,  0.,  0.,  0.,  0.,  1.,  0.,  1.,  0.,  0.,  0.,\r
+   0.,  0.,  0.,  1., -1.,  0.,  1.,  0.,  0.,  0.,  0., -1.,  0.,  0.,  0.,  0.,  0.,  0.,  1.,  0.,\r
+   0., -1., -1.,  0.,  0.,  0.,  0.,  0.,  0.,  1.,  0.,  0.,  0.,  0.,  1., -1.,  0.,  1.,  0.,  1.,\r
+   0.,  1.,  0.,  0.,  0.,  1.,  0.,  0.,  0.,  0., -1.,  0.,  0.,  0., -1.,  0.,  0.,  0.,  0.,  0.,\r
+   0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0., -1.,  0.,  0.,\r
+   0.,  0.,  0.,  0.,  0.,  0.,  1.,  0.,  0., -1.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,\r
+   1.,  0.,  0.,  1.,  0.,  0.,  1.,  0.,  0.,  0.,  0.,  0.,  0., -1.,  1.,  0.,  1.,  0.,  0., -1.,\r
+   0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  1., -1.,  0.,  0.,  0., -1.,  0.,  0.,  0.,  0., -1.,\r
+   0.,  0.,  0.,  0.,  1., -1.,  0., -1.,  1.,  0.,  0.,  0.,  0., -1.,  0.,  0.,  0.,  1.,  0.,  0.,\r
+   0.,  0.,  0., -1.,  0.,  0.,  0.,  0.,  0.,  0., -1.,  0., -1.,  1.,  1., -1.,  0.,  0.,  0.,  1.,\r
+   0.,  1.,  0.,  0.,  0., -1.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  1.,  0.,  1.,  0.,\r
+   0.,  0.,  0.,  0., -1.,  0.,  0.,  0.,  1.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,\r
+   0.,  0., -1.,  0.,  0.,  0.,  1.,  0.,  0.,  0.,  0., -1.,  0.,  1., -1.,  0.,  1.,  0.,  0.,  0.,\r
+   0.,  0., -1.,  0.,  0.,  0.,  1.,  0., -1.,  1., -1.,  0.,  0.,  1.,  0.,  0.,  0.,  0., -1.,  0.,\r
+   0.,  0., -1.,  0.,  0.,  0.,  0., -1.,  0.,  0.,  0.,  0.,  1.,  0.,  0.,  0., -1.,  0.,  0.,  0.,\r
+   0.,  0.,  0.,  1.,  0.,  0.,  0.,  0.,  0.,  0.,  1., -1.,  0.,  0.,  1.,  0.,  0.,  0.,  0., -1.,\r
+   0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0., -1.,  0.,  0.,  0.,  1.,  0.,  0.,  1.,  0.,  0.,\r
+   0.,  0.,  1.,  0.,  0.,  1.,  0.,  0., -1.,  0.,  0.,  0.,  1.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,\r
+   1.,  0.,  0., -1.,  0.,  0., -1.,  0.,  0.,  0.,  1.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,\r
+   0.,  0.,  0.,  1.,  0.,  0.,  0.,  0.,  0.,  1.,  0.,  0., -1.,  1., -1.,  0.,  1.,  0.,  0.,  0.,\r
+   0.,  0.,  0.,  0.,  1., -1.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0., -1.,  1.,  0.,  0.,  0.,  0.,\r
+   0.,  0.,  0.,  0.,  0.,  0.,  0.,  1.,  0.,  0.,  0.,  0.,  0., -1.,  0.,  0.,  0.,  0., -1.,  0.,\r
+   0.,  0., -1.,  0., -1.,  0.,  0.,  0.,  0.,  0.,  0., -1.,  0.,  0., -1.,  0.,  0.,  0.,  0.,  0.,\r
+   0.,  0.,  0.,  1., -1.,  0.,  0.,  0.,  0., -1.,  0.,  1.,  0.,  0.,  1.,  0.,  0.,  0.,  0., -1.,\r
+   0.,  0.,  0.,  0.,  1.,  0.,  0.,  0.,  0., -1.,  0.,  0., -1.,  0.,  0.,  0.,  0.,  0.,  0.,  1., \r
+   0., 0.};\r
+   \r