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