comparison libfaad2/sbr_e_nf.c @ 10989:3185f64f6350

synced with current cvs
author alex
date Fri, 03 Oct 2003 22:23:26 +0000
parents e989150f8216
children 4a370c80fe5c
comparison
equal deleted inserted replaced
10988:c2bff70784d5 10989:3185f64f6350
20 ** forbidden. 20 ** forbidden.
21 ** 21 **
22 ** Commercial non-GPL licensing of this software is possible. 22 ** Commercial non-GPL licensing of this software is possible.
23 ** For more info contact Ahead Software through Mpeg4AAClicense@nero.com. 23 ** For more info contact Ahead Software through Mpeg4AAClicense@nero.com.
24 ** 24 **
25 ** $Id: sbr_e_nf.c,v 1.1 2003/07/29 08:20:13 menno Exp $ 25 ** $Id: sbr_e_nf.c,v 1.4 2003/09/09 18:37:32 menno Exp $
26 **/ 26 **/
27 27
28 #include "common.h" 28 #include "common.h"
29 #include "structs.h" 29 #include "structs.h"
30 30
36 #include "sbr_e_nf.h" 36 #include "sbr_e_nf.h"
37 37
38 void extract_envelope_data(sbr_info *sbr, uint8_t ch) 38 void extract_envelope_data(sbr_info *sbr, uint8_t ch)
39 { 39 {
40 uint8_t l, k; 40 uint8_t l, k;
41
42 #if 0
43 if (sbr->frame == 19)
44 {
45 sbr->frame = 19;
46 }
47 #endif
48 41
49 for (l = 0; l < sbr->L_E[ch]; l++) 42 for (l = 0; l < sbr->L_E[ch]; l++)
50 { 43 {
51 if (sbr->bs_df_env[ch][l] == 0) 44 if (sbr->bs_df_env[ch][l] == 0)
52 { 45 {
111 } 104 }
112 } 105 }
113 } 106 }
114 } 107 }
115 } 108 }
116
117 #if 0
118 if (sbr->frame == 23)
119 {
120 int l, k;
121
122 for (l = 0; l < sbr->L_E[ch]; l++)
123 {
124 for (k = 0; k < sbr->n[sbr->f[ch][l]]; k++)
125 {
126 //printf("l:%d k:%d E:%d\n",l,k, sbr->E[ch][k][l]);
127 printf("%d\n", sbr->E[ch][k][l]);
128 }
129 }
130 printf("\n");
131 }
132 #endif
133 } 109 }
134 110
135 void extract_noise_floor_data(sbr_info *sbr, uint8_t ch) 111 void extract_noise_floor_data(sbr_info *sbr, uint8_t ch)
136 { 112 {
137 uint8_t l, k; 113 uint8_t l, k;
157 sbr->Q[ch][k][l] = sbr->Q[ch][k][l - 1] + sbr->Q[ch][k][l]; 133 sbr->Q[ch][k][l] = sbr->Q[ch][k][l - 1] + sbr->Q[ch][k][l];
158 } 134 }
159 } 135 }
160 } 136 }
161 } 137 }
162
163 #if 0
164 if (sbr->frame == 23)
165 {
166 int l, k;
167
168 for (l = 0; l < sbr->L_Q[ch]; l++)
169 {
170 for (k = 0; k < sbr->N_Q; k++)
171 {
172 //printf("l:%d k:%d E:%d\n",l,k, sbr->E[ch][k][l]);
173 printf("%d\n", sbr->Q[ch][k][l]);
174 }
175 }
176 printf("\n");
177 }
178 #endif
179 } 138 }
180 139
181 /* FIXME: pow() not needed */ 140 /* FIXME: pow() not needed */
182 void envelope_noise_dequantisation(sbr_info *sbr, uint8_t ch) 141 void envelope_noise_dequantisation(sbr_info *sbr, uint8_t ch)
183 { 142 {
184 if (sbr->bs_coupling == 0) 143 if (sbr->bs_coupling == 0)
185 { 144 {
186 uint8_t l, k; 145 uint8_t l, k;
187 #ifdef FIXED_POINT 146 real_t amp = (sbr->amp_res[ch]) ? 1.0f : 0.5f;
188 uint8_t amp = (sbr->amp_res[ch]) ? 0 : 1;
189 #else
190 real_t amp = (sbr->amp_res[ch]) ? 1.0 : 0.5;
191 #endif
192 147
193 for (l = 0; l < sbr->L_E[ch]; l++) 148 for (l = 0; l < sbr->L_E[ch]; l++)
194 { 149 {
195 for (k = 0; k < sbr->n[sbr->f[ch][l]]; k++) 150 for (k = 0; k < sbr->n[sbr->f[ch][l]]; k++)
196 { 151 {
197 #ifndef FIXED_POINT
198 /* +6 for the *64 */ 152 /* +6 for the *64 */
199 sbr->E_orig[ch][k][l] = pow(2, sbr->E[ch][k][l]*amp + 6); 153 sbr->E_orig[ch][k][l] = (real_t)pow(2, sbr->E[ch][k][l]*amp + 6);
200 #else
201 int8_t exp;
202
203 /* +6 for the *64 and -10 for the /32 in the synthesis QMF
204 * since this is a energy value: (x/32)^2 = (x^2)/1024
205 */
206 exp = (sbr->E[ch][k][l] >> amp) + 6 - 10;
207
208 // printf("%d\n", exp);
209
210 if (exp < 0)
211 sbr->E_orig[ch][k][l] = 0; //REAL_CONST(1) >> -exp;
212 else
213 sbr->E_orig[ch][k][l] = 1 << exp; //REAL_CONST(1) << exp;
214
215 if (amp && (sbr->E[ch][k][l] & 1))
216 sbr->E_orig[ch][k][l] = MUL(sbr->E_orig[ch][k][l], REAL_CONST(1.414213562));
217 #endif
218 } 154 }
219 } 155 }
220 156
221 for (l = 0; l < sbr->L_Q[ch]; l++) 157 for (l = 0; l < sbr->L_Q[ch]; l++)
222 { 158 {
223 for (k = 0; k < sbr->N_Q; k++) 159 for (k = 0; k < sbr->N_Q; k++)
224 { 160 {
225 if (sbr->Q[ch][k][l] < 0 || sbr->Q[ch][k][l] > 30) 161 if (sbr->Q[ch][k][l] < 0 || sbr->Q[ch][k][l] > 30)
226 sbr->Q_orig[ch][k][l] = 0; 162 sbr->Q_orig[ch][k][l] = 0;
227 else { 163 else {
228 #ifndef FIXED_POINT 164 sbr->Q_orig[ch][k][l] = (real_t)pow(2, NOISE_FLOOR_OFFSET - sbr->Q[ch][k][l]);
229 sbr->Q_orig[ch][k][l] = pow(2, NOISE_FLOOR_OFFSET - sbr->Q[ch][k][l]);
230 #else
231 int8_t exp = NOISE_FLOOR_OFFSET - sbr->Q[ch][k][l];
232 if (exp < 0)
233 sbr->Q_orig[ch][k][l] = REAL_CONST(1) >> -exp;
234 else
235 sbr->Q_orig[ch][k][l] = REAL_CONST(1) << exp;
236 #endif
237 } 165 }
238 } 166 }
239 } 167 }
240 } 168 }
241 } 169 }
242 170
243 void unmap_envelope_noise(sbr_info *sbr) 171 void unmap_envelope_noise(sbr_info *sbr)
244 { 172 {
245 uint8_t l, k; 173 uint8_t l, k;
246 #ifdef FIXED_POINT 174 real_t amp0 = (sbr->amp_res[0]) ? (real_t)1.0 : (real_t)0.5;
247 uint8_t amp0 = (sbr->amp_res[0]) ? 0 : 1; 175 real_t amp1 = (sbr->amp_res[1]) ? (real_t)1.0 : (real_t)0.5;
248 uint8_t amp1 = (sbr->amp_res[1]) ? 0 : 1;
249 #else
250 real_t amp0 = (sbr->amp_res[0]) ? 1.0 : 0.5;
251 real_t amp1 = (sbr->amp_res[1]) ? 1.0 : 0.5;
252 #endif
253 176
254 for (l = 0; l < sbr->L_E[0]; l++) 177 for (l = 0; l < sbr->L_E[0]; l++)
255 { 178 {
256 for (k = 0; k < sbr->n[sbr->f[0][l]]; k++) 179 for (k = 0; k < sbr->n[sbr->f[0][l]]; k++)
257 { 180 {
258 real_t l_temp, r_temp; 181 real_t l_temp, r_temp;
259 182
260 #ifdef FIXED_POINT 183 /* +6: * 64 ; +1: * 2 */
261 int8_t exp; 184 l_temp = (real_t)pow(2, sbr->E[0][k][l]*amp0 + 7);
262
263 /* +6: * 64 ; +1: * 2 ; -10: /1024 QMF */
264 exp = (sbr->E[0][k][l] >> amp0) - 3;
265
266 // printf("%d\n", exp);
267
268 if (exp < 0)
269 l_temp = REAL_CONST(1) >> -exp;
270 else
271 l_temp = REAL_CONST(1) << exp;
272
273 if (amp0 && (sbr->E[0][k][l] & 1))
274 l_temp = MUL(l_temp, REAL_CONST(1.414213562373095));
275
276 /* UN_MAP removed: (x / 4096) same as (x >> 12) */ 185 /* UN_MAP removed: (x / 4096) same as (x >> 12) */
277 exp = (sbr->E[1][k][l] >> amp1) - 12; 186 r_temp = (real_t)pow(2, sbr->E[1][k][l]*amp1 - 12);
278 187
279 // printf("%d\n", exp); 188 sbr->E_orig[1][k][l] = l_temp / ((real_t)1.0 + r_temp);
280
281 if (exp < 0)
282 r_temp = REAL_CONST(1) >> -exp;
283 else
284 r_temp = REAL_CONST(1) << exp;
285
286 if (amp1 && (sbr->E[1][k][l] & 1))
287 r_temp = MUL(r_temp, REAL_CONST(1.414213562373095));
288 #else
289 /* +6: * 64 ; +1: * 2 */
290 l_temp = pow(2, sbr->E[0][k][l]*amp0 + 7);
291 /* UN_MAP removed: (x / 4096) same as (x >> 12) */
292 r_temp = pow(2, sbr->E[1][k][l]*amp1 - 12);
293 #endif
294
295
296 #ifdef FIXED_POINT
297 {
298 real_t tmp = REAL_CONST(1.0) + r_temp;
299 sbr->E_orig[1][k][l] = SBR_DIV(l_temp, tmp);
300 }
301 #else
302 sbr->E_orig[1][k][l] = l_temp / (1.0 + r_temp);
303 #endif
304 sbr->E_orig[0][k][l] = MUL(r_temp, sbr->E_orig[1][k][l]); 189 sbr->E_orig[0][k][l] = MUL(r_temp, sbr->E_orig[1][k][l]);
305
306 #ifdef FIXED_POINT
307 sbr->E_orig[0][k][l] >>= REAL_BITS;
308 sbr->E_orig[1][k][l] >>= REAL_BITS;
309 #endif
310
311 //printf("%f\t%f\n", sbr->E_orig[0][k][l] /(float)(1<<REAL_BITS), sbr->E_orig[1][k][l] /(float)(1<<REAL_BITS));
312 //printf("%f\t%f\n", sbr->E_orig[0][k][l]/1024., sbr->E_orig[1][k][l]/1024.);
313 } 190 }
314 } 191 }
315 for (l = 0; l < sbr->L_Q[0]; l++) 192 for (l = 0; l < sbr->L_Q[0]; l++)
316 { 193 {
317 for (k = 0; k < sbr->N_Q; k++) 194 for (k = 0; k < sbr->N_Q; k++)
322 sbr->Q_orig[0][k][l] = 0; 199 sbr->Q_orig[0][k][l] = 0;
323 sbr->Q_orig[1][k][l] = 0; 200 sbr->Q_orig[1][k][l] = 0;
324 } else { 201 } else {
325 real_t l_temp, r_temp; 202 real_t l_temp, r_temp;
326 203
327 #ifndef FIXED_POINT 204 l_temp = (real_t)pow(2.0, NOISE_FLOOR_OFFSET - sbr->Q[0][k][l] + 1);
328 l_temp = pow(2.0, NOISE_FLOOR_OFFSET - sbr->Q[0][k][l] + 1); 205 r_temp = (real_t)pow(2.0, sbr->Q[1][k][l] - 12);
329 r_temp = pow(2.0, sbr->Q[1][k][l] - 12); 206
330 #else 207 sbr->Q_orig[1][k][l] = l_temp / ((real_t)1.0 + r_temp);
331 int8_t exp; 208 sbr->Q_orig[0][k][l] = MUL(r_temp, sbr->Q_orig[1][k][l]);
332 209 }
333 exp = NOISE_FLOOR_OFFSET - sbr->Q[0][k][l] + 1; 210 }
334 if (exp < 0) 211 }
335 l_temp = REAL_CONST(1) >> -exp; 212 }
336 else 213
337 l_temp = REAL_CONST(1) << exp;
338
339 exp = sbr->Q[1][k][l] - 12;
340 if (exp < 0)
341 r_temp = REAL_CONST(1) >> -exp;
342 else
343 r_temp = REAL_CONST(1) << exp;
344 #endif 214 #endif
345
346 #ifdef FIXED_POINT
347 sbr->Q_orig[1][k][l] = SBR_DIV(l_temp, (REAL_CONST(1.0) + r_temp));
348 #else
349 sbr->Q_orig[1][k][l] = l_temp / (1.0 + r_temp);
350 #endif
351 sbr->Q_orig[0][k][l] = MUL(r_temp, sbr->Q_orig[1][k][l]);
352 }
353 }
354 }
355 }
356
357 #endif