Coverage Report

Created: 2026-05-24 07:02

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/speex/libspeex/cb_search.c
Line
Count
Source
1
/* Copyright (C) 2002-2006 Jean-Marc Valin
2
   File: cb_search.c
3
4
   Redistribution and use in source and binary forms, with or without
5
   modification, are permitted provided that the following conditions
6
   are met:
7
8
   - Redistributions of source code must retain the above copyright
9
   notice, this list of conditions and the following disclaimer.
10
11
   - Redistributions in binary form must reproduce the above copyright
12
   notice, this list of conditions and the following disclaimer in the
13
   documentation and/or other materials provided with the distribution.
14
15
   - Neither the name of the Xiph.org Foundation nor the names of its
16
   contributors may be used to endorse or promote products derived from
17
   this software without specific prior written permission.
18
19
   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
20
   ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
21
   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
22
   A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR
23
   CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
24
   EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
25
   PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
26
   PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
27
   LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
28
   NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
29
   SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30
*/
31
32
#ifdef HAVE_CONFIG_H
33
#include "config.h"
34
#endif
35
36
#include "cb_search.h"
37
#include "filters.h"
38
#include "stack_alloc.h"
39
#include "vq.h"
40
#include "arch.h"
41
#include "math_approx.h"
42
#include "os_support.h"
43
44
#ifdef _USE_SSE
45
#include "cb_search_sse.h"
46
#elif defined(ARM4_ASM) || defined(ARM5E_ASM)
47
#include "cb_search_arm4.h"
48
#elif defined(BFIN_ASM)
49
#include "cb_search_bfin.h"
50
#endif
51
52
#ifndef DISABLE_ENCODER
53
54
#ifndef OVERRIDE_COMPUTE_WEIGHTED_CODEBOOK
55
static void compute_weighted_codebook(const signed char *shape_cb, const spx_word16_t *r, spx_word16_t *resp, spx_word16_t *resp2, spx_word32_t *E, int shape_cb_size, int subvect_size, char *stack)
56
43.4k
{
57
43.4k
   int i, j, k;
58
43.4k
   VARDECL(spx_word16_t *shape);
59
43.4k
   ALLOC(shape, subvect_size, spx_word16_t);
60
4.03M
   for (i=0;i<shape_cb_size;i++)
61
3.99M
   {
62
3.99M
      spx_word16_t *res;
63
64
3.99M
      res = resp+i*subvect_size;
65
32.8M
      for (k=0;k<subvect_size;k++)
66
28.8M
         shape[k] = (spx_word16_t)shape_cb[i*subvect_size+k];
67
3.99M
      E[i]=0;
68
69
      /* Compute codeword response using convolution with impulse response */
70
32.8M
      for(j=0;j<subvect_size;j++)
71
28.8M
      {
72
28.8M
         spx_word32_t resj=0;
73
28.8M
         spx_word16_t res16;
74
171M
         for (k=0;k<=j;k++)
75
143M
            resj = MAC16_16(resj,shape[k],r[j-k]);
76
28.8M
#ifdef FIXED_POINT
77
28.8M
         res16 = EXTRACT16(SHR32(resj, 13));
78
#else
79
         res16 = 0.03125f*resj;
80
#endif
81
         /* Compute codeword energy */
82
28.8M
         E[i]=MAC16_16(E[i],res16,res16);
83
28.8M
         res[j] = res16;
84
         /*printf ("%d\n", (int)res[j]);*/
85
28.8M
      }
86
3.99M
   }
87
88
43.4k
}
89
#endif
90
91
#ifndef OVERRIDE_TARGET_UPDATE
92
static inline void target_update(spx_word16_t *t, spx_word16_t g, spx_word16_t *r, int len)
93
16.4M
{
94
16.4M
   int n;
95
269M
   for (n=0;n<len;n++)
96
253M
      t[n] = SUB16(t[n],PSHR32(MULT16_16(g,r[n]),13));
97
16.4M
}
cb_search.c:target_update
Line
Count
Source
93
8.23M
{
94
8.23M
   int n;
95
134M
   for (n=0;n<len;n++)
96
126M
      t[n] = SUB16(t[n],PSHR32(MULT16_16(g,r[n]),13));
97
8.23M
}
cb_search.c:target_update
Line
Count
Source
93
8.23M
{
94
8.23M
   int n;
95
134M
   for (n=0;n<len;n++)
96
126M
      t[n] = SUB16(t[n],PSHR32(MULT16_16(g,r[n]),13));
97
8.23M
}
98
#endif
99
100
101
102
static void split_cb_search_shape_sign_N1(
103
spx_word16_t target[],      /* target vector */
104
spx_coef_t ak[],      /* LPCs for this subframe */
105
spx_coef_t awk1[],      /* Weighted LPCs for this subframe */
106
spx_coef_t awk2[],      /* Weighted LPCs for this subframe */
107
const void *par,                      /* Codebook/search parameters*/
108
int   p,                        /* number of LPC coeffs */
109
int   nsf,                      /* number of samples in subframe */
110
spx_sig_t *exc,
111
spx_word16_t *r,
112
SpeexBits *bits,
113
char *stack,
114
int   update_target
115
)
116
19.3k
{
117
19.3k
   int i,j,m,q;
118
19.3k
   VARDECL(spx_word16_t *resp);
119
#ifdef _USE_SSE
120
   VARDECL(__m128 *resp2);
121
   VARDECL(__m128 *E);
122
#else
123
   spx_word16_t *resp2;
124
   VARDECL(spx_word32_t *E);
125
#endif
126
19.3k
   VARDECL(spx_word16_t *t);
127
19.3k
   VARDECL(spx_sig_t *e);
128
19.3k
   const signed char *shape_cb;
129
19.3k
   int shape_cb_size, subvect_size, nb_subvect;
130
19.3k
   const split_cb_params *params;
131
19.3k
   int best_index;
132
19.3k
   spx_word32_t best_dist;
133
19.3k
   int have_sign;
134
135
19.3k
   params = (const split_cb_params *) par;
136
19.3k
   subvect_size = params->subvect_size;
137
19.3k
   nb_subvect = params->nb_subvect;
138
19.3k
   shape_cb_size = 1<<params->shape_bits;
139
19.3k
   shape_cb = params->shape_cb;
140
19.3k
   have_sign = params->have_sign;
141
19.3k
   ALLOC(resp, shape_cb_size*subvect_size, spx_word16_t);
142
#ifdef _USE_SSE
143
5.43k
   ALLOC(resp2, (shape_cb_size*subvect_size)>>2, __m128);
144
5.43k
   ALLOC(E, shape_cb_size>>2, __m128);
145
#else
146
   resp2 = resp;
147
13.9k
   ALLOC(E, shape_cb_size, spx_word32_t);
148
#endif
149
19.3k
   ALLOC(t, nsf, spx_word16_t);
150
19.3k
   ALLOC(e, nsf, spx_sig_t);
151
152
   /* FIXME: Do we still need to copy the target? */
153
19.3k
   SPEEX_COPY(t, target, nsf);
154
155
19.3k
   compute_weighted_codebook(shape_cb, r, resp, resp2, E, shape_cb_size, subvect_size, stack);
156
157
120k
   for (i=0;i<nb_subvect;i++)
158
100k
   {
159
100k
      spx_word16_t *x=t+subvect_size*i;
160
      /*Find new n-best based on previous n-best j*/
161
100k
#ifndef DISABLE_WIDEBAND
162
100k
      if (have_sign)
163
13.5k
         vq_nbest_sign(x, resp2, subvect_size, shape_cb_size, E, 1, &best_index, &best_dist, stack);
164
87.2k
      else
165
87.2k
#endif /* DISABLE_WIDEBAND */
166
87.2k
         vq_nbest(x, resp2, subvect_size, shape_cb_size, E, 1, &best_index, &best_dist, stack);
167
168
100k
      speex_bits_pack(bits,best_index,params->shape_bits+have_sign);
169
170
100k
      {
171
100k
         int rind;
172
100k
         spx_word16_t *res;
173
100k
         spx_word16_t sign=1;
174
100k
         rind = best_index;
175
100k
         if (rind>=shape_cb_size)
176
10.1k
         {
177
10.1k
            sign=-1;
178
10.1k
            rind-=shape_cb_size;
179
10.1k
         }
180
100k
         res = resp+rind*subvect_size;
181
100k
         if (sign>0)
182
782k
            for (m=0;m<subvect_size;m++)
183
692k
               t[subvect_size*i+m] = SUB16(t[subvect_size*i+m], res[m]);
184
10.1k
         else
185
91.7k
            for (m=0;m<subvect_size;m++)
186
81.5k
               t[subvect_size*i+m] = ADD16(t[subvect_size*i+m], res[m]);
187
188
#ifdef FIXED_POINT
189
74.5k
         if (sign==1)
190
67.6k
         {
191
568k
            for (j=0;j<subvect_size;j++)
192
500k
               e[subvect_size*i+j]=SHL32(EXTEND32(shape_cb[rind*subvect_size+j]),SIG_SHIFT-5);
193
67.6k
         } else {
194
62.3k
            for (j=0;j<subvect_size;j++)
195
55.4k
               e[subvect_size*i+j]=NEG32(SHL32(EXTEND32(shape_cb[rind*subvect_size+j]),SIG_SHIFT-5));
196
6.93k
         }
197
#else
198
243k
         for (j=0;j<subvect_size;j++)
199
217k
            e[subvect_size*i+j]=sign*0.03125*shape_cb[rind*subvect_size+j];
200
#endif
201
202
100k
      }
203
204
874k
      for (m=0;m<subvect_size;m++)
205
773k
      {
206
773k
         spx_word16_t g;
207
773k
         int rind;
208
773k
         spx_word16_t sign=1;
209
773k
         rind = best_index;
210
773k
         if (rind>=shape_cb_size)
211
81.5k
         {
212
81.5k
            sign=-1;
213
81.5k
            rind-=shape_cb_size;
214
81.5k
         }
215
216
773k
         q=subvect_size-m;
217
#ifdef FIXED_POINT
218
         g=sign*shape_cb[rind*subvect_size+m];
219
#else
220
         g=sign*0.03125*shape_cb[rind*subvect_size+m];
221
#endif
222
773k
         target_update(t+subvect_size*(i+1), g, r+q, nsf-subvect_size*(i+1));
223
773k
      }
224
100k
   }
225
226
   /* Update excitation */
227
   /* FIXME: We could update the excitation directly above */
228
792k
   for (j=0;j<nsf;j++)
229
773k
      exc[j]=ADD32(exc[j],e[j]);
230
231
   /* Update target: only update target if necessary */
232
19.3k
   if (update_target)
233
1.97k
   {
234
1.97k
      VARDECL(spx_word16_t *r2);
235
1.97k
      ALLOC(r2, nsf, spx_word16_t);
236
80.8k
      for (j=0;j<nsf;j++)
237
78.8k
         r2[j] = EXTRACT16(PSHR32(e[j] ,6));
238
1.97k
      syn_percep_zero16(r2, ak, awk1, awk2, r2, nsf,p, stack);
239
80.8k
      for (j=0;j<nsf;j++)
240
78.8k
         target[j]=SUB16(target[j],PSHR16(r2[j],2));
241
1.97k
   }
242
19.3k
}
cb_search.c:split_cb_search_shape_sign_N1
Line
Count
Source
116
5.43k
{
117
5.43k
   int i,j,m,q;
118
5.43k
   VARDECL(spx_word16_t *resp);
119
5.43k
#ifdef _USE_SSE
120
5.43k
   VARDECL(__m128 *resp2);
121
5.43k
   VARDECL(__m128 *E);
122
#else
123
   spx_word16_t *resp2;
124
   VARDECL(spx_word32_t *E);
125
#endif
126
5.43k
   VARDECL(spx_word16_t *t);
127
5.43k
   VARDECL(spx_sig_t *e);
128
5.43k
   const signed char *shape_cb;
129
5.43k
   int shape_cb_size, subvect_size, nb_subvect;
130
5.43k
   const split_cb_params *params;
131
5.43k
   int best_index;
132
5.43k
   spx_word32_t best_dist;
133
5.43k
   int have_sign;
134
135
5.43k
   params = (const split_cb_params *) par;
136
5.43k
   subvect_size = params->subvect_size;
137
5.43k
   nb_subvect = params->nb_subvect;
138
5.43k
   shape_cb_size = 1<<params->shape_bits;
139
5.43k
   shape_cb = params->shape_cb;
140
5.43k
   have_sign = params->have_sign;
141
5.43k
   ALLOC(resp, shape_cb_size*subvect_size, spx_word16_t);
142
5.43k
#ifdef _USE_SSE
143
5.43k
   ALLOC(resp2, (shape_cb_size*subvect_size)>>2, __m128);
144
5.43k
   ALLOC(E, shape_cb_size>>2, __m128);
145
#else
146
   resp2 = resp;
147
   ALLOC(E, shape_cb_size, spx_word32_t);
148
#endif
149
5.43k
   ALLOC(t, nsf, spx_word16_t);
150
5.43k
   ALLOC(e, nsf, spx_sig_t);
151
152
   /* FIXME: Do we still need to copy the target? */
153
5.43k
   SPEEX_COPY(t, target, nsf);
154
155
5.43k
   compute_weighted_codebook(shape_cb, r, resp, resp2, E, shape_cb_size, subvect_size, stack);
156
157
31.6k
   for (i=0;i<nb_subvect;i++)
158
26.2k
   {
159
26.2k
      spx_word16_t *x=t+subvect_size*i;
160
      /*Find new n-best based on previous n-best j*/
161
26.2k
#ifndef DISABLE_WIDEBAND
162
26.2k
      if (have_sign)
163
3.64k
         vq_nbest_sign(x, resp2, subvect_size, shape_cb_size, E, 1, &best_index, &best_dist, stack);
164
22.6k
      else
165
22.6k
#endif /* DISABLE_WIDEBAND */
166
22.6k
         vq_nbest(x, resp2, subvect_size, shape_cb_size, E, 1, &best_index, &best_dist, stack);
167
168
26.2k
      speex_bits_pack(bits,best_index,params->shape_bits+have_sign);
169
170
26.2k
      {
171
26.2k
         int rind;
172
26.2k
         spx_word16_t *res;
173
26.2k
         spx_word16_t sign=1;
174
26.2k
         rind = best_index;
175
26.2k
         if (rind>=shape_cb_size)
176
3.25k
         {
177
3.25k
            sign=-1;
178
3.25k
            rind-=shape_cb_size;
179
3.25k
         }
180
26.2k
         res = resp+rind*subvect_size;
181
26.2k
         if (sign>0)
182
214k
            for (m=0;m<subvect_size;m++)
183
191k
               t[subvect_size*i+m] = SUB16(t[subvect_size*i+m], res[m]);
184
3.25k
         else
185
29.3k
            for (m=0;m<subvect_size;m++)
186
26.0k
               t[subvect_size*i+m] = ADD16(t[subvect_size*i+m], res[m]);
187
188
#ifdef FIXED_POINT
189
         if (sign==1)
190
         {
191
            for (j=0;j<subvect_size;j++)
192
               e[subvect_size*i+j]=SHL32(EXTEND32(shape_cb[rind*subvect_size+j]),SIG_SHIFT-5);
193
         } else {
194
            for (j=0;j<subvect_size;j++)
195
               e[subvect_size*i+j]=NEG32(SHL32(EXTEND32(shape_cb[rind*subvect_size+j]),SIG_SHIFT-5));
196
         }
197
#else
198
243k
         for (j=0;j<subvect_size;j++)
199
217k
            e[subvect_size*i+j]=sign*0.03125*shape_cb[rind*subvect_size+j];
200
26.2k
#endif
201
202
26.2k
      }
203
204
243k
      for (m=0;m<subvect_size;m++)
205
217k
      {
206
217k
         spx_word16_t g;
207
217k
         int rind;
208
217k
         spx_word16_t sign=1;
209
217k
         rind = best_index;
210
217k
         if (rind>=shape_cb_size)
211
26.0k
         {
212
26.0k
            sign=-1;
213
26.0k
            rind-=shape_cb_size;
214
26.0k
         }
215
216
217k
         q=subvect_size-m;
217
#ifdef FIXED_POINT
218
         g=sign*shape_cb[rind*subvect_size+m];
219
#else
220
217k
         g=sign*0.03125*shape_cb[rind*subvect_size+m];
221
217k
#endif
222
217k
         target_update(t+subvect_size*(i+1), g, r+q, nsf-subvect_size*(i+1));
223
217k
      }
224
26.2k
   }
225
226
   /* Update excitation */
227
   /* FIXME: We could update the excitation directly above */
228
222k
   for (j=0;j<nsf;j++)
229
217k
      exc[j]=ADD32(exc[j],e[j]);
230
231
   /* Update target: only update target if necessary */
232
5.43k
   if (update_target)
233
440
   {
234
440
      VARDECL(spx_word16_t *r2);
235
440
      ALLOC(r2, nsf, spx_word16_t);
236
18.0k
      for (j=0;j<nsf;j++)
237
17.6k
         r2[j] = EXTRACT16(PSHR32(e[j] ,6));
238
440
      syn_percep_zero16(r2, ak, awk1, awk2, r2, nsf,p, stack);
239
18.0k
      for (j=0;j<nsf;j++)
240
17.6k
         target[j]=SUB16(target[j],PSHR16(r2[j],2));
241
440
   }
242
5.43k
}
cb_search.c:split_cb_search_shape_sign_N1
Line
Count
Source
116
13.9k
{
117
13.9k
   int i,j,m,q;
118
13.9k
   VARDECL(spx_word16_t *resp);
119
#ifdef _USE_SSE
120
   VARDECL(__m128 *resp2);
121
   VARDECL(__m128 *E);
122
#else
123
13.9k
   spx_word16_t *resp2;
124
13.9k
   VARDECL(spx_word32_t *E);
125
13.9k
#endif
126
13.9k
   VARDECL(spx_word16_t *t);
127
13.9k
   VARDECL(spx_sig_t *e);
128
13.9k
   const signed char *shape_cb;
129
13.9k
   int shape_cb_size, subvect_size, nb_subvect;
130
13.9k
   const split_cb_params *params;
131
13.9k
   int best_index;
132
13.9k
   spx_word32_t best_dist;
133
13.9k
   int have_sign;
134
135
13.9k
   params = (const split_cb_params *) par;
136
13.9k
   subvect_size = params->subvect_size;
137
13.9k
   nb_subvect = params->nb_subvect;
138
13.9k
   shape_cb_size = 1<<params->shape_bits;
139
13.9k
   shape_cb = params->shape_cb;
140
13.9k
   have_sign = params->have_sign;
141
13.9k
   ALLOC(resp, shape_cb_size*subvect_size, spx_word16_t);
142
#ifdef _USE_SSE
143
   ALLOC(resp2, (shape_cb_size*subvect_size)>>2, __m128);
144
   ALLOC(E, shape_cb_size>>2, __m128);
145
#else
146
13.9k
   resp2 = resp;
147
13.9k
   ALLOC(E, shape_cb_size, spx_word32_t);
148
13.9k
#endif
149
13.9k
   ALLOC(t, nsf, spx_word16_t);
150
13.9k
   ALLOC(e, nsf, spx_sig_t);
151
152
   /* FIXME: Do we still need to copy the target? */
153
13.9k
   SPEEX_COPY(t, target, nsf);
154
155
13.9k
   compute_weighted_codebook(shape_cb, r, resp, resp2, E, shape_cb_size, subvect_size, stack);
156
157
88.5k
   for (i=0;i<nb_subvect;i++)
158
74.5k
   {
159
74.5k
      spx_word16_t *x=t+subvect_size*i;
160
      /*Find new n-best based on previous n-best j*/
161
74.5k
#ifndef DISABLE_WIDEBAND
162
74.5k
      if (have_sign)
163
9.92k
         vq_nbest_sign(x, resp2, subvect_size, shape_cb_size, E, 1, &best_index, &best_dist, stack);
164
64.6k
      else
165
64.6k
#endif /* DISABLE_WIDEBAND */
166
64.6k
         vq_nbest(x, resp2, subvect_size, shape_cb_size, E, 1, &best_index, &best_dist, stack);
167
168
74.5k
      speex_bits_pack(bits,best_index,params->shape_bits+have_sign);
169
170
74.5k
      {
171
74.5k
         int rind;
172
74.5k
         spx_word16_t *res;
173
74.5k
         spx_word16_t sign=1;
174
74.5k
         rind = best_index;
175
74.5k
         if (rind>=shape_cb_size)
176
6.93k
         {
177
6.93k
            sign=-1;
178
6.93k
            rind-=shape_cb_size;
179
6.93k
         }
180
74.5k
         res = resp+rind*subvect_size;
181
74.5k
         if (sign>0)
182
568k
            for (m=0;m<subvect_size;m++)
183
500k
               t[subvect_size*i+m] = SUB16(t[subvect_size*i+m], res[m]);
184
6.93k
         else
185
62.3k
            for (m=0;m<subvect_size;m++)
186
55.4k
               t[subvect_size*i+m] = ADD16(t[subvect_size*i+m], res[m]);
187
188
74.5k
#ifdef FIXED_POINT
189
74.5k
         if (sign==1)
190
67.6k
         {
191
568k
            for (j=0;j<subvect_size;j++)
192
500k
               e[subvect_size*i+j]=SHL32(EXTEND32(shape_cb[rind*subvect_size+j]),SIG_SHIFT-5);
193
67.6k
         } else {
194
62.3k
            for (j=0;j<subvect_size;j++)
195
55.4k
               e[subvect_size*i+j]=NEG32(SHL32(EXTEND32(shape_cb[rind*subvect_size+j]),SIG_SHIFT-5));
196
6.93k
         }
197
#else
198
         for (j=0;j<subvect_size;j++)
199
            e[subvect_size*i+j]=sign*0.03125*shape_cb[rind*subvect_size+j];
200
#endif
201
202
74.5k
      }
203
204
630k
      for (m=0;m<subvect_size;m++)
205
556k
      {
206
556k
         spx_word16_t g;
207
556k
         int rind;
208
556k
         spx_word16_t sign=1;
209
556k
         rind = best_index;
210
556k
         if (rind>=shape_cb_size)
211
55.4k
         {
212
55.4k
            sign=-1;
213
55.4k
            rind-=shape_cb_size;
214
55.4k
         }
215
216
556k
         q=subvect_size-m;
217
556k
#ifdef FIXED_POINT
218
556k
         g=sign*shape_cb[rind*subvect_size+m];
219
#else
220
         g=sign*0.03125*shape_cb[rind*subvect_size+m];
221
#endif
222
556k
         target_update(t+subvect_size*(i+1), g, r+q, nsf-subvect_size*(i+1));
223
556k
      }
224
74.5k
   }
225
226
   /* Update excitation */
227
   /* FIXME: We could update the excitation directly above */
228
570k
   for (j=0;j<nsf;j++)
229
556k
      exc[j]=ADD32(exc[j],e[j]);
230
231
   /* Update target: only update target if necessary */
232
13.9k
   if (update_target)
233
1.53k
   {
234
1.53k
      VARDECL(spx_word16_t *r2);
235
1.53k
      ALLOC(r2, nsf, spx_word16_t);
236
62.8k
      for (j=0;j<nsf;j++)
237
61.2k
         r2[j] = EXTRACT16(PSHR32(e[j] ,6));
238
1.53k
      syn_percep_zero16(r2, ak, awk1, awk2, r2, nsf,p, stack);
239
62.8k
      for (j=0;j<nsf;j++)
240
61.2k
         target[j]=SUB16(target[j],PSHR16(r2[j],2));
241
1.53k
   }
242
13.9k
}
243
244
245
246
void split_cb_search_shape_sign(
247
spx_word16_t target[],      /* target vector */
248
spx_coef_t ak[],      /* LPCs for this subframe */
249
spx_coef_t awk1[],      /* Weighted LPCs for this subframe */
250
spx_coef_t awk2[],      /* Weighted LPCs for this subframe */
251
const void *par,                      /* Codebook/search parameters*/
252
int   p,                        /* number of LPC coeffs */
253
int   nsf,                      /* number of samples in subframe */
254
spx_sig_t *exc,
255
spx_word16_t *r,
256
SpeexBits *bits,
257
char *stack,
258
int   complexity,
259
int   update_target
260
)
261
62.9k
{
262
62.9k
   int i,j,k,m,n,q;
263
62.9k
   VARDECL(spx_word16_t *resp);
264
#ifdef _USE_SSE
265
   VARDECL(__m128 *resp2);
266
   VARDECL(__m128 *E);
267
#else
268
   spx_word16_t *resp2;
269
   VARDECL(spx_word32_t *E);
270
#endif
271
62.9k
   VARDECL(spx_word16_t *t);
272
62.9k
   VARDECL(spx_sig_t *e);
273
62.9k
   VARDECL(spx_word16_t *tmp);
274
62.9k
   VARDECL(spx_word32_t *ndist);
275
62.9k
   VARDECL(spx_word32_t *odist);
276
62.9k
   VARDECL(int *itmp);
277
62.9k
   VARDECL(spx_word16_t **ot2);
278
62.9k
   VARDECL(spx_word16_t **nt2);
279
62.9k
   spx_word16_t **ot, **nt;
280
62.9k
   VARDECL(int **nind);
281
62.9k
   VARDECL(int **oind);
282
62.9k
   VARDECL(int *ind);
283
62.9k
   const signed char *shape_cb;
284
62.9k
   int shape_cb_size, subvect_size, nb_subvect;
285
62.9k
   const split_cb_params *params;
286
62.9k
   int N=2;
287
62.9k
   VARDECL(int *best_index);
288
62.9k
   VARDECL(spx_word32_t *best_dist);
289
62.9k
   VARDECL(int *best_nind);
290
62.9k
   VARDECL(int *best_ntarget);
291
62.9k
   int have_sign;
292
62.9k
   N=complexity;
293
62.9k
   if (N>10)
294
0
      N=10;
295
   /* Complexity isn't as important for the codebooks as it is for the pitch */
296
62.9k
   N=(2*N)/3;
297
62.9k
   if (N<1)
298
14.8k
      N=1;
299
62.9k
   if (N==1)
300
19.3k
   {
301
19.3k
      split_cb_search_shape_sign_N1(target,ak,awk1,awk2,par,p,nsf,exc,r,bits,stack,update_target);
302
19.3k
      return;
303
19.3k
   }
304
43.5k
   ALLOC(ot2, N, spx_word16_t*);
305
43.5k
   ALLOC(nt2, N, spx_word16_t*);
306
43.5k
   ALLOC(oind, N, int*);
307
43.5k
   ALLOC(nind, N, int*);
308
309
43.5k
   params = (const split_cb_params *) par;
310
43.5k
   subvect_size = params->subvect_size;
311
43.5k
   nb_subvect = params->nb_subvect;
312
43.5k
   shape_cb_size = 1<<params->shape_bits;
313
43.5k
   shape_cb = params->shape_cb;
314
43.5k
   have_sign = params->have_sign;
315
43.5k
   ALLOC(resp, shape_cb_size*subvect_size, spx_word16_t);
316
#ifdef _USE_SSE
317
14.0k
   ALLOC(resp2, (shape_cb_size*subvect_size)>>2, __m128);
318
14.0k
   ALLOC(E, shape_cb_size>>2, __m128);
319
#else
320
   resp2 = resp;
321
29.5k
   ALLOC(E, shape_cb_size, spx_word32_t);
322
#endif
323
43.5k
   ALLOC(t, nsf, spx_word16_t);
324
43.5k
   ALLOC(e, nsf, spx_sig_t);
325
43.5k
   ALLOC(ind, nb_subvect, int);
326
327
43.5k
   ALLOC(tmp, 2*N*nsf, spx_word16_t);
328
230k
   for (i=0;i<N;i++)
329
186k
   {
330
186k
      ot2[i]=tmp+2*i*nsf;
331
186k
      nt2[i]=tmp+(2*i+1)*nsf;
332
186k
   }
333
43.5k
   ot=ot2;
334
43.5k
   nt=nt2;
335
43.5k
   ALLOC(best_index, N, int);
336
43.5k
   ALLOC(best_dist, N, spx_word32_t);
337
43.5k
   ALLOC(best_nind, N, int);
338
43.5k
   ALLOC(best_ntarget, N, int);
339
43.5k
   ALLOC(ndist, N, spx_word32_t);
340
43.5k
   ALLOC(odist, N, spx_word32_t);
341
342
43.5k
   ALLOC(itmp, 2*N*nb_subvect, int);
343
230k
   for (i=0;i<N;i++)
344
186k
   {
345
186k
      nind[i]=itmp+2*i*nb_subvect;
346
186k
      oind[i]=itmp+(2*i+1)*nb_subvect;
347
186k
   }
348
349
43.5k
   SPEEX_COPY(t, target, nsf);
350
351
230k
   for (j=0;j<N;j++)
352
186k
      SPEEX_COPY(&ot[j][0], t, nsf);
353
354
   /* Pre-compute codewords response and energy */
355
43.5k
   compute_weighted_codebook(shape_cb, r, resp, resp2, E, shape_cb_size, subvect_size, stack);
356
357
230k
   for (j=0;j<N;j++)
358
186k
      odist[j]=0;
359
360
   /*For all subvectors*/
361
277k
   for (i=0;i<nb_subvect;i++)
362
233k
   {
363
      /*"erase" nbest list*/
364
1.23M
      for (j=0;j<N;j++)
365
997k
         ndist[j]=VERY_LARGE32;
366
      /* This is not strictly necessary, but it provides an additional safety
367
         to prevent crashes in case something goes wrong in the previous
368
         steps (e.g. NaNs) */
369
1.23M
      for (j=0;j<N;j++)
370
997k
         best_nind[j] = best_ntarget[j] = 0;
371
      /*For all n-bests of previous subvector*/
372
1.04M
      for (j=0;j<N;j++)
373
854k
      {
374
854k
         spx_word16_t *x=ot[j]+subvect_size*i;
375
854k
         spx_word32_t tener = 0;
376
7.00M
         for (m=0;m<subvect_size;m++)
377
6.14M
            tener = MAC16_16(tener, x[m],x[m]);
378
#ifdef FIXED_POINT
379
571k
         tener = SHR32(tener,1);
380
#else
381
         tener *= .5;
382
#endif
383
         /*Find new n-best based on previous n-best j*/
384
854k
#ifndef DISABLE_WIDEBAND
385
854k
         if (have_sign)
386
116k
            vq_nbest_sign(x, resp2, subvect_size, shape_cb_size, E, N, best_index, best_dist, stack);
387
738k
         else
388
738k
#endif /* DISABLE_WIDEBAND */
389
738k
            vq_nbest(x, resp2, subvect_size, shape_cb_size, E, N, best_index, best_dist, stack);
390
391
         /*For all new n-bests*/
392
4.90M
         for (k=0;k<N;k++)
393
4.04M
         {
394
            /* Compute total distance (including previous sub-vectors */
395
4.04M
            spx_word32_t err = ADD32(ADD32(odist[j],best_dist[k]),tener);
396
397
            /*update n-best list*/
398
4.04M
            if (err<ndist[N-1])
399
1.56M
            {
400
4.96M
               for (m=0;m<N;m++)
401
4.96M
               {
402
4.96M
                  if (err < ndist[m])
403
1.56M
                  {
404
4.23M
                     for (n=N-1;n>m;n--)
405
2.66M
                     {
406
2.66M
                        ndist[n] = ndist[n-1];
407
2.66M
                        best_nind[n] = best_nind[n-1];
408
2.66M
                        best_ntarget[n] = best_ntarget[n-1];
409
2.66M
                     }
410
                     /* n is equal to m here, so they're interchangeable */
411
1.56M
                     ndist[m] = err;
412
1.56M
                     best_nind[n] = best_index[k];
413
1.56M
                     best_ntarget[n] = j;
414
1.56M
                     break;
415
1.56M
                  }
416
4.96M
               }
417
1.56M
            }
418
4.04M
         }
419
854k
         if (i==0)
420
43.5k
            break;
421
854k
      }
422
1.23M
      for (j=0;j<N;j++)
423
997k
      {
424
         /*previous target (we don't care what happened before*/
425
17.2M
         for (m=(i+1)*subvect_size;m<nsf;m++)
426
16.2M
            nt[j][m]=ot[best_ntarget[j]][m];
427
428
         /* New code: update the rest of the target only if it's worth it */
429
8.46M
         for (m=0;m<subvect_size;m++)
430
7.46M
         {
431
7.46M
            spx_word16_t g;
432
7.46M
            int rind;
433
7.46M
            spx_word16_t sign=1;
434
7.46M
            rind = best_nind[j];
435
7.46M
            if (rind>=shape_cb_size)
436
743k
            {
437
743k
               sign=-1;
438
743k
               rind-=shape_cb_size;
439
743k
            }
440
441
7.46M
            q=subvect_size-m;
442
#ifdef FIXED_POINT
443
            g=sign*shape_cb[rind*subvect_size+m];
444
#else
445
            g=sign*0.03125*shape_cb[rind*subvect_size+m];
446
#endif
447
7.46M
            target_update(nt[j]+subvect_size*(i+1), g, r+q, nsf-subvect_size*(i+1));
448
7.46M
         }
449
450
7.17M
         for (q=0;q<nb_subvect;q++)
451
6.17M
            nind[j][q]=oind[best_ntarget[j]][q];
452
997k
         nind[j][i]=best_nind[j];
453
997k
      }
454
455
      /*update old-new data*/
456
      /* just swap pointers instead of a long copy */
457
233k
      {
458
233k
         spx_word16_t **tmp2;
459
233k
         tmp2=ot;
460
233k
         ot=nt;
461
233k
         nt=tmp2;
462
233k
      }
463
1.23M
      for (j=0;j<N;j++)
464
7.17M
         for (m=0;m<nb_subvect;m++)
465
6.17M
            oind[j][m]=nind[j][m];
466
1.23M
      for (j=0;j<N;j++)
467
997k
         odist[j]=ndist[j];
468
233k
   }
469
470
   /*save indices*/
471
277k
   for (i=0;i<nb_subvect;i++)
472
233k
   {
473
233k
      ind[i]=nind[0][i];
474
233k
      speex_bits_pack(bits,ind[i],params->shape_bits+have_sign);
475
233k
   }
476
477
   /* Put everything back together */
478
277k
   for (i=0;i<nb_subvect;i++)
479
233k
   {
480
233k
      int rind;
481
233k
      spx_word16_t sign=1;
482
233k
      rind = ind[i];
483
233k
      if (rind>=shape_cb_size)
484
25.5k
      {
485
25.5k
         sign=-1;
486
25.5k
         rind-=shape_cb_size;
487
25.5k
      }
488
#ifdef FIXED_POINT
489
157k
      if (sign==1)
490
142k
      {
491
1.20M
         for (j=0;j<subvect_size;j++)
492
1.06M
            e[subvect_size*i+j]=SHL32(EXTEND32(shape_cb[rind*subvect_size+j]),SIG_SHIFT-5);
493
142k
      } else {
494
130k
         for (j=0;j<subvect_size;j++)
495
116k
            e[subvect_size*i+j]=NEG32(SHL32(EXTEND32(shape_cb[rind*subvect_size+j]),SIG_SHIFT-5));
496
14.5k
      }
497
#else
498
637k
      for (j=0;j<subvect_size;j++)
499
560k
         e[subvect_size*i+j]=sign*0.03125*shape_cb[rind*subvect_size+j];
500
#endif
501
233k
   }
502
   /* Update excitation */
503
1.78M
   for (j=0;j<nsf;j++)
504
1.74M
      exc[j]=ADD32(exc[j],e[j]);
505
506
   /* Update target: only update target if necessary */
507
43.5k
   if (update_target)
508
4.26k
   {
509
4.26k
      VARDECL(spx_word16_t *r2);
510
4.26k
      ALLOC(r2, nsf, spx_word16_t);
511
174k
      for (j=0;j<nsf;j++)
512
170k
         r2[j] = EXTRACT16(PSHR32(e[j] ,6));
513
4.26k
      syn_percep_zero16(r2, ak, awk1, awk2, r2, nsf,p, stack);
514
174k
      for (j=0;j<nsf;j++)
515
170k
         target[j]=SUB16(target[j],PSHR16(r2[j],2));
516
4.26k
   }
517
43.5k
}
split_cb_search_shape_sign
Line
Count
Source
261
19.4k
{
262
19.4k
   int i,j,k,m,n,q;
263
19.4k
   VARDECL(spx_word16_t *resp);
264
19.4k
#ifdef _USE_SSE
265
19.4k
   VARDECL(__m128 *resp2);
266
19.4k
   VARDECL(__m128 *E);
267
#else
268
   spx_word16_t *resp2;
269
   VARDECL(spx_word32_t *E);
270
#endif
271
19.4k
   VARDECL(spx_word16_t *t);
272
19.4k
   VARDECL(spx_sig_t *e);
273
19.4k
   VARDECL(spx_word16_t *tmp);
274
19.4k
   VARDECL(spx_word32_t *ndist);
275
19.4k
   VARDECL(spx_word32_t *odist);
276
19.4k
   VARDECL(int *itmp);
277
19.4k
   VARDECL(spx_word16_t **ot2);
278
19.4k
   VARDECL(spx_word16_t **nt2);
279
19.4k
   spx_word16_t **ot, **nt;
280
19.4k
   VARDECL(int **nind);
281
19.4k
   VARDECL(int **oind);
282
19.4k
   VARDECL(int *ind);
283
19.4k
   const signed char *shape_cb;
284
19.4k
   int shape_cb_size, subvect_size, nb_subvect;
285
19.4k
   const split_cb_params *params;
286
19.4k
   int N=2;
287
19.4k
   VARDECL(int *best_index);
288
19.4k
   VARDECL(spx_word32_t *best_dist);
289
19.4k
   VARDECL(int *best_nind);
290
19.4k
   VARDECL(int *best_ntarget);
291
19.4k
   int have_sign;
292
19.4k
   N=complexity;
293
19.4k
   if (N>10)
294
0
      N=10;
295
   /* Complexity isn't as important for the codebooks as it is for the pitch */
296
19.4k
   N=(2*N)/3;
297
19.4k
   if (N<1)
298
4.15k
      N=1;
299
19.4k
   if (N==1)
300
5.43k
   {
301
5.43k
      split_cb_search_shape_sign_N1(target,ak,awk1,awk2,par,p,nsf,exc,r,bits,stack,update_target);
302
5.43k
      return;
303
5.43k
   }
304
14.0k
   ALLOC(ot2, N, spx_word16_t*);
305
14.0k
   ALLOC(nt2, N, spx_word16_t*);
306
14.0k
   ALLOC(oind, N, int*);
307
14.0k
   ALLOC(nind, N, int*);
308
309
14.0k
   params = (const split_cb_params *) par;
310
14.0k
   subvect_size = params->subvect_size;
311
14.0k
   nb_subvect = params->nb_subvect;
312
14.0k
   shape_cb_size = 1<<params->shape_bits;
313
14.0k
   shape_cb = params->shape_cb;
314
14.0k
   have_sign = params->have_sign;
315
14.0k
   ALLOC(resp, shape_cb_size*subvect_size, spx_word16_t);
316
14.0k
#ifdef _USE_SSE
317
14.0k
   ALLOC(resp2, (shape_cb_size*subvect_size)>>2, __m128);
318
14.0k
   ALLOC(E, shape_cb_size>>2, __m128);
319
#else
320
   resp2 = resp;
321
   ALLOC(E, shape_cb_size, spx_word32_t);
322
#endif
323
14.0k
   ALLOC(t, nsf, spx_word16_t);
324
14.0k
   ALLOC(e, nsf, spx_sig_t);
325
14.0k
   ALLOC(ind, nb_subvect, int);
326
327
14.0k
   ALLOC(tmp, 2*N*nsf, spx_word16_t);
328
76.0k
   for (i=0;i<N;i++)
329
62.0k
   {
330
62.0k
      ot2[i]=tmp+2*i*nsf;
331
62.0k
      nt2[i]=tmp+(2*i+1)*nsf;
332
62.0k
   }
333
14.0k
   ot=ot2;
334
14.0k
   nt=nt2;
335
14.0k
   ALLOC(best_index, N, int);
336
14.0k
   ALLOC(best_dist, N, spx_word32_t);
337
14.0k
   ALLOC(best_nind, N, int);
338
14.0k
   ALLOC(best_ntarget, N, int);
339
14.0k
   ALLOC(ndist, N, spx_word32_t);
340
14.0k
   ALLOC(odist, N, spx_word32_t);
341
342
14.0k
   ALLOC(itmp, 2*N*nb_subvect, int);
343
76.0k
   for (i=0;i<N;i++)
344
62.0k
   {
345
62.0k
      nind[i]=itmp+2*i*nb_subvect;
346
62.0k
      oind[i]=itmp+(2*i+1)*nb_subvect;
347
62.0k
   }
348
349
14.0k
   SPEEX_COPY(t, target, nsf);
350
351
76.0k
   for (j=0;j<N;j++)
352
62.0k
      SPEEX_COPY(&ot[j][0], t, nsf);
353
354
   /* Pre-compute codewords response and energy */
355
14.0k
   compute_weighted_codebook(shape_cb, r, resp, resp2, E, shape_cb_size, subvect_size, stack);
356
357
76.0k
   for (j=0;j<N;j++)
358
62.0k
      odist[j]=0;
359
360
   /*For all subvectors*/
361
90.2k
   for (i=0;i<nb_subvect;i++)
362
76.2k
   {
363
      /*"erase" nbest list*/
364
407k
      for (j=0;j<N;j++)
365
330k
         ndist[j]=VERY_LARGE32;
366
      /* This is not strictly necessary, but it provides an additional safety
367
         to prevent crashes in case something goes wrong in the previous
368
         steps (e.g. NaNs) */
369
407k
      for (j=0;j<N;j++)
370
330k
         best_nind[j] = best_ntarget[j] = 0;
371
      /*For all n-bests of previous subvector*/
372
345k
      for (j=0;j<N;j++)
373
282k
      {
374
282k
         spx_word16_t *x=ot[j]+subvect_size*i;
375
282k
         spx_word32_t tener = 0;
376
2.31M
         for (m=0;m<subvect_size;m++)
377
2.03M
            tener = MAC16_16(tener, x[m],x[m]);
378
#ifdef FIXED_POINT
379
         tener = SHR32(tener,1);
380
#else
381
282k
         tener *= .5;
382
282k
#endif
383
         /*Find new n-best based on previous n-best j*/
384
282k
#ifndef DISABLE_WIDEBAND
385
282k
         if (have_sign)
386
44.0k
            vq_nbest_sign(x, resp2, subvect_size, shape_cb_size, E, N, best_index, best_dist, stack);
387
238k
         else
388
238k
#endif /* DISABLE_WIDEBAND */
389
238k
            vq_nbest(x, resp2, subvect_size, shape_cb_size, E, N, best_index, best_dist, stack);
390
391
         /*For all new n-bests*/
392
1.65M
         for (k=0;k<N;k++)
393
1.36M
         {
394
            /* Compute total distance (including previous sub-vectors */
395
1.36M
            spx_word32_t err = ADD32(ADD32(odist[j],best_dist[k]),tener);
396
397
            /*update n-best list*/
398
1.36M
            if (err<ndist[N-1])
399
517k
            {
400
1.68M
               for (m=0;m<N;m++)
401
1.68M
               {
402
1.68M
                  if (err < ndist[m])
403
517k
                  {
404
1.42M
                     for (n=N-1;n>m;n--)
405
902k
                     {
406
902k
                        ndist[n] = ndist[n-1];
407
902k
                        best_nind[n] = best_nind[n-1];
408
902k
                        best_ntarget[n] = best_ntarget[n-1];
409
902k
                     }
410
                     /* n is equal to m here, so they're interchangeable */
411
517k
                     ndist[m] = err;
412
517k
                     best_nind[n] = best_index[k];
413
517k
                     best_ntarget[n] = j;
414
517k
                     break;
415
517k
                  }
416
1.68M
               }
417
517k
            }
418
1.36M
         }
419
282k
         if (i==0)
420
14.0k
            break;
421
282k
      }
422
407k
      for (j=0;j<N;j++)
423
330k
      {
424
         /*previous target (we don't care what happened before*/
425
5.70M
         for (m=(i+1)*subvect_size;m<nsf;m++)
426
5.37M
            nt[j][m]=ot[best_ntarget[j]][m];
427
428
         /* New code: update the rest of the target only if it's worth it */
429
2.81M
         for (m=0;m<subvect_size;m++)
430
2.48M
         {
431
2.48M
            spx_word16_t g;
432
2.48M
            int rind;
433
2.48M
            spx_word16_t sign=1;
434
2.48M
            rind = best_nind[j];
435
2.48M
            if (rind>=shape_cb_size)
436
272k
            {
437
272k
               sign=-1;
438
272k
               rind-=shape_cb_size;
439
272k
            }
440
441
2.48M
            q=subvect_size-m;
442
#ifdef FIXED_POINT
443
            g=sign*shape_cb[rind*subvect_size+m];
444
#else
445
2.48M
            g=sign*0.03125*shape_cb[rind*subvect_size+m];
446
2.48M
#endif
447
2.48M
            target_update(nt[j]+subvect_size*(i+1), g, r+q, nsf-subvect_size*(i+1));
448
2.48M
         }
449
450
2.38M
         for (q=0;q<nb_subvect;q++)
451
2.05M
            nind[j][q]=oind[best_ntarget[j]][q];
452
330k
         nind[j][i]=best_nind[j];
453
330k
      }
454
455
      /*update old-new data*/
456
      /* just swap pointers instead of a long copy */
457
76.2k
      {
458
76.2k
         spx_word16_t **tmp2;
459
76.2k
         tmp2=ot;
460
76.2k
         ot=nt;
461
76.2k
         nt=tmp2;
462
76.2k
      }
463
407k
      for (j=0;j<N;j++)
464
2.38M
         for (m=0;m<nb_subvect;m++)
465
2.05M
            oind[j][m]=nind[j][m];
466
407k
      for (j=0;j<N;j++)
467
330k
         odist[j]=ndist[j];
468
76.2k
   }
469
470
   /*save indices*/
471
90.2k
   for (i=0;i<nb_subvect;i++)
472
76.2k
   {
473
76.2k
      ind[i]=nind[0][i];
474
76.2k
      speex_bits_pack(bits,ind[i],params->shape_bits+have_sign);
475
76.2k
   }
476
477
   /* Put everything back together */
478
90.2k
   for (i=0;i<nb_subvect;i++)
479
76.2k
   {
480
76.2k
      int rind;
481
76.2k
      spx_word16_t sign=1;
482
76.2k
      rind = ind[i];
483
76.2k
      if (rind>=shape_cb_size)
484
11.0k
      {
485
11.0k
         sign=-1;
486
11.0k
         rind-=shape_cb_size;
487
11.0k
      }
488
#ifdef FIXED_POINT
489
      if (sign==1)
490
      {
491
         for (j=0;j<subvect_size;j++)
492
            e[subvect_size*i+j]=SHL32(EXTEND32(shape_cb[rind*subvect_size+j]),SIG_SHIFT-5);
493
      } else {
494
         for (j=0;j<subvect_size;j++)
495
            e[subvect_size*i+j]=NEG32(SHL32(EXTEND32(shape_cb[rind*subvect_size+j]),SIG_SHIFT-5));
496
      }
497
#else
498
637k
      for (j=0;j<subvect_size;j++)
499
560k
         e[subvect_size*i+j]=sign*0.03125*shape_cb[rind*subvect_size+j];
500
76.2k
#endif
501
76.2k
   }
502
   /* Update excitation */
503
574k
   for (j=0;j<nsf;j++)
504
560k
      exc[j]=ADD32(exc[j],e[j]);
505
506
   /* Update target: only update target if necessary */
507
14.0k
   if (update_target)
508
1.72k
   {
509
1.72k
      VARDECL(spx_word16_t *r2);
510
1.72k
      ALLOC(r2, nsf, spx_word16_t);
511
70.6k
      for (j=0;j<nsf;j++)
512
68.9k
         r2[j] = EXTRACT16(PSHR32(e[j] ,6));
513
1.72k
      syn_percep_zero16(r2, ak, awk1, awk2, r2, nsf,p, stack);
514
70.6k
      for (j=0;j<nsf;j++)
515
68.9k
         target[j]=SUB16(target[j],PSHR16(r2[j],2));
516
1.72k
   }
517
14.0k
}
split_cb_search_shape_sign
Line
Count
Source
261
43.4k
{
262
43.4k
   int i,j,k,m,n,q;
263
43.4k
   VARDECL(spx_word16_t *resp);
264
#ifdef _USE_SSE
265
   VARDECL(__m128 *resp2);
266
   VARDECL(__m128 *E);
267
#else
268
43.4k
   spx_word16_t *resp2;
269
43.4k
   VARDECL(spx_word32_t *E);
270
43.4k
#endif
271
43.4k
   VARDECL(spx_word16_t *t);
272
43.4k
   VARDECL(spx_sig_t *e);
273
43.4k
   VARDECL(spx_word16_t *tmp);
274
43.4k
   VARDECL(spx_word32_t *ndist);
275
43.4k
   VARDECL(spx_word32_t *odist);
276
43.4k
   VARDECL(int *itmp);
277
43.4k
   VARDECL(spx_word16_t **ot2);
278
43.4k
   VARDECL(spx_word16_t **nt2);
279
43.4k
   spx_word16_t **ot, **nt;
280
43.4k
   VARDECL(int **nind);
281
43.4k
   VARDECL(int **oind);
282
43.4k
   VARDECL(int *ind);
283
43.4k
   const signed char *shape_cb;
284
43.4k
   int shape_cb_size, subvect_size, nb_subvect;
285
43.4k
   const split_cb_params *params;
286
43.4k
   int N=2;
287
43.4k
   VARDECL(int *best_index);
288
43.4k
   VARDECL(spx_word32_t *best_dist);
289
43.4k
   VARDECL(int *best_nind);
290
43.4k
   VARDECL(int *best_ntarget);
291
43.4k
   int have_sign;
292
43.4k
   N=complexity;
293
43.4k
   if (N>10)
294
0
      N=10;
295
   /* Complexity isn't as important for the codebooks as it is for the pitch */
296
43.4k
   N=(2*N)/3;
297
43.4k
   if (N<1)
298
10.6k
      N=1;
299
43.4k
   if (N==1)
300
13.9k
   {
301
13.9k
      split_cb_search_shape_sign_N1(target,ak,awk1,awk2,par,p,nsf,exc,r,bits,stack,update_target);
302
13.9k
      return;
303
13.9k
   }
304
29.5k
   ALLOC(ot2, N, spx_word16_t*);
305
29.5k
   ALLOC(nt2, N, spx_word16_t*);
306
29.5k
   ALLOC(oind, N, int*);
307
29.5k
   ALLOC(nind, N, int*);
308
309
29.5k
   params = (const split_cb_params *) par;
310
29.5k
   subvect_size = params->subvect_size;
311
29.5k
   nb_subvect = params->nb_subvect;
312
29.5k
   shape_cb_size = 1<<params->shape_bits;
313
29.5k
   shape_cb = params->shape_cb;
314
29.5k
   have_sign = params->have_sign;
315
29.5k
   ALLOC(resp, shape_cb_size*subvect_size, spx_word16_t);
316
#ifdef _USE_SSE
317
   ALLOC(resp2, (shape_cb_size*subvect_size)>>2, __m128);
318
   ALLOC(E, shape_cb_size>>2, __m128);
319
#else
320
29.5k
   resp2 = resp;
321
29.5k
   ALLOC(E, shape_cb_size, spx_word32_t);
322
29.5k
#endif
323
29.5k
   ALLOC(t, nsf, spx_word16_t);
324
29.5k
   ALLOC(e, nsf, spx_sig_t);
325
29.5k
   ALLOC(ind, nb_subvect, int);
326
327
29.5k
   ALLOC(tmp, 2*N*nsf, spx_word16_t);
328
154k
   for (i=0;i<N;i++)
329
124k
   {
330
124k
      ot2[i]=tmp+2*i*nsf;
331
124k
      nt2[i]=tmp+(2*i+1)*nsf;
332
124k
   }
333
29.5k
   ot=ot2;
334
29.5k
   nt=nt2;
335
29.5k
   ALLOC(best_index, N, int);
336
29.5k
   ALLOC(best_dist, N, spx_word32_t);
337
29.5k
   ALLOC(best_nind, N, int);
338
29.5k
   ALLOC(best_ntarget, N, int);
339
29.5k
   ALLOC(ndist, N, spx_word32_t);
340
29.5k
   ALLOC(odist, N, spx_word32_t);
341
342
29.5k
   ALLOC(itmp, 2*N*nb_subvect, int);
343
154k
   for (i=0;i<N;i++)
344
124k
   {
345
124k
      nind[i]=itmp+2*i*nb_subvect;
346
124k
      oind[i]=itmp+(2*i+1)*nb_subvect;
347
124k
   }
348
349
29.5k
   SPEEX_COPY(t, target, nsf);
350
351
154k
   for (j=0;j<N;j++)
352
124k
      SPEEX_COPY(&ot[j][0], t, nsf);
353
354
   /* Pre-compute codewords response and energy */
355
29.5k
   compute_weighted_codebook(shape_cb, r, resp, resp2, E, shape_cb_size, subvect_size, stack);
356
357
154k
   for (j=0;j<N;j++)
358
124k
      odist[j]=0;
359
360
   /*For all subvectors*/
361
186k
   for (i=0;i<nb_subvect;i++)
362
157k
   {
363
      /*"erase" nbest list*/
364
824k
      for (j=0;j<N;j++)
365
666k
         ndist[j]=VERY_LARGE32;
366
      /* This is not strictly necessary, but it provides an additional safety
367
         to prevent crashes in case something goes wrong in the previous
368
         steps (e.g. NaNs) */
369
824k
      for (j=0;j<N;j++)
370
666k
         best_nind[j] = best_ntarget[j] = 0;
371
      /*For all n-bests of previous subvector*/
372
699k
      for (j=0;j<N;j++)
373
571k
      {
374
571k
         spx_word16_t *x=ot[j]+subvect_size*i;
375
571k
         spx_word32_t tener = 0;
376
4.68M
         for (m=0;m<subvect_size;m++)
377
4.11M
            tener = MAC16_16(tener, x[m],x[m]);
378
571k
#ifdef FIXED_POINT
379
571k
         tener = SHR32(tener,1);
380
#else
381
         tener *= .5;
382
#endif
383
         /*Find new n-best based on previous n-best j*/
384
571k
#ifndef DISABLE_WIDEBAND
385
571k
         if (have_sign)
386
72.4k
            vq_nbest_sign(x, resp2, subvect_size, shape_cb_size, E, N, best_index, best_dist, stack);
387
499k
         else
388
499k
#endif /* DISABLE_WIDEBAND */
389
499k
            vq_nbest(x, resp2, subvect_size, shape_cb_size, E, N, best_index, best_dist, stack);
390
391
         /*For all new n-bests*/
392
3.24M
         for (k=0;k<N;k++)
393
2.67M
         {
394
            /* Compute total distance (including previous sub-vectors */
395
2.67M
            spx_word32_t err = ADD32(ADD32(odist[j],best_dist[k]),tener);
396
397
            /*update n-best list*/
398
2.67M
            if (err<ndist[N-1])
399
1.04M
            {
400
3.28M
               for (m=0;m<N;m++)
401
3.28M
               {
402
3.28M
                  if (err < ndist[m])
403
1.04M
                  {
404
2.80M
                     for (n=N-1;n>m;n--)
405
1.76M
                     {
406
1.76M
                        ndist[n] = ndist[n-1];
407
1.76M
                        best_nind[n] = best_nind[n-1];
408
1.76M
                        best_ntarget[n] = best_ntarget[n-1];
409
1.76M
                     }
410
                     /* n is equal to m here, so they're interchangeable */
411
1.04M
                     ndist[m] = err;
412
1.04M
                     best_nind[n] = best_index[k];
413
1.04M
                     best_ntarget[n] = j;
414
1.04M
                     break;
415
1.04M
                  }
416
3.28M
               }
417
1.04M
            }
418
2.67M
         }
419
571k
         if (i==0)
420
29.5k
            break;
421
571k
      }
422
824k
      for (j=0;j<N;j++)
423
666k
      {
424
         /*previous target (we don't care what happened before*/
425
11.5M
         for (m=(i+1)*subvect_size;m<nsf;m++)
426
10.8M
            nt[j][m]=ot[best_ntarget[j]][m];
427
428
         /* New code: update the rest of the target only if it's worth it */
429
5.64M
         for (m=0;m<subvect_size;m++)
430
4.98M
         {
431
4.98M
            spx_word16_t g;
432
4.98M
            int rind;
433
4.98M
            spx_word16_t sign=1;
434
4.98M
            rind = best_nind[j];
435
4.98M
            if (rind>=shape_cb_size)
436
470k
            {
437
470k
               sign=-1;
438
470k
               rind-=shape_cb_size;
439
470k
            }
440
441
4.98M
            q=subvect_size-m;
442
4.98M
#ifdef FIXED_POINT
443
4.98M
            g=sign*shape_cb[rind*subvect_size+m];
444
#else
445
            g=sign*0.03125*shape_cb[rind*subvect_size+m];
446
#endif
447
4.98M
            target_update(nt[j]+subvect_size*(i+1), g, r+q, nsf-subvect_size*(i+1));
448
4.98M
         }
449
450
4.78M
         for (q=0;q<nb_subvect;q++)
451
4.11M
            nind[j][q]=oind[best_ntarget[j]][q];
452
666k
         nind[j][i]=best_nind[j];
453
666k
      }
454
455
      /*update old-new data*/
456
      /* just swap pointers instead of a long copy */
457
157k
      {
458
157k
         spx_word16_t **tmp2;
459
157k
         tmp2=ot;
460
157k
         ot=nt;
461
157k
         nt=tmp2;
462
157k
      }
463
824k
      for (j=0;j<N;j++)
464
4.78M
         for (m=0;m<nb_subvect;m++)
465
4.11M
            oind[j][m]=nind[j][m];
466
824k
      for (j=0;j<N;j++)
467
666k
         odist[j]=ndist[j];
468
157k
   }
469
470
   /*save indices*/
471
186k
   for (i=0;i<nb_subvect;i++)
472
157k
   {
473
157k
      ind[i]=nind[0][i];
474
157k
      speex_bits_pack(bits,ind[i],params->shape_bits+have_sign);
475
157k
   }
476
477
   /* Put everything back together */
478
186k
   for (i=0;i<nb_subvect;i++)
479
157k
   {
480
157k
      int rind;
481
157k
      spx_word16_t sign=1;
482
157k
      rind = ind[i];
483
157k
      if (rind>=shape_cb_size)
484
14.5k
      {
485
14.5k
         sign=-1;
486
14.5k
         rind-=shape_cb_size;
487
14.5k
      }
488
157k
#ifdef FIXED_POINT
489
157k
      if (sign==1)
490
142k
      {
491
1.20M
         for (j=0;j<subvect_size;j++)
492
1.06M
            e[subvect_size*i+j]=SHL32(EXTEND32(shape_cb[rind*subvect_size+j]),SIG_SHIFT-5);
493
142k
      } else {
494
130k
         for (j=0;j<subvect_size;j++)
495
116k
            e[subvect_size*i+j]=NEG32(SHL32(EXTEND32(shape_cb[rind*subvect_size+j]),SIG_SHIFT-5));
496
14.5k
      }
497
#else
498
      for (j=0;j<subvect_size;j++)
499
         e[subvect_size*i+j]=sign*0.03125*shape_cb[rind*subvect_size+j];
500
#endif
501
157k
   }
502
   /* Update excitation */
503
1.21M
   for (j=0;j<nsf;j++)
504
1.18M
      exc[j]=ADD32(exc[j],e[j]);
505
506
   /* Update target: only update target if necessary */
507
29.5k
   if (update_target)
508
2.54k
   {
509
2.54k
      VARDECL(spx_word16_t *r2);
510
2.54k
      ALLOC(r2, nsf, spx_word16_t);
511
104k
      for (j=0;j<nsf;j++)
512
101k
         r2[j] = EXTRACT16(PSHR32(e[j] ,6));
513
2.54k
      syn_percep_zero16(r2, ak, awk1, awk2, r2, nsf,p, stack);
514
104k
      for (j=0;j<nsf;j++)
515
101k
         target[j]=SUB16(target[j],PSHR16(r2[j],2));
516
2.54k
   }
517
29.5k
}
518
#endif /* DISABLE_ENCODER */
519
520
#ifndef DISABLE_DECODER
521
void split_cb_shape_sign_unquant(
522
spx_sig_t *exc,
523
const void *par,                      /* non-overlapping codebook */
524
int   nsf,                      /* number of samples in subframe */
525
SpeexBits *bits,
526
char *stack,
527
spx_uint32_t *seed
528
)
529
108k
{
530
108k
   int i,j;
531
108k
   VARDECL(int *ind);
532
108k
   VARDECL(int *signs);
533
108k
   const signed char *shape_cb;
534
108k
   int subvect_size, nb_subvect;
535
108k
   const split_cb_params *params;
536
108k
   int have_sign;
537
538
108k
   params = (const split_cb_params *) par;
539
108k
   subvect_size = params->subvect_size;
540
108k
   nb_subvect = params->nb_subvect;
541
542
108k
   shape_cb = params->shape_cb;
543
108k
   have_sign = params->have_sign;
544
545
108k
   ALLOC(ind, nb_subvect, int);
546
108k
   ALLOC(signs, nb_subvect, int);
547
548
   /* Decode codewords and gains */
549
638k
   for (i=0;i<nb_subvect;i++)
550
530k
   {
551
530k
      if (have_sign)
552
72.8k
         signs[i] = speex_bits_unpack_unsigned(bits, 1);
553
457k
      else
554
457k
         signs[i] = 0;
555
530k
      ind[i] = speex_bits_unpack_unsigned(bits, params->shape_bits);
556
530k
   }
557
   /* Compute decoded excitation */
558
638k
   for (i=0;i<nb_subvect;i++)
559
530k
   {
560
530k
      spx_word16_t s=1;
561
530k
      if (signs[i])
562
1.53k
         s=-1;
563
#ifdef FIXED_POINT
564
296k
      if (s==1)
565
294k
      {
566
2.69M
         for (j=0;j<subvect_size;j++)
567
2.39M
            exc[subvect_size*i+j]=SHL32(EXTEND32(shape_cb[ind[i]*subvect_size+j]),SIG_SHIFT-5);
568
294k
      } else {
569
9.82k
         for (j=0;j<subvect_size;j++)
570
8.73k
            exc[subvect_size*i+j]=NEG32(SHL32(EXTEND32(shape_cb[ind[i]*subvect_size+j]),SIG_SHIFT-5));
571
1.09k
      }
572
#else
573
2.16M
      for (j=0;j<subvect_size;j++)
574
1.93M
         exc[subvect_size*i+j]+=s*0.03125*shape_cb[ind[i]*subvect_size+j];
575
#endif
576
530k
   }
577
108k
}
split_cb_shape_sign_unquant
Line
Count
Source
529
48.3k
{
530
48.3k
   int i,j;
531
48.3k
   VARDECL(int *ind);
532
48.3k
   VARDECL(int *signs);
533
48.3k
   const signed char *shape_cb;
534
48.3k
   int subvect_size, nb_subvect;
535
48.3k
   const split_cb_params *params;
536
48.3k
   int have_sign;
537
538
48.3k
   params = (const split_cb_params *) par;
539
48.3k
   subvect_size = params->subvect_size;
540
48.3k
   nb_subvect = params->nb_subvect;
541
542
48.3k
   shape_cb = params->shape_cb;
543
48.3k
   have_sign = params->have_sign;
544
545
48.3k
   ALLOC(ind, nb_subvect, int);
546
48.3k
   ALLOC(signs, nb_subvect, int);
547
548
   /* Decode codewords and gains */
549
282k
   for (i=0;i<nb_subvect;i++)
550
234k
   {
551
234k
      if (have_sign)
552
26.9k
         signs[i] = speex_bits_unpack_unsigned(bits, 1);
553
207k
      else
554
207k
         signs[i] = 0;
555
234k
      ind[i] = speex_bits_unpack_unsigned(bits, params->shape_bits);
556
234k
   }
557
   /* Compute decoded excitation */
558
282k
   for (i=0;i<nb_subvect;i++)
559
234k
   {
560
234k
      spx_word16_t s=1;
561
234k
      if (signs[i])
562
444
         s=-1;
563
#ifdef FIXED_POINT
564
      if (s==1)
565
      {
566
         for (j=0;j<subvect_size;j++)
567
            exc[subvect_size*i+j]=SHL32(EXTEND32(shape_cb[ind[i]*subvect_size+j]),SIG_SHIFT-5);
568
      } else {
569
         for (j=0;j<subvect_size;j++)
570
            exc[subvect_size*i+j]=NEG32(SHL32(EXTEND32(shape_cb[ind[i]*subvect_size+j]),SIG_SHIFT-5));
571
      }
572
#else
573
2.16M
      for (j=0;j<subvect_size;j++)
574
1.93M
         exc[subvect_size*i+j]+=s*0.03125*shape_cb[ind[i]*subvect_size+j];
575
234k
#endif
576
234k
   }
577
48.3k
}
split_cb_shape_sign_unquant
Line
Count
Source
529
60.1k
{
530
60.1k
   int i,j;
531
60.1k
   VARDECL(int *ind);
532
60.1k
   VARDECL(int *signs);
533
60.1k
   const signed char *shape_cb;
534
60.1k
   int subvect_size, nb_subvect;
535
60.1k
   const split_cb_params *params;
536
60.1k
   int have_sign;
537
538
60.1k
   params = (const split_cb_params *) par;
539
60.1k
   subvect_size = params->subvect_size;
540
60.1k
   nb_subvect = params->nb_subvect;
541
542
60.1k
   shape_cb = params->shape_cb;
543
60.1k
   have_sign = params->have_sign;
544
545
60.1k
   ALLOC(ind, nb_subvect, int);
546
60.1k
   ALLOC(signs, nb_subvect, int);
547
548
   /* Decode codewords and gains */
549
356k
   for (i=0;i<nb_subvect;i++)
550
296k
   {
551
296k
      if (have_sign)
552
45.8k
         signs[i] = speex_bits_unpack_unsigned(bits, 1);
553
250k
      else
554
250k
         signs[i] = 0;
555
296k
      ind[i] = speex_bits_unpack_unsigned(bits, params->shape_bits);
556
296k
   }
557
   /* Compute decoded excitation */
558
356k
   for (i=0;i<nb_subvect;i++)
559
296k
   {
560
296k
      spx_word16_t s=1;
561
296k
      if (signs[i])
562
1.09k
         s=-1;
563
296k
#ifdef FIXED_POINT
564
296k
      if (s==1)
565
294k
      {
566
2.69M
         for (j=0;j<subvect_size;j++)
567
2.39M
            exc[subvect_size*i+j]=SHL32(EXTEND32(shape_cb[ind[i]*subvect_size+j]),SIG_SHIFT-5);
568
294k
      } else {
569
9.82k
         for (j=0;j<subvect_size;j++)
570
8.73k
            exc[subvect_size*i+j]=NEG32(SHL32(EXTEND32(shape_cb[ind[i]*subvect_size+j]),SIG_SHIFT-5));
571
1.09k
      }
572
#else
573
      for (j=0;j<subvect_size;j++)
574
         exc[subvect_size*i+j]+=s*0.03125*shape_cb[ind[i]*subvect_size+j];
575
#endif
576
296k
   }
577
60.1k
}
578
#endif /* DISABLE_DECODER */
579
580
#ifndef DISABLE_ENCODER
581
void noise_codebook_quant(
582
spx_word16_t target[],      /* target vector */
583
spx_coef_t ak[],      /* LPCs for this subframe */
584
spx_coef_t awk1[],      /* Weighted LPCs for this subframe */
585
spx_coef_t awk2[],      /* Weighted LPCs for this subframe */
586
const void *par,                      /* Codebook/search parameters*/
587
int   p,                        /* number of LPC coeffs */
588
int   nsf,                      /* number of samples in subframe */
589
spx_sig_t *exc,
590
spx_word16_t *r,
591
SpeexBits *bits,
592
char *stack,
593
int   complexity,
594
int   update_target
595
)
596
97.8k
{
597
97.8k
   int i;
598
97.8k
   VARDECL(spx_word16_t *tmp);
599
97.8k
   ALLOC(tmp, nsf, spx_word16_t);
600
97.8k
   residue_percep_zero16(target, ak, awk1, awk2, tmp, nsf, p, stack);
601
602
4.01M
   for (i=0;i<nsf;i++)
603
3.91M
      exc[i]+=SHL32(EXTEND32(tmp[i]),8);
604
97.8k
   SPEEX_MEMSET(target, 0, nsf);
605
97.8k
}
noise_codebook_quant
Line
Count
Source
596
48.9k
{
597
48.9k
   int i;
598
48.9k
   VARDECL(spx_word16_t *tmp);
599
48.9k
   ALLOC(tmp, nsf, spx_word16_t);
600
48.9k
   residue_percep_zero16(target, ak, awk1, awk2, tmp, nsf, p, stack);
601
602
2.00M
   for (i=0;i<nsf;i++)
603
1.95M
      exc[i]+=SHL32(EXTEND32(tmp[i]),8);
604
48.9k
   SPEEX_MEMSET(target, 0, nsf);
605
48.9k
}
noise_codebook_quant
Line
Count
Source
596
48.9k
{
597
48.9k
   int i;
598
48.9k
   VARDECL(spx_word16_t *tmp);
599
48.9k
   ALLOC(tmp, nsf, spx_word16_t);
600
48.9k
   residue_percep_zero16(target, ak, awk1, awk2, tmp, nsf, p, stack);
601
602
2.00M
   for (i=0;i<nsf;i++)
603
1.95M
      exc[i]+=SHL32(EXTEND32(tmp[i]),8);
604
48.9k
   SPEEX_MEMSET(target, 0, nsf);
605
48.9k
}
606
#endif /* DISABLE_ENCODER */
607
608
#ifndef DISABLE_DECODER
609
void noise_codebook_unquant(
610
spx_sig_t *exc,
611
const void *par,                      /* non-overlapping codebook */
612
int   nsf,                      /* number of samples in subframe */
613
SpeexBits *bits,
614
char *stack,
615
spx_uint32_t *seed
616
)
617
35.0k
{
618
35.0k
   int i;
619
   /* FIXME: This is bad, but I don't think the function ever gets called anyway */
620
1.43M
   for (i=0;i<nsf;i++)
621
1.40M
      exc[i]=SHL32(EXTEND32(speex_rand(1, seed)),SIG_SHIFT);
622
35.0k
}
noise_codebook_unquant
Line
Count
Source
617
17.5k
{
618
17.5k
   int i;
619
   /* FIXME: This is bad, but I don't think the function ever gets called anyway */
620
718k
   for (i=0;i<nsf;i++)
621
701k
      exc[i]=SHL32(EXTEND32(speex_rand(1, seed)),SIG_SHIFT);
622
17.5k
}
noise_codebook_unquant
Line
Count
Source
617
17.5k
{
618
17.5k
   int i;
619
   /* FIXME: This is bad, but I don't think the function ever gets called anyway */
620
718k
   for (i=0;i<nsf;i++)
621
701k
      exc[i]=SHL32(EXTEND32(speex_rand(1, seed)),SIG_SHIFT);
622
17.5k
}
623
#endif /* DISABLE_DECODER */