Excitation codebook stuff, but it doesn't work;-(
[speexdsp.git] / libspeex / cb_search.c
1 /*-----------------------------------------------------------------------*\
2
3     FILE........: GAINSHAPE.C
4     TYPE........: C Module
5     AUTHOR......: David Rowe
6     COMPANY.....: Voicetronix
7     DATE CREATED: 19/2/02
8
9     General gain-shape codebbok search.
10
11 \*-----------------------------------------------------------------------*/
12
13 /* Modified by Jean-Marc Valin 2002 */
14
15
16 #include <stdlib.h>
17 #include <cb_search.h>
18
19 #define min(a,b) ((a) < (b) ? (a) : (b))
20
21 /*---------------------------------------------------------------------------*\
22                                                                              
23  void overlap_cb_search()                                                             
24                                                                               
25  Searches a gain/shape codebook consisting of overlapping entries for the    
26  closest vector to the target.  Gives identical results to search() above   
27  buts uses fast end correction algorithm for the synthesis of response       
28  vectors.                                                                     
29                                                                              
30 \*---------------------------------------------------------------------------*/
31
32 void overlap_cb_search(
33 float target[],                 /* target vector */
34 float ak[],                     /* LPCs for this subframe */
35 float awk[],                    /* Weighted LPCs for this subframe */
36 float codebook[],               /* overlapping codebook */
37 int   entries,                  /* number of overlapping entries to search */
38 float *gain,                    /* gain of optimum entry */
39 int   *index,                   /* index of optimum entry */
40 int   p,                        /* number of LPC coeffs */
41 int   nsf                       /* number of samples in subframe */
42 )
43 {
44   float *resp;                  /* zero state response to current entry */
45   float *h;                     /* impulse response of synthesis filter */
46   float *impulse;               /* excitation vector containing one impulse */
47   float d,e,g,score;            /* codebook searching variables */
48   float bscore;                 /* score of "best" vector so far */
49   int i,j,k;                    /* loop variables */
50
51   /* Initialise */
52   
53   resp = (float*)malloc(sizeof(float)*(p+nsf));
54   h = (float*)malloc(sizeof(float)*(p+nsf));
55   impulse = (float*)malloc(sizeof(float)*(p+nsf));
56
57   for(i=0; i<p+nsf; i++)
58     impulse[i] = 0.0;
59   for(i=0; i<p; i++) {
60     h[i] = 0.0;
61     resp[i] = 0.0;
62   }  
63    
64   *gain = 0.0;
65   *index = 0;
66   bscore = 0.0;
67   impulse[p] = 1.0;
68
69   /*synthesis_filter(impulse,ak,nsf,p,&h[p]);*/
70   for (i=0;i<nsf;i++)
71   {
72      h[p+i] = impulse[p+i];
73      for (k=1;k<=p;k++)
74         h[p+i] += awk[k]*impulse[p+i-k] - ak[k]*h[p+i-k];
75   }
76
77   for (i=0;i<nsf;i++)
78   {
79      resp[p+i] = codebook[entries-1];
80      for (k=1;k<=min(p,i);k++)
81         resp[p+i] += awk[k]*codebook[entries-1+i-k];
82      for (k=1;k<p+1;k++)
83         resp[p+i] -= ak[k]*resp[p+i-k];
84   }
85
86   /*synthesis_filter(&codebook[entries-1],ak,nsf,p,&resp[p]);  */  
87     
88   /* Search codebook backwards using end correction for synthesis */
89   
90   for(k=entries-1; k>=0; k--) {
91
92      /*FIXME: This is horribly slow, but I've got problems with the faster version.
93       This loop should not be there at all once the bug is fixed*/
94      for (i=0;i<nsf;i++)
95      {
96         resp[p+i] = codebook[k];
97         for (j=1;j<=min(p,i);j++)
98            resp[p+i] += awk[j]*codebook[k+i-j];
99         for (j=1;j<p+1;j++)
100            resp[p+i] -= ak[j]*resp[p+i-j];
101      }
102
103     d = 0.0; e = 0.0;
104     for(i=0; i<nsf; i++) {
105       d += target[i]*resp[p+i];
106       e += resp[p+i]*resp[p+i];
107     }
108     g = d/e;
109     score = g*d;
110     /*printf ("score: %f %f %f %f\n", target[0],d,e,score);*/
111     if (score >= bscore) {
112       bscore = score;
113       *gain = g;
114       *index = k;
115     }
116     
117     /* Synthesise next entry */
118     
119     if (k) {
120       for(i=nsf-1; i>=1; i--)
121         resp[i+p] = resp[i+p-1] + codebook[k-1]*h[p+i];
122       resp[p] = codebook[k-1]*h[p];
123     }
124   }
125
126   free(resp);
127   free(h);
128   free(impulse);
129
130 }
131