/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 | } 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 | } |
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 | } 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 | } |
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 */ |