Coverage Report

Created: 2025-11-09 06:35

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
5.78k
{
57
5.78k
   int i, j, k;
58
5.78k
   VARDECL(spx_word16_t *shape);
59
5.78k
   ALLOC(shape, subvect_size, spx_word16_t);
60
426k
   for (i=0;i<shape_cb_size;i++)
61
420k
   {
62
420k
      spx_word16_t *res;
63
64
420k
      res = resp+i*subvect_size;
65
3.72M
      for (k=0;k<subvect_size;k++)
66
3.30M
         shape[k] = (spx_word16_t)shape_cb[i*subvect_size+k];
67
420k
      E[i]=0;
68
69
      /* Compute codeword response using convolution with impulse response */
70
3.72M
      for(j=0;j<subvect_size;j++)
71
3.30M
      {
72
3.30M
         spx_word32_t resj=0;
73
3.30M
         spx_word16_t res16;
74
22.1M
         for (k=0;k<=j;k++)
75
18.8M
            resj = MAC16_16(resj,shape[k],r[j-k]);
76
3.30M
#ifdef FIXED_POINT
77
3.30M
         res16 = EXTRACT16(SHR32(resj, 13));
78
#else
79
         res16 = 0.03125f*resj;
80
#endif
81
         /* Compute codeword energy */
82
3.30M
         E[i]=MAC16_16(E[i],res16,res16);
83
3.30M
         res[j] = res16;
84
         /*printf ("%d\n", (int)res[j]);*/
85
3.30M
      }
86
420k
   }
87
88
5.78k
}
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
6.42M
{
94
6.42M
   int n;
95
103M
   for (n=0;n<len;n++)
96
97.2M
      t[n] = SUB16(t[n],PSHR32(MULT16_16(g,r[n]),13));
97
6.42M
}
cb_search.c:target_update
Line
Count
Source
93
3.21M
{
94
3.21M
   int n;
95
51.8M
   for (n=0;n<len;n++)
96
48.6M
      t[n] = SUB16(t[n],PSHR32(MULT16_16(g,r[n]),13));
97
3.21M
}
cb_search.c:target_update
Line
Count
Source
93
3.21M
{
94
3.21M
   int n;
95
51.8M
   for (n=0;n<len;n++)
96
48.6M
      t[n] = SUB16(t[n],PSHR32(MULT16_16(g,r[n]),13));
97
3.21M
}
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
7.89k
{
117
7.89k
   int i,j,m,q;
118
7.89k
   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
7.89k
   VARDECL(spx_word16_t *t);
127
7.89k
   VARDECL(spx_sig_t *e);
128
7.89k
   const signed char *shape_cb;
129
7.89k
   int shape_cb_size, subvect_size, nb_subvect;
130
7.89k
   const split_cb_params *params;
131
7.89k
   int best_index;
132
7.89k
   spx_word32_t best_dist;
133
7.89k
   int have_sign;
134
135
7.89k
   params = (const split_cb_params *) par;
136
7.89k
   subvect_size = params->subvect_size;
137
7.89k
   nb_subvect = params->nb_subvect;
138
7.89k
   shape_cb_size = 1<<params->shape_bits;
139
7.89k
   shape_cb = params->shape_cb;
140
7.89k
   have_sign = params->have_sign;
141
7.89k
   ALLOC(resp, shape_cb_size*subvect_size, spx_word16_t);
142
#ifdef _USE_SSE
143
5.50k
   ALLOC(resp2, (shape_cb_size*subvect_size)>>2, __m128);
144
5.50k
   ALLOC(E, shape_cb_size>>2, __m128);
145
#else
146
   resp2 = resp;
147
2.38k
   ALLOC(E, shape_cb_size, spx_word32_t);
148
#endif
149
7.89k
   ALLOC(t, nsf, spx_word16_t);
150
7.89k
   ALLOC(e, nsf, spx_sig_t);
151
152
   /* FIXME: Do we still need to copy the target? */
153
7.89k
   SPEEX_COPY(t, target, nsf);
154
155
7.89k
   compute_weighted_codebook(shape_cb, r, resp, resp2, E, shape_cb_size, subvect_size, stack);
156
157
47.1k
   for (i=0;i<nb_subvect;i++)
158
39.2k
   {
159
39.2k
      spx_word16_t *x=t+subvect_size*i;
160
      /*Find new n-best based on previous n-best j*/
161
39.2k
#ifndef DISABLE_WIDEBAND
162
39.2k
      if (have_sign)
163
5.68k
         vq_nbest_sign(x, resp2, subvect_size, shape_cb_size, E, 1, &best_index, &best_dist, stack);
164
33.6k
      else
165
33.6k
#endif /* DISABLE_WIDEBAND */
166
33.6k
         vq_nbest(x, resp2, subvect_size, shape_cb_size, E, 1, &best_index, &best_dist, stack);
167
168
39.2k
      speex_bits_pack(bits,best_index,params->shape_bits+have_sign);
169
170
39.2k
      {
171
39.2k
         int rind;
172
39.2k
         spx_word16_t *res;
173
39.2k
         spx_word16_t sign=1;
174
39.2k
         rind = best_index;
175
39.2k
         if (rind>=shape_cb_size)
176
4.80k
         {
177
4.80k
            sign=-1;
178
4.80k
            rind-=shape_cb_size;
179
4.80k
         }
180
39.2k
         res = resp+rind*subvect_size;
181
39.2k
         if (sign>0)
182
311k
            for (m=0;m<subvect_size;m++)
183
277k
               t[subvect_size*i+m] = SUB16(t[subvect_size*i+m], res[m]);
184
4.80k
         else
185
43.2k
            for (m=0;m<subvect_size;m++)
186
38.4k
               t[subvect_size*i+m] = ADD16(t[subvect_size*i+m], res[m]);
187
188
#ifdef FIXED_POINT
189
11.0k
         if (sign==1)
190
9.85k
         {
191
95.8k
            for (j=0;j<subvect_size;j++)
192
86.0k
               e[subvect_size*i+j]=SHL32(EXTEND32(shape_cb[rind*subvect_size+j]),SIG_SHIFT-5);
193
9.85k
         } else {
194
10.7k
            for (j=0;j<subvect_size;j++)
195
9.52k
               e[subvect_size*i+j]=NEG32(SHL32(EXTEND32(shape_cb[rind*subvect_size+j]),SIG_SHIFT-5));
196
1.19k
         }
197
#else
198
248k
         for (j=0;j<subvect_size;j++)
199
220k
            e[subvect_size*i+j]=sign*0.03125*shape_cb[rind*subvect_size+j];
200
#endif
201
202
39.2k
      }
203
204
354k
      for (m=0;m<subvect_size;m++)
205
315k
      {
206
315k
         spx_word16_t g;
207
315k
         int rind;
208
315k
         spx_word16_t sign=1;
209
315k
         rind = best_index;
210
315k
         if (rind>=shape_cb_size)
211
38.4k
         {
212
38.4k
            sign=-1;
213
38.4k
            rind-=shape_cb_size;
214
38.4k
         }
215
216
315k
         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
315k
         target_update(t+subvect_size*(i+1), g, r+q, nsf-subvect_size*(i+1));
223
315k
      }
224
39.2k
   }
225
226
   /* Update excitation */
227
   /* FIXME: We could update the excitation directly above */
228
323k
   for (j=0;j<nsf;j++)
229
315k
      exc[j]=ADD32(exc[j],e[j]);
230
231
   /* Update target: only update target if necessary */
232
7.89k
   if (update_target)
233
752
   {
234
752
      VARDECL(spx_word16_t *r2);
235
752
      ALLOC(r2, nsf, spx_word16_t);
236
30.8k
      for (j=0;j<nsf;j++)
237
30.0k
         r2[j] = EXTRACT16(PSHR32(e[j] ,6));
238
752
      syn_percep_zero16(r2, ak, awk1, awk2, r2, nsf,p, stack);
239
30.8k
      for (j=0;j<nsf;j++)
240
30.0k
         target[j]=SUB16(target[j],PSHR16(r2[j],2));
241
752
   }
242
7.89k
}
cb_search.c:split_cb_search_shape_sign_N1
Line
Count
Source
116
5.50k
{
117
5.50k
   int i,j,m,q;
118
5.50k
   VARDECL(spx_word16_t *resp);
119
5.50k
#ifdef _USE_SSE
120
5.50k
   VARDECL(__m128 *resp2);
121
5.50k
   VARDECL(__m128 *E);
122
#else
123
   spx_word16_t *resp2;
124
   VARDECL(spx_word32_t *E);
125
#endif
126
5.50k
   VARDECL(spx_word16_t *t);
127
5.50k
   VARDECL(spx_sig_t *e);
128
5.50k
   const signed char *shape_cb;
129
5.50k
   int shape_cb_size, subvect_size, nb_subvect;
130
5.50k
   const split_cb_params *params;
131
5.50k
   int best_index;
132
5.50k
   spx_word32_t best_dist;
133
5.50k
   int have_sign;
134
135
5.50k
   params = (const split_cb_params *) par;
136
5.50k
   subvect_size = params->subvect_size;
137
5.50k
   nb_subvect = params->nb_subvect;
138
5.50k
   shape_cb_size = 1<<params->shape_bits;
139
5.50k
   shape_cb = params->shape_cb;
140
5.50k
   have_sign = params->have_sign;
141
5.50k
   ALLOC(resp, shape_cb_size*subvect_size, spx_word16_t);
142
5.50k
#ifdef _USE_SSE
143
5.50k
   ALLOC(resp2, (shape_cb_size*subvect_size)>>2, __m128);
144
5.50k
   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.50k
   ALLOC(t, nsf, spx_word16_t);
150
5.50k
   ALLOC(e, nsf, spx_sig_t);
151
152
   /* FIXME: Do we still need to copy the target? */
153
5.50k
   SPEEX_COPY(t, target, nsf);
154
155
5.50k
   compute_weighted_codebook(shape_cb, r, resp, resp2, E, shape_cb_size, subvect_size, stack);
156
157
33.7k
   for (i=0;i<nb_subvect;i++)
158
28.2k
   {
159
28.2k
      spx_word16_t *x=t+subvect_size*i;
160
      /*Find new n-best based on previous n-best j*/
161
28.2k
#ifndef DISABLE_WIDEBAND
162
28.2k
      if (have_sign)
163
4.10k
         vq_nbest_sign(x, resp2, subvect_size, shape_cb_size, E, 1, &best_index, &best_dist, stack);
164
24.1k
      else
165
24.1k
#endif /* DISABLE_WIDEBAND */
166
24.1k
         vq_nbest(x, resp2, subvect_size, shape_cb_size, E, 1, &best_index, &best_dist, stack);
167
168
28.2k
      speex_bits_pack(bits,best_index,params->shape_bits+have_sign);
169
170
28.2k
      {
171
28.2k
         int rind;
172
28.2k
         spx_word16_t *res;
173
28.2k
         spx_word16_t sign=1;
174
28.2k
         rind = best_index;
175
28.2k
         if (rind>=shape_cb_size)
176
3.61k
         {
177
3.61k
            sign=-1;
178
3.61k
            rind-=shape_cb_size;
179
3.61k
         }
180
28.2k
         res = resp+rind*subvect_size;
181
28.2k
         if (sign>0)
182
215k
            for (m=0;m<subvect_size;m++)
183
191k
               t[subvect_size*i+m] = SUB16(t[subvect_size*i+m], res[m]);
184
3.61k
         else
185
32.5k
            for (m=0;m<subvect_size;m++)
186
28.9k
               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
248k
         for (j=0;j<subvect_size;j++)
199
220k
            e[subvect_size*i+j]=sign*0.03125*shape_cb[rind*subvect_size+j];
200
28.2k
#endif
201
202
28.2k
      }
203
204
248k
      for (m=0;m<subvect_size;m++)
205
220k
      {
206
220k
         spx_word16_t g;
207
220k
         int rind;
208
220k
         spx_word16_t sign=1;
209
220k
         rind = best_index;
210
220k
         if (rind>=shape_cb_size)
211
28.9k
         {
212
28.9k
            sign=-1;
213
28.9k
            rind-=shape_cb_size;
214
28.9k
         }
215
216
220k
         q=subvect_size-m;
217
#ifdef FIXED_POINT
218
         g=sign*shape_cb[rind*subvect_size+m];
219
#else
220
220k
         g=sign*0.03125*shape_cb[rind*subvect_size+m];
221
220k
#endif
222
220k
         target_update(t+subvect_size*(i+1), g, r+q, nsf-subvect_size*(i+1));
223
220k
      }
224
28.2k
   }
225
226
   /* Update excitation */
227
   /* FIXME: We could update the excitation directly above */
228
225k
   for (j=0;j<nsf;j++)
229
220k
      exc[j]=ADD32(exc[j],e[j]);
230
231
   /* Update target: only update target if necessary */
232
5.50k
   if (update_target)
233
536
   {
234
536
      VARDECL(spx_word16_t *r2);
235
536
      ALLOC(r2, nsf, spx_word16_t);
236
21.9k
      for (j=0;j<nsf;j++)
237
21.4k
         r2[j] = EXTRACT16(PSHR32(e[j] ,6));
238
536
      syn_percep_zero16(r2, ak, awk1, awk2, r2, nsf,p, stack);
239
21.9k
      for (j=0;j<nsf;j++)
240
21.4k
         target[j]=SUB16(target[j],PSHR16(r2[j],2));
241
536
   }
242
5.50k
}
cb_search.c:split_cb_search_shape_sign_N1
Line
Count
Source
116
2.38k
{
117
2.38k
   int i,j,m,q;
118
2.38k
   VARDECL(spx_word16_t *resp);
119
#ifdef _USE_SSE
120
   VARDECL(__m128 *resp2);
121
   VARDECL(__m128 *E);
122
#else
123
2.38k
   spx_word16_t *resp2;
124
2.38k
   VARDECL(spx_word32_t *E);
125
2.38k
#endif
126
2.38k
   VARDECL(spx_word16_t *t);
127
2.38k
   VARDECL(spx_sig_t *e);
128
2.38k
   const signed char *shape_cb;
129
2.38k
   int shape_cb_size, subvect_size, nb_subvect;
130
2.38k
   const split_cb_params *params;
131
2.38k
   int best_index;
132
2.38k
   spx_word32_t best_dist;
133
2.38k
   int have_sign;
134
135
2.38k
   params = (const split_cb_params *) par;
136
2.38k
   subvect_size = params->subvect_size;
137
2.38k
   nb_subvect = params->nb_subvect;
138
2.38k
   shape_cb_size = 1<<params->shape_bits;
139
2.38k
   shape_cb = params->shape_cb;
140
2.38k
   have_sign = params->have_sign;
141
2.38k
   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
2.38k
   resp2 = resp;
147
2.38k
   ALLOC(E, shape_cb_size, spx_word32_t);
148
2.38k
#endif
149
2.38k
   ALLOC(t, nsf, spx_word16_t);
150
2.38k
   ALLOC(e, nsf, spx_sig_t);
151
152
   /* FIXME: Do we still need to copy the target? */
153
2.38k
   SPEEX_COPY(t, target, nsf);
154
155
2.38k
   compute_weighted_codebook(shape_cb, r, resp, resp2, E, shape_cb_size, subvect_size, stack);
156
157
13.4k
   for (i=0;i<nb_subvect;i++)
158
11.0k
   {
159
11.0k
      spx_word16_t *x=t+subvect_size*i;
160
      /*Find new n-best based on previous n-best j*/
161
11.0k
#ifndef DISABLE_WIDEBAND
162
11.0k
      if (have_sign)
163
1.58k
         vq_nbest_sign(x, resp2, subvect_size, shape_cb_size, E, 1, &best_index, &best_dist, stack);
164
9.46k
      else
165
9.46k
#endif /* DISABLE_WIDEBAND */
166
9.46k
         vq_nbest(x, resp2, subvect_size, shape_cb_size, E, 1, &best_index, &best_dist, stack);
167
168
11.0k
      speex_bits_pack(bits,best_index,params->shape_bits+have_sign);
169
170
11.0k
      {
171
11.0k
         int rind;
172
11.0k
         spx_word16_t *res;
173
11.0k
         spx_word16_t sign=1;
174
11.0k
         rind = best_index;
175
11.0k
         if (rind>=shape_cb_size)
176
1.19k
         {
177
1.19k
            sign=-1;
178
1.19k
            rind-=shape_cb_size;
179
1.19k
         }
180
11.0k
         res = resp+rind*subvect_size;
181
11.0k
         if (sign>0)
182
95.8k
            for (m=0;m<subvect_size;m++)
183
86.0k
               t[subvect_size*i+m] = SUB16(t[subvect_size*i+m], res[m]);
184
1.19k
         else
185
10.7k
            for (m=0;m<subvect_size;m++)
186
9.52k
               t[subvect_size*i+m] = ADD16(t[subvect_size*i+m], res[m]);
187
188
11.0k
#ifdef FIXED_POINT
189
11.0k
         if (sign==1)
190
9.85k
         {
191
95.8k
            for (j=0;j<subvect_size;j++)
192
86.0k
               e[subvect_size*i+j]=SHL32(EXTEND32(shape_cb[rind*subvect_size+j]),SIG_SHIFT-5);
193
9.85k
         } else {
194
10.7k
            for (j=0;j<subvect_size;j++)
195
9.52k
               e[subvect_size*i+j]=NEG32(SHL32(EXTEND32(shape_cb[rind*subvect_size+j]),SIG_SHIFT-5));
196
1.19k
         }
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
11.0k
      }
203
204
106k
      for (m=0;m<subvect_size;m++)
205
95.5k
      {
206
95.5k
         spx_word16_t g;
207
95.5k
         int rind;
208
95.5k
         spx_word16_t sign=1;
209
95.5k
         rind = best_index;
210
95.5k
         if (rind>=shape_cb_size)
211
9.52k
         {
212
9.52k
            sign=-1;
213
9.52k
            rind-=shape_cb_size;
214
9.52k
         }
215
216
95.5k
         q=subvect_size-m;
217
95.5k
#ifdef FIXED_POINT
218
95.5k
         g=sign*shape_cb[rind*subvect_size+m];
219
#else
220
         g=sign*0.03125*shape_cb[rind*subvect_size+m];
221
#endif
222
95.5k
         target_update(t+subvect_size*(i+1), g, r+q, nsf-subvect_size*(i+1));
223
95.5k
      }
224
11.0k
   }
225
226
   /* Update excitation */
227
   /* FIXME: We could update the excitation directly above */
228
97.9k
   for (j=0;j<nsf;j++)
229
95.5k
      exc[j]=ADD32(exc[j],e[j]);
230
231
   /* Update target: only update target if necessary */
232
2.38k
   if (update_target)
233
216
   {
234
216
      VARDECL(spx_word16_t *r2);
235
216
      ALLOC(r2, nsf, spx_word16_t);
236
8.85k
      for (j=0;j<nsf;j++)
237
8.64k
         r2[j] = EXTRACT16(PSHR32(e[j] ,6));
238
216
      syn_percep_zero16(r2, ak, awk1, awk2, r2, nsf,p, stack);
239
8.85k
      for (j=0;j<nsf;j++)
240
8.64k
         target[j]=SUB16(target[j],PSHR16(r2[j],2));
241
216
   }
242
2.38k
}
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
24.2k
{
262
24.2k
   int i,j,k,m,n,q;
263
24.2k
   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
24.2k
   VARDECL(spx_word16_t *t);
272
24.2k
   VARDECL(spx_sig_t *e);
273
24.2k
   VARDECL(spx_word16_t *tmp);
274
24.2k
   VARDECL(spx_word32_t *ndist);
275
24.2k
   VARDECL(spx_word32_t *odist);
276
24.2k
   VARDECL(int *itmp);
277
24.2k
   VARDECL(spx_word16_t **ot2);
278
24.2k
   VARDECL(spx_word16_t **nt2);
279
24.2k
   spx_word16_t **ot, **nt;
280
24.2k
   VARDECL(int **nind);
281
24.2k
   VARDECL(int **oind);
282
24.2k
   VARDECL(int *ind);
283
24.2k
   const signed char *shape_cb;
284
24.2k
   int shape_cb_size, subvect_size, nb_subvect;
285
24.2k
   const split_cb_params *params;
286
24.2k
   int N=2;
287
24.2k
   VARDECL(int *best_index);
288
24.2k
   VARDECL(spx_word32_t *best_dist);
289
24.2k
   VARDECL(int *best_nind);
290
24.2k
   VARDECL(int *best_ntarget);
291
24.2k
   int have_sign;
292
24.2k
   N=complexity;
293
24.2k
   if (N>10)
294
0
      N=10;
295
   /* Complexity isn't as important for the codebooks as it is for the pitch */
296
24.2k
   N=(2*N)/3;
297
24.2k
   if (N<1)
298
6.14k
      N=1;
299
24.2k
   if (N==1)
300
7.89k
   {
301
7.89k
      split_cb_search_shape_sign_N1(target,ak,awk1,awk2,par,p,nsf,exc,r,bits,stack,update_target);
302
7.89k
      return;
303
7.89k
   }
304
16.3k
   ALLOC(ot2, N, spx_word16_t*);
305
16.3k
   ALLOC(nt2, N, spx_word16_t*);
306
16.3k
   ALLOC(oind, N, int*);
307
16.3k
   ALLOC(nind, N, int*);
308
309
16.3k
   params = (const split_cb_params *) par;
310
16.3k
   subvect_size = params->subvect_size;
311
16.3k
   nb_subvect = params->nb_subvect;
312
16.3k
   shape_cb_size = 1<<params->shape_bits;
313
16.3k
   shape_cb = params->shape_cb;
314
16.3k
   have_sign = params->have_sign;
315
16.3k
   ALLOC(resp, shape_cb_size*subvect_size, spx_word16_t);
316
#ifdef _USE_SSE
317
12.9k
   ALLOC(resp2, (shape_cb_size*subvect_size)>>2, __m128);
318
12.9k
   ALLOC(E, shape_cb_size>>2, __m128);
319
#else
320
   resp2 = resp;
321
3.39k
   ALLOC(E, shape_cb_size, spx_word32_t);
322
#endif
323
16.3k
   ALLOC(t, nsf, spx_word16_t);
324
16.3k
   ALLOC(e, nsf, spx_sig_t);
325
16.3k
   ALLOC(ind, nb_subvect, int);
326
327
16.3k
   ALLOC(tmp, 2*N*nsf, spx_word16_t);
328
88.7k
   for (i=0;i<N;i++)
329
72.3k
   {
330
72.3k
      ot2[i]=tmp+2*i*nsf;
331
72.3k
      nt2[i]=tmp+(2*i+1)*nsf;
332
72.3k
   }
333
16.3k
   ot=ot2;
334
16.3k
   nt=nt2;
335
16.3k
   ALLOC(best_index, N, int);
336
16.3k
   ALLOC(best_dist, N, spx_word32_t);
337
16.3k
   ALLOC(best_nind, N, int);
338
16.3k
   ALLOC(best_ntarget, N, int);
339
16.3k
   ALLOC(ndist, N, spx_word32_t);
340
16.3k
   ALLOC(odist, N, spx_word32_t);
341
342
16.3k
   ALLOC(itmp, 2*N*nb_subvect, int);
343
88.7k
   for (i=0;i<N;i++)
344
72.3k
   {
345
72.3k
      nind[i]=itmp+2*i*nb_subvect;
346
72.3k
      oind[i]=itmp+(2*i+1)*nb_subvect;
347
72.3k
   }
348
349
16.3k
   SPEEX_COPY(t, target, nsf);
350
351
88.7k
   for (j=0;j<N;j++)
352
72.3k
      SPEEX_COPY(&ot[j][0], t, nsf);
353
354
   /* Pre-compute codewords response and energy */
355
16.3k
   compute_weighted_codebook(shape_cb, r, resp, resp2, E, shape_cb_size, subvect_size, stack);
356
357
88.7k
   for (j=0;j<N;j++)
358
72.3k
      odist[j]=0;
359
360
   /*For all subvectors*/
361
103k
   for (i=0;i<nb_subvect;i++)
362
87.1k
   {
363
      /*"erase" nbest list*/
364
467k
      for (j=0;j<N;j++)
365
380k
         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
467k
      for (j=0;j<N;j++)
370
380k
         best_nind[j] = best_ntarget[j] = 0;
371
      /*For all n-bests of previous subvector*/
372
395k
      for (j=0;j<N;j++)
373
324k
      {
374
324k
         spx_word16_t *x=ot[j]+subvect_size*i;
375
324k
         spx_word32_t tener = 0;
376
2.67M
         for (m=0;m<subvect_size;m++)
377
2.35M
            tener = MAC16_16(tener, x[m],x[m]);
378
#ifdef FIXED_POINT
379
62.4k
         tener = SHR32(tener,1);
380
#else
381
         tener *= .5;
382
#endif
383
         /*Find new n-best based on previous n-best j*/
384
324k
#ifndef DISABLE_WIDEBAND
385
324k
         if (have_sign)
386
40.9k
            vq_nbest_sign(x, resp2, subvect_size, shape_cb_size, E, N, best_index, best_dist, stack);
387
283k
         else
388
283k
#endif /* DISABLE_WIDEBAND */
389
283k
            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.88M
         for (k=0;k<N;k++)
393
1.56M
         {
394
            /* Compute total distance (including previous sub-vectors */
395
1.56M
            spx_word32_t err = ADD32(ADD32(odist[j],best_dist[k]),tener);
396
397
            /*update n-best list*/
398
1.56M
            if (err<ndist[N-1])
399
596k
            {
400
1.91M
               for (m=0;m<N;m++)
401
1.91M
               {
402
1.91M
                  if (err < ndist[m])
403
596k
                  {
404
1.63M
                     for (n=N-1;n>m;n--)
405
1.03M
                     {
406
1.03M
                        ndist[n] = ndist[n-1];
407
1.03M
                        best_nind[n] = best_nind[n-1];
408
1.03M
                        best_ntarget[n] = best_ntarget[n-1];
409
1.03M
                     }
410
                     /* n is equal to m here, so they're interchangeable */
411
596k
                     ndist[m] = err;
412
596k
                     best_nind[n] = best_index[k];
413
596k
                     best_ntarget[n] = j;
414
596k
                     break;
415
596k
                  }
416
1.91M
               }
417
596k
            }
418
1.56M
         }
419
324k
         if (i==0)
420
16.3k
            break;
421
324k
      }
422
467k
      for (j=0;j<N;j++)
423
380k
      {
424
         /*previous target (we don't care what happened before*/
425
6.54M
         for (m=(i+1)*subvect_size;m<nsf;m++)
426
6.16M
            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
3.27M
         for (m=0;m<subvect_size;m++)
430
2.89M
         {
431
2.89M
            spx_word16_t g;
432
2.89M
            int rind;
433
2.89M
            spx_word16_t sign=1;
434
2.89M
            rind = best_nind[j];
435
2.89M
            if (rind>=shape_cb_size)
436
255k
            {
437
255k
               sign=-1;
438
255k
               rind-=shape_cb_size;
439
255k
            }
440
441
2.89M
            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
2.89M
            target_update(nt[j]+subvect_size*(i+1), g, r+q, nsf-subvect_size*(i+1));
448
2.89M
         }
449
450
2.74M
         for (q=0;q<nb_subvect;q++)
451
2.36M
            nind[j][q]=oind[best_ntarget[j]][q];
452
380k
         nind[j][i]=best_nind[j];
453
380k
      }
454
455
      /*update old-new data*/
456
      /* just swap pointers instead of a long copy */
457
87.1k
      {
458
87.1k
         spx_word16_t **tmp2;
459
87.1k
         tmp2=ot;
460
87.1k
         ot=nt;
461
87.1k
         nt=tmp2;
462
87.1k
      }
463
467k
      for (j=0;j<N;j++)
464
2.74M
         for (m=0;m<nb_subvect;m++)
465
2.36M
            oind[j][m]=nind[j][m];
466
467k
      for (j=0;j<N;j++)
467
380k
         odist[j]=ndist[j];
468
87.1k
   }
469
470
   /*save indices*/
471
103k
   for (i=0;i<nb_subvect;i++)
472
87.1k
   {
473
87.1k
      ind[i]=nind[0][i];
474
87.1k
      speex_bits_pack(bits,ind[i],params->shape_bits+have_sign);
475
87.1k
   }
476
477
   /* Put everything back together */
478
103k
   for (i=0;i<nb_subvect;i++)
479
87.1k
   {
480
87.1k
      int rind;
481
87.1k
      spx_word16_t sign=1;
482
87.1k
      rind = ind[i];
483
87.1k
      if (rind>=shape_cb_size)
484
10.3k
      {
485
10.3k
         sign=-1;
486
10.3k
         rind-=shape_cb_size;
487
10.3k
      }
488
#ifdef FIXED_POINT
489
18.5k
      if (sign==1)
490
17.5k
      {
491
145k
         for (j=0;j<subvect_size;j++)
492
128k
            e[subvect_size*i+j]=SHL32(EXTEND32(shape_cb[rind*subvect_size+j]),SIG_SHIFT-5);
493
17.5k
      } else {
494
8.38k
         for (j=0;j<subvect_size;j++)
495
7.45k
            e[subvect_size*i+j]=NEG32(SHL32(EXTEND32(shape_cb[rind*subvect_size+j]),SIG_SHIFT-5));
496
932
      }
497
#else
498
587k
      for (j=0;j<subvect_size;j++)
499
519k
         e[subvect_size*i+j]=sign*0.03125*shape_cb[rind*subvect_size+j];
500
#endif
501
87.1k
   }
502
   /* Update excitation */
503
671k
   for (j=0;j<nsf;j++)
504
654k
      exc[j]=ADD32(exc[j],e[j]);
505
506
   /* Update target: only update target if necessary */
507
16.3k
   if (update_target)
508
1.55k
   {
509
1.55k
      VARDECL(spx_word16_t *r2);
510
1.55k
      ALLOC(r2, nsf, spx_word16_t);
511
63.6k
      for (j=0;j<nsf;j++)
512
62.0k
         r2[j] = EXTRACT16(PSHR32(e[j] ,6));
513
1.55k
      syn_percep_zero16(r2, ak, awk1, awk2, r2, nsf,p, stack);
514
63.6k
      for (j=0;j<nsf;j++)
515
62.0k
         target[j]=SUB16(target[j],PSHR16(r2[j],2));
516
1.55k
   }
517
16.3k
}
split_cb_search_shape_sign
Line
Count
Source
261
18.4k
{
262
18.4k
   int i,j,k,m,n,q;
263
18.4k
   VARDECL(spx_word16_t *resp);
264
18.4k
#ifdef _USE_SSE
265
18.4k
   VARDECL(__m128 *resp2);
266
18.4k
   VARDECL(__m128 *E);
267
#else
268
   spx_word16_t *resp2;
269
   VARDECL(spx_word32_t *E);
270
#endif
271
18.4k
   VARDECL(spx_word16_t *t);
272
18.4k
   VARDECL(spx_sig_t *e);
273
18.4k
   VARDECL(spx_word16_t *tmp);
274
18.4k
   VARDECL(spx_word32_t *ndist);
275
18.4k
   VARDECL(spx_word32_t *odist);
276
18.4k
   VARDECL(int *itmp);
277
18.4k
   VARDECL(spx_word16_t **ot2);
278
18.4k
   VARDECL(spx_word16_t **nt2);
279
18.4k
   spx_word16_t **ot, **nt;
280
18.4k
   VARDECL(int **nind);
281
18.4k
   VARDECL(int **oind);
282
18.4k
   VARDECL(int *ind);
283
18.4k
   const signed char *shape_cb;
284
18.4k
   int shape_cb_size, subvect_size, nb_subvect;
285
18.4k
   const split_cb_params *params;
286
18.4k
   int N=2;
287
18.4k
   VARDECL(int *best_index);
288
18.4k
   VARDECL(spx_word32_t *best_dist);
289
18.4k
   VARDECL(int *best_nind);
290
18.4k
   VARDECL(int *best_ntarget);
291
18.4k
   int have_sign;
292
18.4k
   N=complexity;
293
18.4k
   if (N>10)
294
0
      N=10;
295
   /* Complexity isn't as important for the codebooks as it is for the pitch */
296
18.4k
   N=(2*N)/3;
297
18.4k
   if (N<1)
298
4.07k
      N=1;
299
18.4k
   if (N==1)
300
5.50k
   {
301
5.50k
      split_cb_search_shape_sign_N1(target,ak,awk1,awk2,par,p,nsf,exc,r,bits,stack,update_target);
302
5.50k
      return;
303
5.50k
   }
304
12.9k
   ALLOC(ot2, N, spx_word16_t*);
305
12.9k
   ALLOC(nt2, N, spx_word16_t*);
306
12.9k
   ALLOC(oind, N, int*);
307
12.9k
   ALLOC(nind, N, int*);
308
309
12.9k
   params = (const split_cb_params *) par;
310
12.9k
   subvect_size = params->subvect_size;
311
12.9k
   nb_subvect = params->nb_subvect;
312
12.9k
   shape_cb_size = 1<<params->shape_bits;
313
12.9k
   shape_cb = params->shape_cb;
314
12.9k
   have_sign = params->have_sign;
315
12.9k
   ALLOC(resp, shape_cb_size*subvect_size, spx_word16_t);
316
12.9k
#ifdef _USE_SSE
317
12.9k
   ALLOC(resp2, (shape_cb_size*subvect_size)>>2, __m128);
318
12.9k
   ALLOC(E, shape_cb_size>>2, __m128);
319
#else
320
   resp2 = resp;
321
   ALLOC(E, shape_cb_size, spx_word32_t);
322
#endif
323
12.9k
   ALLOC(t, nsf, spx_word16_t);
324
12.9k
   ALLOC(e, nsf, spx_sig_t);
325
12.9k
   ALLOC(ind, nb_subvect, int);
326
327
12.9k
   ALLOC(tmp, 2*N*nsf, spx_word16_t);
328
71.7k
   for (i=0;i<N;i++)
329
58.7k
   {
330
58.7k
      ot2[i]=tmp+2*i*nsf;
331
58.7k
      nt2[i]=tmp+(2*i+1)*nsf;
332
58.7k
   }
333
12.9k
   ot=ot2;
334
12.9k
   nt=nt2;
335
12.9k
   ALLOC(best_index, N, int);
336
12.9k
   ALLOC(best_dist, N, spx_word32_t);
337
12.9k
   ALLOC(best_nind, N, int);
338
12.9k
   ALLOC(best_ntarget, N, int);
339
12.9k
   ALLOC(ndist, N, spx_word32_t);
340
12.9k
   ALLOC(odist, N, spx_word32_t);
341
342
12.9k
   ALLOC(itmp, 2*N*nb_subvect, int);
343
71.7k
   for (i=0;i<N;i++)
344
58.7k
   {
345
58.7k
      nind[i]=itmp+2*i*nb_subvect;
346
58.7k
      oind[i]=itmp+(2*i+1)*nb_subvect;
347
58.7k
   }
348
349
12.9k
   SPEEX_COPY(t, target, nsf);
350
351
71.7k
   for (j=0;j<N;j++)
352
58.7k
      SPEEX_COPY(&ot[j][0], t, nsf);
353
354
   /* Pre-compute codewords response and energy */
355
12.9k
   compute_weighted_codebook(shape_cb, r, resp, resp2, E, shape_cb_size, subvect_size, stack);
356
357
71.7k
   for (j=0;j<N;j++)
358
58.7k
      odist[j]=0;
359
360
   /*For all subvectors*/
361
81.6k
   for (i=0;i<nb_subvect;i++)
362
68.6k
   {
363
      /*"erase" nbest list*/
364
376k
      for (j=0;j<N;j++)
365
307k
         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
376k
      for (j=0;j<N;j++)
370
307k
         best_nind[j] = best_ntarget[j] = 0;
371
      /*For all n-bests of previous subvector*/
372
317k
      for (j=0;j<N;j++)
373
262k
      {
374
262k
         spx_word16_t *x=ot[j]+subvect_size*i;
375
262k
         spx_word32_t tener = 0;
376
2.17M
         for (m=0;m<subvect_size;m++)
377
1.91M
            tener = MAC16_16(tener, x[m],x[m]);
378
#ifdef FIXED_POINT
379
         tener = SHR32(tener,1);
380
#else
381
262k
         tener *= .5;
382
262k
#endif
383
         /*Find new n-best based on previous n-best j*/
384
262k
#ifndef DISABLE_WIDEBAND
385
262k
         if (have_sign)
386
37.2k
            vq_nbest_sign(x, resp2, subvect_size, shape_cb_size, E, N, best_index, best_dist, stack);
387
224k
         else
388
224k
#endif /* DISABLE_WIDEBAND */
389
224k
            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.54M
         for (k=0;k<N;k++)
393
1.28M
         {
394
            /* Compute total distance (including previous sub-vectors */
395
1.28M
            spx_word32_t err = ADD32(ADD32(odist[j],best_dist[k]),tener);
396
397
            /*update n-best list*/
398
1.28M
            if (err<ndist[N-1])
399
485k
            {
400
1.58M
               for (m=0;m<N;m++)
401
1.58M
               {
402
1.58M
                  if (err < ndist[m])
403
485k
                  {
404
1.33M
                     for (n=N-1;n>m;n--)
405
853k
                     {
406
853k
                        ndist[n] = ndist[n-1];
407
853k
                        best_nind[n] = best_nind[n-1];
408
853k
                        best_ntarget[n] = best_ntarget[n-1];
409
853k
                     }
410
                     /* n is equal to m here, so they're interchangeable */
411
485k
                     ndist[m] = err;
412
485k
                     best_nind[n] = best_index[k];
413
485k
                     best_ntarget[n] = j;
414
485k
                     break;
415
485k
                  }
416
1.58M
               }
417
485k
            }
418
1.28M
         }
419
262k
         if (i==0)
420
12.9k
            break;
421
262k
      }
422
376k
      for (j=0;j<N;j++)
423
307k
      {
424
         /*previous target (we don't care what happened before*/
425
5.29M
         for (m=(i+1)*subvect_size;m<nsf;m++)
426
4.98M
            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.65M
         for (m=0;m<subvect_size;m++)
430
2.35M
         {
431
2.35M
            spx_word16_t g;
432
2.35M
            int rind;
433
2.35M
            spx_word16_t sign=1;
434
2.35M
            rind = best_nind[j];
435
2.35M
            if (rind>=shape_cb_size)
436
233k
            {
437
233k
               sign=-1;
438
233k
               rind-=shape_cb_size;
439
233k
            }
440
441
2.35M
            q=subvect_size-m;
442
#ifdef FIXED_POINT
443
            g=sign*shape_cb[rind*subvect_size+m];
444
#else
445
2.35M
            g=sign*0.03125*shape_cb[rind*subvect_size+m];
446
2.35M
#endif
447
2.35M
            target_update(nt[j]+subvect_size*(i+1), g, r+q, nsf-subvect_size*(i+1));
448
2.35M
         }
449
450
2.20M
         for (q=0;q<nb_subvect;q++)
451
1.89M
            nind[j][q]=oind[best_ntarget[j]][q];
452
307k
         nind[j][i]=best_nind[j];
453
307k
      }
454
455
      /*update old-new data*/
456
      /* just swap pointers instead of a long copy */
457
68.6k
      {
458
68.6k
         spx_word16_t **tmp2;
459
68.6k
         tmp2=ot;
460
68.6k
         ot=nt;
461
68.6k
         nt=tmp2;
462
68.6k
      }
463
376k
      for (j=0;j<N;j++)
464
2.20M
         for (m=0;m<nb_subvect;m++)
465
1.89M
            oind[j][m]=nind[j][m];
466
376k
      for (j=0;j<N;j++)
467
307k
         odist[j]=ndist[j];
468
68.6k
   }
469
470
   /*save indices*/
471
81.6k
   for (i=0;i<nb_subvect;i++)
472
68.6k
   {
473
68.6k
      ind[i]=nind[0][i];
474
68.6k
      speex_bits_pack(bits,ind[i],params->shape_bits+have_sign);
475
68.6k
   }
476
477
   /* Put everything back together */
478
81.6k
   for (i=0;i<nb_subvect;i++)
479
68.6k
   {
480
68.6k
      int rind;
481
68.6k
      spx_word16_t sign=1;
482
68.6k
      rind = ind[i];
483
68.6k
      if (rind>=shape_cb_size)
484
9.45k
      {
485
9.45k
         sign=-1;
486
9.45k
         rind-=shape_cb_size;
487
9.45k
      }
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
587k
      for (j=0;j<subvect_size;j++)
499
519k
         e[subvect_size*i+j]=sign*0.03125*shape_cb[rind*subvect_size+j];
500
68.6k
#endif
501
68.6k
   }
502
   /* Update excitation */
503
532k
   for (j=0;j<nsf;j++)
504
519k
      exc[j]=ADD32(exc[j],e[j]);
505
506
   /* Update target: only update target if necessary */
507
12.9k
   if (update_target)
508
1.26k
   {
509
1.26k
      VARDECL(spx_word16_t *r2);
510
1.26k
      ALLOC(r2, nsf, spx_word16_t);
511
51.9k
      for (j=0;j<nsf;j++)
512
50.7k
         r2[j] = EXTRACT16(PSHR32(e[j] ,6));
513
1.26k
      syn_percep_zero16(r2, ak, awk1, awk2, r2, nsf,p, stack);
514
51.9k
      for (j=0;j<nsf;j++)
515
50.7k
         target[j]=SUB16(target[j],PSHR16(r2[j],2));
516
1.26k
   }
517
12.9k
}
split_cb_search_shape_sign
Line
Count
Source
261
5.78k
{
262
5.78k
   int i,j,k,m,n,q;
263
5.78k
   VARDECL(spx_word16_t *resp);
264
#ifdef _USE_SSE
265
   VARDECL(__m128 *resp2);
266
   VARDECL(__m128 *E);
267
#else
268
5.78k
   spx_word16_t *resp2;
269
5.78k
   VARDECL(spx_word32_t *E);
270
5.78k
#endif
271
5.78k
   VARDECL(spx_word16_t *t);
272
5.78k
   VARDECL(spx_sig_t *e);
273
5.78k
   VARDECL(spx_word16_t *tmp);
274
5.78k
   VARDECL(spx_word32_t *ndist);
275
5.78k
   VARDECL(spx_word32_t *odist);
276
5.78k
   VARDECL(int *itmp);
277
5.78k
   VARDECL(spx_word16_t **ot2);
278
5.78k
   VARDECL(spx_word16_t **nt2);
279
5.78k
   spx_word16_t **ot, **nt;
280
5.78k
   VARDECL(int **nind);
281
5.78k
   VARDECL(int **oind);
282
5.78k
   VARDECL(int *ind);
283
5.78k
   const signed char *shape_cb;
284
5.78k
   int shape_cb_size, subvect_size, nb_subvect;
285
5.78k
   const split_cb_params *params;
286
5.78k
   int N=2;
287
5.78k
   VARDECL(int *best_index);
288
5.78k
   VARDECL(spx_word32_t *best_dist);
289
5.78k
   VARDECL(int *best_nind);
290
5.78k
   VARDECL(int *best_ntarget);
291
5.78k
   int have_sign;
292
5.78k
   N=complexity;
293
5.78k
   if (N>10)
294
0
      N=10;
295
   /* Complexity isn't as important for the codebooks as it is for the pitch */
296
5.78k
   N=(2*N)/3;
297
5.78k
   if (N<1)
298
2.07k
      N=1;
299
5.78k
   if (N==1)
300
2.38k
   {
301
2.38k
      split_cb_search_shape_sign_N1(target,ak,awk1,awk2,par,p,nsf,exc,r,bits,stack,update_target);
302
2.38k
      return;
303
2.38k
   }
304
3.39k
   ALLOC(ot2, N, spx_word16_t*);
305
3.39k
   ALLOC(nt2, N, spx_word16_t*);
306
3.39k
   ALLOC(oind, N, int*);
307
3.39k
   ALLOC(nind, N, int*);
308
309
3.39k
   params = (const split_cb_params *) par;
310
3.39k
   subvect_size = params->subvect_size;
311
3.39k
   nb_subvect = params->nb_subvect;
312
3.39k
   shape_cb_size = 1<<params->shape_bits;
313
3.39k
   shape_cb = params->shape_cb;
314
3.39k
   have_sign = params->have_sign;
315
3.39k
   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
3.39k
   resp2 = resp;
321
3.39k
   ALLOC(E, shape_cb_size, spx_word32_t);
322
3.39k
#endif
323
3.39k
   ALLOC(t, nsf, spx_word16_t);
324
3.39k
   ALLOC(e, nsf, spx_sig_t);
325
3.39k
   ALLOC(ind, nb_subvect, int);
326
327
3.39k
   ALLOC(tmp, 2*N*nsf, spx_word16_t);
328
17.0k
   for (i=0;i<N;i++)
329
13.6k
   {
330
13.6k
      ot2[i]=tmp+2*i*nsf;
331
13.6k
      nt2[i]=tmp+(2*i+1)*nsf;
332
13.6k
   }
333
3.39k
   ot=ot2;
334
3.39k
   nt=nt2;
335
3.39k
   ALLOC(best_index, N, int);
336
3.39k
   ALLOC(best_dist, N, spx_word32_t);
337
3.39k
   ALLOC(best_nind, N, int);
338
3.39k
   ALLOC(best_ntarget, N, int);
339
3.39k
   ALLOC(ndist, N, spx_word32_t);
340
3.39k
   ALLOC(odist, N, spx_word32_t);
341
342
3.39k
   ALLOC(itmp, 2*N*nb_subvect, int);
343
17.0k
   for (i=0;i<N;i++)
344
13.6k
   {
345
13.6k
      nind[i]=itmp+2*i*nb_subvect;
346
13.6k
      oind[i]=itmp+(2*i+1)*nb_subvect;
347
13.6k
   }
348
349
3.39k
   SPEEX_COPY(t, target, nsf);
350
351
17.0k
   for (j=0;j<N;j++)
352
13.6k
      SPEEX_COPY(&ot[j][0], t, nsf);
353
354
   /* Pre-compute codewords response and energy */
355
3.39k
   compute_weighted_codebook(shape_cb, r, resp, resp2, E, shape_cb_size, subvect_size, stack);
356
357
17.0k
   for (j=0;j<N;j++)
358
13.6k
      odist[j]=0;
359
360
   /*For all subvectors*/
361
21.9k
   for (i=0;i<nb_subvect;i++)
362
18.5k
   {
363
      /*"erase" nbest list*/
364
91.2k
      for (j=0;j<N;j++)
365
72.7k
         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
91.2k
      for (j=0;j<N;j++)
370
72.7k
         best_nind[j] = best_ntarget[j] = 0;
371
      /*For all n-bests of previous subvector*/
372
77.6k
      for (j=0;j<N;j++)
373
62.4k
      {
374
62.4k
         spx_word16_t *x=ot[j]+subvect_size*i;
375
62.4k
         spx_word32_t tener = 0;
376
503k
         for (m=0;m<subvect_size;m++)
377
441k
            tener = MAC16_16(tener, x[m],x[m]);
378
62.4k
#ifdef FIXED_POINT
379
62.4k
         tener = SHR32(tener,1);
380
#else
381
         tener *= .5;
382
#endif
383
         /*Find new n-best based on previous n-best j*/
384
62.4k
#ifndef DISABLE_WIDEBAND
385
62.4k
         if (have_sign)
386
3.66k
            vq_nbest_sign(x, resp2, subvect_size, shape_cb_size, E, N, best_index, best_dist, stack);
387
58.8k
         else
388
58.8k
#endif /* DISABLE_WIDEBAND */
389
58.8k
            vq_nbest(x, resp2, subvect_size, shape_cb_size, E, N, best_index, best_dist, stack);
390
391
         /*For all new n-bests*/
392
339k
         for (k=0;k<N;k++)
393
276k
         {
394
            /* Compute total distance (including previous sub-vectors */
395
276k
            spx_word32_t err = ADD32(ADD32(odist[j],best_dist[k]),tener);
396
397
            /*update n-best list*/
398
276k
            if (err<ndist[N-1])
399
111k
            {
400
328k
               for (m=0;m<N;m++)
401
328k
               {
402
328k
                  if (err < ndist[m])
403
111k
                  {
404
291k
                     for (n=N-1;n>m;n--)
405
180k
                     {
406
180k
                        ndist[n] = ndist[n-1];
407
180k
                        best_nind[n] = best_nind[n-1];
408
180k
                        best_ntarget[n] = best_ntarget[n-1];
409
180k
                     }
410
                     /* n is equal to m here, so they're interchangeable */
411
111k
                     ndist[m] = err;
412
111k
                     best_nind[n] = best_index[k];
413
111k
                     best_ntarget[n] = j;
414
111k
                     break;
415
111k
                  }
416
328k
               }
417
111k
            }
418
276k
         }
419
62.4k
         if (i==0)
420
3.39k
            break;
421
62.4k
      }
422
91.2k
      for (j=0;j<N;j++)
423
72.7k
      {
424
         /*previous target (we don't care what happened before*/
425
1.25M
         for (m=(i+1)*subvect_size;m<nsf;m++)
426
1.18M
            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
618k
         for (m=0;m<subvect_size;m++)
430
545k
         {
431
545k
            spx_word16_t g;
432
545k
            int rind;
433
545k
            spx_word16_t sign=1;
434
545k
            rind = best_nind[j];
435
545k
            if (rind>=shape_cb_size)
436
22.1k
            {
437
22.1k
               sign=-1;
438
22.1k
               rind-=shape_cb_size;
439
22.1k
            }
440
441
545k
            q=subvect_size-m;
442
545k
#ifdef FIXED_POINT
443
545k
            g=sign*shape_cb[rind*subvect_size+m];
444
#else
445
            g=sign*0.03125*shape_cb[rind*subvect_size+m];
446
#endif
447
545k
            target_update(nt[j]+subvect_size*(i+1), g, r+q, nsf-subvect_size*(i+1));
448
545k
         }
449
450
542k
         for (q=0;q<nb_subvect;q++)
451
469k
            nind[j][q]=oind[best_ntarget[j]][q];
452
72.7k
         nind[j][i]=best_nind[j];
453
72.7k
      }
454
455
      /*update old-new data*/
456
      /* just swap pointers instead of a long copy */
457
18.5k
      {
458
18.5k
         spx_word16_t **tmp2;
459
18.5k
         tmp2=ot;
460
18.5k
         ot=nt;
461
18.5k
         nt=tmp2;
462
18.5k
      }
463
91.2k
      for (j=0;j<N;j++)
464
542k
         for (m=0;m<nb_subvect;m++)
465
469k
            oind[j][m]=nind[j][m];
466
91.2k
      for (j=0;j<N;j++)
467
72.7k
         odist[j]=ndist[j];
468
18.5k
   }
469
470
   /*save indices*/
471
21.9k
   for (i=0;i<nb_subvect;i++)
472
18.5k
   {
473
18.5k
      ind[i]=nind[0][i];
474
18.5k
      speex_bits_pack(bits,ind[i],params->shape_bits+have_sign);
475
18.5k
   }
476
477
   /* Put everything back together */
478
21.9k
   for (i=0;i<nb_subvect;i++)
479
18.5k
   {
480
18.5k
      int rind;
481
18.5k
      spx_word16_t sign=1;
482
18.5k
      rind = ind[i];
483
18.5k
      if (rind>=shape_cb_size)
484
932
      {
485
932
         sign=-1;
486
932
         rind-=shape_cb_size;
487
932
      }
488
18.5k
#ifdef FIXED_POINT
489
18.5k
      if (sign==1)
490
17.5k
      {
491
145k
         for (j=0;j<subvect_size;j++)
492
128k
            e[subvect_size*i+j]=SHL32(EXTEND32(shape_cb[rind*subvect_size+j]),SIG_SHIFT-5);
493
17.5k
      } else {
494
8.38k
         for (j=0;j<subvect_size;j++)
495
7.45k
            e[subvect_size*i+j]=NEG32(SHL32(EXTEND32(shape_cb[rind*subvect_size+j]),SIG_SHIFT-5));
496
932
      }
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
18.5k
   }
502
   /* Update excitation */
503
139k
   for (j=0;j<nsf;j++)
504
135k
      exc[j]=ADD32(exc[j],e[j]);
505
506
   /* Update target: only update target if necessary */
507
3.39k
   if (update_target)
508
284
   {
509
284
      VARDECL(spx_word16_t *r2);
510
284
      ALLOC(r2, nsf, spx_word16_t);
511
11.6k
      for (j=0;j<nsf;j++)
512
11.3k
         r2[j] = EXTRACT16(PSHR32(e[j] ,6));
513
284
      syn_percep_zero16(r2, ak, awk1, awk2, r2, nsf,p, stack);
514
11.6k
      for (j=0;j<nsf;j++)
515
11.3k
         target[j]=SUB16(target[j],PSHR16(r2[j],2));
516
284
   }
517
3.39k
}
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
105k
{
530
105k
   int i,j;
531
105k
   VARDECL(int *ind);
532
105k
   VARDECL(int *signs);
533
105k
   const signed char *shape_cb;
534
105k
   int subvect_size, nb_subvect;
535
105k
   const split_cb_params *params;
536
105k
   int have_sign;
537
538
105k
   params = (const split_cb_params *) par;
539
105k
   subvect_size = params->subvect_size;
540
105k
   nb_subvect = params->nb_subvect;
541
542
105k
   shape_cb = params->shape_cb;
543
105k
   have_sign = params->have_sign;
544
545
105k
   ALLOC(ind, nb_subvect, int);
546
105k
   ALLOC(signs, nb_subvect, int);
547
548
   /* Decode codewords and gains */
549
640k
   for (i=0;i<nb_subvect;i++)
550
535k
   {
551
535k
      if (have_sign)
552
76.1k
         signs[i] = speex_bits_unpack_unsigned(bits, 1);
553
459k
      else
554
459k
         signs[i] = 0;
555
535k
      ind[i] = speex_bits_unpack_unsigned(bits, params->shape_bits);
556
535k
   }
557
   /* Compute decoded excitation */
558
640k
   for (i=0;i<nb_subvect;i++)
559
535k
   {
560
535k
      spx_word16_t s=1;
561
535k
      if (signs[i])
562
1.32k
         s=-1;
563
#ifdef FIXED_POINT
564
317k
      if (s==1)
565
316k
      {
566
2.77M
         for (j=0;j<subvect_size;j++)
567
2.46M
            exc[subvect_size*i+j]=SHL32(EXTEND32(shape_cb[ind[i]*subvect_size+j]),SIG_SHIFT-5);
568
316k
      } else {
569
8.09k
         for (j=0;j<subvect_size;j++)
570
7.19k
            exc[subvect_size*i+j]=NEG32(SHL32(EXTEND32(shape_cb[ind[i]*subvect_size+j]),SIG_SHIFT-5));
571
899
      }
572
#else
573
1.96M
      for (j=0;j<subvect_size;j++)
574
1.74M
         exc[subvect_size*i+j]+=s*0.03125*shape_cb[ind[i]*subvect_size+j];
575
#endif
576
535k
   }
577
105k
}
split_cb_shape_sign_unquant
Line
Count
Source
529
43.6k
{
530
43.6k
   int i,j;
531
43.6k
   VARDECL(int *ind);
532
43.6k
   VARDECL(int *signs);
533
43.6k
   const signed char *shape_cb;
534
43.6k
   int subvect_size, nb_subvect;
535
43.6k
   const split_cb_params *params;
536
43.6k
   int have_sign;
537
538
43.6k
   params = (const split_cb_params *) par;
539
43.6k
   subvect_size = params->subvect_size;
540
43.6k
   nb_subvect = params->nb_subvect;
541
542
43.6k
   shape_cb = params->shape_cb;
543
43.6k
   have_sign = params->have_sign;
544
545
43.6k
   ALLOC(ind, nb_subvect, int);
546
43.6k
   ALLOC(signs, nb_subvect, int);
547
548
   /* Decode codewords and gains */
549
261k
   for (i=0;i<nb_subvect;i++)
550
217k
   {
551
217k
      if (have_sign)
552
33.9k
         signs[i] = speex_bits_unpack_unsigned(bits, 1);
553
183k
      else
554
183k
         signs[i] = 0;
555
217k
      ind[i] = speex_bits_unpack_unsigned(bits, params->shape_bits);
556
217k
   }
557
   /* Compute decoded excitation */
558
261k
   for (i=0;i<nb_subvect;i++)
559
217k
   {
560
217k
      spx_word16_t s=1;
561
217k
      if (signs[i])
562
427
         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
1.96M
      for (j=0;j<subvect_size;j++)
574
1.74M
         exc[subvect_size*i+j]+=s*0.03125*shape_cb[ind[i]*subvect_size+j];
575
217k
#endif
576
217k
   }
577
43.6k
}
split_cb_shape_sign_unquant
Line
Count
Source
529
61.6k
{
530
61.6k
   int i,j;
531
61.6k
   VARDECL(int *ind);
532
61.6k
   VARDECL(int *signs);
533
61.6k
   const signed char *shape_cb;
534
61.6k
   int subvect_size, nb_subvect;
535
61.6k
   const split_cb_params *params;
536
61.6k
   int have_sign;
537
538
61.6k
   params = (const split_cb_params *) par;
539
61.6k
   subvect_size = params->subvect_size;
540
61.6k
   nb_subvect = params->nb_subvect;
541
542
61.6k
   shape_cb = params->shape_cb;
543
61.6k
   have_sign = params->have_sign;
544
545
61.6k
   ALLOC(ind, nb_subvect, int);
546
61.6k
   ALLOC(signs, nb_subvect, int);
547
548
   /* Decode codewords and gains */
549
379k
   for (i=0;i<nb_subvect;i++)
550
317k
   {
551
317k
      if (have_sign)
552
42.2k
         signs[i] = speex_bits_unpack_unsigned(bits, 1);
553
275k
      else
554
275k
         signs[i] = 0;
555
317k
      ind[i] = speex_bits_unpack_unsigned(bits, params->shape_bits);
556
317k
   }
557
   /* Compute decoded excitation */
558
379k
   for (i=0;i<nb_subvect;i++)
559
317k
   {
560
317k
      spx_word16_t s=1;
561
317k
      if (signs[i])
562
899
         s=-1;
563
317k
#ifdef FIXED_POINT
564
317k
      if (s==1)
565
316k
      {
566
2.77M
         for (j=0;j<subvect_size;j++)
567
2.46M
            exc[subvect_size*i+j]=SHL32(EXTEND32(shape_cb[ind[i]*subvect_size+j]),SIG_SHIFT-5);
568
316k
      } else {
569
8.09k
         for (j=0;j<subvect_size;j++)
570
7.19k
            exc[subvect_size*i+j]=NEG32(SHL32(EXTEND32(shape_cb[ind[i]*subvect_size+j]),SIG_SHIFT-5));
571
899
      }
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
317k
   }
577
61.6k
}
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
36.1k
{
597
36.1k
   int i;
598
36.1k
   VARDECL(spx_word16_t *tmp);
599
36.1k
   ALLOC(tmp, nsf, spx_word16_t);
600
36.1k
   residue_percep_zero16(target, ak, awk1, awk2, tmp, nsf, p, stack);
601
602
1.48M
   for (i=0;i<nsf;i++)
603
1.44M
      exc[i]+=SHL32(EXTEND32(tmp[i]),8);
604
36.1k
   SPEEX_MEMSET(target, 0, nsf);
605
36.1k
}
noise_codebook_quant
Line
Count
Source
596
18.0k
{
597
18.0k
   int i;
598
18.0k
   VARDECL(spx_word16_t *tmp);
599
18.0k
   ALLOC(tmp, nsf, spx_word16_t);
600
18.0k
   residue_percep_zero16(target, ak, awk1, awk2, tmp, nsf, p, stack);
601
602
741k
   for (i=0;i<nsf;i++)
603
723k
      exc[i]+=SHL32(EXTEND32(tmp[i]),8);
604
18.0k
   SPEEX_MEMSET(target, 0, nsf);
605
18.0k
}
noise_codebook_quant
Line
Count
Source
596
18.0k
{
597
18.0k
   int i;
598
18.0k
   VARDECL(spx_word16_t *tmp);
599
18.0k
   ALLOC(tmp, nsf, spx_word16_t);
600
18.0k
   residue_percep_zero16(target, ak, awk1, awk2, tmp, nsf, p, stack);
601
602
741k
   for (i=0;i<nsf;i++)
603
723k
      exc[i]+=SHL32(EXTEND32(tmp[i]),8);
604
18.0k
   SPEEX_MEMSET(target, 0, nsf);
605
18.0k
}
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
33.8k
{
618
33.8k
   int i;
619
   /* FIXME: This is bad, but I don't think the function ever gets called anyway */
620
1.38M
   for (i=0;i<nsf;i++)
621
1.35M
      exc[i]=SHL32(EXTEND32(speex_rand(1, seed)),SIG_SHIFT);
622
33.8k
}
noise_codebook_unquant
Line
Count
Source
617
16.9k
{
618
16.9k
   int i;
619
   /* FIXME: This is bad, but I don't think the function ever gets called anyway */
620
694k
   for (i=0;i<nsf;i++)
621
677k
      exc[i]=SHL32(EXTEND32(speex_rand(1, seed)),SIG_SHIFT);
622
16.9k
}
noise_codebook_unquant
Line
Count
Source
617
16.9k
{
618
16.9k
   int i;
619
   /* FIXME: This is bad, but I don't think the function ever gets called anyway */
620
694k
   for (i=0;i<nsf;i++)
621
677k
      exc[i]=SHL32(EXTEND32(speex_rand(1, seed)),SIG_SHIFT);
622
16.9k
}
623
#endif /* DISABLE_DECODER */