2 ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR and PS decoding
3 ** Copyright (C) 2003-2004 M. Bakker, Ahead Software AG, http://www.nero.com
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.
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.
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.
19 ** Any non-GPL usage of this software or parts of this software is strictly
22 ** Commercial non-GPL licensing of this software is possible.
23 ** For more info contact Ahead Software through Mpeg4AAClicense@nero.com.
25 ** Initially modified for use with MPlayer on 2005/12/05
26 ** $Id: ps_dec.c,v 1.10 2004/09/04 14:56:28 menno Exp $
27 ** detailed changelog at http://svn.mplayerhq.hu/mplayer/trunk/
28 ** local_changes.diff contains the exact changes to this file.
37 #include "ps_tables.h"
40 #define NEGATE_IPD_MASK (0x1000)
41 #define DECAY_SLOPE FRAC_CONST(0.05)
42 #define COEF_SQRT2 COEF_CONST(1.4142135623731)
45 /* filters are mirrored in coef 6, second half left out */
46 static const real_t p8_13_20
[7] =
48 FRAC_CONST(0.00746082949812),
49 FRAC_CONST(0.02270420949825),
50 FRAC_CONST(0.04546865930473),
51 FRAC_CONST(0.07266113929591),
52 FRAC_CONST(0.09885108575264),
53 FRAC_CONST(0.11793710567217),
57 static const real_t p2_13_20
[7] =
60 FRAC_CONST(0.01899487526049),
62 FRAC_CONST(-0.07293139167538),
64 FRAC_CONST(0.30596630545168),
68 static const real_t p12_13_34
[7] =
70 FRAC_CONST(0.04081179924692),
71 FRAC_CONST(0.03812810994926),
72 FRAC_CONST(0.05144908135699),
73 FRAC_CONST(0.06399831151592),
74 FRAC_CONST(0.07428313801106),
75 FRAC_CONST(0.08100347892914),
76 FRAC_CONST(0.08333333333333)
79 static const real_t p8_13_34
[7] =
81 FRAC_CONST(0.01565675600122),
82 FRAC_CONST(0.03752716391991),
83 FRAC_CONST(0.05417891378782),
84 FRAC_CONST(0.08417044116767),
85 FRAC_CONST(0.10307344158036),
86 FRAC_CONST(0.12222452249753),
90 static const real_t p4_13_34
[7] =
92 FRAC_CONST(-0.05908211155639),
93 FRAC_CONST(-0.04871498374946),
95 FRAC_CONST(0.07778723915851),
96 FRAC_CONST(0.16486303567403),
97 FRAC_CONST(0.23279856662996),
102 static const uint8_t delay_length_d
[2][NO_ALLPASS_LINKS
] = {
103 { 1, 2, 3 } /* d_24kHz */,
104 { 3, 4, 5 } /* d_48kHz */
107 static const uint8_t delay_length_d
[NO_ALLPASS_LINKS
] = {
108 3, 4, 5 /* d_48kHz */
111 static const real_t filter_a
[NO_ALLPASS_LINKS
] = { /* a(m) = exp(-d_48kHz(m)/7) */
112 FRAC_CONST(0.65143905753106),
113 FRAC_CONST(0.56471812200776),
114 FRAC_CONST(0.48954165955695)
117 static const uint8_t group_border20
[10+12 + 1] =
119 6, 7, 0, 1, 2, 3, /* 6 subqmf subbands */
120 9, 8, /* 2 subqmf subbands */
121 10, 11, /* 2 subqmf subbands */
122 3, 4, 5, 6, 7, 8, 9, 11, 14, 18, 23, 35, 64
125 static const uint8_t group_border34
[32+18 + 1] =
127 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, /* 12 subqmf subbands */
128 12, 13, 14, 15, 16, 17, 18, 19, /* 8 subqmf subbands */
129 20, 21, 22, 23, /* 4 subqmf subbands */
130 24, 25, 26, 27, /* 4 subqmf subbands */
131 28, 29, 30, 31, /* 4 subqmf subbands */
132 32-27, 33-27, 34-27, 35-27, 36-27, 37-27, 38-27, 40-27, 42-27, 44-27, 46-27, 48-27, 51-27, 54-27, 57-27, 60-27, 64-27, 68-27, 91-27
135 static const uint16_t map_group2bk20
[10+12] =
137 (NEGATE_IPD_MASK
| 1), (NEGATE_IPD_MASK
| 0),
138 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19
141 static const uint16_t map_group2bk34
[32+18] =
143 0, 1, 2, 3, 4, 5, 6, 6, 7, (NEGATE_IPD_MASK
| 2), (NEGATE_IPD_MASK
| 1), (NEGATE_IPD_MASK
| 0),
144 10, 10, 4, 5, 6, 7, 8, 9,
148 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33
151 /* type definitions */
155 uint8_t resolution20
[3];
156 uint8_t resolution34
[5];
163 /* static function declarations */
164 static void ps_data_decode(ps_info
*ps
);
165 static hyb_info
*hybrid_init(void);
166 static void channel_filter2(hyb_info
*hyb
, uint8_t frame_len
, const real_t
*filter
,
167 qmf_t
*buffer
, qmf_t
**X_hybrid
);
168 static void INLINE
DCT3_4_unscaled(real_t
*y
, real_t
*x
);
169 static void channel_filter8(hyb_info
*hyb
, uint8_t frame_len
, const real_t
*filter
,
170 qmf_t
*buffer
, qmf_t
**X_hybrid
);
171 static void hybrid_analysis(hyb_info
*hyb
, qmf_t X
[32][64], qmf_t X_hybrid
[32][32],
173 static void hybrid_synthesis(hyb_info
*hyb
, qmf_t X
[32][64], qmf_t X_hybrid
[32][32],
175 static int8_t delta_clip(int8_t i
, int8_t min
, int8_t max
);
176 static void delta_decode(uint8_t enable
, int8_t *index
, int8_t *index_prev
,
177 uint8_t dt_flag
, uint8_t nr_par
, uint8_t stride
,
178 int8_t min_index
, int8_t max_index
);
179 static void delta_modulo_decode(uint8_t enable
, int8_t *index
, int8_t *index_prev
,
180 uint8_t dt_flag
, uint8_t nr_par
, uint8_t stride
,
182 static void map20indexto34(int8_t *index
, uint8_t bins
);
184 static void map34indexto20(int8_t *index
, uint8_t bins
);
186 static void ps_data_decode(ps_info
*ps
);
187 static void ps_decorrelate(ps_info
*ps
, qmf_t X_left
[38][64], qmf_t X_right
[38][64],
188 qmf_t X_hybrid_left
[32][32], qmf_t X_hybrid_right
[32][32]);
189 static void ps_mix_phase(ps_info
*ps
, qmf_t X_left
[38][64], qmf_t X_right
[38][64],
190 qmf_t X_hybrid_left
[32][32], qmf_t X_hybrid_right
[32][32]);
195 static hyb_info
*hybrid_init(void)
199 hyb_info
*hyb
= (hyb_info
*)faad_malloc(sizeof(hyb_info
));
201 hyb
->resolution34
[0] = 12;
202 hyb
->resolution34
[1] = 8;
203 hyb
->resolution34
[2] = 4;
204 hyb
->resolution34
[3] = 4;
205 hyb
->resolution34
[4] = 4;
207 hyb
->resolution20
[0] = 8;
208 hyb
->resolution20
[1] = 2;
209 hyb
->resolution20
[2] = 2;
213 hyb
->work
= (qmf_t
*)faad_malloc((hyb
->frame_len
+12) * sizeof(qmf_t
));
214 memset(hyb
->work
, 0, (hyb
->frame_len
+12) * sizeof(qmf_t
));
216 hyb
->buffer
= (qmf_t
**)faad_malloc(5 * sizeof(qmf_t
*));
217 for (i
= 0; i
< 5; i
++)
219 hyb
->buffer
[i
] = (qmf_t
*)faad_malloc(hyb
->frame_len
* sizeof(qmf_t
));
220 memset(hyb
->buffer
[i
], 0, hyb
->frame_len
* sizeof(qmf_t
));
223 hyb
->temp
= (qmf_t
**)faad_malloc(hyb
->frame_len
* sizeof(qmf_t
*));
224 for (i
= 0; i
< hyb
->frame_len
; i
++)
226 hyb
->temp
[i
] = (qmf_t
*)faad_malloc(12 /*max*/ * sizeof(qmf_t
));
232 static void hybrid_free(hyb_info
*hyb
)
237 faad_free(hyb
->work
);
239 for (i
= 0; i
< 5; i
++)
242 faad_free(hyb
->buffer
[i
]);
245 faad_free(hyb
->buffer
);
247 for (i
= 0; i
< hyb
->frame_len
; i
++)
250 faad_free(hyb
->temp
[i
]);
253 faad_free(hyb
->temp
);
256 /* real filter, size 2 */
257 static void channel_filter2(hyb_info
*hyb
, uint8_t frame_len
, const real_t
*filter
,
258 qmf_t
*buffer
, qmf_t
**X_hybrid
)
262 for (i
= 0; i
< frame_len
; i
++)
264 real_t r0
= MUL_F(filter
[0],(QMF_RE(buffer
[0+i
]) + QMF_RE(buffer
[12+i
])));
265 real_t r1
= MUL_F(filter
[1],(QMF_RE(buffer
[1+i
]) + QMF_RE(buffer
[11+i
])));
266 real_t r2
= MUL_F(filter
[2],(QMF_RE(buffer
[2+i
]) + QMF_RE(buffer
[10+i
])));
267 real_t r3
= MUL_F(filter
[3],(QMF_RE(buffer
[3+i
]) + QMF_RE(buffer
[9+i
])));
268 real_t r4
= MUL_F(filter
[4],(QMF_RE(buffer
[4+i
]) + QMF_RE(buffer
[8+i
])));
269 real_t r5
= MUL_F(filter
[5],(QMF_RE(buffer
[5+i
]) + QMF_RE(buffer
[7+i
])));
270 real_t r6
= MUL_F(filter
[6],QMF_RE(buffer
[6+i
]));
271 real_t i0
= MUL_F(filter
[0],(QMF_IM(buffer
[0+i
]) + QMF_IM(buffer
[12+i
])));
272 real_t i1
= MUL_F(filter
[1],(QMF_IM(buffer
[1+i
]) + QMF_IM(buffer
[11+i
])));
273 real_t i2
= MUL_F(filter
[2],(QMF_IM(buffer
[2+i
]) + QMF_IM(buffer
[10+i
])));
274 real_t i3
= MUL_F(filter
[3],(QMF_IM(buffer
[3+i
]) + QMF_IM(buffer
[9+i
])));
275 real_t i4
= MUL_F(filter
[4],(QMF_IM(buffer
[4+i
]) + QMF_IM(buffer
[8+i
])));
276 real_t i5
= MUL_F(filter
[5],(QMF_IM(buffer
[5+i
]) + QMF_IM(buffer
[7+i
])));
277 real_t i6
= MUL_F(filter
[6],QMF_IM(buffer
[6+i
]));
280 QMF_RE(X_hybrid
[i
][0]) = r0
+ r1
+ r2
+ r3
+ r4
+ r5
+ r6
;
281 QMF_IM(X_hybrid
[i
][0]) = i0
+ i1
+ i2
+ i3
+ i4
+ i5
+ i6
;
284 QMF_RE(X_hybrid
[i
][1]) = r0
- r1
+ r2
- r3
+ r4
- r5
+ r6
;
285 QMF_IM(X_hybrid
[i
][1]) = i0
- i1
+ i2
- i3
+ i4
- i5
+ i6
;
289 /* complex filter, size 4 */
290 static void channel_filter4(hyb_info
*hyb
, uint8_t frame_len
, const real_t
*filter
,
291 qmf_t
*buffer
, qmf_t
**X_hybrid
)
294 real_t input_re1
[2], input_re2
[2], input_im1
[2], input_im2
[2];
296 for (i
= 0; i
< frame_len
; i
++)
298 input_re1
[0] = -MUL_F(filter
[2], (QMF_RE(buffer
[i
+2]) + QMF_RE(buffer
[i
+10]))) +
299 MUL_F(filter
[6], QMF_RE(buffer
[i
+6]));
300 input_re1
[1] = MUL_F(FRAC_CONST(-0.70710678118655),
301 (MUL_F(filter
[1], (QMF_RE(buffer
[i
+1]) + QMF_RE(buffer
[i
+11]))) +
302 MUL_F(filter
[3], (QMF_RE(buffer
[i
+3]) + QMF_RE(buffer
[i
+9]))) -
303 MUL_F(filter
[5], (QMF_RE(buffer
[i
+5]) + QMF_RE(buffer
[i
+7])))));
305 input_im1
[0] = MUL_F(filter
[0], (QMF_IM(buffer
[i
+0]) - QMF_IM(buffer
[i
+12]))) -
306 MUL_F(filter
[4], (QMF_IM(buffer
[i
+4]) - QMF_IM(buffer
[i
+8])));
307 input_im1
[1] = MUL_F(FRAC_CONST(0.70710678118655),
308 (MUL_F(filter
[1], (QMF_IM(buffer
[i
+1]) - QMF_IM(buffer
[i
+11]))) -
309 MUL_F(filter
[3], (QMF_IM(buffer
[i
+3]) - QMF_IM(buffer
[i
+9]))) -
310 MUL_F(filter
[5], (QMF_IM(buffer
[i
+5]) - QMF_IM(buffer
[i
+7])))));
312 input_re2
[0] = MUL_F(filter
[0], (QMF_RE(buffer
[i
+0]) - QMF_RE(buffer
[i
+12]))) -
313 MUL_F(filter
[4], (QMF_RE(buffer
[i
+4]) - QMF_RE(buffer
[i
+8])));
314 input_re2
[1] = MUL_F(FRAC_CONST(0.70710678118655),
315 (MUL_F(filter
[1], (QMF_RE(buffer
[i
+1]) - QMF_RE(buffer
[i
+11]))) -
316 MUL_F(filter
[3], (QMF_RE(buffer
[i
+3]) - QMF_RE(buffer
[i
+9]))) -
317 MUL_F(filter
[5], (QMF_RE(buffer
[i
+5]) - QMF_RE(buffer
[i
+7])))));
319 input_im2
[0] = -MUL_F(filter
[2], (QMF_IM(buffer
[i
+2]) + QMF_IM(buffer
[i
+10]))) +
320 MUL_F(filter
[6], QMF_IM(buffer
[i
+6]));
321 input_im2
[1] = MUL_F(FRAC_CONST(-0.70710678118655),
322 (MUL_F(filter
[1], (QMF_IM(buffer
[i
+1]) + QMF_IM(buffer
[i
+11]))) +
323 MUL_F(filter
[3], (QMF_IM(buffer
[i
+3]) + QMF_IM(buffer
[i
+9]))) -
324 MUL_F(filter
[5], (QMF_IM(buffer
[i
+5]) + QMF_IM(buffer
[i
+7])))));
327 QMF_RE(X_hybrid
[i
][0]) = input_re1
[0] + input_re1
[1] + input_im1
[0] + input_im1
[1];
328 QMF_IM(X_hybrid
[i
][0]) = -input_re2
[0] - input_re2
[1] + input_im2
[0] + input_im2
[1];
331 QMF_RE(X_hybrid
[i
][1]) = input_re1
[0] - input_re1
[1] - input_im1
[0] + input_im1
[1];
332 QMF_IM(X_hybrid
[i
][1]) = input_re2
[0] - input_re2
[1] + input_im2
[0] - input_im2
[1];
335 QMF_RE(X_hybrid
[i
][2]) = input_re1
[0] - input_re1
[1] + input_im1
[0] - input_im1
[1];
336 QMF_IM(X_hybrid
[i
][2]) = -input_re2
[0] + input_re2
[1] + input_im2
[0] - input_im2
[1];
339 QMF_RE(X_hybrid
[i
][3]) = input_re1
[0] + input_re1
[1] - input_im1
[0] - input_im1
[1];
340 QMF_IM(X_hybrid
[i
][3]) = input_re2
[0] + input_re2
[1] + input_im2
[0] + input_im2
[1];
344 static void INLINE
DCT3_4_unscaled(real_t
*y
, real_t
*x
)
346 real_t f0
, f1
, f2
, f3
, f4
, f5
, f6
, f7
, f8
;
348 f0
= MUL_F(x
[2], FRAC_CONST(0.7071067811865476));
352 f4
= MUL_C(x
[1], COEF_CONST(1.3065629648763766));
353 f5
= MUL_F(f3
, FRAC_CONST(-0.9238795325112866));
354 f6
= MUL_F(x
[3], FRAC_CONST(-0.5411961001461967));
363 /* complex filter, size 8 */
364 static void channel_filter8(hyb_info
*hyb
, uint8_t frame_len
, const real_t
*filter
,
365 qmf_t
*buffer
, qmf_t
**X_hybrid
)
368 real_t input_re1
[4], input_re2
[4], input_im1
[4], input_im2
[4];
371 for (i
= 0; i
< frame_len
; i
++)
373 input_re1
[0] = MUL_F(filter
[6],QMF_RE(buffer
[6+i
]));
374 input_re1
[1] = MUL_F(filter
[5],(QMF_RE(buffer
[5+i
]) + QMF_RE(buffer
[7+i
])));
375 input_re1
[2] = -MUL_F(filter
[0],(QMF_RE(buffer
[0+i
]) + QMF_RE(buffer
[12+i
]))) + MUL_F(filter
[4],(QMF_RE(buffer
[4+i
]) + QMF_RE(buffer
[8+i
])));
376 input_re1
[3] = -MUL_F(filter
[1],(QMF_RE(buffer
[1+i
]) + QMF_RE(buffer
[11+i
]))) + MUL_F(filter
[3],(QMF_RE(buffer
[3+i
]) + QMF_RE(buffer
[9+i
])));
378 input_im1
[0] = MUL_F(filter
[5],(QMF_IM(buffer
[7+i
]) - QMF_IM(buffer
[5+i
])));
379 input_im1
[1] = MUL_F(filter
[0],(QMF_IM(buffer
[12+i
]) - QMF_IM(buffer
[0+i
]))) + MUL_F(filter
[4],(QMF_IM(buffer
[8+i
]) - QMF_IM(buffer
[4+i
])));
380 input_im1
[2] = MUL_F(filter
[1],(QMF_IM(buffer
[11+i
]) - QMF_IM(buffer
[1+i
]))) + MUL_F(filter
[3],(QMF_IM(buffer
[9+i
]) - QMF_IM(buffer
[3+i
])));
381 input_im1
[3] = MUL_F(filter
[2],(QMF_IM(buffer
[10+i
]) - QMF_IM(buffer
[2+i
])));
383 for (n
= 0; n
< 4; n
++)
385 x
[n
] = input_re1
[n
] - input_im1
[3-n
];
387 DCT3_4_unscaled(x
, x
);
388 QMF_RE(X_hybrid
[i
][7]) = x
[0];
389 QMF_RE(X_hybrid
[i
][5]) = x
[2];
390 QMF_RE(X_hybrid
[i
][3]) = x
[3];
391 QMF_RE(X_hybrid
[i
][1]) = x
[1];
393 for (n
= 0; n
< 4; n
++)
395 x
[n
] = input_re1
[n
] + input_im1
[3-n
];
397 DCT3_4_unscaled(x
, x
);
398 QMF_RE(X_hybrid
[i
][6]) = x
[1];
399 QMF_RE(X_hybrid
[i
][4]) = x
[3];
400 QMF_RE(X_hybrid
[i
][2]) = x
[2];
401 QMF_RE(X_hybrid
[i
][0]) = x
[0];
403 input_im2
[0] = MUL_F(filter
[6],QMF_IM(buffer
[6+i
]));
404 input_im2
[1] = MUL_F(filter
[5],(QMF_IM(buffer
[5+i
]) + QMF_IM(buffer
[7+i
])));
405 input_im2
[2] = -MUL_F(filter
[0],(QMF_IM(buffer
[0+i
]) + QMF_IM(buffer
[12+i
]))) + MUL_F(filter
[4],(QMF_IM(buffer
[4+i
]) + QMF_IM(buffer
[8+i
])));
406 input_im2
[3] = -MUL_F(filter
[1],(QMF_IM(buffer
[1+i
]) + QMF_IM(buffer
[11+i
]))) + MUL_F(filter
[3],(QMF_IM(buffer
[3+i
]) + QMF_IM(buffer
[9+i
])));
408 input_re2
[0] = MUL_F(filter
[5],(QMF_RE(buffer
[7+i
]) - QMF_RE(buffer
[5+i
])));
409 input_re2
[1] = MUL_F(filter
[0],(QMF_RE(buffer
[12+i
]) - QMF_RE(buffer
[0+i
]))) + MUL_F(filter
[4],(QMF_RE(buffer
[8+i
]) - QMF_RE(buffer
[4+i
])));
410 input_re2
[2] = MUL_F(filter
[1],(QMF_RE(buffer
[11+i
]) - QMF_RE(buffer
[1+i
]))) + MUL_F(filter
[3],(QMF_RE(buffer
[9+i
]) - QMF_RE(buffer
[3+i
])));
411 input_re2
[3] = MUL_F(filter
[2],(QMF_RE(buffer
[10+i
]) - QMF_RE(buffer
[2+i
])));
413 for (n
= 0; n
< 4; n
++)
415 x
[n
] = input_im2
[n
] + input_re2
[3-n
];
417 DCT3_4_unscaled(x
, x
);
418 QMF_IM(X_hybrid
[i
][7]) = x
[0];
419 QMF_IM(X_hybrid
[i
][5]) = x
[2];
420 QMF_IM(X_hybrid
[i
][3]) = x
[3];
421 QMF_IM(X_hybrid
[i
][1]) = x
[1];
423 for (n
= 0; n
< 4; n
++)
425 x
[n
] = input_im2
[n
] - input_re2
[3-n
];
427 DCT3_4_unscaled(x
, x
);
428 QMF_IM(X_hybrid
[i
][6]) = x
[1];
429 QMF_IM(X_hybrid
[i
][4]) = x
[3];
430 QMF_IM(X_hybrid
[i
][2]) = x
[2];
431 QMF_IM(X_hybrid
[i
][0]) = x
[0];
435 static void INLINE
DCT3_6_unscaled(real_t
*y
, real_t
*x
)
437 real_t f0
, f1
, f2
, f3
, f4
, f5
, f6
, f7
;
439 f0
= MUL_F(x
[3], FRAC_CONST(0.70710678118655));
442 f3
= MUL_F((x
[1] - x
[5]), FRAC_CONST(0.70710678118655));
443 f4
= MUL_F(x
[2], FRAC_CONST(0.86602540378444)) + MUL_F(x
[4], FRAC_CONST(0.5));
445 f6
= MUL_F(x
[1], FRAC_CONST(0.96592582628907)) + MUL_F(x
[5], FRAC_CONST(0.25881904510252));
448 y
[1] = f2
+ f3
- x
[4];
451 y
[4] = f1
- f3
- x
[4];
455 /* complex filter, size 12 */
456 static void channel_filter12(hyb_info
*hyb
, uint8_t frame_len
, const real_t
*filter
,
457 qmf_t
*buffer
, qmf_t
**X_hybrid
)
460 real_t input_re1
[6], input_re2
[6], input_im1
[6], input_im2
[6];
461 real_t out_re1
[6], out_re2
[6], out_im1
[6], out_im2
[6];
463 for (i
= 0; i
< frame_len
; i
++)
465 for (n
= 0; n
< 6; n
++)
469 input_re1
[0] = MUL_F(QMF_RE(buffer
[6+i
]), filter
[6]);
470 input_re2
[0] = MUL_F(QMF_IM(buffer
[6+i
]), filter
[6]);
472 input_re1
[6-n
] = MUL_F((QMF_RE(buffer
[n
+i
]) + QMF_RE(buffer
[12-n
+i
])), filter
[n
]);
473 input_re2
[6-n
] = MUL_F((QMF_IM(buffer
[n
+i
]) + QMF_IM(buffer
[12-n
+i
])), filter
[n
]);
475 input_im2
[n
] = MUL_F((QMF_RE(buffer
[n
+i
]) - QMF_RE(buffer
[12-n
+i
])), filter
[n
]);
476 input_im1
[n
] = MUL_F((QMF_IM(buffer
[n
+i
]) - QMF_IM(buffer
[12-n
+i
])), filter
[n
]);
479 DCT3_6_unscaled(out_re1
, input_re1
);
480 DCT3_6_unscaled(out_re2
, input_re2
);
482 DCT3_6_unscaled(out_im1
, input_im1
);
483 DCT3_6_unscaled(out_im2
, input_im2
);
485 for (n
= 0; n
< 6; n
+= 2)
487 QMF_RE(X_hybrid
[i
][n
]) = out_re1
[n
] - out_im1
[n
];
488 QMF_IM(X_hybrid
[i
][n
]) = out_re2
[n
] + out_im2
[n
];
489 QMF_RE(X_hybrid
[i
][n
+1]) = out_re1
[n
+1] + out_im1
[n
+1];
490 QMF_IM(X_hybrid
[i
][n
+1]) = out_re2
[n
+1] - out_im2
[n
+1];
492 QMF_RE(X_hybrid
[i
][10-n
]) = out_re1
[n
+1] - out_im1
[n
+1];
493 QMF_IM(X_hybrid
[i
][10-n
]) = out_re2
[n
+1] + out_im2
[n
+1];
494 QMF_RE(X_hybrid
[i
][11-n
]) = out_re1
[n
] + out_im1
[n
];
495 QMF_IM(X_hybrid
[i
][11-n
]) = out_re2
[n
] - out_im2
[n
];
500 /* Hybrid analysis: further split up QMF subbands
501 * to improve frequency resolution
503 static void hybrid_analysis(hyb_info
*hyb
, qmf_t X
[32][64], qmf_t X_hybrid
[32][32],
508 uint8_t qmf_bands
= (use34
) ? 5 : 3;
509 uint8_t *resolution
= (use34
) ? hyb
->resolution34
: hyb
->resolution20
;
511 for (band
= 0; band
< qmf_bands
; band
++)
513 /* build working buffer */
514 memcpy(hyb
->work
, hyb
->buffer
[band
], 12 * sizeof(qmf_t
));
516 /* add new samples */
517 for (n
= 0; n
< hyb
->frame_len
; n
++)
519 QMF_RE(hyb
->work
[12 + n
]) = QMF_RE(X
[n
+ 6 /*delay*/][band
]);
520 QMF_IM(hyb
->work
[12 + n
]) = QMF_IM(X
[n
+ 6 /*delay*/][band
]);
524 memcpy(hyb
->buffer
[band
], hyb
->work
+ hyb
->frame_len
, 12 * sizeof(qmf_t
));
527 switch(resolution
[band
])
530 /* Type B real filter, Q[p] = 2 */
531 channel_filter2(hyb
, hyb
->frame_len
, p2_13_20
, hyb
->work
, hyb
->temp
);
534 /* Type A complex filter, Q[p] = 4 */
535 channel_filter4(hyb
, hyb
->frame_len
, p4_13_34
, hyb
->work
, hyb
->temp
);
538 /* Type A complex filter, Q[p] = 8 */
539 channel_filter8(hyb
, hyb
->frame_len
, (use34
) ? p8_13_34
: p8_13_20
,
540 hyb
->work
, hyb
->temp
);
543 /* Type A complex filter, Q[p] = 12 */
544 channel_filter12(hyb
, hyb
->frame_len
, p12_13_34
, hyb
->work
, hyb
->temp
);
548 for (n
= 0; n
< hyb
->frame_len
; n
++)
550 for (k
= 0; k
< resolution
[band
]; k
++)
552 QMF_RE(X_hybrid
[n
][offset
+ k
]) = QMF_RE(hyb
->temp
[n
][k
]);
553 QMF_IM(X_hybrid
[n
][offset
+ k
]) = QMF_IM(hyb
->temp
[n
][k
]);
556 offset
+= resolution
[band
];
559 /* group hybrid channels */
562 for (n
= 0; n
< 32 /*30?*/; n
++)
564 QMF_RE(X_hybrid
[n
][3]) += QMF_RE(X_hybrid
[n
][4]);
565 QMF_IM(X_hybrid
[n
][3]) += QMF_IM(X_hybrid
[n
][4]);
566 QMF_RE(X_hybrid
[n
][4]) = 0;
567 QMF_IM(X_hybrid
[n
][4]) = 0;
569 QMF_RE(X_hybrid
[n
][2]) += QMF_RE(X_hybrid
[n
][5]);
570 QMF_IM(X_hybrid
[n
][2]) += QMF_IM(X_hybrid
[n
][5]);
571 QMF_RE(X_hybrid
[n
][5]) = 0;
572 QMF_IM(X_hybrid
[n
][5]) = 0;
577 static void hybrid_synthesis(hyb_info
*hyb
, qmf_t X
[32][64], qmf_t X_hybrid
[32][32],
582 uint8_t qmf_bands
= (use34
) ? 5 : 3;
583 uint8_t *resolution
= (use34
) ? hyb
->resolution34
: hyb
->resolution20
;
585 for(band
= 0; band
< qmf_bands
; band
++)
587 for (n
= 0; n
< hyb
->frame_len
; n
++)
589 QMF_RE(X
[n
][band
]) = 0;
590 QMF_IM(X
[n
][band
]) = 0;
592 for (k
= 0; k
< resolution
[band
]; k
++)
594 QMF_RE(X
[n
][band
]) += QMF_RE(X_hybrid
[n
][offset
+ k
]);
595 QMF_IM(X
[n
][band
]) += QMF_IM(X_hybrid
[n
][offset
+ k
]);
598 offset
+= resolution
[band
];
602 /* limits the value i to the range [min,max] */
603 static int8_t delta_clip(int8_t i
, int8_t min
, int8_t max
)
615 /* delta decode array */
616 static void delta_decode(uint8_t enable
, int8_t *index
, int8_t *index_prev
,
617 uint8_t dt_flag
, uint8_t nr_par
, uint8_t stride
,
618 int8_t min_index
, int8_t max_index
)
626 /* delta coded in frequency direction */
627 index
[0] = 0 + index
[0];
628 index
[0] = delta_clip(index
[0], min_index
, max_index
);
630 for (i
= 1; i
< nr_par
; i
++)
632 index
[i
] = index
[i
-1] + index
[i
];
633 index
[i
] = delta_clip(index
[i
], min_index
, max_index
);
636 /* delta coded in time direction */
637 for (i
= 0; i
< nr_par
; i
++)
640 //int8_t tmp = index[i];
642 //printf("%d %d\n", index_prev[i*stride], index[i]);
643 //printf("%d\n", index[i]);
645 index
[i
] = index_prev
[i
*stride
] + index
[i
];
647 index
[i
] = delta_clip(index
[i
], min_index
, max_index
);
651 // if (index[i] == 7)
653 // printf("%d %d %d\n", index_prev[i*stride], tmp, tmp2);
659 /* set indices to zero */
660 for (i
= 0; i
< nr_par
; i
++)
669 for (i
= (nr_par
<<1)-1; i
> 0; i
--)
671 index
[i
] = index
[i
>>1];
676 /* delta modulo decode array */
677 /* in: log2 value of the modulo value to allow using AND instead of MOD */
678 static void delta_modulo_decode(uint8_t enable
, int8_t *index
, int8_t *index_prev
,
679 uint8_t dt_flag
, uint8_t nr_par
, uint8_t stride
,
688 /* delta coded in frequency direction */
689 index
[0] = 0 + index
[0];
690 index
[0] &= log2modulo
;
692 for (i
= 1; i
< nr_par
; i
++)
694 index
[i
] = index
[i
-1] + index
[i
];
695 index
[i
] &= log2modulo
;
698 /* delta coded in time direction */
699 for (i
= 0; i
< nr_par
; i
++)
701 index
[i
] = index_prev
[i
*stride
] + index
[i
];
702 index
[i
] &= log2modulo
;
706 /* set indices to zero */
707 for (i
= 0; i
< nr_par
; i
++)
717 for (i
= (nr_par
<<1)-1; i
> 0; i
--)
719 index
[i
] = index
[i
>>1];
725 static void map34indexto20(int8_t *index
, uint8_t bins
)
727 index
[0] = (2*index
[0]+index
[1])/3;
728 index
[1] = (index
[1]+2*index
[2])/3;
729 index
[2] = (2*index
[3]+index
[4])/3;
730 index
[3] = (index
[4]+2*index
[5])/3;
731 index
[4] = (index
[6]+index
[7])/2;
732 index
[5] = (index
[8]+index
[9])/2;
733 index
[6] = index
[10];
734 index
[7] = index
[11];
735 index
[8] = (index
[12]+index
[13])/2;
736 index
[9] = (index
[14]+index
[15])/2;
737 index
[10] = index
[16];
741 index
[11] = index
[17];
742 index
[12] = index
[18];
743 index
[13] = index
[19];
744 index
[14] = (index
[20]+index
[21])/2;
745 index
[15] = (index
[22]+index
[23])/2;
746 index
[16] = (index
[24]+index
[25])/2;
747 index
[17] = (index
[26]+index
[27])/2;
748 index
[18] = (index
[28]+index
[29]+index
[30]+index
[31])/4;
749 index
[19] = (index
[32]+index
[33])/2;
754 static void map20indexto34(int8_t *index
, uint8_t bins
)
757 index
[1] = (index
[0] + index
[1])/2;
760 index
[4] = (index
[2] + index
[3])/2;
766 index
[10] = index
[6];
767 index
[11] = index
[7];
768 index
[12] = index
[8];
769 index
[13] = index
[8];
770 index
[14] = index
[9];
771 index
[15] = index
[9];
772 index
[16] = index
[10];
776 index
[17] = index
[11];
777 index
[18] = index
[12];
778 index
[19] = index
[13];
779 index
[20] = index
[14];
780 index
[21] = index
[14];
781 index
[22] = index
[15];
782 index
[23] = index
[15];
783 index
[24] = index
[16];
784 index
[25] = index
[16];
785 index
[26] = index
[17];
786 index
[27] = index
[17];
787 index
[28] = index
[18];
788 index
[29] = index
[18];
789 index
[30] = index
[18];
790 index
[31] = index
[18];
791 index
[32] = index
[19];
792 index
[33] = index
[19];
796 /* parse the bitstream data decoded in ps_data() */
797 static void ps_data_decode(ps_info
*ps
)
801 /* ps data not available, use data from previous frame */
802 if (ps
->ps_data_available
== 0)
807 for (env
= 0; env
< ps
->num_env
; env
++)
809 int8_t *iid_index_prev
;
810 int8_t *icc_index_prev
;
811 int8_t *ipd_index_prev
;
812 int8_t *opd_index_prev
;
814 int8_t num_iid_steps
= (ps
->iid_mode
< 3) ? 7 : 15 /*fine quant*/;
818 /* take last envelope from previous frame */
819 iid_index_prev
= ps
->iid_index_prev
;
820 icc_index_prev
= ps
->icc_index_prev
;
821 ipd_index_prev
= ps
->ipd_index_prev
;
822 opd_index_prev
= ps
->opd_index_prev
;
824 /* take index values from previous envelope */
825 iid_index_prev
= ps
->iid_index
[env
- 1];
826 icc_index_prev
= ps
->icc_index
[env
- 1];
827 ipd_index_prev
= ps
->ipd_index
[env
- 1];
828 opd_index_prev
= ps
->opd_index
[env
- 1];
832 /* delta decode iid parameters */
833 delta_decode(ps
->enable_iid
, ps
->iid_index
[env
], iid_index_prev
,
834 ps
->iid_dt
[env
], ps
->nr_iid_par
,
835 (ps
->iid_mode
== 0 || ps
->iid_mode
== 3) ? 2 : 1,
836 -num_iid_steps
, num_iid_steps
);
839 /* delta decode icc parameters */
840 delta_decode(ps
->enable_icc
, ps
->icc_index
[env
], icc_index_prev
,
841 ps
->icc_dt
[env
], ps
->nr_icc_par
,
842 (ps
->icc_mode
== 0 || ps
->icc_mode
== 3) ? 2 : 1,
845 /* delta modulo decode ipd parameters */
846 delta_modulo_decode(ps
->enable_ipdopd
, ps
->ipd_index
[env
], ipd_index_prev
,
847 ps
->ipd_dt
[env
], ps
->nr_ipdopd_par
, 1, /*log2(8)*/ 3);
849 /* delta modulo decode opd parameters */
850 delta_modulo_decode(ps
->enable_ipdopd
, ps
->opd_index
[env
], opd_index_prev
,
851 ps
->opd_dt
[env
], ps
->nr_ipdopd_par
, 1, /*log2(8)*/ 3);
854 /* handle error case */
855 if (ps
->num_env
== 0)
862 for (bin
= 0; bin
< 34; bin
++)
863 ps
->iid_index
[0][bin
] = ps
->iid_index_prev
[bin
];
865 for (bin
= 0; bin
< 34; bin
++)
866 ps
->iid_index
[0][bin
] = 0;
871 for (bin
= 0; bin
< 34; bin
++)
872 ps
->icc_index
[0][bin
] = ps
->icc_index_prev
[bin
];
874 for (bin
= 0; bin
< 34; bin
++)
875 ps
->icc_index
[0][bin
] = 0;
878 if (ps
->enable_ipdopd
)
880 for (bin
= 0; bin
< 17; bin
++)
882 ps
->ipd_index
[0][bin
] = ps
->ipd_index_prev
[bin
];
883 ps
->opd_index
[0][bin
] = ps
->opd_index_prev
[bin
];
886 for (bin
= 0; bin
< 17; bin
++)
888 ps
->ipd_index
[0][bin
] = 0;
889 ps
->opd_index
[0][bin
] = 0;
894 /* update previous indices */
895 for (bin
= 0; bin
< 34; bin
++)
896 ps
->iid_index_prev
[bin
] = ps
->iid_index
[ps
->num_env
-1][bin
];
897 for (bin
= 0; bin
< 34; bin
++)
898 ps
->icc_index_prev
[bin
] = ps
->icc_index
[ps
->num_env
-1][bin
];
899 for (bin
= 0; bin
< 17; bin
++)
901 ps
->ipd_index_prev
[bin
] = ps
->ipd_index
[ps
->num_env
-1][bin
];
902 ps
->opd_index_prev
[bin
] = ps
->opd_index
[ps
->num_env
-1][bin
];
905 ps
->ps_data_available
= 0;
907 if (ps
->frame_class
== 0)
909 ps
->border_position
[0] = 0;
910 for (env
= 1; env
< ps
->num_env
; env
++)
912 ps
->border_position
[env
] = (env
* 32 /* 30 for 960? */) / ps
->num_env
;
914 ps
->border_position
[ps
->num_env
] = 32 /* 30 for 960? */;
916 ps
->border_position
[0] = 0;
918 if (ps
->border_position
[ps
->num_env
] < 32 /* 30 for 960? */)
921 ps
->border_position
[ps
->num_env
] = 32 /* 30 for 960? */;
922 for (bin
= 0; bin
< 34; bin
++)
924 ps
->iid_index
[ps
->num_env
][bin
] = ps
->iid_index
[ps
->num_env
-1][bin
];
925 ps
->icc_index
[ps
->num_env
][bin
] = ps
->icc_index
[ps
->num_env
-1][bin
];
927 for (bin
= 0; bin
< 17; bin
++)
929 ps
->ipd_index
[ps
->num_env
][bin
] = ps
->ipd_index
[ps
->num_env
-1][bin
];
930 ps
->opd_index
[ps
->num_env
][bin
] = ps
->opd_index
[ps
->num_env
-1][bin
];
934 for (env
= 1; env
< ps
->num_env
; env
++)
936 int8_t thr
= 32 /* 30 for 960? */ - (ps
->num_env
- env
);
938 if (ps
->border_position
[env
] > thr
)
940 ps
->border_position
[env
] = thr
;
942 thr
= ps
->border_position
[env
-1]+1;
943 if (ps
->border_position
[env
] < thr
)
945 ps
->border_position
[env
] = thr
;
951 /* make sure that the indices of all parameters can be mapped
952 * to the same hybrid synthesis filterbank
955 for (env
= 0; env
< ps
->num_env
; env
++)
957 if (ps
->iid_mode
== 2 || ps
->iid_mode
== 5)
958 map34indexto20(ps
->iid_index
[env
], 34);
959 if (ps
->icc_mode
== 2 || ps
->icc_mode
== 5)
960 map34indexto20(ps
->icc_index
[env
], 34);
962 /* disable ipd/opd */
963 for (bin
= 0; bin
< 17; bin
++)
965 ps
->aaIpdIndex
[env
][bin
] = 0;
966 ps
->aaOpdIndex
[env
][bin
] = 0;
970 if (ps
->use34hybrid_bands
)
972 for (env
= 0; env
< ps
->num_env
; env
++)
974 if (ps
->iid_mode
!= 2 && ps
->iid_mode
!= 5)
975 map20indexto34(ps
->iid_index
[env
], 34);
976 if (ps
->icc_mode
!= 2 && ps
->icc_mode
!= 5)
977 map20indexto34(ps
->icc_index
[env
], 34);
978 if (ps
->ipd_mode
!= 2 && ps
->ipd_mode
!= 5)
980 map20indexto34(ps
->ipd_index
[env
], 17);
981 map20indexto34(ps
->opd_index
[env
], 17);
988 for (env
= 0; env
< ps
->num_env
; env
++)
990 printf("iid[env:%d]:", env
);
991 for (bin
= 0; bin
< 34; bin
++)
993 printf(" %d", ps
->iid_index
[env
][bin
]);
997 for (env
= 0; env
< ps
->num_env
; env
++)
999 printf("icc[env:%d]:", env
);
1000 for (bin
= 0; bin
< 34; bin
++)
1002 printf(" %d", ps
->icc_index
[env
][bin
]);
1006 for (env
= 0; env
< ps
->num_env
; env
++)
1008 printf("ipd[env:%d]:", env
);
1009 for (bin
= 0; bin
< 17; bin
++)
1011 printf(" %d", ps
->ipd_index
[env
][bin
]);
1015 for (env
= 0; env
< ps
->num_env
; env
++)
1017 printf("opd[env:%d]:", env
);
1018 for (bin
= 0; bin
< 17; bin
++)
1020 printf(" %d", ps
->opd_index
[env
][bin
]);
1028 /* decorrelate the mono signal using an allpass filter */
1029 static void ps_decorrelate(ps_info
*ps
, qmf_t X_left
[38][64], qmf_t X_right
[38][64],
1030 qmf_t X_hybrid_left
[32][32], qmf_t X_hybrid_right
[32][32])
1032 uint8_t gr
, n
, m
, bk
;
1035 const complex_t
*Phi_Fract_SubQmf
;
1036 uint8_t temp_delay_ser
[NO_ALLPASS_LINKS
];
1037 real_t P_SmoothPeakDecayDiffNrg
, nrg
;
1039 real_t G_TransientRatio
[32][34] = {{0}};
1040 complex_t inputLeft
;
1043 /* chose hybrid filterbank: 20 or 34 band case */
1044 if (ps
->use34hybrid_bands
)
1046 Phi_Fract_SubQmf
= Phi_Fract_SubQmf34
;
1048 Phi_Fract_SubQmf
= Phi_Fract_SubQmf20
;
1051 /* clear the energy values */
1052 for (n
= 0; n
< 32; n
++)
1054 for (bk
= 0; bk
< 34; bk
++)
1060 /* calculate the energy in each parameter band b(k) */
1061 for (gr
= 0; gr
< ps
->num_groups
; gr
++)
1063 /* select the parameter index b(k) to which this group belongs */
1064 bk
= (~NEGATE_IPD_MASK
) & ps
->map_group2bk
[gr
];
1066 /* select the upper subband border for this group */
1067 maxsb
= (gr
< ps
->num_hybrid_groups
) ? ps
->group_border
[gr
]+1 : ps
->group_border
[gr
+1];
1069 for (sb
= ps
->group_border
[gr
]; sb
< maxsb
; sb
++)
1071 for (n
= ps
->border_position
[0]; n
< ps
->border_position
[ps
->num_env
]; n
++)
1074 uint32_t in_re
, in_im
;
1077 /* input from hybrid subbands or QMF subbands */
1078 if (gr
< ps
->num_hybrid_groups
)
1080 RE(inputLeft
) = QMF_RE(X_hybrid_left
[n
][sb
]);
1081 IM(inputLeft
) = QMF_IM(X_hybrid_left
[n
][sb
]);
1083 RE(inputLeft
) = QMF_RE(X_left
[n
][sb
]);
1084 IM(inputLeft
) = QMF_IM(X_left
[n
][sb
]);
1087 /* accumulate energy */
1089 /* NOTE: all input is scaled by 2^(-5) because of fixed point QMF
1090 * meaning that P will be scaled by 2^(-10) compared to floating point version
1092 in_re
= ((abs(RE(inputLeft
))+(1<<(REAL_BITS
-1)))>>REAL_BITS
);
1093 in_im
= ((abs(IM(inputLeft
))+(1<<(REAL_BITS
-1)))>>REAL_BITS
);
1094 P
[n
][bk
] += in_re
*in_re
+ in_im
*in_im
;
1096 P
[n
][bk
] += MUL_R(RE(inputLeft
),RE(inputLeft
)) + MUL_R(IM(inputLeft
),IM(inputLeft
));
1103 for (n
= 0; n
< 32; n
++)
1105 for (bk
= 0; bk
< 34; bk
++)
1108 printf("%d %d: %d\n", n
, bk
, P
[n
][bk
] /*/(float)REAL_PRECISION*/);
1110 printf("%d %d: %f\n", n
, bk
, P
[n
][bk
]/1024.0);
1116 /* calculate transient reduction ratio for each parameter band b(k) */
1117 for (bk
= 0; bk
< ps
->nr_par_bands
; bk
++)
1119 for (n
= ps
->border_position
[0]; n
< ps
->border_position
[ps
->num_env
]; n
++)
1121 const real_t gamma
= COEF_CONST(1.5);
1123 ps
->P_PeakDecayNrg
[bk
] = MUL_F(ps
->P_PeakDecayNrg
[bk
], ps
->alpha_decay
);
1124 if (ps
->P_PeakDecayNrg
[bk
] < P
[n
][bk
])
1125 ps
->P_PeakDecayNrg
[bk
] = P
[n
][bk
];
1127 /* apply smoothing filter to peak decay energy */
1128 P_SmoothPeakDecayDiffNrg
= ps
->P_SmoothPeakDecayDiffNrg_prev
[bk
];
1129 P_SmoothPeakDecayDiffNrg
+= MUL_F((ps
->P_PeakDecayNrg
[bk
] - P
[n
][bk
] - ps
->P_SmoothPeakDecayDiffNrg_prev
[bk
]), ps
->alpha_smooth
);
1130 ps
->P_SmoothPeakDecayDiffNrg_prev
[bk
] = P_SmoothPeakDecayDiffNrg
;
1132 /* apply smoothing filter to energy */
1133 nrg
= ps
->P_prev
[bk
];
1134 nrg
+= MUL_F((P
[n
][bk
] - ps
->P_prev
[bk
]), ps
->alpha_smooth
);
1135 ps
->P_prev
[bk
] = nrg
;
1137 /* calculate transient ratio */
1138 if (MUL_C(P_SmoothPeakDecayDiffNrg
, gamma
) <= nrg
)
1140 G_TransientRatio
[n
][bk
] = REAL_CONST(1.0);
1142 G_TransientRatio
[n
][bk
] = DIV_R(nrg
, (MUL_C(P_SmoothPeakDecayDiffNrg
, gamma
)));
1148 for (n
= 0; n
< 32; n
++)
1150 for (bk
= 0; bk
< 34; bk
++)
1153 printf("%d %d: %f\n", n
, bk
, G_TransientRatio
[n
][bk
]/(float)REAL_PRECISION
);
1155 printf("%d %d: %f\n", n
, bk
, G_TransientRatio
[n
][bk
]);
1161 /* apply stereo decorrelation filter to the signal */
1162 for (gr
= 0; gr
< ps
->num_groups
; gr
++)
1164 if (gr
< ps
->num_hybrid_groups
)
1165 maxsb
= ps
->group_border
[gr
] + 1;
1167 maxsb
= ps
->group_border
[gr
+ 1];
1170 for (sb
= ps
->group_border
[gr
]; sb
< maxsb
; sb
++)
1172 real_t g_DecaySlope
;
1173 real_t g_DecaySlope_filt
[NO_ALLPASS_LINKS
];
1175 /* g_DecaySlope: [0..1] */
1176 if (gr
< ps
->num_hybrid_groups
|| sb
<= ps
->decay_cutoff
)
1178 g_DecaySlope
= FRAC_CONST(1.0);
1180 int8_t decay
= ps
->decay_cutoff
- sb
;
1181 if (decay
<= -20 /* -1/DECAY_SLOPE */)
1185 /* decay(int)*decay_slope(frac) = g_DecaySlope(frac) */
1186 g_DecaySlope
= FRAC_CONST(1.0) + DECAY_SLOPE
* decay
;
1190 /* calculate g_DecaySlope_filt for every m multiplied by filter_a[m] */
1191 for (m
= 0; m
< NO_ALLPASS_LINKS
; m
++)
1193 g_DecaySlope_filt
[m
] = MUL_F(g_DecaySlope
, filter_a
[m
]);
1197 /* set delay indices */
1198 temp_delay
= ps
->saved_delay
;
1199 for (n
= 0; n
< NO_ALLPASS_LINKS
; n
++)
1200 temp_delay_ser
[n
] = ps
->delay_buf_index_ser
[n
];
1202 for (n
= ps
->border_position
[0]; n
< ps
->border_position
[ps
->num_env
]; n
++)
1204 complex_t tmp
, tmp0
, R0
;
1206 if (gr
< ps
->num_hybrid_groups
)
1208 /* hybrid filterbank input */
1209 RE(inputLeft
) = QMF_RE(X_hybrid_left
[n
][sb
]);
1210 IM(inputLeft
) = QMF_IM(X_hybrid_left
[n
][sb
]);
1212 /* QMF filterbank input */
1213 RE(inputLeft
) = QMF_RE(X_left
[n
][sb
]);
1214 IM(inputLeft
) = QMF_IM(X_left
[n
][sb
]);
1217 if (sb
> ps
->nr_allpass_bands
&& gr
>= ps
->num_hybrid_groups
)
1221 /* never hybrid subbands here, always QMF subbands */
1222 RE(tmp
) = RE(ps
->delay_Qmf
[ps
->delay_buf_index_delay
[sb
]][sb
]);
1223 IM(tmp
) = IM(ps
->delay_Qmf
[ps
->delay_buf_index_delay
[sb
]][sb
]);
1226 RE(ps
->delay_Qmf
[ps
->delay_buf_index_delay
[sb
]][sb
]) = RE(inputLeft
);
1227 IM(ps
->delay_Qmf
[ps
->delay_buf_index_delay
[sb
]][sb
]) = IM(inputLeft
);
1229 /* allpass filter */
1231 complex_t Phi_Fract
;
1233 /* fetch parameters */
1234 if (gr
< ps
->num_hybrid_groups
)
1236 /* select data from the hybrid subbands */
1237 RE(tmp0
) = RE(ps
->delay_SubQmf
[temp_delay
][sb
]);
1238 IM(tmp0
) = IM(ps
->delay_SubQmf
[temp_delay
][sb
]);
1240 RE(ps
->delay_SubQmf
[temp_delay
][sb
]) = RE(inputLeft
);
1241 IM(ps
->delay_SubQmf
[temp_delay
][sb
]) = IM(inputLeft
);
1243 RE(Phi_Fract
) = RE(Phi_Fract_SubQmf
[sb
]);
1244 IM(Phi_Fract
) = IM(Phi_Fract_SubQmf
[sb
]);
1246 /* select data from the QMF subbands */
1247 RE(tmp0
) = RE(ps
->delay_Qmf
[temp_delay
][sb
]);
1248 IM(tmp0
) = IM(ps
->delay_Qmf
[temp_delay
][sb
]);
1250 RE(ps
->delay_Qmf
[temp_delay
][sb
]) = RE(inputLeft
);
1251 IM(ps
->delay_Qmf
[temp_delay
][sb
]) = IM(inputLeft
);
1253 RE(Phi_Fract
) = RE(Phi_Fract_Qmf
[sb
]);
1254 IM(Phi_Fract
) = IM(Phi_Fract_Qmf
[sb
]);
1257 /* z^(-2) * Phi_Fract[k] */
1258 ComplexMult(&RE(tmp
), &IM(tmp
), RE(tmp0
), IM(tmp0
), RE(Phi_Fract
), IM(Phi_Fract
));
1262 for (m
= 0; m
< NO_ALLPASS_LINKS
; m
++)
1264 complex_t Q_Fract_allpass
, tmp2
;
1266 /* fetch parameters */
1267 if (gr
< ps
->num_hybrid_groups
)
1269 /* select data from the hybrid subbands */
1270 RE(tmp0
) = RE(ps
->delay_SubQmf_ser
[m
][temp_delay_ser
[m
]][sb
]);
1271 IM(tmp0
) = IM(ps
->delay_SubQmf_ser
[m
][temp_delay_ser
[m
]][sb
]);
1273 if (ps
->use34hybrid_bands
)
1275 RE(Q_Fract_allpass
) = RE(Q_Fract_allpass_SubQmf34
[sb
][m
]);
1276 IM(Q_Fract_allpass
) = IM(Q_Fract_allpass_SubQmf34
[sb
][m
]);
1278 RE(Q_Fract_allpass
) = RE(Q_Fract_allpass_SubQmf20
[sb
][m
]);
1279 IM(Q_Fract_allpass
) = IM(Q_Fract_allpass_SubQmf20
[sb
][m
]);
1282 /* select data from the QMF subbands */
1283 RE(tmp0
) = RE(ps
->delay_Qmf_ser
[m
][temp_delay_ser
[m
]][sb
]);
1284 IM(tmp0
) = IM(ps
->delay_Qmf_ser
[m
][temp_delay_ser
[m
]][sb
]);
1286 RE(Q_Fract_allpass
) = RE(Q_Fract_allpass_Qmf
[sb
][m
]);
1287 IM(Q_Fract_allpass
) = IM(Q_Fract_allpass_Qmf
[sb
][m
]);
1290 /* delay by a fraction */
1291 /* z^(-d(m)) * Q_Fract_allpass[k,m] */
1292 ComplexMult(&RE(tmp
), &IM(tmp
), RE(tmp0
), IM(tmp0
), RE(Q_Fract_allpass
), IM(Q_Fract_allpass
));
1294 /* -a(m) * g_DecaySlope[k] */
1295 RE(tmp
) += -MUL_F(g_DecaySlope_filt
[m
], RE(R0
));
1296 IM(tmp
) += -MUL_F(g_DecaySlope_filt
[m
], IM(R0
));
1298 /* -a(m) * g_DecaySlope[k] * Q_Fract_allpass[k,m] * z^(-d(m)) */
1299 RE(tmp2
) = RE(R0
) + MUL_F(g_DecaySlope_filt
[m
], RE(tmp
));
1300 IM(tmp2
) = IM(R0
) + MUL_F(g_DecaySlope_filt
[m
], IM(tmp
));
1303 if (gr
< ps
->num_hybrid_groups
)
1305 RE(ps
->delay_SubQmf_ser
[m
][temp_delay_ser
[m
]][sb
]) = RE(tmp2
);
1306 IM(ps
->delay_SubQmf_ser
[m
][temp_delay_ser
[m
]][sb
]) = IM(tmp2
);
1308 RE(ps
->delay_Qmf_ser
[m
][temp_delay_ser
[m
]][sb
]) = RE(tmp2
);
1309 IM(ps
->delay_Qmf_ser
[m
][temp_delay_ser
[m
]][sb
]) = IM(tmp2
);
1312 /* store for next iteration (or as output value if last iteration) */
1318 /* select b(k) for reading the transient ratio */
1319 bk
= (~NEGATE_IPD_MASK
) & ps
->map_group2bk
[gr
];
1321 /* duck if a past transient is found */
1322 RE(R0
) = MUL_R(G_TransientRatio
[n
][bk
], RE(R0
));
1323 IM(R0
) = MUL_R(G_TransientRatio
[n
][bk
], IM(R0
));
1325 if (gr
< ps
->num_hybrid_groups
)
1328 QMF_RE(X_hybrid_right
[n
][sb
]) = RE(R0
);
1329 QMF_IM(X_hybrid_right
[n
][sb
]) = IM(R0
);
1332 QMF_RE(X_right
[n
][sb
]) = RE(R0
);
1333 QMF_IM(X_right
[n
][sb
]) = IM(R0
);
1336 /* Update delay buffer index */
1337 if (++temp_delay
>= 2)
1342 /* update delay indices */
1343 if (sb
> ps
->nr_allpass_bands
&& gr
>= ps
->num_hybrid_groups
)
1345 /* delay_D depends on the samplerate, it can hold the values 14 and 1 */
1346 if (++ps
->delay_buf_index_delay
[sb
] >= ps
->delay_D
[sb
])
1348 ps
->delay_buf_index_delay
[sb
] = 0;
1352 for (m
= 0; m
< NO_ALLPASS_LINKS
; m
++)
1354 if (++temp_delay_ser
[m
] >= ps
->num_sample_delay_ser
[m
])
1356 temp_delay_ser
[m
] = 0;
1363 /* update delay indices */
1364 ps
->saved_delay
= temp_delay
;
1365 for (m
= 0; m
< NO_ALLPASS_LINKS
; m
++)
1366 ps
->delay_buf_index_ser
[m
] = temp_delay_ser
[m
];
1370 #define step(shift) \
1371 if ((0x40000000l >> shift) + root <= value) \
1373 value -= (0x40000000l >> shift) + root; \
1374 root = (root >> 1) | (0x40000000l >> shift); \
1379 /* fixed point square root approximation */
1380 static real_t
ps_sqrt(real_t value
)
1384 step( 0); step( 2); step( 4); step( 6);
1385 step( 8); step(10); step(12); step(14);
1386 step(16); step(18); step(20); step(22);
1387 step(24); step(26); step(28); step(30);
1392 root
<<= (REAL_BITS
/2);
1397 #define ps_sqrt(A) sqrt(A)
1400 static const real_t ipdopd_cos_tab
[] = {
1401 FRAC_CONST(1.000000000000000),
1402 FRAC_CONST(0.707106781186548),
1403 FRAC_CONST(0.000000000000000),
1404 FRAC_CONST(-0.707106781186547),
1405 FRAC_CONST(-1.000000000000000),
1406 FRAC_CONST(-0.707106781186548),
1407 FRAC_CONST(-0.000000000000000),
1408 FRAC_CONST(0.707106781186547),
1409 FRAC_CONST(1.000000000000000)
1412 static const real_t ipdopd_sin_tab
[] = {
1413 FRAC_CONST(0.000000000000000),
1414 FRAC_CONST(0.707106781186547),
1415 FRAC_CONST(1.000000000000000),
1416 FRAC_CONST(0.707106781186548),
1417 FRAC_CONST(0.000000000000000),
1418 FRAC_CONST(-0.707106781186547),
1419 FRAC_CONST(-1.000000000000000),
1420 FRAC_CONST(-0.707106781186548),
1421 FRAC_CONST(-0.000000000000000)
1424 static void ps_mix_phase(ps_info
*ps
, qmf_t X_left
[38][64], qmf_t X_right
[38][64],
1425 qmf_t X_hybrid_left
[32][32], qmf_t X_hybrid_right
[32][32])
1432 uint8_t nr_ipdopd_par
;
1433 complex_t h11
, h12
, h21
, h22
;
1434 complex_t H11
, H12
, H21
, H22
;
1435 complex_t deltaH11
, deltaH12
, deltaH21
, deltaH22
;
1437 complex_t tempRight
;
1438 complex_t phaseLeft
;
1439 complex_t phaseRight
;
1441 const real_t
*sf_iid
;
1442 uint8_t no_iid_steps
;
1444 if (ps
->iid_mode
>= 3)
1447 sf_iid
= sf_iid_fine
;
1450 sf_iid
= sf_iid_normal
;
1453 if (ps
->ipd_mode
== 0 || ps
->ipd_mode
== 3)
1455 nr_ipdopd_par
= 11; /* resolution */
1457 nr_ipdopd_par
= ps
->nr_ipdopd_par
;
1460 for (gr
= 0; gr
< ps
->num_groups
; gr
++)
1462 bk
= (~NEGATE_IPD_MASK
) & ps
->map_group2bk
[gr
];
1464 /* use one channel per group in the subqmf domain */
1465 maxsb
= (gr
< ps
->num_hybrid_groups
) ? ps
->group_border
[gr
] + 1 : ps
->group_border
[gr
+ 1];
1467 for (env
= 0; env
< ps
->num_env
; env
++)
1469 if (ps
->icc_mode
< 3)
1471 /* type 'A' mixing as described in 8.6.4.6.2.1 */
1479 c_1 = sqrt(2.0 / (1.0 + pow(10.0, quant_iid[no_iid_steps + iid_index] / 10.0)));
1480 c_2 = sqrt(2.0 / (1.0 + pow(10.0, quant_iid[no_iid_steps - iid_index] / 10.0)));
1481 alpha = 0.5 * acos(quant_rho[icc_index]);
1482 beta = alpha * ( c_1 - c_2 ) / sqrt(2.0);
1485 //printf("%d\n", ps->iid_index[env][bk]);
1487 /* calculate the scalefactors c_1 and c_2 from the intensity differences */
1488 c_1
= sf_iid
[no_iid_steps
+ ps
->iid_index
[env
][bk
]];
1489 c_2
= sf_iid
[no_iid_steps
- ps
->iid_index
[env
][bk
]];
1491 /* calculate alpha and beta using the ICC parameters */
1492 cosa
= cos_alphas
[ps
->icc_index
[env
][bk
]];
1493 sina
= sin_alphas
[ps
->icc_index
[env
][bk
]];
1495 if (ps
->iid_mode
>= 3)
1497 if (ps
->iid_index
[env
][bk
] < 0)
1499 cosb
= cos_betas_fine
[-ps
->iid_index
[env
][bk
]][ps
->icc_index
[env
][bk
]];
1500 sinb
= -sin_betas_fine
[-ps
->iid_index
[env
][bk
]][ps
->icc_index
[env
][bk
]];
1502 cosb
= cos_betas_fine
[ps
->iid_index
[env
][bk
]][ps
->icc_index
[env
][bk
]];
1503 sinb
= sin_betas_fine
[ps
->iid_index
[env
][bk
]][ps
->icc_index
[env
][bk
]];
1506 if (ps
->iid_index
[env
][bk
] < 0)
1508 cosb
= cos_betas_normal
[-ps
->iid_index
[env
][bk
]][ps
->icc_index
[env
][bk
]];
1509 sinb
= -sin_betas_normal
[-ps
->iid_index
[env
][bk
]][ps
->icc_index
[env
][bk
]];
1511 cosb
= cos_betas_normal
[ps
->iid_index
[env
][bk
]][ps
->icc_index
[env
][bk
]];
1512 sinb
= sin_betas_normal
[ps
->iid_index
[env
][bk
]][ps
->icc_index
[env
][bk
]];
1516 ab1
= MUL_C(cosb
, cosa
);
1517 ab2
= MUL_C(sinb
, sina
);
1518 ab3
= MUL_C(sinb
, cosa
);
1519 ab4
= MUL_C(cosb
, sina
);
1522 RE(h11
) = MUL_C(c_2
, (ab1
- ab2
));
1523 RE(h12
) = MUL_C(c_1
, (ab1
+ ab2
));
1524 RE(h21
) = MUL_C(c_2
, (ab3
+ ab4
));
1525 RE(h22
) = MUL_C(c_1
, (ab3
- ab4
));
1527 /* type 'B' mixing as described in 8.6.4.6.2.2 */
1532 real_t c, rho, mu, alpha, gamma;
1535 i = ps->iid_index[env][bk];
1536 c = (real_t)pow(10.0, ((i)?(((i>0)?1:-1)*quant_iid[((i>0)?i:-i)-1]):0.)/20.0);
1537 rho = quant_rho[ps->icc_index[env][bk]];
1539 if (rho == 0.0f && c == 1.)
1541 alpha = (real_t)M_PI/4.0f;
1548 alpha = 0.5f*(real_t)atan( (2.0f*c*rho) / (c*c-1.0f) );
1552 alpha += (real_t)M_PI/2.0f;
1556 alpha += (real_t)M_PI;
1560 mu = 1+(4.0f*rho*rho-4.0f)/(mu*mu);
1561 gamma = (real_t)atan(sqrt((1.0f-sqrt(mu))/(1.0f+sqrt(mu))));
1564 if (ps
->iid_mode
>= 3)
1566 uint8_t abs_iid
= abs(ps
->iid_index
[env
][bk
]);
1568 cosa
= sincos_alphas_B_fine
[no_iid_steps
+ ps
->iid_index
[env
][bk
]][ps
->icc_index
[env
][bk
]];
1569 sina
= sincos_alphas_B_fine
[30 - (no_iid_steps
+ ps
->iid_index
[env
][bk
])][ps
->icc_index
[env
][bk
]];
1570 cosg
= cos_gammas_fine
[abs_iid
][ps
->icc_index
[env
][bk
]];
1571 sing
= sin_gammas_fine
[abs_iid
][ps
->icc_index
[env
][bk
]];
1573 uint8_t abs_iid
= abs(ps
->iid_index
[env
][bk
]);
1575 cosa
= sincos_alphas_B_normal
[no_iid_steps
+ ps
->iid_index
[env
][bk
]][ps
->icc_index
[env
][bk
]];
1576 sina
= sincos_alphas_B_normal
[14 - (no_iid_steps
+ ps
->iid_index
[env
][bk
])][ps
->icc_index
[env
][bk
]];
1577 cosg
= cos_gammas_normal
[abs_iid
][ps
->icc_index
[env
][bk
]];
1578 sing
= sin_gammas_normal
[abs_iid
][ps
->icc_index
[env
][bk
]];
1581 RE(h11
) = MUL_C(COEF_SQRT2
, MUL_C(cosa
, cosg
));
1582 RE(h12
) = MUL_C(COEF_SQRT2
, MUL_C(sina
, cosg
));
1583 RE(h21
) = MUL_C(COEF_SQRT2
, MUL_C(-cosa
, sing
));
1584 RE(h22
) = MUL_C(COEF_SQRT2
, MUL_C(sina
, sing
));
1587 /* calculate phase rotation parameters H_xy */
1588 /* note that the imaginary part of these parameters are only calculated when
1589 IPD and OPD are enabled
1591 if ((ps
->enable_ipdopd
) && (bk
< nr_ipdopd_par
))
1595 real_t yq
, xp
, xq
, py
, tmp
;
1597 /* ringbuffer index */
1600 /* previous value */
1602 /* divide by 4, shift right 2 bits */
1603 RE(tempLeft
) = RE(ps
->ipd_prev
[bk
][i
]) >> 2;
1604 IM(tempLeft
) = IM(ps
->ipd_prev
[bk
][i
]) >> 2;
1605 RE(tempRight
) = RE(ps
->opd_prev
[bk
][i
]) >> 2;
1606 IM(tempRight
) = IM(ps
->opd_prev
[bk
][i
]) >> 2;
1608 RE(tempLeft
) = MUL_F(RE(ps
->ipd_prev
[bk
][i
]), FRAC_CONST(0.25));
1609 IM(tempLeft
) = MUL_F(IM(ps
->ipd_prev
[bk
][i
]), FRAC_CONST(0.25));
1610 RE(tempRight
) = MUL_F(RE(ps
->opd_prev
[bk
][i
]), FRAC_CONST(0.25));
1611 IM(tempRight
) = MUL_F(IM(ps
->opd_prev
[bk
][i
]), FRAC_CONST(0.25));
1614 /* save current value */
1615 RE(ps
->ipd_prev
[bk
][i
]) = ipdopd_cos_tab
[abs(ps
->ipd_index
[env
][bk
])];
1616 IM(ps
->ipd_prev
[bk
][i
]) = ipdopd_sin_tab
[abs(ps
->ipd_index
[env
][bk
])];
1617 RE(ps
->opd_prev
[bk
][i
]) = ipdopd_cos_tab
[abs(ps
->opd_index
[env
][bk
])];
1618 IM(ps
->opd_prev
[bk
][i
]) = ipdopd_sin_tab
[abs(ps
->opd_index
[env
][bk
])];
1620 /* add current value */
1621 RE(tempLeft
) += RE(ps
->ipd_prev
[bk
][i
]);
1622 IM(tempLeft
) += IM(ps
->ipd_prev
[bk
][i
]);
1623 RE(tempRight
) += RE(ps
->opd_prev
[bk
][i
]);
1624 IM(tempRight
) += IM(ps
->opd_prev
[bk
][i
]);
1626 /* ringbuffer index */
1633 /* get value before previous */
1635 /* dividing by 2, shift right 1 bit */
1636 RE(tempLeft
) += (RE(ps
->ipd_prev
[bk
][i
]) >> 1);
1637 IM(tempLeft
) += (IM(ps
->ipd_prev
[bk
][i
]) >> 1);
1638 RE(tempRight
) += (RE(ps
->opd_prev
[bk
][i
]) >> 1);
1639 IM(tempRight
) += (IM(ps
->opd_prev
[bk
][i
]) >> 1);
1641 RE(tempLeft
) += MUL_F(RE(ps
->ipd_prev
[bk
][i
]), FRAC_CONST(0.5));
1642 IM(tempLeft
) += MUL_F(IM(ps
->ipd_prev
[bk
][i
]), FRAC_CONST(0.5));
1643 RE(tempRight
) += MUL_F(RE(ps
->opd_prev
[bk
][i
]), FRAC_CONST(0.5));
1644 IM(tempRight
) += MUL_F(IM(ps
->opd_prev
[bk
][i
]), FRAC_CONST(0.5));
1647 #if 0 /* original code */
1648 ipd
= (float)atan2(IM(tempLeft
), RE(tempLeft
));
1649 opd
= (float)atan2(IM(tempRight
), RE(tempRight
));
1651 /* phase rotation */
1652 RE(phaseLeft
) = (float)cos(opd
);
1653 IM(phaseLeft
) = (float)sin(opd
);
1655 RE(phaseRight
) = (float)cos(opd
);
1656 IM(phaseRight
) = (float)sin(opd
);
1660 // p = IM(tempRight)
1661 // q = RE(tempRight)
1662 // cos(atan2(x,y)) = 1/sqrt(1 + (x*x)/(y*y))
1663 // sin(atan2(x,y)) = x/(y*sqrt(1 + (x*x)/(y*y)))
1664 // cos(atan2(x,y)-atan2(p,q)) = (y*q+x*p)/(y*q * sqrt(1 + (x*x)/(y*y)) * sqrt(1 + (p*p)/(q*q)));
1665 // sin(atan2(x,y)-atan2(p,q)) = (x*q-p*y)/(y*q * sqrt(1 + (x*x)/(y*y)) * sqrt(1 + (p*p)/(q*q)));
1667 /* (x*x)/(y*y) (REAL > 0) */
1668 xxyy
= DIV_R(MUL_C(IM(tempLeft
),IM(tempLeft
)), MUL_C(RE(tempLeft
),RE(tempLeft
)));
1669 ppqq
= DIV_R(MUL_C(IM(tempRight
),IM(tempRight
)), MUL_C(RE(tempRight
),RE(tempRight
)));
1671 /* 1 + (x*x)/(y*y) (REAL > 1) */
1672 xxyy
+= REAL_CONST(1);
1673 ppqq
+= REAL_CONST(1);
1675 /* 1 / sqrt(1 + (x*x)/(y*y)) (FRAC <= 1) */
1676 xxyy
= DIV_R(FRAC_CONST(1), ps_sqrt(xxyy
));
1677 ppqq
= DIV_R(FRAC_CONST(1), ps_sqrt(ppqq
));
1680 yq
= MUL_C(RE(tempLeft
), RE(tempRight
));
1681 xp
= MUL_C(IM(tempLeft
), IM(tempRight
));
1682 xq
= MUL_C(IM(tempLeft
), RE(tempRight
));
1683 py
= MUL_C(RE(tempLeft
), IM(tempRight
));
1685 RE(phaseLeft
) = xxyy
;
1686 IM(phaseLeft
) = MUL_R(xxyy
, (DIV_R(IM(tempLeft
), RE(tempLeft
))));
1688 tmp
= DIV_C(MUL_F(xxyy
, ppqq
), yq
);
1690 /* MUL_C(FRAC,COEF) = FRAC */
1691 RE(phaseRight
) = MUL_C(tmp
, (yq
+xp
));
1692 IM(phaseRight
) = MUL_C(tmp
, (xq
-py
));
1695 /* MUL_F(COEF, FRAC) = COEF */
1696 IM(h11
) = MUL_F(RE(h11
), IM(phaseLeft
));
1697 IM(h12
) = MUL_F(RE(h12
), IM(phaseRight
));
1698 IM(h21
) = MUL_F(RE(h21
), IM(phaseLeft
));
1699 IM(h22
) = MUL_F(RE(h22
), IM(phaseRight
));
1701 RE(h11
) = MUL_F(RE(h11
), RE(phaseLeft
));
1702 RE(h12
) = MUL_F(RE(h12
), RE(phaseRight
));
1703 RE(h21
) = MUL_F(RE(h21
), RE(phaseLeft
));
1704 RE(h22
) = MUL_F(RE(h22
), RE(phaseRight
));
1707 /* length of the envelope n_e+1 - n_e (in time samples) */
1708 /* 0 < L <= 32: integer */
1709 L
= (real_t
)(ps
->border_position
[env
+ 1] - ps
->border_position
[env
]);
1711 /* obtain final H_xy by means of linear interpolation */
1712 RE(deltaH11
) = (RE(h11
) - RE(ps
->h11_prev
[gr
])) / L
;
1713 RE(deltaH12
) = (RE(h12
) - RE(ps
->h12_prev
[gr
])) / L
;
1714 RE(deltaH21
) = (RE(h21
) - RE(ps
->h21_prev
[gr
])) / L
;
1715 RE(deltaH22
) = (RE(h22
) - RE(ps
->h22_prev
[gr
])) / L
;
1717 RE(H11
) = RE(ps
->h11_prev
[gr
]);
1718 RE(H12
) = RE(ps
->h12_prev
[gr
]);
1719 RE(H21
) = RE(ps
->h21_prev
[gr
]);
1720 RE(H22
) = RE(ps
->h22_prev
[gr
]);
1722 RE(ps
->h11_prev
[gr
]) = RE(h11
);
1723 RE(ps
->h12_prev
[gr
]) = RE(h12
);
1724 RE(ps
->h21_prev
[gr
]) = RE(h21
);
1725 RE(ps
->h22_prev
[gr
]) = RE(h22
);
1727 /* only calculate imaginary part when needed */
1728 if ((ps
->enable_ipdopd
) && (bk
< nr_ipdopd_par
))
1730 /* obtain final H_xy by means of linear interpolation */
1731 IM(deltaH11
) = (IM(h11
) - IM(ps
->h11_prev
[gr
])) / L
;
1732 IM(deltaH12
) = (IM(h12
) - IM(ps
->h12_prev
[gr
])) / L
;
1733 IM(deltaH21
) = (IM(h21
) - IM(ps
->h21_prev
[gr
])) / L
;
1734 IM(deltaH22
) = (IM(h22
) - IM(ps
->h22_prev
[gr
])) / L
;
1736 IM(H11
) = IM(ps
->h11_prev
[gr
]);
1737 IM(H12
) = IM(ps
->h12_prev
[gr
]);
1738 IM(H21
) = IM(ps
->h21_prev
[gr
]);
1739 IM(H22
) = IM(ps
->h22_prev
[gr
]);
1741 if ((NEGATE_IPD_MASK
& ps
->map_group2bk
[gr
]) != 0)
1743 IM(deltaH11
) = -IM(deltaH11
);
1744 IM(deltaH12
) = -IM(deltaH12
);
1745 IM(deltaH21
) = -IM(deltaH21
);
1746 IM(deltaH22
) = -IM(deltaH22
);
1754 IM(ps
->h11_prev
[gr
]) = IM(h11
);
1755 IM(ps
->h12_prev
[gr
]) = IM(h12
);
1756 IM(ps
->h21_prev
[gr
]) = IM(h21
);
1757 IM(ps
->h22_prev
[gr
]) = IM(h22
);
1760 /* apply H_xy to the current envelope band of the decorrelated subband */
1761 for (n
= ps
->border_position
[env
]; n
< ps
->border_position
[env
+ 1]; n
++)
1763 /* addition finalises the interpolation over every n */
1764 RE(H11
) += RE(deltaH11
);
1765 RE(H12
) += RE(deltaH12
);
1766 RE(H21
) += RE(deltaH21
);
1767 RE(H22
) += RE(deltaH22
);
1768 if ((ps
->enable_ipdopd
) && (bk
< nr_ipdopd_par
))
1770 IM(H11
) += IM(deltaH11
);
1771 IM(H12
) += IM(deltaH12
);
1772 IM(H21
) += IM(deltaH21
);
1773 IM(H22
) += IM(deltaH22
);
1776 /* channel is an alias to the subband */
1777 for (sb
= ps
->group_border
[gr
]; sb
< maxsb
; sb
++)
1779 complex_t inLeft
, inRight
;
1781 /* load decorrelated samples */
1782 if (gr
< ps
->num_hybrid_groups
)
1784 RE(inLeft
) = RE(X_hybrid_left
[n
][sb
]);
1785 IM(inLeft
) = IM(X_hybrid_left
[n
][sb
]);
1786 RE(inRight
) = RE(X_hybrid_right
[n
][sb
]);
1787 IM(inRight
) = IM(X_hybrid_right
[n
][sb
]);
1789 RE(inLeft
) = RE(X_left
[n
][sb
]);
1790 IM(inLeft
) = IM(X_left
[n
][sb
]);
1791 RE(inRight
) = RE(X_right
[n
][sb
]);
1792 IM(inRight
) = IM(X_right
[n
][sb
]);
1796 RE(tempLeft
) = MUL_C(RE(H11
), RE(inLeft
)) + MUL_C(RE(H21
), RE(inRight
));
1797 IM(tempLeft
) = MUL_C(RE(H11
), IM(inLeft
)) + MUL_C(RE(H21
), IM(inRight
));
1798 RE(tempRight
) = MUL_C(RE(H12
), RE(inLeft
)) + MUL_C(RE(H22
), RE(inRight
));
1799 IM(tempRight
) = MUL_C(RE(H12
), IM(inLeft
)) + MUL_C(RE(H22
), IM(inRight
));
1801 /* only perform imaginary operations when needed */
1802 if ((ps
->enable_ipdopd
) && (bk
< nr_ipdopd_par
))
1804 /* apply rotation */
1805 RE(tempLeft
) -= MUL_C(IM(H11
), IM(inLeft
)) + MUL_C(IM(H21
), IM(inRight
));
1806 IM(tempLeft
) += MUL_C(IM(H11
), RE(inLeft
)) + MUL_C(IM(H21
), RE(inRight
));
1807 RE(tempRight
) -= MUL_C(IM(H12
), IM(inLeft
)) + MUL_C(IM(H22
), IM(inRight
));
1808 IM(tempRight
) += MUL_C(IM(H12
), RE(inLeft
)) + MUL_C(IM(H22
), RE(inRight
));
1811 /* store final samples */
1812 if (gr
< ps
->num_hybrid_groups
)
1814 RE(X_hybrid_left
[n
][sb
]) = RE(tempLeft
);
1815 IM(X_hybrid_left
[n
][sb
]) = IM(tempLeft
);
1816 RE(X_hybrid_right
[n
][sb
]) = RE(tempRight
);
1817 IM(X_hybrid_right
[n
][sb
]) = IM(tempRight
);
1819 RE(X_left
[n
][sb
]) = RE(tempLeft
);
1820 IM(X_left
[n
][sb
]) = IM(tempLeft
);
1821 RE(X_right
[n
][sb
]) = RE(tempRight
);
1822 IM(X_right
[n
][sb
]) = IM(tempRight
);
1827 /* shift phase smoother's circular buffer index */
1829 if (ps
->phase_hist
== 2)
1837 void ps_free(ps_info
*ps
)
1839 /* free hybrid filterbank structures */
1840 hybrid_free(ps
->hyb
);
1845 ps_info
*ps_init(uint8_t sr_index
)
1848 uint8_t short_delay_band
;
1850 ps_info
*ps
= (ps_info
*)faad_malloc(sizeof(ps_info
));
1851 memset(ps
, 0, sizeof(ps_info
));
1853 ps
->hyb
= hybrid_init();
1855 ps
->ps_data_available
= 0;
1858 ps
->saved_delay
= 0;
1860 for (i
= 0; i
< 64; i
++)
1862 ps
->delay_buf_index_delay
[i
] = 0;
1865 for (i
= 0; i
< NO_ALLPASS_LINKS
; i
++)
1867 ps
->delay_buf_index_ser
[i
] = 0;
1869 if (sr_index
<= 5) /* >= 32 kHz*/
1871 ps
->num_sample_delay_ser
[i
] = delay_length_d
[1][i
];
1873 ps
->num_sample_delay_ser
[i
] = delay_length_d
[0][i
];
1876 /* THESE ARE CONSTANTS NOW */
1877 ps
->num_sample_delay_ser
[i
] = delay_length_d
[i
];
1882 if (sr_index
<= 5) /* >= 32 kHz*/
1884 short_delay_band
= 35;
1885 ps
->nr_allpass_bands
= 22;
1886 ps
->alpha_decay
= FRAC_CONST(0.76592833836465);
1887 ps
->alpha_smooth
= FRAC_CONST(0.25);
1889 short_delay_band
= 64;
1890 ps
->nr_allpass_bands
= 45;
1891 ps
->alpha_decay
= FRAC_CONST(0.58664621951003);
1892 ps
->alpha_smooth
= FRAC_CONST(0.6);
1895 /* THESE ARE CONSTANTS NOW */
1896 short_delay_band
= 35;
1897 ps
->nr_allpass_bands
= 22;
1898 ps
->alpha_decay
= FRAC_CONST(0.76592833836465);
1899 ps
->alpha_smooth
= FRAC_CONST(0.25);
1902 /* THESE ARE CONSTANT NOW IF PS IS INDEPENDANT OF SAMPLERATE */
1903 for (i
= 0; i
< short_delay_band
; i
++)
1905 ps
->delay_D
[i
] = 14;
1907 for (i
= short_delay_band
; i
< 64; i
++)
1912 /* mixing and phase */
1913 for (i
= 0; i
< 50; i
++)
1915 RE(ps
->h11_prev
[i
]) = 1;
1916 IM(ps
->h12_prev
[i
]) = 1;
1917 RE(ps
->h11_prev
[i
]) = 1;
1918 IM(ps
->h12_prev
[i
]) = 1;
1923 for (i
= 0; i
< 20; i
++)
1925 RE(ps
->ipd_prev
[i
][0]) = 0;
1926 IM(ps
->ipd_prev
[i
][0]) = 0;
1927 RE(ps
->ipd_prev
[i
][1]) = 0;
1928 IM(ps
->ipd_prev
[i
][1]) = 0;
1929 RE(ps
->opd_prev
[i
][0]) = 0;
1930 IM(ps
->opd_prev
[i
][0]) = 0;
1931 RE(ps
->opd_prev
[i
][1]) = 0;
1932 IM(ps
->opd_prev
[i
][1]) = 0;
1938 /* main Parametric Stereo decoding function */
1939 uint8_t ps_decode(ps_info
*ps
, qmf_t X_left
[38][64], qmf_t X_right
[38][64])
1941 qmf_t X_hybrid_left
[32][32] = {{{0}}};
1942 qmf_t X_hybrid_right
[32][32] = {{{0}}};
1944 /* delta decoding of the bitstream data */
1947 /* set up some parameters depending on filterbank type */
1948 if (ps
->use34hybrid_bands
)
1950 ps
->group_border
= (uint8_t*)group_border34
;
1951 ps
->map_group2bk
= (uint16_t*)map_group2bk34
;
1952 ps
->num_groups
= 32+18;
1953 ps
->num_hybrid_groups
= 32;
1954 ps
->nr_par_bands
= 34;
1955 ps
->decay_cutoff
= 5;
1957 ps
->group_border
= (uint8_t*)group_border20
;
1958 ps
->map_group2bk
= (uint16_t*)map_group2bk20
;
1959 ps
->num_groups
= 10+12;
1960 ps
->num_hybrid_groups
= 10;
1961 ps
->nr_par_bands
= 20;
1962 ps
->decay_cutoff
= 3;
1965 /* Perform further analysis on the lowest subbands to get a higher
1966 * frequency resolution
1968 hybrid_analysis((hyb_info
*)ps
->hyb
, X_left
, X_hybrid_left
,
1969 ps
->use34hybrid_bands
);
1971 /* decorrelate mono signal */
1972 ps_decorrelate(ps
, X_left
, X_right
, X_hybrid_left
, X_hybrid_right
);
1974 /* apply mixing and phase parameters */
1975 ps_mix_phase(ps
, X_left
, X_right
, X_hybrid_left
, X_hybrid_right
);
1977 /* hybrid synthesis, to rebuild the SBR QMF matrices */
1978 hybrid_synthesis((hyb_info
*)ps
->hyb
, X_left
, X_hybrid_left
,
1979 ps
->use34hybrid_bands
);
1981 hybrid_synthesis((hyb_info
*)ps
->hyb
, X_right
, X_hybrid_right
,
1982 ps
->use34hybrid_bands
);