/proc/self/cwd/libfaad/tns.c
Line | Count | Source |
1 | | /* |
2 | | ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding |
3 | | ** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com |
4 | | ** |
5 | | ** This program is free software; you can redistribute it and/or modify |
6 | | ** it under the terms of the GNU General Public License as published by |
7 | | ** the Free Software Foundation; either version 2 of the License, or |
8 | | ** (at your option) any later version. |
9 | | ** |
10 | | ** This program is distributed in the hope that it will be useful, |
11 | | ** but WITHOUT ANY WARRANTY; without even the implied warranty of |
12 | | ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
13 | | ** GNU General Public License for more details. |
14 | | ** |
15 | | ** You should have received a copy of the GNU General Public License |
16 | | ** along with this program; if not, write to the Free Software |
17 | | ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. |
18 | | ** |
19 | | ** Any non-GPL usage of this software or parts of this software is strictly |
20 | | ** forbidden. |
21 | | ** |
22 | | ** The "appropriate copyright message" mentioned in section 2c of the GPLv2 |
23 | | ** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" |
24 | | ** |
25 | | ** Commercial non-GPL licensing of this software is possible. |
26 | | ** For more info contact Nero AG through Mpeg4AAClicense@nero.com. |
27 | | ** |
28 | | ** $Id: tns.c,v 1.40 2007/11/01 12:33:40 menno Exp $ |
29 | | **/ |
30 | | |
31 | | #include "common.h" |
32 | | #include "structs.h" |
33 | | |
34 | | #include "syntax.h" |
35 | | #include "tns.h" |
36 | | |
37 | | |
38 | | /* static function declarations */ |
39 | | /* returns exp */ |
40 | | static uint8_t tns_decode_coef(uint8_t order, uint8_t coef_res_bits, |
41 | | uint8_t coef_compress, uint8_t *coef, real_t *a); |
42 | | static void tns_ar_filter(real_t *spectrum, uint16_t size, int8_t inc, real_t *lpc, |
43 | | uint8_t order, uint8_t exp); |
44 | | static void tns_ma_filter(real_t *spectrum, uint16_t size, int8_t inc, real_t *lpc, |
45 | | uint8_t order, uint8_t exp); |
46 | | |
47 | | |
48 | | #ifdef _MSC_VER |
49 | | #pragma warning(disable:4305) |
50 | | #pragma warning(disable:4244) |
51 | | #endif |
52 | | static real_t tns_coef_0_3[] = |
53 | | { |
54 | | COEF_CONST(0.0), COEF_CONST(0.4338837391), COEF_CONST(0.7818314825), COEF_CONST(0.9749279122), |
55 | | COEF_CONST(-0.9848077530), COEF_CONST(-0.8660254038), COEF_CONST(-0.6427876097), COEF_CONST(-0.3420201433), |
56 | | COEF_CONST(-0.4338837391), COEF_CONST(-0.7818314825), COEF_CONST(-0.9749279122), COEF_CONST(-0.9749279122), |
57 | | COEF_CONST(-0.9848077530), COEF_CONST(-0.8660254038), COEF_CONST(-0.6427876097), COEF_CONST(-0.3420201433) |
58 | | }; |
59 | | static real_t tns_coef_0_4[] = |
60 | | { |
61 | | COEF_CONST(0.0), COEF_CONST(0.2079116908), COEF_CONST(0.4067366431), COEF_CONST(0.5877852523), |
62 | | COEF_CONST(0.7431448255), COEF_CONST(0.8660254038), COEF_CONST(0.9510565163), COEF_CONST(0.9945218954), |
63 | | COEF_CONST(-0.9957341763), COEF_CONST(-0.9618256432), COEF_CONST(-0.8951632914), COEF_CONST(-0.7980172273), |
64 | | COEF_CONST(-0.6736956436), COEF_CONST(-0.5264321629), COEF_CONST(-0.3612416662), COEF_CONST(-0.1837495178) |
65 | | }; |
66 | | static real_t tns_coef_1_3[] = |
67 | | { |
68 | | COEF_CONST(0.0), COEF_CONST(0.4338837391), COEF_CONST(-0.6427876097), COEF_CONST(-0.3420201433), |
69 | | COEF_CONST(0.9749279122), COEF_CONST(0.7818314825), COEF_CONST(-0.6427876097), COEF_CONST(-0.3420201433), |
70 | | COEF_CONST(-0.4338837391), COEF_CONST(-0.7818314825), COEF_CONST(-0.6427876097), COEF_CONST(-0.3420201433), |
71 | | COEF_CONST(-0.7818314825), COEF_CONST(-0.4338837391), COEF_CONST(-0.6427876097), COEF_CONST(-0.3420201433) |
72 | | }; |
73 | | static real_t tns_coef_1_4[] = |
74 | | { |
75 | | COEF_CONST(0.0), COEF_CONST(0.2079116908), COEF_CONST(0.4067366431), COEF_CONST(0.5877852523), |
76 | | COEF_CONST(-0.6736956436), COEF_CONST(-0.5264321629), COEF_CONST(-0.3612416662), COEF_CONST(-0.1837495178), |
77 | | COEF_CONST(0.9945218954), COEF_CONST(0.9510565163), COEF_CONST(0.8660254038), COEF_CONST(0.7431448255), |
78 | | COEF_CONST(-0.6736956436), COEF_CONST(-0.5264321629), COEF_CONST(-0.3612416662), COEF_CONST(-0.1837495178) |
79 | | }; |
80 | | |
81 | | static real_t* all_tns_coefs[] = {tns_coef_0_3, tns_coef_0_4, tns_coef_1_3, tns_coef_1_4}; |
82 | | |
83 | | /* TNS decoding for one channel and frame */ |
84 | | void tns_decode_frame(ic_stream *ics, tns_info *tns, uint8_t sr_index, |
85 | | uint8_t object_type, real_t *spec, uint16_t frame_len) |
86 | 625k | { |
87 | 625k | uint8_t w, f, tns_order; |
88 | 625k | int8_t inc; |
89 | 625k | int16_t size; |
90 | 625k | uint16_t bottom, top, start, end; |
91 | 625k | uint16_t nshort = frame_len/8; |
92 | 625k | real_t lpc[TNS_MAX_ORDER+1]; |
93 | 625k | uint8_t exp; |
94 | | |
95 | 625k | if (!ics->tns_data_present) |
96 | 588k | return; |
97 | | |
98 | 109k | for (w = 0; w < ics->num_windows; w++) |
99 | 73.5k | { |
100 | 73.5k | bottom = ics->num_swb; |
101 | | |
102 | 107k | for (f = 0; f < tns->n_filt[w]; f++) |
103 | 34.4k | { |
104 | 34.4k | top = bottom; |
105 | 34.4k | bottom = max(top - tns->length[w][f], 0); |
106 | 34.4k | tns_order = min(tns->order[w][f], TNS_MAX_ORDER); |
107 | 34.4k | if (!tns_order) |
108 | 13.5k | continue; |
109 | | |
110 | 20.9k | exp = tns_decode_coef(tns_order, tns->coef_res[w]+3, |
111 | 20.9k | tns->coef_compress[w][f], tns->coef[w][f], lpc); |
112 | | |
113 | 20.9k | start = min(bottom, max_tns_sfb(sr_index, object_type, (ics->window_sequence == EIGHT_SHORT_SEQUENCE))); |
114 | 20.9k | start = min(start, ics->max_sfb); |
115 | 20.9k | start = min(ics->swb_offset[start], ics->swb_offset_max); |
116 | | |
117 | 20.9k | end = min(top, max_tns_sfb(sr_index, object_type, (ics->window_sequence == EIGHT_SHORT_SEQUENCE))); |
118 | 20.9k | end = min(end, ics->max_sfb); |
119 | 20.9k | end = min(ics->swb_offset[end], ics->swb_offset_max); |
120 | | |
121 | 20.9k | size = end - start; |
122 | 20.9k | if (size <= 0) |
123 | 17.9k | continue; |
124 | | |
125 | 2.93k | if (tns->direction[w][f]) |
126 | 1.46k | { |
127 | 1.46k | inc = -1; |
128 | 1.46k | start = end - 1; |
129 | 1.47k | } else { |
130 | 1.47k | inc = 1; |
131 | 1.47k | } |
132 | | |
133 | 2.93k | tns_ar_filter(&spec[(w*nshort)+start], size, inc, lpc, tns_order, exp); |
134 | 2.93k | } |
135 | 73.5k | } |
136 | 36.4k | } |
137 | | |
138 | | /* TNS encoding for one channel and frame */ |
139 | | void tns_encode_frame(ic_stream *ics, tns_info *tns, uint8_t sr_index, |
140 | | uint8_t object_type, real_t *spec, uint16_t frame_len) |
141 | 12.6k | { |
142 | 12.6k | uint8_t w, f, tns_order; |
143 | 12.6k | int8_t inc; |
144 | 12.6k | int16_t size; |
145 | 12.6k | uint16_t bottom, top, start, end; |
146 | 12.6k | uint16_t nshort = frame_len/8; |
147 | 12.6k | real_t lpc[TNS_MAX_ORDER+1]; |
148 | 12.6k | uint8_t exp; |
149 | | |
150 | 12.6k | if (!ics->tns_data_present) |
151 | 10.5k | return; |
152 | | |
153 | 4.09k | for (w = 0; w < ics->num_windows; w++) |
154 | 2.04k | { |
155 | 2.04k | bottom = ics->num_swb; |
156 | | |
157 | 6.91k | for (f = 0; f < tns->n_filt[w]; f++) |
158 | 4.86k | { |
159 | 4.86k | top = bottom; |
160 | 4.86k | bottom = max(top - tns->length[w][f], 0); |
161 | 4.86k | tns_order = min(tns->order[w][f], TNS_MAX_ORDER); |
162 | 4.86k | if (!tns_order) |
163 | 1.05k | continue; |
164 | | |
165 | 3.81k | exp = tns_decode_coef(tns_order, tns->coef_res[w]+3, |
166 | 3.81k | tns->coef_compress[w][f], tns->coef[w][f], lpc); |
167 | | |
168 | 3.81k | start = min(bottom, max_tns_sfb(sr_index, object_type, (ics->window_sequence == EIGHT_SHORT_SEQUENCE))); |
169 | 3.81k | start = min(start, ics->max_sfb); |
170 | 3.81k | start = min(ics->swb_offset[start], ics->swb_offset_max); |
171 | | |
172 | 3.81k | end = min(top, max_tns_sfb(sr_index, object_type, (ics->window_sequence == EIGHT_SHORT_SEQUENCE))); |
173 | 3.81k | end = min(end, ics->max_sfb); |
174 | 3.81k | end = min(ics->swb_offset[end], ics->swb_offset_max); |
175 | | |
176 | 3.81k | size = end - start; |
177 | 3.81k | if (size <= 0) |
178 | 2.38k | continue; |
179 | | |
180 | 1.42k | if (tns->direction[w][f]) |
181 | 555 | { |
182 | 555 | inc = -1; |
183 | 555 | start = end - 1; |
184 | 869 | } else { |
185 | 869 | inc = 1; |
186 | 869 | } |
187 | | |
188 | 1.42k | tns_ma_filter(&spec[(w*nshort)+start], size, inc, lpc, tns_order, exp); |
189 | 1.42k | } |
190 | 2.04k | } |
191 | 2.04k | } |
192 | | |
193 | | /* Decoder transmitted coefficients for one TNS filter */ |
194 | | static uint8_t tns_decode_coef(uint8_t order, uint8_t coef_res_bits, uint8_t coef_compress, |
195 | | uint8_t *coef, real_t *a) |
196 | 24.7k | { |
197 | 24.7k | uint8_t i, m; |
198 | 24.7k | real_t tmp2[TNS_MAX_ORDER+1], b[TNS_MAX_ORDER+1]; |
199 | 24.7k | uint8_t table_index = 2 * (coef_compress != 0) + (coef_res_bits != 3); |
200 | 24.7k | real_t* tns_coef = all_tns_coefs[table_index]; |
201 | 24.7k | uint8_t exp = 0; |
202 | | |
203 | | /* Conversion to signed integer */ |
204 | 158k | for (i = 0; i < order; i++) |
205 | 133k | tmp2[i] = tns_coef[coef[i]]; |
206 | | |
207 | | /* Conversion to LPC coefficients */ |
208 | 24.7k | a[0] = COEF_CONST(1.0); |
209 | 158k | for (m = 1; m <= order; m++) |
210 | 133k | { |
211 | 133k | a[m] = tmp2[m-1]; /* changed */ |
212 | 843k | for (i = 1; i < m; i++) /* loop only while i<m */ |
213 | 709k | b[i] = a[i] + MUL_C(a[m], a[m-i]); |
214 | | |
215 | 843k | for (i = 1; i < m; i++) /* loop only while i<m */ |
216 | 709k | a[i] = b[i]; |
217 | | |
218 | | #ifdef FIXED_POINT |
219 | | a[m] >>= exp; |
220 | | |
221 | | /* OK not to check after the last iteration. */ |
222 | 62.6k | if (m < order) |
223 | 51.6k | { |
224 | 51.6k | real_t sum_abs = COEF_CONST(0.0); |
225 | 388k | for (i = 1; i <= m; ++i) |
226 | 336k | { |
227 | 336k | sum_abs += (a[i] >= 0) ? a[i] : -a[i]; |
228 | 336k | } |
229 | | /* Next iteration would turn sum to 2*sum + 1; maximal "coef" is 7.999 */ |
230 | 51.6k | if (sum_abs >= COEF_CONST(3.5)) |
231 | 6.60k | { |
232 | 6.60k | exp++; |
233 | 73.4k | for (i = 1; i <= m; ++i) |
234 | 66.8k | { |
235 | 66.8k | a[i] >>= 1; |
236 | 66.8k | } |
237 | 6.60k | } |
238 | 51.6k | } |
239 | | #endif |
240 | 133k | } |
241 | 24.7k | return exp; |
242 | 24.7k | } Line | Count | Source | 196 | 11.0k | { | 197 | 11.0k | uint8_t i, m; | 198 | 11.0k | real_t tmp2[TNS_MAX_ORDER+1], b[TNS_MAX_ORDER+1]; | 199 | 11.0k | uint8_t table_index = 2 * (coef_compress != 0) + (coef_res_bits != 3); | 200 | 11.0k | real_t* tns_coef = all_tns_coefs[table_index]; | 201 | 11.0k | uint8_t exp = 0; | 202 | | | 203 | | /* Conversion to signed integer */ | 204 | 73.6k | for (i = 0; i < order; i++) | 205 | 62.6k | tmp2[i] = tns_coef[coef[i]]; | 206 | | | 207 | | /* Conversion to LPC coefficients */ | 208 | 11.0k | a[0] = COEF_CONST(1.0); | 209 | 73.6k | for (m = 1; m <= order; m++) | 210 | 62.6k | { | 211 | 62.6k | a[m] = tmp2[m-1]; /* changed */ | 212 | 399k | for (i = 1; i < m; i++) /* loop only while i<m */ | 213 | 336k | b[i] = a[i] + MUL_C(a[m], a[m-i]); | 214 | | | 215 | 399k | for (i = 1; i < m; i++) /* loop only while i<m */ | 216 | 336k | a[i] = b[i]; | 217 | | | 218 | 62.6k | #ifdef FIXED_POINT | 219 | 62.6k | a[m] >>= exp; | 220 | | | 221 | | /* OK not to check after the last iteration. */ | 222 | 62.6k | if (m < order) | 223 | 51.6k | { | 224 | 51.6k | real_t sum_abs = COEF_CONST(0.0); | 225 | 388k | for (i = 1; i <= m; ++i) | 226 | 336k | { | 227 | 336k | sum_abs += (a[i] >= 0) ? a[i] : -a[i]; | 228 | 336k | } | 229 | | /* Next iteration would turn sum to 2*sum + 1; maximal "coef" is 7.999 */ | 230 | 51.6k | if (sum_abs >= COEF_CONST(3.5)) | 231 | 6.60k | { | 232 | 6.60k | exp++; | 233 | 73.4k | for (i = 1; i <= m; ++i) | 234 | 66.8k | { | 235 | 66.8k | a[i] >>= 1; | 236 | 66.8k | } | 237 | 6.60k | } | 238 | 51.6k | } | 239 | 62.6k | #endif | 240 | 62.6k | } | 241 | 11.0k | return exp; | 242 | 11.0k | } |
Line | Count | Source | 196 | 13.7k | { | 197 | 13.7k | uint8_t i, m; | 198 | 13.7k | real_t tmp2[TNS_MAX_ORDER+1], b[TNS_MAX_ORDER+1]; | 199 | 13.7k | uint8_t table_index = 2 * (coef_compress != 0) + (coef_res_bits != 3); | 200 | 13.7k | real_t* tns_coef = all_tns_coefs[table_index]; | 201 | 13.7k | uint8_t exp = 0; | 202 | | | 203 | | /* Conversion to signed integer */ | 204 | 84.9k | for (i = 0; i < order; i++) | 205 | 71.2k | tmp2[i] = tns_coef[coef[i]]; | 206 | | | 207 | | /* Conversion to LPC coefficients */ | 208 | 13.7k | a[0] = COEF_CONST(1.0); | 209 | 84.9k | for (m = 1; m <= order; m++) | 210 | 71.2k | { | 211 | 71.2k | a[m] = tmp2[m-1]; /* changed */ | 212 | 443k | for (i = 1; i < m; i++) /* loop only while i<m */ | 213 | 372k | b[i] = a[i] + MUL_C(a[m], a[m-i]); | 214 | | | 215 | 443k | for (i = 1; i < m; i++) /* loop only while i<m */ | 216 | 372k | a[i] = b[i]; | 217 | | | 218 | | #ifdef FIXED_POINT | 219 | | a[m] >>= exp; | 220 | | | 221 | | /* OK not to check after the last iteration. */ | 222 | | if (m < order) | 223 | | { | 224 | | real_t sum_abs = COEF_CONST(0.0); | 225 | | for (i = 1; i <= m; ++i) | 226 | | { | 227 | | sum_abs += (a[i] >= 0) ? a[i] : -a[i]; | 228 | | } | 229 | | /* Next iteration would turn sum to 2*sum + 1; maximal "coef" is 7.999 */ | 230 | | if (sum_abs >= COEF_CONST(3.5)) | 231 | | { | 232 | | exp++; | 233 | | for (i = 1; i <= m; ++i) | 234 | | { | 235 | | a[i] >>= 1; | 236 | | } | 237 | | } | 238 | | } | 239 | | #endif | 240 | 71.2k | } | 241 | 13.7k | return exp; | 242 | 13.7k | } |
|
243 | | |
244 | | static void tns_ar_filter(real_t *spectrum, uint16_t size, int8_t inc, real_t *lpc, |
245 | | uint8_t order, uint8_t exp) |
246 | 2.93k | { |
247 | | /* |
248 | | - Simple all-pole filter of order "order" defined by |
249 | | y(n) = x(n) - lpc[1]*y(n-1) - ... - lpc[order]*y(n-order) |
250 | | - The state variables of the filter are initialized to zero every time |
251 | | - The output data is written over the input data ("in-place operation") |
252 | | - An input vector of "size" samples is processed and the index increment |
253 | | to the next data sample is given by "inc" |
254 | | */ |
255 | | |
256 | 2.93k | uint8_t j; |
257 | 2.93k | uint16_t i; |
258 | | /* state is stored as a double ringbuffer */ |
259 | 2.93k | real_t state[2*TNS_MAX_ORDER] = {0}; |
260 | 2.93k | int8_t state_index = 0; |
261 | 2.93k | int32_t mul = 1; |
262 | | |
263 | | #ifdef FIXED_POINT |
264 | 1.44k | if (exp >= 4) |
265 | 320 | return; |
266 | 1.12k | mul = 1 << exp; |
267 | | #else |
268 | | (void)exp; |
269 | | #endif |
270 | | |
271 | 161k | for (i = 0; i < size; i++) |
272 | 158k | { |
273 | 158k | real_t y = REAL_CONST(0.0); |
274 | 1.67M | for (j = 0; j < order; j++) |
275 | 1.51M | y += MUL_C(state[state_index+j], lpc[j+1]); |
276 | 158k | y = *spectrum - (y * mul); |
277 | | |
278 | | /* double ringbuffer state */ |
279 | 158k | state_index--; |
280 | 158k | if (state_index < 0) |
281 | 40.6k | state_index = order-1; |
282 | 158k | state[state_index] = state[state_index + order] = y; |
283 | | |
284 | 158k | *spectrum = y; |
285 | 158k | spectrum += inc; |
286 | | |
287 | | //#define TNS_PRINT |
288 | | #ifdef TNS_PRINT |
289 | | //printf("%d\n", y); |
290 | | printf("0x%.8X\n", y); |
291 | | #endif |
292 | 158k | } |
293 | 1.12k | } Line | Count | Source | 246 | 1.44k | { | 247 | | /* | 248 | | - Simple all-pole filter of order "order" defined by | 249 | | y(n) = x(n) - lpc[1]*y(n-1) - ... - lpc[order]*y(n-order) | 250 | | - The state variables of the filter are initialized to zero every time | 251 | | - The output data is written over the input data ("in-place operation") | 252 | | - An input vector of "size" samples is processed and the index increment | 253 | | to the next data sample is given by "inc" | 254 | | */ | 255 | | | 256 | 1.44k | uint8_t j; | 257 | 1.44k | uint16_t i; | 258 | | /* state is stored as a double ringbuffer */ | 259 | 1.44k | real_t state[2*TNS_MAX_ORDER] = {0}; | 260 | 1.44k | int8_t state_index = 0; | 261 | 1.44k | int32_t mul = 1; | 262 | | | 263 | 1.44k | #ifdef FIXED_POINT | 264 | 1.44k | if (exp >= 4) | 265 | 320 | return; | 266 | 1.12k | mul = 1 << exp; | 267 | | #else | 268 | | (void)exp; | 269 | | #endif | 270 | | | 271 | 83.1k | for (i = 0; i < size; i++) | 272 | 81.9k | { | 273 | 81.9k | real_t y = REAL_CONST(0.0); | 274 | 903k | for (j = 0; j < order; j++) | 275 | 821k | y += MUL_C(state[state_index+j], lpc[j+1]); | 276 | 81.9k | y = *spectrum - (y * mul); | 277 | | | 278 | | /* double ringbuffer state */ | 279 | 81.9k | state_index--; | 280 | 81.9k | if (state_index < 0) | 281 | 17.9k | state_index = order-1; | 282 | 81.9k | state[state_index] = state[state_index + order] = y; | 283 | | | 284 | 81.9k | *spectrum = y; | 285 | 81.9k | spectrum += inc; | 286 | | | 287 | | //#define TNS_PRINT | 288 | | #ifdef TNS_PRINT | 289 | | //printf("%d\n", y); | 290 | | printf("0x%.8X\n", y); | 291 | | #endif | 292 | 81.9k | } | 293 | 1.12k | } |
Line | Count | Source | 246 | 1.49k | { | 247 | | /* | 248 | | - Simple all-pole filter of order "order" defined by | 249 | | y(n) = x(n) - lpc[1]*y(n-1) - ... - lpc[order]*y(n-order) | 250 | | - The state variables of the filter are initialized to zero every time | 251 | | - The output data is written over the input data ("in-place operation") | 252 | | - An input vector of "size" samples is processed and the index increment | 253 | | to the next data sample is given by "inc" | 254 | | */ | 255 | | | 256 | 1.49k | uint8_t j; | 257 | 1.49k | uint16_t i; | 258 | | /* state is stored as a double ringbuffer */ | 259 | 1.49k | real_t state[2*TNS_MAX_ORDER] = {0}; | 260 | 1.49k | int8_t state_index = 0; | 261 | 1.49k | int32_t mul = 1; | 262 | | | 263 | | #ifdef FIXED_POINT | 264 | | if (exp >= 4) | 265 | | return; | 266 | | mul = 1 << exp; | 267 | | #else | 268 | 1.49k | (void)exp; | 269 | 1.49k | #endif | 270 | | | 271 | 78.1k | for (i = 0; i < size; i++) | 272 | 76.7k | { | 273 | 76.7k | real_t y = REAL_CONST(0.0); | 274 | 769k | for (j = 0; j < order; j++) | 275 | 692k | y += MUL_C(state[state_index+j], lpc[j+1]); | 276 | 76.7k | y = *spectrum - (y * mul); | 277 | | | 278 | | /* double ringbuffer state */ | 279 | 76.7k | state_index--; | 280 | 76.7k | if (state_index < 0) | 281 | 22.6k | state_index = order-1; | 282 | 76.7k | state[state_index] = state[state_index + order] = y; | 283 | | | 284 | 76.7k | *spectrum = y; | 285 | 76.7k | spectrum += inc; | 286 | | | 287 | | //#define TNS_PRINT | 288 | | #ifdef TNS_PRINT | 289 | | //printf("%d\n", y); | 290 | | printf("0x%.8X\n", y); | 291 | | #endif | 292 | 76.7k | } | 293 | 1.49k | } |
|
294 | | |
295 | | static void tns_ma_filter(real_t *spectrum, uint16_t size, int8_t inc, real_t *lpc, |
296 | | uint8_t order, uint8_t exp) |
297 | 1.42k | { |
298 | | /* |
299 | | - Simple all-zero filter of order "order" defined by |
300 | | y(n) = x(n) + a(2)*x(n-1) + ... + a(order+1)*x(n-order) |
301 | | - The state variables of the filter are initialized to zero every time |
302 | | - The output data is written over the input data ("in-place operation") |
303 | | - An input vector of "size" samples is processed and the index increment |
304 | | to the next data sample is given by "inc" |
305 | | */ |
306 | | |
307 | 1.42k | uint8_t j; |
308 | 1.42k | uint16_t i; |
309 | | /* state is stored as a double ringbuffer */ |
310 | 1.42k | real_t state[2*TNS_MAX_ORDER] = {0}; |
311 | 1.42k | int8_t state_index = 0; |
312 | 1.42k | int32_t mul = 1; |
313 | | |
314 | | #ifdef FIXED_POINT |
315 | 460 | if (exp >= 4) |
316 | 75 | return; |
317 | 385 | mul = 1 << exp; |
318 | | #else |
319 | | (void)exp; |
320 | | #endif |
321 | | |
322 | 32.8k | for (i = 0; i < size; i++) |
323 | 31.4k | { |
324 | 31.4k | real_t y = REAL_CONST(0.0); |
325 | 289k | for (j = 0; j < order; j++) |
326 | 258k | y += MUL_C(state[state_index+j], lpc[j+1]); |
327 | | |
328 | 31.4k | y = *spectrum + (y * mul); |
329 | | |
330 | | /* double ringbuffer state */ |
331 | 31.4k | state_index--; |
332 | 31.4k | if (state_index < 0) |
333 | 11.2k | state_index = order-1; |
334 | 31.4k | state[state_index] = state[state_index + order] = *spectrum; |
335 | | |
336 | 31.4k | *spectrum = y; |
337 | 31.4k | spectrum += inc; |
338 | 31.4k | } |
339 | 385 | } Line | Count | Source | 297 | 460 | { | 298 | | /* | 299 | | - Simple all-zero filter of order "order" defined by | 300 | | y(n) = x(n) + a(2)*x(n-1) + ... + a(order+1)*x(n-order) | 301 | | - The state variables of the filter are initialized to zero every time | 302 | | - The output data is written over the input data ("in-place operation") | 303 | | - An input vector of "size" samples is processed and the index increment | 304 | | to the next data sample is given by "inc" | 305 | | */ | 306 | | | 307 | 460 | uint8_t j; | 308 | 460 | uint16_t i; | 309 | | /* state is stored as a double ringbuffer */ | 310 | 460 | real_t state[2*TNS_MAX_ORDER] = {0}; | 311 | 460 | int8_t state_index = 0; | 312 | 460 | int32_t mul = 1; | 313 | | | 314 | 460 | #ifdef FIXED_POINT | 315 | 460 | if (exp >= 4) | 316 | 75 | return; | 317 | 385 | mul = 1 << exp; | 318 | | #else | 319 | | (void)exp; | 320 | | #endif | 321 | | | 322 | 10.7k | for (i = 0; i < size; i++) | 323 | 10.4k | { | 324 | 10.4k | real_t y = REAL_CONST(0.0); | 325 | 120k | for (j = 0; j < order; j++) | 326 | 110k | y += MUL_C(state[state_index+j], lpc[j+1]); | 327 | | | 328 | 10.4k | y = *spectrum + (y * mul); | 329 | | | 330 | | /* double ringbuffer state */ | 331 | 10.4k | state_index--; | 332 | 10.4k | if (state_index < 0) | 333 | 3.16k | state_index = order-1; | 334 | 10.4k | state[state_index] = state[state_index + order] = *spectrum; | 335 | | | 336 | 10.4k | *spectrum = y; | 337 | 10.4k | spectrum += inc; | 338 | 10.4k | } | 339 | 385 | } |
Line | Count | Source | 297 | 964 | { | 298 | | /* | 299 | | - Simple all-zero filter of order "order" defined by | 300 | | y(n) = x(n) + a(2)*x(n-1) + ... + a(order+1)*x(n-order) | 301 | | - The state variables of the filter are initialized to zero every time | 302 | | - The output data is written over the input data ("in-place operation") | 303 | | - An input vector of "size" samples is processed and the index increment | 304 | | to the next data sample is given by "inc" | 305 | | */ | 306 | | | 307 | 964 | uint8_t j; | 308 | 964 | uint16_t i; | 309 | | /* state is stored as a double ringbuffer */ | 310 | 964 | real_t state[2*TNS_MAX_ORDER] = {0}; | 311 | 964 | int8_t state_index = 0; | 312 | 964 | int32_t mul = 1; | 313 | | | 314 | | #ifdef FIXED_POINT | 315 | | if (exp >= 4) | 316 | | return; | 317 | | mul = 1 << exp; | 318 | | #else | 319 | 964 | (void)exp; | 320 | 964 | #endif | 321 | | | 322 | 22.0k | for (i = 0; i < size; i++) | 323 | 21.0k | { | 324 | 21.0k | real_t y = REAL_CONST(0.0); | 325 | 168k | for (j = 0; j < order; j++) | 326 | 147k | y += MUL_C(state[state_index+j], lpc[j+1]); | 327 | | | 328 | 21.0k | y = *spectrum + (y * mul); | 329 | | | 330 | | /* double ringbuffer state */ | 331 | 21.0k | state_index--; | 332 | 21.0k | if (state_index < 0) | 333 | 8.11k | state_index = order-1; | 334 | 21.0k | state[state_index] = state[state_index + order] = *spectrum; | 335 | | | 336 | 21.0k | *spectrum = y; | 337 | 21.0k | spectrum += inc; | 338 | 21.0k | } | 339 | 964 | } |
|