Coverage Report

Created: 2026-01-17 06:57

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
45.9k
{
57
45.9k
   int i, j, k;
58
45.9k
   VARDECL(spx_word16_t *shape);
59
45.9k
   ALLOC(shape, subvect_size, spx_word16_t);
60
4.39M
   for (i=0;i<shape_cb_size;i++)
61
4.34M
   {
62
4.34M
      spx_word16_t *res;
63
64
4.34M
      res = resp+i*subvect_size;
65
35.1M
      for (k=0;k<subvect_size;k++)
66
30.8M
         shape[k] = (spx_word16_t)shape_cb[i*subvect_size+k];
67
4.34M
      E[i]=0;
68
69
      /* Compute codeword response using convolution with impulse response */
70
35.1M
      for(j=0;j<subvect_size;j++)
71
30.8M
      {
72
30.8M
         spx_word32_t resj=0;
73
30.8M
         spx_word16_t res16;
74
181M
         for (k=0;k<=j;k++)
75
150M
            resj = MAC16_16(resj,shape[k],r[j-k]);
76
30.8M
#ifdef FIXED_POINT
77
30.8M
         res16 = EXTRACT16(SHR32(resj, 13));
78
#else
79
         res16 = 0.03125f*resj;
80
#endif
81
         /* Compute codeword energy */
82
30.8M
         E[i]=MAC16_16(E[i],res16,res16);
83
30.8M
         res[j] = res16;
84
         /*printf ("%d\n", (int)res[j]);*/
85
30.8M
      }
86
4.34M
   }
87
88
45.9k
}
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.5M
{
94
16.5M
   int n;
95
271M
   for (n=0;n<len;n++)
96
254M
      t[n] = SUB16(t[n],PSHR32(MULT16_16(g,r[n]),13));
97
16.5M
}
cb_search.c:target_update
Line
Count
Source
93
8.25M
{
94
8.25M
   int n;
95
135M
   for (n=0;n<len;n++)
96
127M
      t[n] = SUB16(t[n],PSHR32(MULT16_16(g,r[n]),13));
97
8.25M
}
cb_search.c:target_update
Line
Count
Source
93
8.25M
{
94
8.25M
   int n;
95
135M
   for (n=0;n<len;n++)
96
127M
      t[n] = SUB16(t[n],PSHR32(MULT16_16(g,r[n]),13));
97
8.25M
}
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
20.2k
{
117
20.2k
   int i,j,m,q;
118
20.2k
   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
20.2k
   VARDECL(spx_word16_t *t);
127
20.2k
   VARDECL(spx_sig_t *e);
128
20.2k
   const signed char *shape_cb;
129
20.2k
   int shape_cb_size, subvect_size, nb_subvect;
130
20.2k
   const split_cb_params *params;
131
20.2k
   int best_index;
132
20.2k
   spx_word32_t best_dist;
133
20.2k
   int have_sign;
134
135
20.2k
   params = (const split_cb_params *) par;
136
20.2k
   subvect_size = params->subvect_size;
137
20.2k
   nb_subvect = params->nb_subvect;
138
20.2k
   shape_cb_size = 1<<params->shape_bits;
139
20.2k
   shape_cb = params->shape_cb;
140
20.2k
   have_sign = params->have_sign;
141
20.2k
   ALLOC(resp, shape_cb_size*subvect_size, spx_word16_t);
142
#ifdef _USE_SSE
143
5.04k
   ALLOC(resp2, (shape_cb_size*subvect_size)>>2, __m128);
144
5.04k
   ALLOC(E, shape_cb_size>>2, __m128);
145
#else
146
   resp2 = resp;
147
15.2k
   ALLOC(E, shape_cb_size, spx_word32_t);
148
#endif
149
20.2k
   ALLOC(t, nsf, spx_word16_t);
150
20.2k
   ALLOC(e, nsf, spx_sig_t);
151
152
   /* FIXME: Do we still need to copy the target? */
153
20.2k
   SPEEX_COPY(t, target, nsf);
154
155
20.2k
   compute_weighted_codebook(shape_cb, r, resp, resp2, E, shape_cb_size, subvect_size, stack);
156
157
123k
   for (i=0;i<nb_subvect;i++)
158
103k
   {
159
103k
      spx_word16_t *x=t+subvect_size*i;
160
      /*Find new n-best based on previous n-best j*/
161
103k
#ifndef DISABLE_WIDEBAND
162
103k
      if (have_sign)
163
15.5k
         vq_nbest_sign(x, resp2, subvect_size, shape_cb_size, E, 1, &best_index, &best_dist, stack);
164
87.5k
      else
165
87.5k
#endif /* DISABLE_WIDEBAND */
166
87.5k
         vq_nbest(x, resp2, subvect_size, shape_cb_size, E, 1, &best_index, &best_dist, stack);
167
168
103k
      speex_bits_pack(bits,best_index,params->shape_bits+have_sign);
169
170
103k
      {
171
103k
         int rind;
172
103k
         spx_word16_t *res;
173
103k
         spx_word16_t sign=1;
174
103k
         rind = best_index;
175
103k
         if (rind>=shape_cb_size)
176
11.4k
         {
177
11.4k
            sign=-1;
178
11.4k
            rind-=shape_cb_size;
179
11.4k
         }
180
103k
         res = resp+rind*subvect_size;
181
103k
         if (sign>0)
182
809k
            for (m=0;m<subvect_size;m++)
183
718k
               t[subvect_size*i+m] = SUB16(t[subvect_size*i+m], res[m]);
184
11.4k
         else
185
102k
            for (m=0;m<subvect_size;m++)
186
91.4k
               t[subvect_size*i+m] = ADD16(t[subvect_size*i+m], res[m]);
187
188
#ifdef FIXED_POINT
189
77.4k
         if (sign==1)
190
69.7k
         {
191
615k
            for (j=0;j<subvect_size;j++)
192
545k
               e[subvect_size*i+j]=SHL32(EXTEND32(shape_cb[rind*subvect_size+j]),SIG_SHIFT-5);
193
69.7k
         } else {
194
69.9k
            for (j=0;j<subvect_size;j++)
195
62.1k
               e[subvect_size*i+j]=NEG32(SHL32(EXTEND32(shape_cb[rind*subvect_size+j]),SIG_SHIFT-5));
196
7.76k
         }
197
#else
198
227k
         for (j=0;j<subvect_size;j++)
199
201k
            e[subvect_size*i+j]=sign*0.03125*shape_cb[rind*subvect_size+j];
200
#endif
201
202
103k
      }
203
204
912k
      for (m=0;m<subvect_size;m++)
205
809k
      {
206
809k
         spx_word16_t g;
207
809k
         int rind;
208
809k
         spx_word16_t sign=1;
209
809k
         rind = best_index;
210
809k
         if (rind>=shape_cb_size)
211
91.4k
         {
212
91.4k
            sign=-1;
213
91.4k
            rind-=shape_cb_size;
214
91.4k
         }
215
216
809k
         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
809k
         target_update(t+subvect_size*(i+1), g, r+q, nsf-subvect_size*(i+1));
223
809k
      }
224
103k
   }
225
226
   /* Update excitation */
227
   /* FIXME: We could update the excitation directly above */
228
830k
   for (j=0;j<nsf;j++)
229
809k
      exc[j]=ADD32(exc[j],e[j]);
230
231
   /* Update target: only update target if necessary */
232
20.2k
   if (update_target)
233
2.25k
   {
234
2.25k
      VARDECL(spx_word16_t *r2);
235
2.25k
      ALLOC(r2, nsf, spx_word16_t);
236
92.3k
      for (j=0;j<nsf;j++)
237
90.0k
         r2[j] = EXTRACT16(PSHR32(e[j] ,6));
238
2.25k
      syn_percep_zero16(r2, ak, awk1, awk2, r2, nsf,p, stack);
239
92.3k
      for (j=0;j<nsf;j++)
240
90.0k
         target[j]=SUB16(target[j],PSHR16(r2[j],2));
241
2.25k
   }
242
20.2k
}
cb_search.c:split_cb_search_shape_sign_N1
Line
Count
Source
116
5.04k
{
117
5.04k
   int i,j,m,q;
118
5.04k
   VARDECL(spx_word16_t *resp);
119
5.04k
#ifdef _USE_SSE
120
5.04k
   VARDECL(__m128 *resp2);
121
5.04k
   VARDECL(__m128 *E);
122
#else
123
   spx_word16_t *resp2;
124
   VARDECL(spx_word32_t *E);
125
#endif
126
5.04k
   VARDECL(spx_word16_t *t);
127
5.04k
   VARDECL(spx_sig_t *e);
128
5.04k
   const signed char *shape_cb;
129
5.04k
   int shape_cb_size, subvect_size, nb_subvect;
130
5.04k
   const split_cb_params *params;
131
5.04k
   int best_index;
132
5.04k
   spx_word32_t best_dist;
133
5.04k
   int have_sign;
134
135
5.04k
   params = (const split_cb_params *) par;
136
5.04k
   subvect_size = params->subvect_size;
137
5.04k
   nb_subvect = params->nb_subvect;
138
5.04k
   shape_cb_size = 1<<params->shape_bits;
139
5.04k
   shape_cb = params->shape_cb;
140
5.04k
   have_sign = params->have_sign;
141
5.04k
   ALLOC(resp, shape_cb_size*subvect_size, spx_word16_t);
142
5.04k
#ifdef _USE_SSE
143
5.04k
   ALLOC(resp2, (shape_cb_size*subvect_size)>>2, __m128);
144
5.04k
   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.04k
   ALLOC(t, nsf, spx_word16_t);
150
5.04k
   ALLOC(e, nsf, spx_sig_t);
151
152
   /* FIXME: Do we still need to copy the target? */
153
5.04k
   SPEEX_COPY(t, target, nsf);
154
155
5.04k
   compute_weighted_codebook(shape_cb, r, resp, resp2, E, shape_cb_size, subvect_size, stack);
156
157
30.6k
   for (i=0;i<nb_subvect;i++)
158
25.5k
   {
159
25.5k
      spx_word16_t *x=t+subvect_size*i;
160
      /*Find new n-best based on previous n-best j*/
161
25.5k
#ifndef DISABLE_WIDEBAND
162
25.5k
      if (have_sign)
163
4.10k
         vq_nbest_sign(x, resp2, subvect_size, shape_cb_size, E, 1, &best_index, &best_dist, stack);
164
21.4k
      else
165
21.4k
#endif /* DISABLE_WIDEBAND */
166
21.4k
         vq_nbest(x, resp2, subvect_size, shape_cb_size, E, 1, &best_index, &best_dist, stack);
167
168
25.5k
      speex_bits_pack(bits,best_index,params->shape_bits+have_sign);
169
170
25.5k
      {
171
25.5k
         int rind;
172
25.5k
         spx_word16_t *res;
173
25.5k
         spx_word16_t sign=1;
174
25.5k
         rind = best_index;
175
25.5k
         if (rind>=shape_cb_size)
176
3.65k
         {
177
3.65k
            sign=-1;
178
3.65k
            rind-=shape_cb_size;
179
3.65k
         }
180
25.5k
         res = resp+rind*subvect_size;
181
25.5k
         if (sign>0)
182
194k
            for (m=0;m<subvect_size;m++)
183
172k
               t[subvect_size*i+m] = SUB16(t[subvect_size*i+m], res[m]);
184
3.65k
         else
185
32.9k
            for (m=0;m<subvect_size;m++)
186
29.2k
               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
227k
         for (j=0;j<subvect_size;j++)
199
201k
            e[subvect_size*i+j]=sign*0.03125*shape_cb[rind*subvect_size+j];
200
25.5k
#endif
201
202
25.5k
      }
203
204
227k
      for (m=0;m<subvect_size;m++)
205
201k
      {
206
201k
         spx_word16_t g;
207
201k
         int rind;
208
201k
         spx_word16_t sign=1;
209
201k
         rind = best_index;
210
201k
         if (rind>=shape_cb_size)
211
29.2k
         {
212
29.2k
            sign=-1;
213
29.2k
            rind-=shape_cb_size;
214
29.2k
         }
215
216
201k
         q=subvect_size-m;
217
#ifdef FIXED_POINT
218
         g=sign*shape_cb[rind*subvect_size+m];
219
#else
220
201k
         g=sign*0.03125*shape_cb[rind*subvect_size+m];
221
201k
#endif
222
201k
         target_update(t+subvect_size*(i+1), g, r+q, nsf-subvect_size*(i+1));
223
201k
      }
224
25.5k
   }
225
226
   /* Update excitation */
227
   /* FIXME: We could update the excitation directly above */
228
206k
   for (j=0;j<nsf;j++)
229
201k
      exc[j]=ADD32(exc[j],e[j]);
230
231
   /* Update target: only update target if necessary */
232
5.04k
   if (update_target)
233
564
   {
234
564
      VARDECL(spx_word16_t *r2);
235
564
      ALLOC(r2, nsf, spx_word16_t);
236
23.1k
      for (j=0;j<nsf;j++)
237
22.5k
         r2[j] = EXTRACT16(PSHR32(e[j] ,6));
238
564
      syn_percep_zero16(r2, ak, awk1, awk2, r2, nsf,p, stack);
239
23.1k
      for (j=0;j<nsf;j++)
240
22.5k
         target[j]=SUB16(target[j],PSHR16(r2[j],2));
241
564
   }
242
5.04k
}
cb_search.c:split_cb_search_shape_sign_N1
Line
Count
Source
116
15.2k
{
117
15.2k
   int i,j,m,q;
118
15.2k
   VARDECL(spx_word16_t *resp);
119
#ifdef _USE_SSE
120
   VARDECL(__m128 *resp2);
121
   VARDECL(__m128 *E);
122
#else
123
15.2k
   spx_word16_t *resp2;
124
15.2k
   VARDECL(spx_word32_t *E);
125
15.2k
#endif
126
15.2k
   VARDECL(spx_word16_t *t);
127
15.2k
   VARDECL(spx_sig_t *e);
128
15.2k
   const signed char *shape_cb;
129
15.2k
   int shape_cb_size, subvect_size, nb_subvect;
130
15.2k
   const split_cb_params *params;
131
15.2k
   int best_index;
132
15.2k
   spx_word32_t best_dist;
133
15.2k
   int have_sign;
134
135
15.2k
   params = (const split_cb_params *) par;
136
15.2k
   subvect_size = params->subvect_size;
137
15.2k
   nb_subvect = params->nb_subvect;
138
15.2k
   shape_cb_size = 1<<params->shape_bits;
139
15.2k
   shape_cb = params->shape_cb;
140
15.2k
   have_sign = params->have_sign;
141
15.2k
   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
15.2k
   resp2 = resp;
147
15.2k
   ALLOC(E, shape_cb_size, spx_word32_t);
148
15.2k
#endif
149
15.2k
   ALLOC(t, nsf, spx_word16_t);
150
15.2k
   ALLOC(e, nsf, spx_sig_t);
151
152
   /* FIXME: Do we still need to copy the target? */
153
15.2k
   SPEEX_COPY(t, target, nsf);
154
155
15.2k
   compute_weighted_codebook(shape_cb, r, resp, resp2, E, shape_cb_size, subvect_size, stack);
156
157
92.6k
   for (i=0;i<nb_subvect;i++)
158
77.4k
   {
159
77.4k
      spx_word16_t *x=t+subvect_size*i;
160
      /*Find new n-best based on previous n-best j*/
161
77.4k
#ifndef DISABLE_WIDEBAND
162
77.4k
      if (have_sign)
163
11.4k
         vq_nbest_sign(x, resp2, subvect_size, shape_cb_size, E, 1, &best_index, &best_dist, stack);
164
66.0k
      else
165
66.0k
#endif /* DISABLE_WIDEBAND */
166
66.0k
         vq_nbest(x, resp2, subvect_size, shape_cb_size, E, 1, &best_index, &best_dist, stack);
167
168
77.4k
      speex_bits_pack(bits,best_index,params->shape_bits+have_sign);
169
170
77.4k
      {
171
77.4k
         int rind;
172
77.4k
         spx_word16_t *res;
173
77.4k
         spx_word16_t sign=1;
174
77.4k
         rind = best_index;
175
77.4k
         if (rind>=shape_cb_size)
176
7.76k
         {
177
7.76k
            sign=-1;
178
7.76k
            rind-=shape_cb_size;
179
7.76k
         }
180
77.4k
         res = resp+rind*subvect_size;
181
77.4k
         if (sign>0)
182
615k
            for (m=0;m<subvect_size;m++)
183
545k
               t[subvect_size*i+m] = SUB16(t[subvect_size*i+m], res[m]);
184
7.76k
         else
185
69.9k
            for (m=0;m<subvect_size;m++)
186
62.1k
               t[subvect_size*i+m] = ADD16(t[subvect_size*i+m], res[m]);
187
188
77.4k
#ifdef FIXED_POINT
189
77.4k
         if (sign==1)
190
69.7k
         {
191
615k
            for (j=0;j<subvect_size;j++)
192
545k
               e[subvect_size*i+j]=SHL32(EXTEND32(shape_cb[rind*subvect_size+j]),SIG_SHIFT-5);
193
69.7k
         } else {
194
69.9k
            for (j=0;j<subvect_size;j++)
195
62.1k
               e[subvect_size*i+j]=NEG32(SHL32(EXTEND32(shape_cb[rind*subvect_size+j]),SIG_SHIFT-5));
196
7.76k
         }
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
77.4k
      }
203
204
685k
      for (m=0;m<subvect_size;m++)
205
608k
      {
206
608k
         spx_word16_t g;
207
608k
         int rind;
208
608k
         spx_word16_t sign=1;
209
608k
         rind = best_index;
210
608k
         if (rind>=shape_cb_size)
211
62.1k
         {
212
62.1k
            sign=-1;
213
62.1k
            rind-=shape_cb_size;
214
62.1k
         }
215
216
608k
         q=subvect_size-m;
217
608k
#ifdef FIXED_POINT
218
608k
         g=sign*shape_cb[rind*subvect_size+m];
219
#else
220
         g=sign*0.03125*shape_cb[rind*subvect_size+m];
221
#endif
222
608k
         target_update(t+subvect_size*(i+1), g, r+q, nsf-subvect_size*(i+1));
223
608k
      }
224
77.4k
   }
225
226
   /* Update excitation */
227
   /* FIXME: We could update the excitation directly above */
228
623k
   for (j=0;j<nsf;j++)
229
608k
      exc[j]=ADD32(exc[j],e[j]);
230
231
   /* Update target: only update target if necessary */
232
15.2k
   if (update_target)
233
1.68k
   {
234
1.68k
      VARDECL(spx_word16_t *r2);
235
1.68k
      ALLOC(r2, nsf, spx_word16_t);
236
69.2k
      for (j=0;j<nsf;j++)
237
67.5k
         r2[j] = EXTRACT16(PSHR32(e[j] ,6));
238
1.68k
      syn_percep_zero16(r2, ak, awk1, awk2, r2, nsf,p, stack);
239
69.2k
      for (j=0;j<nsf;j++)
240
67.5k
         target[j]=SUB16(target[j],PSHR16(r2[j],2));
241
1.68k
   }
242
15.2k
}
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
63.9k
{
262
63.9k
   int i,j,k,m,n,q;
263
63.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
63.9k
   VARDECL(spx_word16_t *t);
272
63.9k
   VARDECL(spx_sig_t *e);
273
63.9k
   VARDECL(spx_word16_t *tmp);
274
63.9k
   VARDECL(spx_word32_t *ndist);
275
63.9k
   VARDECL(spx_word32_t *odist);
276
63.9k
   VARDECL(int *itmp);
277
63.9k
   VARDECL(spx_word16_t **ot2);
278
63.9k
   VARDECL(spx_word16_t **nt2);
279
63.9k
   spx_word16_t **ot, **nt;
280
63.9k
   VARDECL(int **nind);
281
63.9k
   VARDECL(int **oind);
282
63.9k
   VARDECL(int *ind);
283
63.9k
   const signed char *shape_cb;
284
63.9k
   int shape_cb_size, subvect_size, nb_subvect;
285
63.9k
   const split_cb_params *params;
286
63.9k
   int N=2;
287
63.9k
   VARDECL(int *best_index);
288
63.9k
   VARDECL(spx_word32_t *best_dist);
289
63.9k
   VARDECL(int *best_nind);
290
63.9k
   VARDECL(int *best_ntarget);
291
63.9k
   int have_sign;
292
63.9k
   N=complexity;
293
63.9k
   if (N>10)
294
0
      N=10;
295
   /* Complexity isn't as important for the codebooks as it is for the pitch */
296
63.9k
   N=(2*N)/3;
297
63.9k
   if (N<1)
298
14.0k
      N=1;
299
63.9k
   if (N==1)
300
20.2k
   {
301
20.2k
      split_cb_search_shape_sign_N1(target,ak,awk1,awk2,par,p,nsf,exc,r,bits,stack,update_target);
302
20.2k
      return;
303
20.2k
   }
304
43.7k
   ALLOC(ot2, N, spx_word16_t*);
305
43.7k
   ALLOC(nt2, N, spx_word16_t*);
306
43.7k
   ALLOC(oind, N, int*);
307
43.7k
   ALLOC(nind, N, int*);
308
309
43.7k
   params = (const split_cb_params *) par;
310
43.7k
   subvect_size = params->subvect_size;
311
43.7k
   nb_subvect = params->nb_subvect;
312
43.7k
   shape_cb_size = 1<<params->shape_bits;
313
43.7k
   shape_cb = params->shape_cb;
314
43.7k
   have_sign = params->have_sign;
315
43.7k
   ALLOC(resp, shape_cb_size*subvect_size, spx_word16_t);
316
#ifdef _USE_SSE
317
13.0k
   ALLOC(resp2, (shape_cb_size*subvect_size)>>2, __m128);
318
13.0k
   ALLOC(E, shape_cb_size>>2, __m128);
319
#else
320
   resp2 = resp;
321
30.7k
   ALLOC(E, shape_cb_size, spx_word32_t);
322
#endif
323
43.7k
   ALLOC(t, nsf, spx_word16_t);
324
43.7k
   ALLOC(e, nsf, spx_sig_t);
325
43.7k
   ALLOC(ind, nb_subvect, int);
326
327
43.7k
   ALLOC(tmp, 2*N*nsf, spx_word16_t);
328
229k
   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.7k
   ot=ot2;
334
43.7k
   nt=nt2;
335
43.7k
   ALLOC(best_index, N, int);
336
43.7k
   ALLOC(best_dist, N, spx_word32_t);
337
43.7k
   ALLOC(best_nind, N, int);
338
43.7k
   ALLOC(best_ntarget, N, int);
339
43.7k
   ALLOC(ndist, N, spx_word32_t);
340
43.7k
   ALLOC(odist, N, spx_word32_t);
341
342
43.7k
   ALLOC(itmp, 2*N*nb_subvect, int);
343
229k
   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.7k
   SPEEX_COPY(t, target, nsf);
350
351
229k
   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.7k
   compute_weighted_codebook(shape_cb, r, resp, resp2, E, shape_cb_size, subvect_size, stack);
356
357
229k
   for (j=0;j<N;j++)
358
186k
      odist[j]=0;
359
360
   /*For all subvectors*/
361
282k
   for (i=0;i<nb_subvect;i++)
362
239k
   {
363
      /*"erase" nbest list*/
364
1.25M
      for (j=0;j<N;j++)
365
1.01M
         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.25M
      for (j=0;j<N;j++)
370
1.01M
         best_nind[j] = best_ntarget[j] = 0;
371
      /*For all n-bests of previous subvector*/
372
1.06M
      for (j=0;j<N;j++)
373
869k
      {
374
869k
         spx_word16_t *x=ot[j]+subvect_size*i;
375
869k
         spx_word32_t tener = 0;
376
7.02M
         for (m=0;m<subvect_size;m++)
377
6.15M
            tener = MAC16_16(tener, x[m],x[m]);
378
#ifdef FIXED_POINT
379
598k
         tener = SHR32(tener,1);
380
#else
381
         tener *= .5;
382
#endif
383
         /*Find new n-best based on previous n-best j*/
384
869k
#ifndef DISABLE_WIDEBAND
385
869k
         if (have_sign)
386
109k
            vq_nbest_sign(x, resp2, subvect_size, shape_cb_size, E, N, best_index, best_dist, stack);
387
760k
         else
388
760k
#endif /* DISABLE_WIDEBAND */
389
760k
            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.03M
         {
394
            /* Compute total distance (including previous sub-vectors */
395
4.03M
            spx_word32_t err = ADD32(ADD32(odist[j],best_dist[k]),tener);
396
397
            /*update n-best list*/
398
4.03M
            if (err<ndist[N-1])
399
1.58M
            {
400
4.93M
               for (m=0;m<N;m++)
401
4.93M
               {
402
4.93M
                  if (err < ndist[m])
403
1.58M
                  {
404
4.20M
                     for (n=N-1;n>m;n--)
405
2.62M
                     {
406
2.62M
                        ndist[n] = ndist[n-1];
407
2.62M
                        best_nind[n] = best_nind[n-1];
408
2.62M
                        best_ntarget[n] = best_ntarget[n-1];
409
2.62M
                     }
410
                     /* n is equal to m here, so they're interchangeable */
411
1.58M
                     ndist[m] = err;
412
1.58M
                     best_nind[n] = best_index[k];
413
1.58M
                     best_ntarget[n] = j;
414
1.58M
                     break;
415
1.58M
                  }
416
4.93M
               }
417
1.58M
            }
418
4.03M
         }
419
869k
         if (i==0)
420
43.7k
            break;
421
869k
      }
422
1.25M
      for (j=0;j<N;j++)
423
1.01M
      {
424
         /*previous target (we don't care what happened before*/
425
17.5M
         for (m=(i+1)*subvect_size;m<nsf;m++)
426
16.5M
            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.44M
         {
431
7.44M
            spx_word16_t g;
432
7.44M
            int rind;
433
7.44M
            spx_word16_t sign=1;
434
7.44M
            rind = best_nind[j];
435
7.44M
            if (rind>=shape_cb_size)
436
700k
            {
437
700k
               sign=-1;
438
700k
               rind-=shape_cb_size;
439
700k
            }
440
441
7.44M
            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.44M
            target_update(nt[j]+subvect_size*(i+1), g, r+q, nsf-subvect_size*(i+1));
448
7.44M
         }
449
450
7.36M
         for (q=0;q<nb_subvect;q++)
451
6.35M
            nind[j][q]=oind[best_ntarget[j]][q];
452
1.01M
         nind[j][i]=best_nind[j];
453
1.01M
      }
454
455
      /*update old-new data*/
456
      /* just swap pointers instead of a long copy */
457
239k
      {
458
239k
         spx_word16_t **tmp2;
459
239k
         tmp2=ot;
460
239k
         ot=nt;
461
239k
         nt=tmp2;
462
239k
      }
463
1.25M
      for (j=0;j<N;j++)
464
7.36M
         for (m=0;m<nb_subvect;m++)
465
6.35M
            oind[j][m]=nind[j][m];
466
1.25M
      for (j=0;j<N;j++)
467
1.01M
         odist[j]=ndist[j];
468
239k
   }
469
470
   /*save indices*/
471
282k
   for (i=0;i<nb_subvect;i++)
472
239k
   {
473
239k
      ind[i]=nind[0][i];
474
239k
      speex_bits_pack(bits,ind[i],params->shape_bits+have_sign);
475
239k
   }
476
477
   /* Put everything back together */
478
282k
   for (i=0;i<nb_subvect;i++)
479
239k
   {
480
239k
      int rind;
481
239k
      spx_word16_t sign=1;
482
239k
      rind = ind[i];
483
239k
      if (rind>=shape_cb_size)
484
23.4k
      {
485
23.4k
         sign=-1;
486
23.4k
         rind-=shape_cb_size;
487
23.4k
      }
488
#ifdef FIXED_POINT
489
167k
      if (sign==1)
490
153k
      {
491
1.26M
         for (j=0;j<subvect_size;j++)
492
1.11M
            e[subvect_size*i+j]=SHL32(EXTEND32(shape_cb[rind*subvect_size+j]),SIG_SHIFT-5);
493
153k
      } else {
494
131k
         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
593k
      for (j=0;j<subvect_size;j++)
499
521k
         e[subvect_size*i+j]=sign*0.03125*shape_cb[rind*subvect_size+j];
500
#endif
501
239k
   }
502
   /* Update excitation */
503
1.79M
   for (j=0;j<nsf;j++)
504
1.75M
      exc[j]=ADD32(exc[j],e[j]);
505
506
   /* Update target: only update target if necessary */
507
43.7k
   if (update_target)
508
3.71k
   {
509
3.71k
      VARDECL(spx_word16_t *r2);
510
3.71k
      ALLOC(r2, nsf, spx_word16_t);
511
152k
      for (j=0;j<nsf;j++)
512
148k
         r2[j] = EXTRACT16(PSHR32(e[j] ,6));
513
3.71k
      syn_percep_zero16(r2, ak, awk1, awk2, r2, nsf,p, stack);
514
152k
      for (j=0;j<nsf;j++)
515
148k
         target[j]=SUB16(target[j],PSHR16(r2[j],2));
516
3.71k
   }
517
43.7k
}
split_cb_search_shape_sign
Line
Count
Source
261
18.0k
{
262
18.0k
   int i,j,k,m,n,q;
263
18.0k
   VARDECL(spx_word16_t *resp);
264
18.0k
#ifdef _USE_SSE
265
18.0k
   VARDECL(__m128 *resp2);
266
18.0k
   VARDECL(__m128 *E);
267
#else
268
   spx_word16_t *resp2;
269
   VARDECL(spx_word32_t *E);
270
#endif
271
18.0k
   VARDECL(spx_word16_t *t);
272
18.0k
   VARDECL(spx_sig_t *e);
273
18.0k
   VARDECL(spx_word16_t *tmp);
274
18.0k
   VARDECL(spx_word32_t *ndist);
275
18.0k
   VARDECL(spx_word32_t *odist);
276
18.0k
   VARDECL(int *itmp);
277
18.0k
   VARDECL(spx_word16_t **ot2);
278
18.0k
   VARDECL(spx_word16_t **nt2);
279
18.0k
   spx_word16_t **ot, **nt;
280
18.0k
   VARDECL(int **nind);
281
18.0k
   VARDECL(int **oind);
282
18.0k
   VARDECL(int *ind);
283
18.0k
   const signed char *shape_cb;
284
18.0k
   int shape_cb_size, subvect_size, nb_subvect;
285
18.0k
   const split_cb_params *params;
286
18.0k
   int N=2;
287
18.0k
   VARDECL(int *best_index);
288
18.0k
   VARDECL(spx_word32_t *best_dist);
289
18.0k
   VARDECL(int *best_nind);
290
18.0k
   VARDECL(int *best_ntarget);
291
18.0k
   int have_sign;
292
18.0k
   N=complexity;
293
18.0k
   if (N>10)
294
0
      N=10;
295
   /* Complexity isn't as important for the codebooks as it is for the pitch */
296
18.0k
   N=(2*N)/3;
297
18.0k
   if (N<1)
298
3.82k
      N=1;
299
18.0k
   if (N==1)
300
5.04k
   {
301
5.04k
      split_cb_search_shape_sign_N1(target,ak,awk1,awk2,par,p,nsf,exc,r,bits,stack,update_target);
302
5.04k
      return;
303
5.04k
   }
304
13.0k
   ALLOC(ot2, N, spx_word16_t*);
305
13.0k
   ALLOC(nt2, N, spx_word16_t*);
306
13.0k
   ALLOC(oind, N, int*);
307
13.0k
   ALLOC(nind, N, int*);
308
309
13.0k
   params = (const split_cb_params *) par;
310
13.0k
   subvect_size = params->subvect_size;
311
13.0k
   nb_subvect = params->nb_subvect;
312
13.0k
   shape_cb_size = 1<<params->shape_bits;
313
13.0k
   shape_cb = params->shape_cb;
314
13.0k
   have_sign = params->have_sign;
315
13.0k
   ALLOC(resp, shape_cb_size*subvect_size, spx_word16_t);
316
13.0k
#ifdef _USE_SSE
317
13.0k
   ALLOC(resp2, (shape_cb_size*subvect_size)>>2, __m128);
318
13.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
13.0k
   ALLOC(t, nsf, spx_word16_t);
324
13.0k
   ALLOC(e, nsf, spx_sig_t);
325
13.0k
   ALLOC(ind, nb_subvect, int);
326
327
13.0k
   ALLOC(tmp, 2*N*nsf, spx_word16_t);
328
71.8k
   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
13.0k
   ot=ot2;
334
13.0k
   nt=nt2;
335
13.0k
   ALLOC(best_index, N, int);
336
13.0k
   ALLOC(best_dist, N, spx_word32_t);
337
13.0k
   ALLOC(best_nind, N, int);
338
13.0k
   ALLOC(best_ntarget, N, int);
339
13.0k
   ALLOC(ndist, N, spx_word32_t);
340
13.0k
   ALLOC(odist, N, spx_word32_t);
341
342
13.0k
   ALLOC(itmp, 2*N*nb_subvect, int);
343
71.8k
   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
13.0k
   SPEEX_COPY(t, target, nsf);
350
351
71.8k
   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
13.0k
   compute_weighted_codebook(shape_cb, r, resp, resp2, E, shape_cb_size, subvect_size, stack);
356
357
71.8k
   for (j=0;j<N;j++)
358
58.7k
      odist[j]=0;
359
360
   /*For all subvectors*/
361
84.3k
   for (i=0;i<nb_subvect;i++)
362
71.3k
   {
363
      /*"erase" nbest list*/
364
388k
      for (j=0;j<N;j++)
365
317k
         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
388k
      for (j=0;j<N;j++)
370
317k
         best_nind[j] = best_ntarget[j] = 0;
371
      /*For all n-bests of previous subvector*/
372
329k
      for (j=0;j<N;j++)
373
271k
      {
374
271k
         spx_word16_t *x=ot[j]+subvect_size*i;
375
271k
         spx_word32_t tener = 0;
376
2.19M
         for (m=0;m<subvect_size;m++)
377
1.92M
            tener = MAC16_16(tener, x[m],x[m]);
378
#ifdef FIXED_POINT
379
         tener = SHR32(tener,1);
380
#else
381
271k
         tener *= .5;
382
271k
#endif
383
         /*Find new n-best based on previous n-best j*/
384
271k
#ifndef DISABLE_WIDEBAND
385
271k
         if (have_sign)
386
38.0k
            vq_nbest_sign(x, resp2, subvect_size, shape_cb_size, E, N, best_index, best_dist, stack);
387
233k
         else
388
233k
#endif /* DISABLE_WIDEBAND */
389
233k
            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.59M
         for (k=0;k<N;k++)
393
1.32M
         {
394
            /* Compute total distance (including previous sub-vectors */
395
1.32M
            spx_word32_t err = ADD32(ADD32(odist[j],best_dist[k]),tener);
396
397
            /*update n-best list*/
398
1.32M
            if (err<ndist[N-1])
399
500k
            {
400
1.62M
               for (m=0;m<N;m++)
401
1.62M
               {
402
1.62M
                  if (err < ndist[m])
403
500k
                  {
404
1.37M
                     for (n=N-1;n>m;n--)
405
875k
                     {
406
875k
                        ndist[n] = ndist[n-1];
407
875k
                        best_nind[n] = best_nind[n-1];
408
875k
                        best_ntarget[n] = best_ntarget[n-1];
409
875k
                     }
410
                     /* n is equal to m here, so they're interchangeable */
411
500k
                     ndist[m] = err;
412
500k
                     best_nind[n] = best_index[k];
413
500k
                     best_ntarget[n] = j;
414
500k
                     break;
415
500k
                  }
416
1.62M
               }
417
500k
            }
418
1.32M
         }
419
271k
         if (i==0)
420
13.0k
            break;
421
271k
      }
422
388k
      for (j=0;j<N;j++)
423
317k
      {
424
         /*previous target (we don't care what happened before*/
425
5.48M
         for (m=(i+1)*subvect_size;m<nsf;m++)
426
5.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
2.66M
         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
238k
            {
437
238k
               sign=-1;
438
238k
               rind-=shape_cb_size;
439
238k
            }
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.31M
         for (q=0;q<nb_subvect;q++)
451
1.99M
            nind[j][q]=oind[best_ntarget[j]][q];
452
317k
         nind[j][i]=best_nind[j];
453
317k
      }
454
455
      /*update old-new data*/
456
      /* just swap pointers instead of a long copy */
457
71.3k
      {
458
71.3k
         spx_word16_t **tmp2;
459
71.3k
         tmp2=ot;
460
71.3k
         ot=nt;
461
71.3k
         nt=tmp2;
462
71.3k
      }
463
388k
      for (j=0;j<N;j++)
464
2.31M
         for (m=0;m<nb_subvect;m++)
465
1.99M
            oind[j][m]=nind[j][m];
466
388k
      for (j=0;j<N;j++)
467
317k
         odist[j]=ndist[j];
468
71.3k
   }
469
470
   /*save indices*/
471
84.3k
   for (i=0;i<nb_subvect;i++)
472
71.3k
   {
473
71.3k
      ind[i]=nind[0][i];
474
71.3k
      speex_bits_pack(bits,ind[i],params->shape_bits+have_sign);
475
71.3k
   }
476
477
   /* Put everything back together */
478
84.3k
   for (i=0;i<nb_subvect;i++)
479
71.3k
   {
480
71.3k
      int rind;
481
71.3k
      spx_word16_t sign=1;
482
71.3k
      rind = ind[i];
483
71.3k
      if (rind>=shape_cb_size)
484
8.90k
      {
485
8.90k
         sign=-1;
486
8.90k
         rind-=shape_cb_size;
487
8.90k
      }
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
593k
      for (j=0;j<subvect_size;j++)
499
521k
         e[subvect_size*i+j]=sign*0.03125*shape_cb[rind*subvect_size+j];
500
71.3k
#endif
501
71.3k
   }
502
   /* Update excitation */
503
534k
   for (j=0;j<nsf;j++)
504
521k
      exc[j]=ADD32(exc[j],e[j]);
505
506
   /* Update target: only update target if necessary */
507
13.0k
   if (update_target)
508
1.34k
   {
509
1.34k
      VARDECL(spx_word16_t *r2);
510
1.34k
      ALLOC(r2, nsf, spx_word16_t);
511
55.2k
      for (j=0;j<nsf;j++)
512
53.9k
         r2[j] = EXTRACT16(PSHR32(e[j] ,6));
513
1.34k
      syn_percep_zero16(r2, ak, awk1, awk2, r2, nsf,p, stack);
514
55.2k
      for (j=0;j<nsf;j++)
515
53.9k
         target[j]=SUB16(target[j],PSHR16(r2[j],2));
516
1.34k
   }
517
13.0k
}
split_cb_search_shape_sign
Line
Count
Source
261
45.9k
{
262
45.9k
   int i,j,k,m,n,q;
263
45.9k
   VARDECL(spx_word16_t *resp);
264
#ifdef _USE_SSE
265
   VARDECL(__m128 *resp2);
266
   VARDECL(__m128 *E);
267
#else
268
45.9k
   spx_word16_t *resp2;
269
45.9k
   VARDECL(spx_word32_t *E);
270
45.9k
#endif
271
45.9k
   VARDECL(spx_word16_t *t);
272
45.9k
   VARDECL(spx_sig_t *e);
273
45.9k
   VARDECL(spx_word16_t *tmp);
274
45.9k
   VARDECL(spx_word32_t *ndist);
275
45.9k
   VARDECL(spx_word32_t *odist);
276
45.9k
   VARDECL(int *itmp);
277
45.9k
   VARDECL(spx_word16_t **ot2);
278
45.9k
   VARDECL(spx_word16_t **nt2);
279
45.9k
   spx_word16_t **ot, **nt;
280
45.9k
   VARDECL(int **nind);
281
45.9k
   VARDECL(int **oind);
282
45.9k
   VARDECL(int *ind);
283
45.9k
   const signed char *shape_cb;
284
45.9k
   int shape_cb_size, subvect_size, nb_subvect;
285
45.9k
   const split_cb_params *params;
286
45.9k
   int N=2;
287
45.9k
   VARDECL(int *best_index);
288
45.9k
   VARDECL(spx_word32_t *best_dist);
289
45.9k
   VARDECL(int *best_nind);
290
45.9k
   VARDECL(int *best_ntarget);
291
45.9k
   int have_sign;
292
45.9k
   N=complexity;
293
45.9k
   if (N>10)
294
0
      N=10;
295
   /* Complexity isn't as important for the codebooks as it is for the pitch */
296
45.9k
   N=(2*N)/3;
297
45.9k
   if (N<1)
298
10.2k
      N=1;
299
45.9k
   if (N==1)
300
15.2k
   {
301
15.2k
      split_cb_search_shape_sign_N1(target,ak,awk1,awk2,par,p,nsf,exc,r,bits,stack,update_target);
302
15.2k
      return;
303
15.2k
   }
304
30.7k
   ALLOC(ot2, N, spx_word16_t*);
305
30.7k
   ALLOC(nt2, N, spx_word16_t*);
306
30.7k
   ALLOC(oind, N, int*);
307
30.7k
   ALLOC(nind, N, int*);
308
309
30.7k
   params = (const split_cb_params *) par;
310
30.7k
   subvect_size = params->subvect_size;
311
30.7k
   nb_subvect = params->nb_subvect;
312
30.7k
   shape_cb_size = 1<<params->shape_bits;
313
30.7k
   shape_cb = params->shape_cb;
314
30.7k
   have_sign = params->have_sign;
315
30.7k
   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
30.7k
   resp2 = resp;
321
30.7k
   ALLOC(E, shape_cb_size, spx_word32_t);
322
30.7k
#endif
323
30.7k
   ALLOC(t, nsf, spx_word16_t);
324
30.7k
   ALLOC(e, nsf, spx_sig_t);
325
30.7k
   ALLOC(ind, nb_subvect, int);
326
327
30.7k
   ALLOC(tmp, 2*N*nsf, spx_word16_t);
328
158k
   for (i=0;i<N;i++)
329
127k
   {
330
127k
      ot2[i]=tmp+2*i*nsf;
331
127k
      nt2[i]=tmp+(2*i+1)*nsf;
332
127k
   }
333
30.7k
   ot=ot2;
334
30.7k
   nt=nt2;
335
30.7k
   ALLOC(best_index, N, int);
336
30.7k
   ALLOC(best_dist, N, spx_word32_t);
337
30.7k
   ALLOC(best_nind, N, int);
338
30.7k
   ALLOC(best_ntarget, N, int);
339
30.7k
   ALLOC(ndist, N, spx_word32_t);
340
30.7k
   ALLOC(odist, N, spx_word32_t);
341
342
30.7k
   ALLOC(itmp, 2*N*nb_subvect, int);
343
158k
   for (i=0;i<N;i++)
344
127k
   {
345
127k
      nind[i]=itmp+2*i*nb_subvect;
346
127k
      oind[i]=itmp+(2*i+1)*nb_subvect;
347
127k
   }
348
349
30.7k
   SPEEX_COPY(t, target, nsf);
350
351
158k
   for (j=0;j<N;j++)
352
127k
      SPEEX_COPY(&ot[j][0], t, nsf);
353
354
   /* Pre-compute codewords response and energy */
355
30.7k
   compute_weighted_codebook(shape_cb, r, resp, resp2, E, shape_cb_size, subvect_size, stack);
356
357
158k
   for (j=0;j<N;j++)
358
127k
      odist[j]=0;
359
360
   /*For all subvectors*/
361
198k
   for (i=0;i<nb_subvect;i++)
362
167k
   {
363
      /*"erase" nbest list*/
364
863k
      for (j=0;j<N;j++)
365
695k
         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
863k
      for (j=0;j<N;j++)
370
695k
         best_nind[j] = best_ntarget[j] = 0;
371
      /*For all n-bests of previous subvector*/
372
735k
      for (j=0;j<N;j++)
373
598k
      {
374
598k
         spx_word16_t *x=ot[j]+subvect_size*i;
375
598k
         spx_word32_t tener = 0;
376
4.83M
         for (m=0;m<subvect_size;m++)
377
4.23M
            tener = MAC16_16(tener, x[m],x[m]);
378
598k
#ifdef FIXED_POINT
379
598k
         tener = SHR32(tener,1);
380
#else
381
         tener *= .5;
382
#endif
383
         /*Find new n-best based on previous n-best j*/
384
598k
#ifndef DISABLE_WIDEBAND
385
598k
         if (have_sign)
386
71.2k
            vq_nbest_sign(x, resp2, subvect_size, shape_cb_size, E, N, best_index, best_dist, stack);
387
527k
         else
388
527k
#endif /* DISABLE_WIDEBAND */
389
527k
            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.31M
         for (k=0;k<N;k++)
393
2.71M
         {
394
            /* Compute total distance (including previous sub-vectors */
395
2.71M
            spx_word32_t err = ADD32(ADD32(odist[j],best_dist[k]),tener);
396
397
            /*update n-best list*/
398
2.71M
            if (err<ndist[N-1])
399
1.08M
            {
400
3.30M
               for (m=0;m<N;m++)
401
3.30M
               {
402
3.30M
                  if (err < ndist[m])
403
1.08M
                  {
404
2.83M
                     for (n=N-1;n>m;n--)
405
1.74M
                     {
406
1.74M
                        ndist[n] = ndist[n-1];
407
1.74M
                        best_nind[n] = best_nind[n-1];
408
1.74M
                        best_ntarget[n] = best_ntarget[n-1];
409
1.74M
                     }
410
                     /* n is equal to m here, so they're interchangeable */
411
1.08M
                     ndist[m] = err;
412
1.08M
                     best_nind[n] = best_index[k];
413
1.08M
                     best_ntarget[n] = j;
414
1.08M
                     break;
415
1.08M
                  }
416
3.30M
               }
417
1.08M
            }
418
2.71M
         }
419
598k
         if (i==0)
420
30.7k
            break;
421
598k
      }
422
863k
      for (j=0;j<N;j++)
423
695k
      {
424
         /*previous target (we don't care what happened before*/
425
12.0M
         for (m=(i+1)*subvect_size;m<nsf;m++)
426
11.3M
            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.79M
         for (m=0;m<subvect_size;m++)
430
5.09M
         {
431
5.09M
            spx_word16_t g;
432
5.09M
            int rind;
433
5.09M
            spx_word16_t sign=1;
434
5.09M
            rind = best_nind[j];
435
5.09M
            if (rind>=shape_cb_size)
436
462k
            {
437
462k
               sign=-1;
438
462k
               rind-=shape_cb_size;
439
462k
            }
440
441
5.09M
            q=subvect_size-m;
442
5.09M
#ifdef FIXED_POINT
443
5.09M
            g=sign*shape_cb[rind*subvect_size+m];
444
#else
445
            g=sign*0.03125*shape_cb[rind*subvect_size+m];
446
#endif
447
5.09M
            target_update(nt[j]+subvect_size*(i+1), g, r+q, nsf-subvect_size*(i+1));
448
5.09M
         }
449
450
5.05M
         for (q=0;q<nb_subvect;q++)
451
4.35M
            nind[j][q]=oind[best_ntarget[j]][q];
452
695k
         nind[j][i]=best_nind[j];
453
695k
      }
454
455
      /*update old-new data*/
456
      /* just swap pointers instead of a long copy */
457
167k
      {
458
167k
         spx_word16_t **tmp2;
459
167k
         tmp2=ot;
460
167k
         ot=nt;
461
167k
         nt=tmp2;
462
167k
      }
463
863k
      for (j=0;j<N;j++)
464
5.05M
         for (m=0;m<nb_subvect;m++)
465
4.35M
            oind[j][m]=nind[j][m];
466
863k
      for (j=0;j<N;j++)
467
695k
         odist[j]=ndist[j];
468
167k
   }
469
470
   /*save indices*/
471
198k
   for (i=0;i<nb_subvect;i++)
472
167k
   {
473
167k
      ind[i]=nind[0][i];
474
167k
      speex_bits_pack(bits,ind[i],params->shape_bits+have_sign);
475
167k
   }
476
477
   /* Put everything back together */
478
198k
   for (i=0;i<nb_subvect;i++)
479
167k
   {
480
167k
      int rind;
481
167k
      spx_word16_t sign=1;
482
167k
      rind = ind[i];
483
167k
      if (rind>=shape_cb_size)
484
14.5k
      {
485
14.5k
         sign=-1;
486
14.5k
         rind-=shape_cb_size;
487
14.5k
      }
488
167k
#ifdef FIXED_POINT
489
167k
      if (sign==1)
490
153k
      {
491
1.26M
         for (j=0;j<subvect_size;j++)
492
1.11M
            e[subvect_size*i+j]=SHL32(EXTEND32(shape_cb[rind*subvect_size+j]),SIG_SHIFT-5);
493
153k
      } else {
494
131k
         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
167k
   }
502
   /* Update excitation */
503
1.25M
   for (j=0;j<nsf;j++)
504
1.22M
      exc[j]=ADD32(exc[j],e[j]);
505
506
   /* Update target: only update target if necessary */
507
30.7k
   if (update_target)
508
2.36k
   {
509
2.36k
      VARDECL(spx_word16_t *r2);
510
2.36k
      ALLOC(r2, nsf, spx_word16_t);
511
96.9k
      for (j=0;j<nsf;j++)
512
94.5k
         r2[j] = EXTRACT16(PSHR32(e[j] ,6));
513
2.36k
      syn_percep_zero16(r2, ak, awk1, awk2, r2, nsf,p, stack);
514
96.9k
      for (j=0;j<nsf;j++)
515
94.5k
         target[j]=SUB16(target[j],PSHR16(r2[j],2));
516
2.36k
   }
517
30.7k
}
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
102k
{
530
102k
   int i,j;
531
102k
   VARDECL(int *ind);
532
102k
   VARDECL(int *signs);
533
102k
   const signed char *shape_cb;
534
102k
   int subvect_size, nb_subvect;
535
102k
   const split_cb_params *params;
536
102k
   int have_sign;
537
538
102k
   params = (const split_cb_params *) par;
539
102k
   subvect_size = params->subvect_size;
540
102k
   nb_subvect = params->nb_subvect;
541
542
102k
   shape_cb = params->shape_cb;
543
102k
   have_sign = params->have_sign;
544
545
102k
   ALLOC(ind, nb_subvect, int);
546
102k
   ALLOC(signs, nb_subvect, int);
547
548
   /* Decode codewords and gains */
549
623k
   for (i=0;i<nb_subvect;i++)
550
520k
   {
551
520k
      if (have_sign)
552
80.4k
         signs[i] = speex_bits_unpack_unsigned(bits, 1);
553
440k
      else
554
440k
         signs[i] = 0;
555
520k
      ind[i] = speex_bits_unpack_unsigned(bits, params->shape_bits);
556
520k
   }
557
   /* Compute decoded excitation */
558
623k
   for (i=0;i<nb_subvect;i++)
559
520k
   {
560
520k
      spx_word16_t s=1;
561
520k
      if (signs[i])
562
1.47k
         s=-1;
563
#ifdef FIXED_POINT
564
301k
      if (s==1)
565
300k
      {
566
2.61M
         for (j=0;j<subvect_size;j++)
567
2.31M
            exc[subvect_size*i+j]=SHL32(EXTEND32(shape_cb[ind[i]*subvect_size+j]),SIG_SHIFT-5);
568
300k
      } else {
569
8.62k
         for (j=0;j<subvect_size;j++)
570
7.66k
            exc[subvect_size*i+j]=NEG32(SHL32(EXTEND32(shape_cb[ind[i]*subvect_size+j]),SIG_SHIFT-5));
571
958
      }
572
#else
573
1.98M
      for (j=0;j<subvect_size;j++)
574
1.76M
         exc[subvect_size*i+j]+=s*0.03125*shape_cb[ind[i]*subvect_size+j];
575
#endif
576
520k
   }
577
102k
}
split_cb_shape_sign_unquant
Line
Count
Source
529
44.1k
{
530
44.1k
   int i,j;
531
44.1k
   VARDECL(int *ind);
532
44.1k
   VARDECL(int *signs);
533
44.1k
   const signed char *shape_cb;
534
44.1k
   int subvect_size, nb_subvect;
535
44.1k
   const split_cb_params *params;
536
44.1k
   int have_sign;
537
538
44.1k
   params = (const split_cb_params *) par;
539
44.1k
   subvect_size = params->subvect_size;
540
44.1k
   nb_subvect = params->nb_subvect;
541
542
44.1k
   shape_cb = params->shape_cb;
543
44.1k
   have_sign = params->have_sign;
544
545
44.1k
   ALLOC(ind, nb_subvect, int);
546
44.1k
   ALLOC(signs, nb_subvect, int);
547
548
   /* Decode codewords and gains */
549
263k
   for (i=0;i<nb_subvect;i++)
550
219k
   {
551
219k
      if (have_sign)
552
34.8k
         signs[i] = speex_bits_unpack_unsigned(bits, 1);
553
184k
      else
554
184k
         signs[i] = 0;
555
219k
      ind[i] = speex_bits_unpack_unsigned(bits, params->shape_bits);
556
219k
   }
557
   /* Compute decoded excitation */
558
263k
   for (i=0;i<nb_subvect;i++)
559
219k
   {
560
219k
      spx_word16_t s=1;
561
219k
      if (signs[i])
562
516
         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.98M
      for (j=0;j<subvect_size;j++)
574
1.76M
         exc[subvect_size*i+j]+=s*0.03125*shape_cb[ind[i]*subvect_size+j];
575
219k
#endif
576
219k
   }
577
44.1k
}
split_cb_shape_sign_unquant
Line
Count
Source
529
58.0k
{
530
58.0k
   int i,j;
531
58.0k
   VARDECL(int *ind);
532
58.0k
   VARDECL(int *signs);
533
58.0k
   const signed char *shape_cb;
534
58.0k
   int subvect_size, nb_subvect;
535
58.0k
   const split_cb_params *params;
536
58.0k
   int have_sign;
537
538
58.0k
   params = (const split_cb_params *) par;
539
58.0k
   subvect_size = params->subvect_size;
540
58.0k
   nb_subvect = params->nb_subvect;
541
542
58.0k
   shape_cb = params->shape_cb;
543
58.0k
   have_sign = params->have_sign;
544
545
58.0k
   ALLOC(ind, nb_subvect, int);
546
58.0k
   ALLOC(signs, nb_subvect, int);
547
548
   /* Decode codewords and gains */
549
359k
   for (i=0;i<nb_subvect;i++)
550
301k
   {
551
301k
      if (have_sign)
552
45.6k
         signs[i] = speex_bits_unpack_unsigned(bits, 1);
553
256k
      else
554
256k
         signs[i] = 0;
555
301k
      ind[i] = speex_bits_unpack_unsigned(bits, params->shape_bits);
556
301k
   }
557
   /* Compute decoded excitation */
558
359k
   for (i=0;i<nb_subvect;i++)
559
301k
   {
560
301k
      spx_word16_t s=1;
561
301k
      if (signs[i])
562
958
         s=-1;
563
301k
#ifdef FIXED_POINT
564
301k
      if (s==1)
565
300k
      {
566
2.61M
         for (j=0;j<subvect_size;j++)
567
2.31M
            exc[subvect_size*i+j]=SHL32(EXTEND32(shape_cb[ind[i]*subvect_size+j]),SIG_SHIFT-5);
568
300k
      } else {
569
8.62k
         for (j=0;j<subvect_size;j++)
570
7.66k
            exc[subvect_size*i+j]=NEG32(SHL32(EXTEND32(shape_cb[ind[i]*subvect_size+j]),SIG_SHIFT-5));
571
958
      }
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
301k
   }
577
58.0k
}
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.5k
{
597
97.5k
   int i;
598
97.5k
   VARDECL(spx_word16_t *tmp);
599
97.5k
   ALLOC(tmp, nsf, spx_word16_t);
600
97.5k
   residue_percep_zero16(target, ak, awk1, awk2, tmp, nsf, p, stack);
601
602
3.99M
   for (i=0;i<nsf;i++)
603
3.90M
      exc[i]+=SHL32(EXTEND32(tmp[i]),8);
604
97.5k
   SPEEX_MEMSET(target, 0, nsf);
605
97.5k
}
noise_codebook_quant
Line
Count
Source
596
48.7k
{
597
48.7k
   int i;
598
48.7k
   VARDECL(spx_word16_t *tmp);
599
48.7k
   ALLOC(tmp, nsf, spx_word16_t);
600
48.7k
   residue_percep_zero16(target, ak, awk1, awk2, tmp, nsf, p, stack);
601
602
1.99M
   for (i=0;i<nsf;i++)
603
1.95M
      exc[i]+=SHL32(EXTEND32(tmp[i]),8);
604
48.7k
   SPEEX_MEMSET(target, 0, nsf);
605
48.7k
}
noise_codebook_quant
Line
Count
Source
596
48.7k
{
597
48.7k
   int i;
598
48.7k
   VARDECL(spx_word16_t *tmp);
599
48.7k
   ALLOC(tmp, nsf, spx_word16_t);
600
48.7k
   residue_percep_zero16(target, ak, awk1, awk2, tmp, nsf, p, stack);
601
602
1.99M
   for (i=0;i<nsf;i++)
603
1.95M
      exc[i]+=SHL32(EXTEND32(tmp[i]),8);
604
48.7k
   SPEEX_MEMSET(target, 0, nsf);
605
48.7k
}
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.6k
{
618
35.6k
   int i;
619
   /* FIXME: This is bad, but I don't think the function ever gets called anyway */
620
1.46M
   for (i=0;i<nsf;i++)
621
1.42M
      exc[i]=SHL32(EXTEND32(speex_rand(1, seed)),SIG_SHIFT);
622
35.6k
}
noise_codebook_unquant
Line
Count
Source
617
17.8k
{
618
17.8k
   int i;
619
   /* FIXME: This is bad, but I don't think the function ever gets called anyway */
620
730k
   for (i=0;i<nsf;i++)
621
712k
      exc[i]=SHL32(EXTEND32(speex_rand(1, seed)),SIG_SHIFT);
622
17.8k
}
noise_codebook_unquant
Line
Count
Source
617
17.8k
{
618
17.8k
   int i;
619
   /* FIXME: This is bad, but I don't think the function ever gets called anyway */
620
730k
   for (i=0;i<nsf;i++)
621
712k
      exc[i]=SHL32(EXTEND32(speex_rand(1, seed)),SIG_SHIFT);
622
17.8k
}
623
#endif /* DISABLE_DECODER */