/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 | 745k | { |
87 | 745k | uint8_t w, f, tns_order; |
88 | 745k | int8_t inc; |
89 | 745k | int16_t size; |
90 | 745k | uint16_t bottom, top, start, end; |
91 | 745k | uint16_t nshort = frame_len/8; |
92 | 745k | real_t lpc[TNS_MAX_ORDER+1]; |
93 | 745k | uint8_t exp; |
94 | | |
95 | 745k | if (!ics->tns_data_present) |
96 | 699k | return; |
97 | | |
98 | 136k | for (w = 0; w < ics->num_windows; w++) |
99 | 91.4k | { |
100 | 91.4k | bottom = ics->num_swb; |
101 | | |
102 | 136k | for (f = 0; f < tns->n_filt[w]; f++) |
103 | 44.7k | { |
104 | 44.7k | top = bottom; |
105 | 44.7k | bottom = max(top - tns->length[w][f], 0); |
106 | 44.7k | tns_order = min(tns->order[w][f], TNS_MAX_ORDER); |
107 | 44.7k | if (!tns_order) |
108 | 17.5k | continue; |
109 | | |
110 | 27.2k | exp = tns_decode_coef(tns_order, tns->coef_res[w]+3, |
111 | 27.2k | tns->coef_compress[w][f], tns->coef[w][f], lpc); |
112 | | |
113 | 27.2k | start = min(bottom, max_tns_sfb(sr_index, object_type, (ics->window_sequence == EIGHT_SHORT_SEQUENCE))); |
114 | 27.2k | start = min(start, ics->max_sfb); |
115 | 27.2k | start = min(ics->swb_offset[start], ics->swb_offset_max); |
116 | | |
117 | 27.2k | end = min(top, max_tns_sfb(sr_index, object_type, (ics->window_sequence == EIGHT_SHORT_SEQUENCE))); |
118 | 27.2k | end = min(end, ics->max_sfb); |
119 | 27.2k | end = min(ics->swb_offset[end], ics->swb_offset_max); |
120 | | |
121 | 27.2k | size = end - start; |
122 | 27.2k | if (size <= 0) |
123 | 23.4k | continue; |
124 | | |
125 | 3.82k | if (tns->direction[w][f]) |
126 | 2.13k | { |
127 | 2.13k | inc = -1; |
128 | 2.13k | start = end - 1; |
129 | 2.13k | } else { |
130 | 1.68k | inc = 1; |
131 | 1.68k | } |
132 | | |
133 | 3.82k | tns_ar_filter(&spec[(w*nshort)+start], size, inc, lpc, tns_order, exp); |
134 | 3.82k | } |
135 | 91.4k | } |
136 | 45.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 | 13.7k | { |
142 | 13.7k | uint8_t w, f, tns_order; |
143 | 13.7k | int8_t inc; |
144 | 13.7k | int16_t size; |
145 | 13.7k | uint16_t bottom, top, start, end; |
146 | 13.7k | uint16_t nshort = frame_len/8; |
147 | 13.7k | real_t lpc[TNS_MAX_ORDER+1]; |
148 | 13.7k | uint8_t exp; |
149 | | |
150 | 13.7k | if (!ics->tns_data_present) |
151 | 11.3k | return; |
152 | | |
153 | 4.73k | for (w = 0; w < ics->num_windows; w++) |
154 | 2.36k | { |
155 | 2.36k | bottom = ics->num_swb; |
156 | | |
157 | 8.08k | for (f = 0; f < tns->n_filt[w]; f++) |
158 | 5.71k | { |
159 | 5.71k | top = bottom; |
160 | 5.71k | bottom = max(top - tns->length[w][f], 0); |
161 | 5.71k | tns_order = min(tns->order[w][f], TNS_MAX_ORDER); |
162 | 5.71k | if (!tns_order) |
163 | 1.35k | continue; |
164 | | |
165 | 4.36k | exp = tns_decode_coef(tns_order, tns->coef_res[w]+3, |
166 | 4.36k | tns->coef_compress[w][f], tns->coef[w][f], lpc); |
167 | | |
168 | 4.36k | start = min(bottom, max_tns_sfb(sr_index, object_type, (ics->window_sequence == EIGHT_SHORT_SEQUENCE))); |
169 | 4.36k | start = min(start, ics->max_sfb); |
170 | 4.36k | start = min(ics->swb_offset[start], ics->swb_offset_max); |
171 | | |
172 | 4.36k | end = min(top, max_tns_sfb(sr_index, object_type, (ics->window_sequence == EIGHT_SHORT_SEQUENCE))); |
173 | 4.36k | end = min(end, ics->max_sfb); |
174 | 4.36k | end = min(ics->swb_offset[end], ics->swb_offset_max); |
175 | | |
176 | 4.36k | size = end - start; |
177 | 4.36k | if (size <= 0) |
178 | 2.70k | continue; |
179 | | |
180 | 1.66k | if (tns->direction[w][f]) |
181 | 680 | { |
182 | 680 | inc = -1; |
183 | 680 | start = end - 1; |
184 | 984 | } else { |
185 | 984 | inc = 1; |
186 | 984 | } |
187 | | |
188 | 1.66k | tns_ma_filter(&spec[(w*nshort)+start], size, inc, lpc, tns_order, exp); |
189 | 1.66k | } |
190 | 2.36k | } |
191 | 2.36k | } |
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 | 31.5k | { |
197 | 31.5k | uint8_t i, m; |
198 | 31.5k | real_t tmp2[TNS_MAX_ORDER+1], b[TNS_MAX_ORDER+1]; |
199 | 31.5k | uint8_t table_index = 2 * (coef_compress != 0) + (coef_res_bits != 3); |
200 | 31.5k | real_t* tns_coef = all_tns_coefs[table_index]; |
201 | 31.5k | uint8_t exp = 0; |
202 | | |
203 | | /* Conversion to signed integer */ |
204 | 192k | for (i = 0; i < order; i++) |
205 | 161k | tmp2[i] = tns_coef[coef[i]]; |
206 | | |
207 | | /* Conversion to LPC coefficients */ |
208 | 31.5k | a[0] = COEF_CONST(1.0); |
209 | 192k | for (m = 1; m <= order; m++) |
210 | 161k | { |
211 | 161k | a[m] = tmp2[m-1]; /* changed */ |
212 | 966k | for (i = 1; i < m; i++) /* loop only while i<m */ |
213 | 805k | b[i] = a[i] + MUL_C(a[m], a[m-i]); |
214 | | |
215 | 966k | for (i = 1; i < m; i++) /* loop only while i<m */ |
216 | 805k | a[i] = b[i]; |
217 | | |
218 | | #ifdef FIXED_POINT |
219 | | a[m] >>= exp; |
220 | | |
221 | | /* OK not to check after the last iteration. */ |
222 | 92.7k | if (m < order) |
223 | 75.5k | { |
224 | 75.5k | real_t sum_abs = COEF_CONST(0.0); |
225 | 562k | for (i = 1; i <= m; ++i) |
226 | 486k | { |
227 | 486k | sum_abs += (a[i] >= 0) ? a[i] : -a[i]; |
228 | 486k | } |
229 | | /* Next iteration would turn sum to 2*sum + 1; maximal "coef" is 7.999 */ |
230 | 75.5k | if (sum_abs >= COEF_CONST(3.5)) |
231 | 9.50k | { |
232 | 9.50k | exp++; |
233 | 107k | for (i = 1; i <= m; ++i) |
234 | 98.0k | { |
235 | 98.0k | a[i] >>= 1; |
236 | 98.0k | } |
237 | 9.50k | } |
238 | 75.5k | } |
239 | | #endif |
240 | 161k | } |
241 | 31.5k | return exp; |
242 | 31.5k | } Line | Count | Source | 196 | 17.1k | { | 197 | 17.1k | uint8_t i, m; | 198 | 17.1k | real_t tmp2[TNS_MAX_ORDER+1], b[TNS_MAX_ORDER+1]; | 199 | 17.1k | uint8_t table_index = 2 * (coef_compress != 0) + (coef_res_bits != 3); | 200 | 17.1k | real_t* tns_coef = all_tns_coefs[table_index]; | 201 | 17.1k | uint8_t exp = 0; | 202 | | | 203 | | /* Conversion to signed integer */ | 204 | 109k | for (i = 0; i < order; i++) | 205 | 92.7k | tmp2[i] = tns_coef[coef[i]]; | 206 | | | 207 | | /* Conversion to LPC coefficients */ | 208 | 17.1k | a[0] = COEF_CONST(1.0); | 209 | 109k | for (m = 1; m <= order; m++) | 210 | 92.7k | { | 211 | 92.7k | a[m] = tmp2[m-1]; /* changed */ | 212 | 579k | for (i = 1; i < m; i++) /* loop only while i<m */ | 213 | 486k | b[i] = a[i] + MUL_C(a[m], a[m-i]); | 214 | | | 215 | 579k | for (i = 1; i < m; i++) /* loop only while i<m */ | 216 | 486k | a[i] = b[i]; | 217 | | | 218 | 92.7k | #ifdef FIXED_POINT | 219 | 92.7k | a[m] >>= exp; | 220 | | | 221 | | /* OK not to check after the last iteration. */ | 222 | 92.7k | if (m < order) | 223 | 75.5k | { | 224 | 75.5k | real_t sum_abs = COEF_CONST(0.0); | 225 | 562k | for (i = 1; i <= m; ++i) | 226 | 486k | { | 227 | 486k | sum_abs += (a[i] >= 0) ? a[i] : -a[i]; | 228 | 486k | } | 229 | | /* Next iteration would turn sum to 2*sum + 1; maximal "coef" is 7.999 */ | 230 | 75.5k | if (sum_abs >= COEF_CONST(3.5)) | 231 | 9.50k | { | 232 | 9.50k | exp++; | 233 | 107k | for (i = 1; i <= m; ++i) | 234 | 98.0k | { | 235 | 98.0k | a[i] >>= 1; | 236 | 98.0k | } | 237 | 9.50k | } | 238 | 75.5k | } | 239 | 92.7k | #endif | 240 | 92.7k | } | 241 | 17.1k | return exp; | 242 | 17.1k | } |
Line | Count | Source | 196 | 14.4k | { | 197 | 14.4k | uint8_t i, m; | 198 | 14.4k | real_t tmp2[TNS_MAX_ORDER+1], b[TNS_MAX_ORDER+1]; | 199 | 14.4k | uint8_t table_index = 2 * (coef_compress != 0) + (coef_res_bits != 3); | 200 | 14.4k | real_t* tns_coef = all_tns_coefs[table_index]; | 201 | 14.4k | uint8_t exp = 0; | 202 | | | 203 | | /* Conversion to signed integer */ | 204 | 83.0k | for (i = 0; i < order; i++) | 205 | 68.5k | tmp2[i] = tns_coef[coef[i]]; | 206 | | | 207 | | /* Conversion to LPC coefficients */ | 208 | 14.4k | a[0] = COEF_CONST(1.0); | 209 | 83.0k | for (m = 1; m <= order; m++) | 210 | 68.5k | { | 211 | 68.5k | a[m] = tmp2[m-1]; /* changed */ | 212 | 387k | for (i = 1; i < m; i++) /* loop only while i<m */ | 213 | 318k | b[i] = a[i] + MUL_C(a[m], a[m-i]); | 214 | | | 215 | 387k | for (i = 1; i < m; i++) /* loop only while i<m */ | 216 | 318k | 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 | 68.5k | } | 241 | 14.4k | return exp; | 242 | 14.4k | } |
|
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 | 3.82k | { |
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 | 3.82k | uint8_t j; |
257 | 3.82k | uint16_t i; |
258 | | /* state is stored as a double ringbuffer */ |
259 | 3.82k | real_t state[2*TNS_MAX_ORDER] = {0}; |
260 | 3.82k | int8_t state_index = 0; |
261 | 3.82k | int32_t mul = 1; |
262 | | |
263 | | #ifdef FIXED_POINT |
264 | 1.88k | if (exp >= 4) |
265 | 474 | return; |
266 | 1.41k | mul = 1 << exp; |
267 | | #else |
268 | | (void)exp; |
269 | | #endif |
270 | | |
271 | 197k | for (i = 0; i < size; i++) |
272 | 194k | { |
273 | 194k | real_t y = REAL_CONST(0.0); |
274 | 1.75M | for (j = 0; j < order; j++) |
275 | 1.55M | y += MUL_C(state[state_index+j], lpc[j+1]); |
276 | 194k | y = *spectrum - (y * mul); |
277 | | |
278 | | /* double ringbuffer state */ |
279 | 194k | state_index--; |
280 | 194k | if (state_index < 0) |
281 | 57.6k | state_index = order-1; |
282 | 194k | state[state_index] = state[state_index + order] = y; |
283 | | |
284 | 194k | *spectrum = y; |
285 | 194k | 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 | 194k | } |
293 | 1.41k | } Line | Count | Source | 246 | 1.88k | { | 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.88k | uint8_t j; | 257 | 1.88k | uint16_t i; | 258 | | /* state is stored as a double ringbuffer */ | 259 | 1.88k | real_t state[2*TNS_MAX_ORDER] = {0}; | 260 | 1.88k | int8_t state_index = 0; | 261 | 1.88k | int32_t mul = 1; | 262 | | | 263 | 1.88k | #ifdef FIXED_POINT | 264 | 1.88k | if (exp >= 4) | 265 | 474 | return; | 266 | 1.41k | mul = 1 << exp; | 267 | | #else | 268 | | (void)exp; | 269 | | #endif | 270 | | | 271 | 67.7k | for (i = 0; i < size; i++) | 272 | 66.3k | { | 273 | 66.3k | real_t y = REAL_CONST(0.0); | 274 | 616k | for (j = 0; j < order; j++) | 275 | 550k | y += MUL_C(state[state_index+j], lpc[j+1]); | 276 | 66.3k | y = *spectrum - (y * mul); | 277 | | | 278 | | /* double ringbuffer state */ | 279 | 66.3k | state_index--; | 280 | 66.3k | if (state_index < 0) | 281 | 15.4k | state_index = order-1; | 282 | 66.3k | state[state_index] = state[state_index + order] = y; | 283 | | | 284 | 66.3k | *spectrum = y; | 285 | 66.3k | 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 | 66.3k | } | 293 | 1.41k | } |
Line | Count | Source | 246 | 1.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 | 1.93k | uint8_t j; | 257 | 1.93k | uint16_t i; | 258 | | /* state is stored as a double ringbuffer */ | 259 | 1.93k | real_t state[2*TNS_MAX_ORDER] = {0}; | 260 | 1.93k | int8_t state_index = 0; | 261 | 1.93k | int32_t mul = 1; | 262 | | | 263 | | #ifdef FIXED_POINT | 264 | | if (exp >= 4) | 265 | | return; | 266 | | mul = 1 << exp; | 267 | | #else | 268 | 1.93k | (void)exp; | 269 | 1.93k | #endif | 270 | | | 271 | 130k | for (i = 0; i < size; i++) | 272 | 128k | { | 273 | 128k | real_t y = REAL_CONST(0.0); | 274 | 1.13M | for (j = 0; j < order; j++) | 275 | 1.00M | y += MUL_C(state[state_index+j], lpc[j+1]); | 276 | 128k | y = *spectrum - (y * mul); | 277 | | | 278 | | /* double ringbuffer state */ | 279 | 128k | state_index--; | 280 | 128k | if (state_index < 0) | 281 | 42.2k | state_index = order-1; | 282 | 128k | state[state_index] = state[state_index + order] = y; | 283 | | | 284 | 128k | *spectrum = y; | 285 | 128k | 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 | 128k | } | 293 | 1.93k | } |
|
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.66k | { |
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.66k | uint8_t j; |
308 | 1.66k | uint16_t i; |
309 | | /* state is stored as a double ringbuffer */ |
310 | 1.66k | real_t state[2*TNS_MAX_ORDER] = {0}; |
311 | 1.66k | int8_t state_index = 0; |
312 | 1.66k | int32_t mul = 1; |
313 | | |
314 | | #ifdef FIXED_POINT |
315 | 706 | if (exp >= 4) |
316 | 136 | return; |
317 | 570 | mul = 1 << exp; |
318 | | #else |
319 | | (void)exp; |
320 | | #endif |
321 | | |
322 | 27.1k | for (i = 0; i < size; i++) |
323 | 25.6k | { |
324 | 25.6k | real_t y = REAL_CONST(0.0); |
325 | 209k | for (j = 0; j < order; j++) |
326 | 184k | y += MUL_C(state[state_index+j], lpc[j+1]); |
327 | | |
328 | 25.6k | y = *spectrum + (y * mul); |
329 | | |
330 | | /* double ringbuffer state */ |
331 | 25.6k | state_index--; |
332 | 25.6k | if (state_index < 0) |
333 | 10.3k | state_index = order-1; |
334 | 25.6k | state[state_index] = state[state_index + order] = *spectrum; |
335 | | |
336 | 25.6k | *spectrum = y; |
337 | 25.6k | spectrum += inc; |
338 | 25.6k | } |
339 | 570 | } Line | Count | Source | 297 | 706 | { | 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 | 706 | uint8_t j; | 308 | 706 | uint16_t i; | 309 | | /* state is stored as a double ringbuffer */ | 310 | 706 | real_t state[2*TNS_MAX_ORDER] = {0}; | 311 | 706 | int8_t state_index = 0; | 312 | 706 | int32_t mul = 1; | 313 | | | 314 | 706 | #ifdef FIXED_POINT | 315 | 706 | if (exp >= 4) | 316 | 136 | return; | 317 | 570 | mul = 1 << exp; | 318 | | #else | 319 | | (void)exp; | 320 | | #endif | 321 | | | 322 | 7.16k | for (i = 0; i < size; i++) | 323 | 6.59k | { | 324 | 6.59k | real_t y = REAL_CONST(0.0); | 325 | 54.8k | for (j = 0; j < order; j++) | 326 | 48.2k | y += MUL_C(state[state_index+j], lpc[j+1]); | 327 | | | 328 | 6.59k | y = *spectrum + (y * mul); | 329 | | | 330 | | /* double ringbuffer state */ | 331 | 6.59k | state_index--; | 332 | 6.59k | if (state_index < 0) | 333 | 3.02k | state_index = order-1; | 334 | 6.59k | state[state_index] = state[state_index + order] = *spectrum; | 335 | | | 336 | 6.59k | *spectrum = y; | 337 | 6.59k | spectrum += inc; | 338 | 6.59k | } | 339 | 570 | } |
Line | Count | Source | 297 | 958 | { | 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 | 958 | uint8_t j; | 308 | 958 | uint16_t i; | 309 | | /* state is stored as a double ringbuffer */ | 310 | 958 | real_t state[2*TNS_MAX_ORDER] = {0}; | 311 | 958 | int8_t state_index = 0; | 312 | 958 | int32_t mul = 1; | 313 | | | 314 | | #ifdef FIXED_POINT | 315 | | if (exp >= 4) | 316 | | return; | 317 | | mul = 1 << exp; | 318 | | #else | 319 | 958 | (void)exp; | 320 | 958 | #endif | 321 | | | 322 | 19.9k | for (i = 0; i < size; i++) | 323 | 19.0k | { | 324 | 19.0k | real_t y = REAL_CONST(0.0); | 325 | 154k | for (j = 0; j < order; j++) | 326 | 135k | y += MUL_C(state[state_index+j], lpc[j+1]); | 327 | | | 328 | 19.0k | y = *spectrum + (y * mul); | 329 | | | 330 | | /* double ringbuffer state */ | 331 | 19.0k | state_index--; | 332 | 19.0k | if (state_index < 0) | 333 | 7.35k | state_index = order-1; | 334 | 19.0k | state[state_index] = state[state_index + order] = *spectrum; | 335 | | | 336 | 19.0k | *spectrum = y; | 337 | 19.0k | spectrum += inc; | 338 | 19.0k | } | 339 | 958 | } |
|