/proc/self/cwd/libfaad/ps_dec.c
Line | Count | Source (jump to first uncovered line) |
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: ps_dec.c,v 1.16 2009/01/26 22:32:31 menno Exp $ |
29 | | **/ |
30 | | |
31 | | #include "common.h" |
32 | | |
33 | | #ifdef PS_DEC |
34 | | |
35 | | #include <stdlib.h> |
36 | | #include <stdio.h> |
37 | | #include "ps_dec.h" |
38 | | #include "ps_tables.h" |
39 | | |
40 | | /* constants */ |
41 | 42.6M | #define NEGATE_IPD_MASK (0x1000) |
42 | 320k | #define DECAY_SLOPE FRAC_CONST(0.05) |
43 | | #define COEF_SQRT2 COEF_CONST(1.4142135623731) |
44 | | |
45 | | /* tables */ |
46 | | /* filters are mirrored in coef 6, second half left out */ |
47 | | static const real_t p8_13_20[7] = |
48 | | { |
49 | | FRAC_CONST(0.00746082949812), |
50 | | FRAC_CONST(0.02270420949825), |
51 | | FRAC_CONST(0.04546865930473), |
52 | | FRAC_CONST(0.07266113929591), |
53 | | FRAC_CONST(0.09885108575264), |
54 | | FRAC_CONST(0.11793710567217), |
55 | | FRAC_CONST(0.125) |
56 | | }; |
57 | | |
58 | | static const real_t p2_13_20[7] = |
59 | | { |
60 | | FRAC_CONST(0.0), |
61 | | FRAC_CONST(0.01899487526049), |
62 | | FRAC_CONST(0.0), |
63 | | FRAC_CONST(-0.07293139167538), |
64 | | FRAC_CONST(0.0), |
65 | | FRAC_CONST(0.30596630545168), |
66 | | FRAC_CONST(0.5) |
67 | | }; |
68 | | |
69 | | static const real_t p12_13_34[7] = |
70 | | { |
71 | | FRAC_CONST(0.04081179924692), |
72 | | FRAC_CONST(0.03812810994926), |
73 | | FRAC_CONST(0.05144908135699), |
74 | | FRAC_CONST(0.06399831151592), |
75 | | FRAC_CONST(0.07428313801106), |
76 | | FRAC_CONST(0.08100347892914), |
77 | | FRAC_CONST(0.08333333333333) |
78 | | }; |
79 | | |
80 | | static const real_t p8_13_34[7] = |
81 | | { |
82 | | FRAC_CONST(0.01565675600122), |
83 | | FRAC_CONST(0.03752716391991), |
84 | | FRAC_CONST(0.05417891378782), |
85 | | FRAC_CONST(0.08417044116767), |
86 | | FRAC_CONST(0.10307344158036), |
87 | | FRAC_CONST(0.12222452249753), |
88 | | FRAC_CONST(0.125) |
89 | | }; |
90 | | |
91 | | static const real_t p4_13_34[7] = |
92 | | { |
93 | | FRAC_CONST(-0.05908211155639), |
94 | | FRAC_CONST(-0.04871498374946), |
95 | | FRAC_CONST(0.0), |
96 | | FRAC_CONST(0.07778723915851), |
97 | | FRAC_CONST(0.16486303567403), |
98 | | FRAC_CONST(0.23279856662996), |
99 | | FRAC_CONST(0.25) |
100 | | }; |
101 | | |
102 | | #ifdef PARAM_32KHZ |
103 | | static const uint8_t delay_length_d[2][NO_ALLPASS_LINKS] = { |
104 | | { 1, 2, 3 } /* d_24kHz */, |
105 | | { 3, 4, 5 } /* d_48kHz */ |
106 | | }; |
107 | | #else |
108 | | static const uint8_t delay_length_d[NO_ALLPASS_LINKS] = { |
109 | | 3, 4, 5 /* d_48kHz */ |
110 | | }; |
111 | | #endif |
112 | | static const real_t filter_a[NO_ALLPASS_LINKS] = { /* a(m) = exp(-d_48kHz(m)/7) */ |
113 | | FRAC_CONST(0.65143905753106), |
114 | | FRAC_CONST(0.56471812200776), |
115 | | FRAC_CONST(0.48954165955695) |
116 | | }; |
117 | | |
118 | | static const uint8_t group_border20[10+12 + 1] = |
119 | | { |
120 | | 6, 7, 0, 1, 2, 3, /* 6 subqmf subbands */ |
121 | | 9, 8, /* 2 subqmf subbands */ |
122 | | 10, 11, /* 2 subqmf subbands */ |
123 | | 3, 4, 5, 6, 7, 8, 9, 11, 14, 18, 23, 35, 64 |
124 | | }; |
125 | | |
126 | | static const uint8_t group_border34[32+18 + 1] = |
127 | | { |
128 | | 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, /* 12 subqmf subbands */ |
129 | | 12, 13, 14, 15, 16, 17, 18, 19, /* 8 subqmf subbands */ |
130 | | 20, 21, 22, 23, /* 4 subqmf subbands */ |
131 | | 24, 25, 26, 27, /* 4 subqmf subbands */ |
132 | | 28, 29, 30, 31, /* 4 subqmf subbands */ |
133 | | 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 |
134 | | }; |
135 | | |
136 | | static const uint16_t map_group2bk20[10+12] = |
137 | | { |
138 | | (NEGATE_IPD_MASK | 1), (NEGATE_IPD_MASK | 0), |
139 | | 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19 |
140 | | }; |
141 | | |
142 | | static const uint16_t map_group2bk34[32+18] = |
143 | | { |
144 | | 0, 1, 2, 3, 4, 5, 6, 6, 7, (NEGATE_IPD_MASK | 2), (NEGATE_IPD_MASK | 1), (NEGATE_IPD_MASK | 0), |
145 | | 10, 10, 4, 5, 6, 7, 8, 9, |
146 | | 10, 11, 12, 9, |
147 | | 14, 11, 12, 13, |
148 | | 14, 15, 16, 13, |
149 | | 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33 |
150 | | }; |
151 | | |
152 | | /* type definitions */ |
153 | | typedef struct |
154 | | { |
155 | | uint8_t frame_len; |
156 | | uint8_t resolution20[3]; |
157 | | uint8_t resolution34[5]; |
158 | | |
159 | | qmf_t *work; |
160 | | qmf_t **buffer; |
161 | | qmf_t **temp; |
162 | | } hyb_info; |
163 | | |
164 | | /* static function declarations */ |
165 | | static void ps_data_decode(ps_info *ps); |
166 | | static hyb_info *hybrid_init(uint8_t numTimeSlotsRate); |
167 | | static void channel_filter2(hyb_info *hyb, uint8_t frame_len, const real_t *filter, |
168 | | qmf_t *buffer, qmf_t **X_hybrid); |
169 | | static void INLINE DCT3_4_unscaled(real_t *y, real_t *x); |
170 | | static void channel_filter8(hyb_info *hyb, uint8_t frame_len, const real_t *filter, |
171 | | qmf_t *buffer, qmf_t **X_hybrid); |
172 | | static void hybrid_analysis(hyb_info *hyb, qmf_t X[32][64], qmf_t X_hybrid[32][32], |
173 | | uint8_t use34, uint8_t numTimeSlotsRate); |
174 | | static void hybrid_synthesis(hyb_info *hyb, qmf_t X[32][64], qmf_t X_hybrid[32][32], |
175 | | uint8_t use34, uint8_t numTimeSlotsRate); |
176 | | static int8_t delta_clip(int8_t i, int8_t min, int8_t max); |
177 | | static void delta_decode(uint8_t enable, int8_t *index, int8_t *index_prev, |
178 | | uint8_t dt_flag, uint8_t nr_par, uint8_t stride, |
179 | | int8_t min_index, int8_t max_index); |
180 | | static void delta_modulo_decode(uint8_t enable, int8_t *index, int8_t *index_prev, |
181 | | uint8_t dt_flag, uint8_t nr_par, uint8_t stride, |
182 | | int8_t and_modulo); |
183 | | static void map20indexto34(int8_t *index, uint8_t bins); |
184 | | #ifdef PS_LOW_POWER |
185 | | static void map34indexto20(int8_t *index, uint8_t bins); |
186 | | #endif |
187 | | static void ps_data_decode(ps_info *ps); |
188 | | static void ps_decorrelate(ps_info *ps, qmf_t X_left[38][64], qmf_t X_right[38][64], |
189 | | qmf_t X_hybrid_left[32][32], qmf_t X_hybrid_right[32][32]); |
190 | | static void ps_mix_phase(ps_info *ps, qmf_t X_left[38][64], qmf_t X_right[38][64], |
191 | | qmf_t X_hybrid_left[32][32], qmf_t X_hybrid_right[32][32]); |
192 | | |
193 | | /* */ |
194 | | |
195 | | |
196 | | static hyb_info *hybrid_init(uint8_t numTimeSlotsRate) |
197 | 26.6k | { |
198 | 26.6k | uint8_t i; |
199 | | |
200 | 26.6k | hyb_info *hyb = (hyb_info*)faad_malloc(sizeof(hyb_info)); |
201 | | |
202 | 26.6k | hyb->resolution34[0] = 12; |
203 | 26.6k | hyb->resolution34[1] = 8; |
204 | 26.6k | hyb->resolution34[2] = 4; |
205 | 26.6k | hyb->resolution34[3] = 4; |
206 | 26.6k | hyb->resolution34[4] = 4; |
207 | | |
208 | 26.6k | hyb->resolution20[0] = 8; |
209 | 26.6k | hyb->resolution20[1] = 2; |
210 | 26.6k | hyb->resolution20[2] = 2; |
211 | | |
212 | 26.6k | hyb->frame_len = numTimeSlotsRate; |
213 | | |
214 | 26.6k | hyb->work = (qmf_t*)faad_malloc((hyb->frame_len+12) * sizeof(qmf_t)); |
215 | 26.6k | memset(hyb->work, 0, (hyb->frame_len+12) * sizeof(qmf_t)); |
216 | | |
217 | 26.6k | hyb->buffer = (qmf_t**)faad_malloc(5 * sizeof(qmf_t*)); |
218 | 160k | for (i = 0; i < 5; i++) |
219 | 133k | { |
220 | 133k | hyb->buffer[i] = (qmf_t*)faad_malloc(hyb->frame_len * sizeof(qmf_t)); |
221 | 133k | memset(hyb->buffer[i], 0, hyb->frame_len * sizeof(qmf_t)); |
222 | 133k | } |
223 | | |
224 | 26.6k | hyb->temp = (qmf_t**)faad_malloc(hyb->frame_len * sizeof(qmf_t*)); |
225 | 870k | for (i = 0; i < hyb->frame_len; i++) |
226 | 843k | { |
227 | 843k | hyb->temp[i] = (qmf_t*)faad_malloc(12 /*max*/ * sizeof(qmf_t)); |
228 | 843k | } |
229 | | |
230 | 26.6k | return hyb; |
231 | 26.6k | } |
232 | | |
233 | | static void hybrid_free(hyb_info *hyb) |
234 | 26.6k | { |
235 | 26.6k | uint8_t i; |
236 | | |
237 | 26.6k | if (!hyb) return; |
238 | | |
239 | 26.6k | if (hyb->work) |
240 | 26.6k | faad_free(hyb->work); |
241 | | |
242 | 160k | for (i = 0; i < 5; i++) |
243 | 133k | { |
244 | 133k | if (hyb->buffer[i]) |
245 | 133k | faad_free(hyb->buffer[i]); |
246 | 133k | } |
247 | 26.6k | if (hyb->buffer) |
248 | 26.6k | faad_free(hyb->buffer); |
249 | | |
250 | 870k | for (i = 0; i < hyb->frame_len; i++) |
251 | 843k | { |
252 | 843k | if (hyb->temp[i]) |
253 | 843k | faad_free(hyb->temp[i]); |
254 | 843k | } |
255 | 26.6k | if (hyb->temp) |
256 | 26.6k | faad_free(hyb->temp); |
257 | | |
258 | 26.6k | faad_free(hyb); |
259 | 26.6k | } |
260 | | |
261 | | /* real filter, size 2 */ |
262 | | static void channel_filter2(hyb_info *hyb, uint8_t frame_len, const real_t *filter, |
263 | | qmf_t *buffer, qmf_t **X_hybrid) |
264 | 41.7k | { |
265 | 41.7k | uint8_t i; |
266 | 41.7k | (void)hyb; /* TODO: remove parameter? */ |
267 | | |
268 | 1.35M | for (i = 0; i < frame_len; i++) |
269 | 1.31M | { |
270 | 1.31M | real_t r0 = MUL_F(filter[0],(QMF_RE(buffer[0+i]) + QMF_RE(buffer[12+i]))); |
271 | 1.31M | real_t r1 = MUL_F(filter[1],(QMF_RE(buffer[1+i]) + QMF_RE(buffer[11+i]))); |
272 | 1.31M | real_t r2 = MUL_F(filter[2],(QMF_RE(buffer[2+i]) + QMF_RE(buffer[10+i]))); |
273 | 1.31M | real_t r3 = MUL_F(filter[3],(QMF_RE(buffer[3+i]) + QMF_RE(buffer[9+i]))); |
274 | 1.31M | real_t r4 = MUL_F(filter[4],(QMF_RE(buffer[4+i]) + QMF_RE(buffer[8+i]))); |
275 | 1.31M | real_t r5 = MUL_F(filter[5],(QMF_RE(buffer[5+i]) + QMF_RE(buffer[7+i]))); |
276 | 1.31M | real_t r6 = MUL_F(filter[6],QMF_RE(buffer[6+i])); |
277 | 1.31M | real_t i0 = MUL_F(filter[0],(QMF_IM(buffer[0+i]) + QMF_IM(buffer[12+i]))); |
278 | 1.31M | real_t i1 = MUL_F(filter[1],(QMF_IM(buffer[1+i]) + QMF_IM(buffer[11+i]))); |
279 | 1.31M | real_t i2 = MUL_F(filter[2],(QMF_IM(buffer[2+i]) + QMF_IM(buffer[10+i]))); |
280 | 1.31M | real_t i3 = MUL_F(filter[3],(QMF_IM(buffer[3+i]) + QMF_IM(buffer[9+i]))); |
281 | 1.31M | real_t i4 = MUL_F(filter[4],(QMF_IM(buffer[4+i]) + QMF_IM(buffer[8+i]))); |
282 | 1.31M | real_t i5 = MUL_F(filter[5],(QMF_IM(buffer[5+i]) + QMF_IM(buffer[7+i]))); |
283 | 1.31M | real_t i6 = MUL_F(filter[6],QMF_IM(buffer[6+i])); |
284 | | |
285 | | /* q = 0 */ |
286 | 1.31M | QMF_RE(X_hybrid[i][0]) = r0 + r1 + r2 + r3 + r4 + r5 + r6; |
287 | 1.31M | QMF_IM(X_hybrid[i][0]) = i0 + i1 + i2 + i3 + i4 + i5 + i6; |
288 | | |
289 | | /* q = 1 */ |
290 | 1.31M | QMF_RE(X_hybrid[i][1]) = r0 - r1 + r2 - r3 + r4 - r5 + r6; |
291 | 1.31M | QMF_IM(X_hybrid[i][1]) = i0 - i1 + i2 - i3 + i4 - i5 + i6; |
292 | 1.31M | } |
293 | 41.7k | } Line | Count | Source | 264 | 20.8k | { | 265 | 20.8k | uint8_t i; | 266 | 20.8k | (void)hyb; /* TODO: remove parameter? */ | 267 | | | 268 | 677k | for (i = 0; i < frame_len; i++) | 269 | 656k | { | 270 | 656k | real_t r0 = MUL_F(filter[0],(QMF_RE(buffer[0+i]) + QMF_RE(buffer[12+i]))); | 271 | 656k | real_t r1 = MUL_F(filter[1],(QMF_RE(buffer[1+i]) + QMF_RE(buffer[11+i]))); | 272 | 656k | real_t r2 = MUL_F(filter[2],(QMF_RE(buffer[2+i]) + QMF_RE(buffer[10+i]))); | 273 | 656k | real_t r3 = MUL_F(filter[3],(QMF_RE(buffer[3+i]) + QMF_RE(buffer[9+i]))); | 274 | 656k | real_t r4 = MUL_F(filter[4],(QMF_RE(buffer[4+i]) + QMF_RE(buffer[8+i]))); | 275 | 656k | real_t r5 = MUL_F(filter[5],(QMF_RE(buffer[5+i]) + QMF_RE(buffer[7+i]))); | 276 | 656k | real_t r6 = MUL_F(filter[6],QMF_RE(buffer[6+i])); | 277 | 656k | real_t i0 = MUL_F(filter[0],(QMF_IM(buffer[0+i]) + QMF_IM(buffer[12+i]))); | 278 | 656k | real_t i1 = MUL_F(filter[1],(QMF_IM(buffer[1+i]) + QMF_IM(buffer[11+i]))); | 279 | 656k | real_t i2 = MUL_F(filter[2],(QMF_IM(buffer[2+i]) + QMF_IM(buffer[10+i]))); | 280 | 656k | real_t i3 = MUL_F(filter[3],(QMF_IM(buffer[3+i]) + QMF_IM(buffer[9+i]))); | 281 | 656k | real_t i4 = MUL_F(filter[4],(QMF_IM(buffer[4+i]) + QMF_IM(buffer[8+i]))); | 282 | 656k | real_t i5 = MUL_F(filter[5],(QMF_IM(buffer[5+i]) + QMF_IM(buffer[7+i]))); | 283 | 656k | real_t i6 = MUL_F(filter[6],QMF_IM(buffer[6+i])); | 284 | | | 285 | | /* q = 0 */ | 286 | 656k | QMF_RE(X_hybrid[i][0]) = r0 + r1 + r2 + r3 + r4 + r5 + r6; | 287 | 656k | QMF_IM(X_hybrid[i][0]) = i0 + i1 + i2 + i3 + i4 + i5 + i6; | 288 | | | 289 | | /* q = 1 */ | 290 | 656k | QMF_RE(X_hybrid[i][1]) = r0 - r1 + r2 - r3 + r4 - r5 + r6; | 291 | 656k | QMF_IM(X_hybrid[i][1]) = i0 - i1 + i2 - i3 + i4 - i5 + i6; | 292 | 656k | } | 293 | 20.8k | } |
Line | Count | Source | 264 | 20.8k | { | 265 | 20.8k | uint8_t i; | 266 | 20.8k | (void)hyb; /* TODO: remove parameter? */ | 267 | | | 268 | 677k | for (i = 0; i < frame_len; i++) | 269 | 656k | { | 270 | 656k | real_t r0 = MUL_F(filter[0],(QMF_RE(buffer[0+i]) + QMF_RE(buffer[12+i]))); | 271 | 656k | real_t r1 = MUL_F(filter[1],(QMF_RE(buffer[1+i]) + QMF_RE(buffer[11+i]))); | 272 | 656k | real_t r2 = MUL_F(filter[2],(QMF_RE(buffer[2+i]) + QMF_RE(buffer[10+i]))); | 273 | 656k | real_t r3 = MUL_F(filter[3],(QMF_RE(buffer[3+i]) + QMF_RE(buffer[9+i]))); | 274 | 656k | real_t r4 = MUL_F(filter[4],(QMF_RE(buffer[4+i]) + QMF_RE(buffer[8+i]))); | 275 | 656k | real_t r5 = MUL_F(filter[5],(QMF_RE(buffer[5+i]) + QMF_RE(buffer[7+i]))); | 276 | 656k | real_t r6 = MUL_F(filter[6],QMF_RE(buffer[6+i])); | 277 | 656k | real_t i0 = MUL_F(filter[0],(QMF_IM(buffer[0+i]) + QMF_IM(buffer[12+i]))); | 278 | 656k | real_t i1 = MUL_F(filter[1],(QMF_IM(buffer[1+i]) + QMF_IM(buffer[11+i]))); | 279 | 656k | real_t i2 = MUL_F(filter[2],(QMF_IM(buffer[2+i]) + QMF_IM(buffer[10+i]))); | 280 | 656k | real_t i3 = MUL_F(filter[3],(QMF_IM(buffer[3+i]) + QMF_IM(buffer[9+i]))); | 281 | 656k | real_t i4 = MUL_F(filter[4],(QMF_IM(buffer[4+i]) + QMF_IM(buffer[8+i]))); | 282 | 656k | real_t i5 = MUL_F(filter[5],(QMF_IM(buffer[5+i]) + QMF_IM(buffer[7+i]))); | 283 | 656k | real_t i6 = MUL_F(filter[6],QMF_IM(buffer[6+i])); | 284 | | | 285 | | /* q = 0 */ | 286 | 656k | QMF_RE(X_hybrid[i][0]) = r0 + r1 + r2 + r3 + r4 + r5 + r6; | 287 | 656k | QMF_IM(X_hybrid[i][0]) = i0 + i1 + i2 + i3 + i4 + i5 + i6; | 288 | | | 289 | | /* q = 1 */ | 290 | 656k | QMF_RE(X_hybrid[i][1]) = r0 - r1 + r2 - r3 + r4 - r5 + r6; | 291 | 656k | QMF_IM(X_hybrid[i][1]) = i0 - i1 + i2 - i3 + i4 - i5 + i6; | 292 | 656k | } | 293 | 20.8k | } |
|
294 | | |
295 | | /* complex filter, size 4 */ |
296 | | static void channel_filter4(hyb_info *hyb, uint8_t frame_len, const real_t *filter, |
297 | | qmf_t *buffer, qmf_t **X_hybrid) |
298 | 19.3k | { |
299 | 19.3k | uint8_t i; |
300 | 19.3k | real_t input_re1[2], input_re2[2], input_im1[2], input_im2[2]; |
301 | 19.3k | (void)hyb; /* TODO: remove parameter? */ |
302 | | |
303 | 613k | for (i = 0; i < frame_len; i++) |
304 | 594k | { |
305 | 594k | input_re1[0] = -MUL_F(filter[2], (QMF_RE(buffer[i+2]) + QMF_RE(buffer[i+10]))) + |
306 | 594k | MUL_F(filter[6], QMF_RE(buffer[i+6])); |
307 | 594k | input_re1[1] = MUL_F(FRAC_CONST(-0.70710678118655), |
308 | 594k | (MUL_F(filter[1], (QMF_RE(buffer[i+1]) + QMF_RE(buffer[i+11]))) + |
309 | 594k | MUL_F(filter[3], (QMF_RE(buffer[i+3]) + QMF_RE(buffer[i+9]))) - |
310 | 594k | MUL_F(filter[5], (QMF_RE(buffer[i+5]) + QMF_RE(buffer[i+7]))))); |
311 | | |
312 | 594k | input_im1[0] = MUL_F(filter[0], (QMF_IM(buffer[i+0]) - QMF_IM(buffer[i+12]))) - |
313 | 594k | MUL_F(filter[4], (QMF_IM(buffer[i+4]) - QMF_IM(buffer[i+8]))); |
314 | 594k | input_im1[1] = MUL_F(FRAC_CONST(0.70710678118655), |
315 | 594k | (MUL_F(filter[1], (QMF_IM(buffer[i+1]) - QMF_IM(buffer[i+11]))) - |
316 | 594k | MUL_F(filter[3], (QMF_IM(buffer[i+3]) - QMF_IM(buffer[i+9]))) - |
317 | 594k | MUL_F(filter[5], (QMF_IM(buffer[i+5]) - QMF_IM(buffer[i+7]))))); |
318 | | |
319 | 594k | input_re2[0] = MUL_F(filter[0], (QMF_RE(buffer[i+0]) - QMF_RE(buffer[i+12]))) - |
320 | 594k | MUL_F(filter[4], (QMF_RE(buffer[i+4]) - QMF_RE(buffer[i+8]))); |
321 | 594k | input_re2[1] = MUL_F(FRAC_CONST(0.70710678118655), |
322 | 594k | (MUL_F(filter[1], (QMF_RE(buffer[i+1]) - QMF_RE(buffer[i+11]))) - |
323 | 594k | MUL_F(filter[3], (QMF_RE(buffer[i+3]) - QMF_RE(buffer[i+9]))) - |
324 | 594k | MUL_F(filter[5], (QMF_RE(buffer[i+5]) - QMF_RE(buffer[i+7]))))); |
325 | | |
326 | 594k | input_im2[0] = -MUL_F(filter[2], (QMF_IM(buffer[i+2]) + QMF_IM(buffer[i+10]))) + |
327 | 594k | MUL_F(filter[6], QMF_IM(buffer[i+6])); |
328 | 594k | input_im2[1] = MUL_F(FRAC_CONST(-0.70710678118655), |
329 | 594k | (MUL_F(filter[1], (QMF_IM(buffer[i+1]) + QMF_IM(buffer[i+11]))) + |
330 | 594k | MUL_F(filter[3], (QMF_IM(buffer[i+3]) + QMF_IM(buffer[i+9]))) - |
331 | 594k | MUL_F(filter[5], (QMF_IM(buffer[i+5]) + QMF_IM(buffer[i+7]))))); |
332 | | |
333 | | /* q == 0 */ |
334 | 594k | QMF_RE(X_hybrid[i][0]) = input_re1[0] + input_re1[1] + input_im1[0] + input_im1[1]; |
335 | 594k | QMF_IM(X_hybrid[i][0]) = -input_re2[0] - input_re2[1] + input_im2[0] + input_im2[1]; |
336 | | |
337 | | /* q == 1 */ |
338 | 594k | QMF_RE(X_hybrid[i][1]) = input_re1[0] - input_re1[1] - input_im1[0] + input_im1[1]; |
339 | 594k | QMF_IM(X_hybrid[i][1]) = input_re2[0] - input_re2[1] + input_im2[0] - input_im2[1]; |
340 | | |
341 | | /* q == 2 */ |
342 | 594k | QMF_RE(X_hybrid[i][2]) = input_re1[0] - input_re1[1] + input_im1[0] - input_im1[1]; |
343 | 594k | QMF_IM(X_hybrid[i][2]) = -input_re2[0] + input_re2[1] + input_im2[0] - input_im2[1]; |
344 | | |
345 | | /* q == 3 */ |
346 | 594k | QMF_RE(X_hybrid[i][3]) = input_re1[0] + input_re1[1] - input_im1[0] - input_im1[1]; |
347 | 594k | QMF_IM(X_hybrid[i][3]) = input_re2[0] + input_re2[1] + input_im2[0] + input_im2[1]; |
348 | 594k | } |
349 | 19.3k | } Line | Count | Source | 298 | 7.09k | { | 299 | 7.09k | uint8_t i; | 300 | 7.09k | real_t input_re1[2], input_re2[2], input_im1[2], input_im2[2]; | 301 | 7.09k | (void)hyb; /* TODO: remove parameter? */ | 302 | | | 303 | 226k | for (i = 0; i < frame_len; i++) | 304 | 219k | { | 305 | 219k | input_re1[0] = -MUL_F(filter[2], (QMF_RE(buffer[i+2]) + QMF_RE(buffer[i+10]))) + | 306 | 219k | MUL_F(filter[6], QMF_RE(buffer[i+6])); | 307 | 219k | input_re1[1] = MUL_F(FRAC_CONST(-0.70710678118655), | 308 | 219k | (MUL_F(filter[1], (QMF_RE(buffer[i+1]) + QMF_RE(buffer[i+11]))) + | 309 | 219k | MUL_F(filter[3], (QMF_RE(buffer[i+3]) + QMF_RE(buffer[i+9]))) - | 310 | 219k | MUL_F(filter[5], (QMF_RE(buffer[i+5]) + QMF_RE(buffer[i+7]))))); | 311 | | | 312 | 219k | input_im1[0] = MUL_F(filter[0], (QMF_IM(buffer[i+0]) - QMF_IM(buffer[i+12]))) - | 313 | 219k | MUL_F(filter[4], (QMF_IM(buffer[i+4]) - QMF_IM(buffer[i+8]))); | 314 | 219k | input_im1[1] = MUL_F(FRAC_CONST(0.70710678118655), | 315 | 219k | (MUL_F(filter[1], (QMF_IM(buffer[i+1]) - QMF_IM(buffer[i+11]))) - | 316 | 219k | MUL_F(filter[3], (QMF_IM(buffer[i+3]) - QMF_IM(buffer[i+9]))) - | 317 | 219k | MUL_F(filter[5], (QMF_IM(buffer[i+5]) - QMF_IM(buffer[i+7]))))); | 318 | | | 319 | 219k | input_re2[0] = MUL_F(filter[0], (QMF_RE(buffer[i+0]) - QMF_RE(buffer[i+12]))) - | 320 | 219k | MUL_F(filter[4], (QMF_RE(buffer[i+4]) - QMF_RE(buffer[i+8]))); | 321 | 219k | input_re2[1] = MUL_F(FRAC_CONST(0.70710678118655), | 322 | 219k | (MUL_F(filter[1], (QMF_RE(buffer[i+1]) - QMF_RE(buffer[i+11]))) - | 323 | 219k | MUL_F(filter[3], (QMF_RE(buffer[i+3]) - QMF_RE(buffer[i+9]))) - | 324 | 219k | MUL_F(filter[5], (QMF_RE(buffer[i+5]) - QMF_RE(buffer[i+7]))))); | 325 | | | 326 | 219k | input_im2[0] = -MUL_F(filter[2], (QMF_IM(buffer[i+2]) + QMF_IM(buffer[i+10]))) + | 327 | 219k | MUL_F(filter[6], QMF_IM(buffer[i+6])); | 328 | 219k | input_im2[1] = MUL_F(FRAC_CONST(-0.70710678118655), | 329 | 219k | (MUL_F(filter[1], (QMF_IM(buffer[i+1]) + QMF_IM(buffer[i+11]))) + | 330 | 219k | MUL_F(filter[3], (QMF_IM(buffer[i+3]) + QMF_IM(buffer[i+9]))) - | 331 | 219k | MUL_F(filter[5], (QMF_IM(buffer[i+5]) + QMF_IM(buffer[i+7]))))); | 332 | | | 333 | | /* q == 0 */ | 334 | 219k | QMF_RE(X_hybrid[i][0]) = input_re1[0] + input_re1[1] + input_im1[0] + input_im1[1]; | 335 | 219k | QMF_IM(X_hybrid[i][0]) = -input_re2[0] - input_re2[1] + input_im2[0] + input_im2[1]; | 336 | | | 337 | | /* q == 1 */ | 338 | 219k | QMF_RE(X_hybrid[i][1]) = input_re1[0] - input_re1[1] - input_im1[0] + input_im1[1]; | 339 | 219k | QMF_IM(X_hybrid[i][1]) = input_re2[0] - input_re2[1] + input_im2[0] - input_im2[1]; | 340 | | | 341 | | /* q == 2 */ | 342 | 219k | QMF_RE(X_hybrid[i][2]) = input_re1[0] - input_re1[1] + input_im1[0] - input_im1[1]; | 343 | 219k | QMF_IM(X_hybrid[i][2]) = -input_re2[0] + input_re2[1] + input_im2[0] - input_im2[1]; | 344 | | | 345 | | /* q == 3 */ | 346 | 219k | QMF_RE(X_hybrid[i][3]) = input_re1[0] + input_re1[1] - input_im1[0] - input_im1[1]; | 347 | 219k | QMF_IM(X_hybrid[i][3]) = input_re2[0] + input_re2[1] + input_im2[0] + input_im2[1]; | 348 | 219k | } | 349 | 7.09k | } |
Line | Count | Source | 298 | 12.2k | { | 299 | 12.2k | uint8_t i; | 300 | 12.2k | real_t input_re1[2], input_re2[2], input_im1[2], input_im2[2]; | 301 | 12.2k | (void)hyb; /* TODO: remove parameter? */ | 302 | | | 303 | 387k | for (i = 0; i < frame_len; i++) | 304 | 375k | { | 305 | 375k | input_re1[0] = -MUL_F(filter[2], (QMF_RE(buffer[i+2]) + QMF_RE(buffer[i+10]))) + | 306 | 375k | MUL_F(filter[6], QMF_RE(buffer[i+6])); | 307 | 375k | input_re1[1] = MUL_F(FRAC_CONST(-0.70710678118655), | 308 | 375k | (MUL_F(filter[1], (QMF_RE(buffer[i+1]) + QMF_RE(buffer[i+11]))) + | 309 | 375k | MUL_F(filter[3], (QMF_RE(buffer[i+3]) + QMF_RE(buffer[i+9]))) - | 310 | 375k | MUL_F(filter[5], (QMF_RE(buffer[i+5]) + QMF_RE(buffer[i+7]))))); | 311 | | | 312 | 375k | input_im1[0] = MUL_F(filter[0], (QMF_IM(buffer[i+0]) - QMF_IM(buffer[i+12]))) - | 313 | 375k | MUL_F(filter[4], (QMF_IM(buffer[i+4]) - QMF_IM(buffer[i+8]))); | 314 | 375k | input_im1[1] = MUL_F(FRAC_CONST(0.70710678118655), | 315 | 375k | (MUL_F(filter[1], (QMF_IM(buffer[i+1]) - QMF_IM(buffer[i+11]))) - | 316 | 375k | MUL_F(filter[3], (QMF_IM(buffer[i+3]) - QMF_IM(buffer[i+9]))) - | 317 | 375k | MUL_F(filter[5], (QMF_IM(buffer[i+5]) - QMF_IM(buffer[i+7]))))); | 318 | | | 319 | 375k | input_re2[0] = MUL_F(filter[0], (QMF_RE(buffer[i+0]) - QMF_RE(buffer[i+12]))) - | 320 | 375k | MUL_F(filter[4], (QMF_RE(buffer[i+4]) - QMF_RE(buffer[i+8]))); | 321 | 375k | input_re2[1] = MUL_F(FRAC_CONST(0.70710678118655), | 322 | 375k | (MUL_F(filter[1], (QMF_RE(buffer[i+1]) - QMF_RE(buffer[i+11]))) - | 323 | 375k | MUL_F(filter[3], (QMF_RE(buffer[i+3]) - QMF_RE(buffer[i+9]))) - | 324 | 375k | MUL_F(filter[5], (QMF_RE(buffer[i+5]) - QMF_RE(buffer[i+7]))))); | 325 | | | 326 | 375k | input_im2[0] = -MUL_F(filter[2], (QMF_IM(buffer[i+2]) + QMF_IM(buffer[i+10]))) + | 327 | 375k | MUL_F(filter[6], QMF_IM(buffer[i+6])); | 328 | 375k | input_im2[1] = MUL_F(FRAC_CONST(-0.70710678118655), | 329 | 375k | (MUL_F(filter[1], (QMF_IM(buffer[i+1]) + QMF_IM(buffer[i+11]))) + | 330 | 375k | MUL_F(filter[3], (QMF_IM(buffer[i+3]) + QMF_IM(buffer[i+9]))) - | 331 | 375k | MUL_F(filter[5], (QMF_IM(buffer[i+5]) + QMF_IM(buffer[i+7]))))); | 332 | | | 333 | | /* q == 0 */ | 334 | 375k | QMF_RE(X_hybrid[i][0]) = input_re1[0] + input_re1[1] + input_im1[0] + input_im1[1]; | 335 | 375k | QMF_IM(X_hybrid[i][0]) = -input_re2[0] - input_re2[1] + input_im2[0] + input_im2[1]; | 336 | | | 337 | | /* q == 1 */ | 338 | 375k | QMF_RE(X_hybrid[i][1]) = input_re1[0] - input_re1[1] - input_im1[0] + input_im1[1]; | 339 | 375k | QMF_IM(X_hybrid[i][1]) = input_re2[0] - input_re2[1] + input_im2[0] - input_im2[1]; | 340 | | | 341 | | /* q == 2 */ | 342 | 375k | QMF_RE(X_hybrid[i][2]) = input_re1[0] - input_re1[1] + input_im1[0] - input_im1[1]; | 343 | 375k | QMF_IM(X_hybrid[i][2]) = -input_re2[0] + input_re2[1] + input_im2[0] - input_im2[1]; | 344 | | | 345 | | /* q == 3 */ | 346 | 375k | QMF_RE(X_hybrid[i][3]) = input_re1[0] + input_re1[1] - input_im1[0] - input_im1[1]; | 347 | 375k | QMF_IM(X_hybrid[i][3]) = input_re2[0] + input_re2[1] + input_im2[0] + input_im2[1]; | 348 | 375k | } | 349 | 12.2k | } |
|
350 | | |
351 | | static void INLINE DCT3_4_unscaled(real_t *y, real_t *x) |
352 | 2.10M | { |
353 | 2.10M | real_t f0, f1, f2, f3, f4, f5, f6, f7, f8; |
354 | | |
355 | 2.10M | f0 = MUL_F(x[2], FRAC_CONST(0.7071067811865476)); |
356 | 2.10M | f1 = x[0] - f0; |
357 | 2.10M | f2 = x[0] + f0; |
358 | 2.10M | f3 = x[1] + x[3]; |
359 | 2.10M | f4 = MUL_C(x[1], COEF_CONST(1.3065629648763766)); |
360 | 2.10M | f5 = MUL_F(f3, FRAC_CONST(-0.9238795325112866)); |
361 | 2.10M | f6 = MUL_F(x[3], FRAC_CONST(-0.5411961001461967)); |
362 | 2.10M | f7 = f4 + f5; |
363 | 2.10M | f8 = f6 - f5; |
364 | 2.10M | y[3] = f2 - f8; |
365 | 2.10M | y[0] = f2 + f8; |
366 | 2.10M | y[2] = f1 - f7; |
367 | 2.10M | y[1] = f1 + f7; |
368 | 2.10M | } Line | Count | Source | 352 | 735k | { | 353 | 735k | real_t f0, f1, f2, f3, f4, f5, f6, f7, f8; | 354 | | | 355 | 735k | f0 = MUL_F(x[2], FRAC_CONST(0.7071067811865476)); | 356 | 735k | f1 = x[0] - f0; | 357 | 735k | f2 = x[0] + f0; | 358 | 735k | f3 = x[1] + x[3]; | 359 | 735k | f4 = MUL_C(x[1], COEF_CONST(1.3065629648763766)); | 360 | 735k | f5 = MUL_F(f3, FRAC_CONST(-0.9238795325112866)); | 361 | 735k | f6 = MUL_F(x[3], FRAC_CONST(-0.5411961001461967)); | 362 | 735k | f7 = f4 + f5; | 363 | 735k | f8 = f6 - f5; | 364 | 735k | y[3] = f2 - f8; | 365 | 735k | y[0] = f2 + f8; | 366 | 735k | y[2] = f1 - f7; | 367 | 735k | y[1] = f1 + f7; | 368 | 735k | } |
Line | Count | Source | 352 | 1.37M | { | 353 | 1.37M | real_t f0, f1, f2, f3, f4, f5, f6, f7, f8; | 354 | | | 355 | 1.37M | f0 = MUL_F(x[2], FRAC_CONST(0.7071067811865476)); | 356 | 1.37M | f1 = x[0] - f0; | 357 | 1.37M | f2 = x[0] + f0; | 358 | 1.37M | f3 = x[1] + x[3]; | 359 | 1.37M | f4 = MUL_C(x[1], COEF_CONST(1.3065629648763766)); | 360 | 1.37M | f5 = MUL_F(f3, FRAC_CONST(-0.9238795325112866)); | 361 | 1.37M | f6 = MUL_F(x[3], FRAC_CONST(-0.5411961001461967)); | 362 | 1.37M | f7 = f4 + f5; | 363 | 1.37M | f8 = f6 - f5; | 364 | 1.37M | y[3] = f2 - f8; | 365 | 1.37M | y[0] = f2 + f8; | 366 | 1.37M | y[2] = f1 - f7; | 367 | 1.37M | y[1] = f1 + f7; | 368 | 1.37M | } |
|
369 | | |
370 | | /* complex filter, size 8 */ |
371 | | static void channel_filter8(hyb_info *hyb, uint8_t frame_len, const real_t *filter, |
372 | | qmf_t *buffer, qmf_t **X_hybrid) |
373 | 33.7k | { |
374 | 33.7k | uint8_t i, n; |
375 | 33.7k | real_t input_re1[4], input_re2[4], input_im1[4], input_im2[4]; |
376 | 33.7k | real_t x[4]; |
377 | 33.7k | (void)hyb; /* TODO: remove parameter? */ |
378 | | |
379 | 1.08M | for (i = 0; i < frame_len; i++) |
380 | 1.05M | { |
381 | 1.05M | input_re1[0] = MUL_F(filter[6],QMF_RE(buffer[6+i])); |
382 | 1.05M | input_re1[1] = MUL_F(filter[5],(QMF_RE(buffer[5+i]) + QMF_RE(buffer[7+i]))); |
383 | 1.05M | 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]))); |
384 | 1.05M | 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]))); |
385 | | |
386 | 1.05M | input_im1[0] = MUL_F(filter[5],(QMF_IM(buffer[7+i]) - QMF_IM(buffer[5+i]))); |
387 | 1.05M | 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]))); |
388 | 1.05M | 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]))); |
389 | 1.05M | input_im1[3] = MUL_F(filter[2],(QMF_IM(buffer[10+i]) - QMF_IM(buffer[2+i]))); |
390 | | |
391 | 5.26M | for (n = 0; n < 4; n++) |
392 | 4.21M | { |
393 | 4.21M | x[n] = input_re1[n] - input_im1[3-n]; |
394 | 4.21M | } |
395 | 1.05M | DCT3_4_unscaled(x, x); |
396 | 1.05M | QMF_RE(X_hybrid[i][7]) = x[0]; |
397 | 1.05M | QMF_RE(X_hybrid[i][5]) = x[2]; |
398 | 1.05M | QMF_RE(X_hybrid[i][3]) = x[3]; |
399 | 1.05M | QMF_RE(X_hybrid[i][1]) = x[1]; |
400 | | |
401 | 5.26M | for (n = 0; n < 4; n++) |
402 | 4.21M | { |
403 | 4.21M | x[n] = input_re1[n] + input_im1[3-n]; |
404 | 4.21M | } |
405 | 1.05M | DCT3_4_unscaled(x, x); |
406 | 1.05M | QMF_RE(X_hybrid[i][6]) = x[1]; |
407 | 1.05M | QMF_RE(X_hybrid[i][4]) = x[3]; |
408 | 1.05M | QMF_RE(X_hybrid[i][2]) = x[2]; |
409 | 1.05M | QMF_RE(X_hybrid[i][0]) = x[0]; |
410 | | |
411 | 1.05M | input_im2[0] = MUL_F(filter[6],QMF_IM(buffer[6+i])); |
412 | 1.05M | input_im2[1] = MUL_F(filter[5],(QMF_IM(buffer[5+i]) + QMF_IM(buffer[7+i]))); |
413 | 1.05M | 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]))); |
414 | 1.05M | 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]))); |
415 | | |
416 | 1.05M | input_re2[0] = MUL_F(filter[5],(QMF_RE(buffer[7+i]) - QMF_RE(buffer[5+i]))); |
417 | 1.05M | 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]))); |
418 | 1.05M | 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]))); |
419 | 1.05M | input_re2[3] = MUL_F(filter[2],(QMF_RE(buffer[10+i]) - QMF_RE(buffer[2+i]))); |
420 | | |
421 | 5.26M | for (n = 0; n < 4; n++) |
422 | 4.21M | { |
423 | 4.21M | x[n] = input_im2[n] + input_re2[3-n]; |
424 | 4.21M | } |
425 | 1.05M | DCT3_4_unscaled(x, x); |
426 | 1.05M | QMF_IM(X_hybrid[i][7]) = x[0]; |
427 | 1.05M | QMF_IM(X_hybrid[i][5]) = x[2]; |
428 | 1.05M | QMF_IM(X_hybrid[i][3]) = x[3]; |
429 | 1.05M | QMF_IM(X_hybrid[i][1]) = x[1]; |
430 | | |
431 | 5.26M | for (n = 0; n < 4; n++) |
432 | 4.21M | { |
433 | 4.21M | x[n] = input_im2[n] - input_re2[3-n]; |
434 | 4.21M | } |
435 | 1.05M | DCT3_4_unscaled(x, x); |
436 | 1.05M | QMF_IM(X_hybrid[i][6]) = x[1]; |
437 | 1.05M | QMF_IM(X_hybrid[i][4]) = x[3]; |
438 | 1.05M | QMF_IM(X_hybrid[i][2]) = x[2]; |
439 | 1.05M | QMF_IM(X_hybrid[i][0]) = x[0]; |
440 | 1.05M | } |
441 | 33.7k | } Line | Count | Source | 373 | 16.8k | { | 374 | 16.8k | uint8_t i, n; | 375 | 16.8k | real_t input_re1[4], input_re2[4], input_im1[4], input_im2[4]; | 376 | 16.8k | real_t x[4]; | 377 | 16.8k | (void)hyb; /* TODO: remove parameter? */ | 378 | | | 379 | 543k | for (i = 0; i < frame_len; i++) | 380 | 526k | { | 381 | 526k | input_re1[0] = MUL_F(filter[6],QMF_RE(buffer[6+i])); | 382 | 526k | input_re1[1] = MUL_F(filter[5],(QMF_RE(buffer[5+i]) + QMF_RE(buffer[7+i]))); | 383 | 526k | 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]))); | 384 | 526k | 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]))); | 385 | | | 386 | 526k | input_im1[0] = MUL_F(filter[5],(QMF_IM(buffer[7+i]) - QMF_IM(buffer[5+i]))); | 387 | 526k | 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]))); | 388 | 526k | 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]))); | 389 | 526k | input_im1[3] = MUL_F(filter[2],(QMF_IM(buffer[10+i]) - QMF_IM(buffer[2+i]))); | 390 | | | 391 | 2.63M | for (n = 0; n < 4; n++) | 392 | 2.10M | { | 393 | 2.10M | x[n] = input_re1[n] - input_im1[3-n]; | 394 | 2.10M | } | 395 | 526k | DCT3_4_unscaled(x, x); | 396 | 526k | QMF_RE(X_hybrid[i][7]) = x[0]; | 397 | 526k | QMF_RE(X_hybrid[i][5]) = x[2]; | 398 | 526k | QMF_RE(X_hybrid[i][3]) = x[3]; | 399 | 526k | QMF_RE(X_hybrid[i][1]) = x[1]; | 400 | | | 401 | 2.63M | for (n = 0; n < 4; n++) | 402 | 2.10M | { | 403 | 2.10M | x[n] = input_re1[n] + input_im1[3-n]; | 404 | 2.10M | } | 405 | 526k | DCT3_4_unscaled(x, x); | 406 | 526k | QMF_RE(X_hybrid[i][6]) = x[1]; | 407 | 526k | QMF_RE(X_hybrid[i][4]) = x[3]; | 408 | 526k | QMF_RE(X_hybrid[i][2]) = x[2]; | 409 | 526k | QMF_RE(X_hybrid[i][0]) = x[0]; | 410 | | | 411 | 526k | input_im2[0] = MUL_F(filter[6],QMF_IM(buffer[6+i])); | 412 | 526k | input_im2[1] = MUL_F(filter[5],(QMF_IM(buffer[5+i]) + QMF_IM(buffer[7+i]))); | 413 | 526k | 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]))); | 414 | 526k | 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]))); | 415 | | | 416 | 526k | input_re2[0] = MUL_F(filter[5],(QMF_RE(buffer[7+i]) - QMF_RE(buffer[5+i]))); | 417 | 526k | 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]))); | 418 | 526k | 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]))); | 419 | 526k | input_re2[3] = MUL_F(filter[2],(QMF_RE(buffer[10+i]) - QMF_RE(buffer[2+i]))); | 420 | | | 421 | 2.63M | for (n = 0; n < 4; n++) | 422 | 2.10M | { | 423 | 2.10M | x[n] = input_im2[n] + input_re2[3-n]; | 424 | 2.10M | } | 425 | 526k | DCT3_4_unscaled(x, x); | 426 | 526k | QMF_IM(X_hybrid[i][7]) = x[0]; | 427 | 526k | QMF_IM(X_hybrid[i][5]) = x[2]; | 428 | 526k | QMF_IM(X_hybrid[i][3]) = x[3]; | 429 | 526k | QMF_IM(X_hybrid[i][1]) = x[1]; | 430 | | | 431 | 2.63M | for (n = 0; n < 4; n++) | 432 | 2.10M | { | 433 | 2.10M | x[n] = input_im2[n] - input_re2[3-n]; | 434 | 2.10M | } | 435 | 526k | DCT3_4_unscaled(x, x); | 436 | 526k | QMF_IM(X_hybrid[i][6]) = x[1]; | 437 | 526k | QMF_IM(X_hybrid[i][4]) = x[3]; | 438 | 526k | QMF_IM(X_hybrid[i][2]) = x[2]; | 439 | 526k | QMF_IM(X_hybrid[i][0]) = x[0]; | 440 | 526k | } | 441 | 16.8k | } |
Line | Count | Source | 373 | 16.8k | { | 374 | 16.8k | uint8_t i, n; | 375 | 16.8k | real_t input_re1[4], input_re2[4], input_im1[4], input_im2[4]; | 376 | 16.8k | real_t x[4]; | 377 | 16.8k | (void)hyb; /* TODO: remove parameter? */ | 378 | | | 379 | 543k | for (i = 0; i < frame_len; i++) | 380 | 526k | { | 381 | 526k | input_re1[0] = MUL_F(filter[6],QMF_RE(buffer[6+i])); | 382 | 526k | input_re1[1] = MUL_F(filter[5],(QMF_RE(buffer[5+i]) + QMF_RE(buffer[7+i]))); | 383 | 526k | 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]))); | 384 | 526k | 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]))); | 385 | | | 386 | 526k | input_im1[0] = MUL_F(filter[5],(QMF_IM(buffer[7+i]) - QMF_IM(buffer[5+i]))); | 387 | 526k | 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]))); | 388 | 526k | 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]))); | 389 | 526k | input_im1[3] = MUL_F(filter[2],(QMF_IM(buffer[10+i]) - QMF_IM(buffer[2+i]))); | 390 | | | 391 | 2.63M | for (n = 0; n < 4; n++) | 392 | 2.10M | { | 393 | 2.10M | x[n] = input_re1[n] - input_im1[3-n]; | 394 | 2.10M | } | 395 | 526k | DCT3_4_unscaled(x, x); | 396 | 526k | QMF_RE(X_hybrid[i][7]) = x[0]; | 397 | 526k | QMF_RE(X_hybrid[i][5]) = x[2]; | 398 | 526k | QMF_RE(X_hybrid[i][3]) = x[3]; | 399 | 526k | QMF_RE(X_hybrid[i][1]) = x[1]; | 400 | | | 401 | 2.63M | for (n = 0; n < 4; n++) | 402 | 2.10M | { | 403 | 2.10M | x[n] = input_re1[n] + input_im1[3-n]; | 404 | 2.10M | } | 405 | 526k | DCT3_4_unscaled(x, x); | 406 | 526k | QMF_RE(X_hybrid[i][6]) = x[1]; | 407 | 526k | QMF_RE(X_hybrid[i][4]) = x[3]; | 408 | 526k | QMF_RE(X_hybrid[i][2]) = x[2]; | 409 | 526k | QMF_RE(X_hybrid[i][0]) = x[0]; | 410 | | | 411 | 526k | input_im2[0] = MUL_F(filter[6],QMF_IM(buffer[6+i])); | 412 | 526k | input_im2[1] = MUL_F(filter[5],(QMF_IM(buffer[5+i]) + QMF_IM(buffer[7+i]))); | 413 | 526k | 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]))); | 414 | 526k | 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]))); | 415 | | | 416 | 526k | input_re2[0] = MUL_F(filter[5],(QMF_RE(buffer[7+i]) - QMF_RE(buffer[5+i]))); | 417 | 526k | 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]))); | 418 | 526k | 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]))); | 419 | 526k | input_re2[3] = MUL_F(filter[2],(QMF_RE(buffer[10+i]) - QMF_RE(buffer[2+i]))); | 420 | | | 421 | 2.63M | for (n = 0; n < 4; n++) | 422 | 2.10M | { | 423 | 2.10M | x[n] = input_im2[n] + input_re2[3-n]; | 424 | 2.10M | } | 425 | 526k | DCT3_4_unscaled(x, x); | 426 | 526k | QMF_IM(X_hybrid[i][7]) = x[0]; | 427 | 526k | QMF_IM(X_hybrid[i][5]) = x[2]; | 428 | 526k | QMF_IM(X_hybrid[i][3]) = x[3]; | 429 | 526k | QMF_IM(X_hybrid[i][1]) = x[1]; | 430 | | | 431 | 2.63M | for (n = 0; n < 4; n++) | 432 | 2.10M | { | 433 | 2.10M | x[n] = input_im2[n] - input_re2[3-n]; | 434 | 2.10M | } | 435 | 526k | DCT3_4_unscaled(x, x); | 436 | 526k | QMF_IM(X_hybrid[i][6]) = x[1]; | 437 | 526k | QMF_IM(X_hybrid[i][4]) = x[3]; | 438 | 526k | QMF_IM(X_hybrid[i][2]) = x[2]; | 439 | 526k | QMF_IM(X_hybrid[i][0]) = x[0]; | 440 | 526k | } | 441 | 16.8k | } |
|
442 | | |
443 | | static void INLINE DCT3_6_unscaled(real_t *y, real_t *x) |
444 | 792k | { |
445 | 792k | real_t f0, f1, f2, f3, f4, f5, f6, f7; |
446 | | |
447 | 792k | f0 = MUL_F(x[3], FRAC_CONST(0.70710678118655)); |
448 | 792k | f1 = x[0] + f0; |
449 | 792k | f2 = x[0] - f0; |
450 | 792k | f3 = MUL_F((x[1] - x[5]), FRAC_CONST(0.70710678118655)); |
451 | 792k | f4 = MUL_F(x[2], FRAC_CONST(0.86602540378444)) + MUL_F(x[4], FRAC_CONST(0.5)); |
452 | 792k | f5 = f4 - x[4]; |
453 | 792k | f6 = MUL_F(x[1], FRAC_CONST(0.96592582628907)) + MUL_F(x[5], FRAC_CONST(0.25881904510252)); |
454 | 792k | f7 = f6 - f3; |
455 | 792k | y[0] = f1 + f6 + f4; |
456 | 792k | y[1] = f2 + f3 - x[4]; |
457 | 792k | y[2] = f7 + f2 - f5; |
458 | 792k | y[3] = f1 - f7 - f5; |
459 | 792k | y[4] = f1 - f3 - x[4]; |
460 | 792k | y[5] = f2 - f6 + f4; |
461 | 792k | } Line | Count | Source | 444 | 292k | { | 445 | 292k | real_t f0, f1, f2, f3, f4, f5, f6, f7; | 446 | | | 447 | 292k | f0 = MUL_F(x[3], FRAC_CONST(0.70710678118655)); | 448 | 292k | f1 = x[0] + f0; | 449 | 292k | f2 = x[0] - f0; | 450 | 292k | f3 = MUL_F((x[1] - x[5]), FRAC_CONST(0.70710678118655)); | 451 | 292k | f4 = MUL_F(x[2], FRAC_CONST(0.86602540378444)) + MUL_F(x[4], FRAC_CONST(0.5)); | 452 | 292k | f5 = f4 - x[4]; | 453 | 292k | f6 = MUL_F(x[1], FRAC_CONST(0.96592582628907)) + MUL_F(x[5], FRAC_CONST(0.25881904510252)); | 454 | 292k | f7 = f6 - f3; | 455 | 292k | y[0] = f1 + f6 + f4; | 456 | 292k | y[1] = f2 + f3 - x[4]; | 457 | 292k | y[2] = f7 + f2 - f5; | 458 | 292k | y[3] = f1 - f7 - f5; | 459 | 292k | y[4] = f1 - f3 - x[4]; | 460 | 292k | y[5] = f2 - f6 + f4; | 461 | 292k | } |
Line | Count | Source | 444 | 500k | { | 445 | 500k | real_t f0, f1, f2, f3, f4, f5, f6, f7; | 446 | | | 447 | 500k | f0 = MUL_F(x[3], FRAC_CONST(0.70710678118655)); | 448 | 500k | f1 = x[0] + f0; | 449 | 500k | f2 = x[0] - f0; | 450 | 500k | f3 = MUL_F((x[1] - x[5]), FRAC_CONST(0.70710678118655)); | 451 | 500k | f4 = MUL_F(x[2], FRAC_CONST(0.86602540378444)) + MUL_F(x[4], FRAC_CONST(0.5)); | 452 | 500k | f5 = f4 - x[4]; | 453 | 500k | f6 = MUL_F(x[1], FRAC_CONST(0.96592582628907)) + MUL_F(x[5], FRAC_CONST(0.25881904510252)); | 454 | 500k | f7 = f6 - f3; | 455 | 500k | y[0] = f1 + f6 + f4; | 456 | 500k | y[1] = f2 + f3 - x[4]; | 457 | 500k | y[2] = f7 + f2 - f5; | 458 | 500k | y[3] = f1 - f7 - f5; | 459 | 500k | y[4] = f1 - f3 - x[4]; | 460 | 500k | y[5] = f2 - f6 + f4; | 461 | 500k | } |
|
462 | | |
463 | | /* complex filter, size 12 */ |
464 | | static void channel_filter12(hyb_info *hyb, uint8_t frame_len, const real_t *filter, |
465 | | qmf_t *buffer, qmf_t **X_hybrid) |
466 | 12.8k | { |
467 | 12.8k | uint8_t i, n; |
468 | 12.8k | real_t input_re1[6], input_re2[6], input_im1[6], input_im2[6]; |
469 | 12.8k | real_t out_re1[6], out_re2[6], out_im1[6], out_im2[6]; |
470 | 12.8k | (void)hyb; /* TODO: remove parameter? */ |
471 | | |
472 | 409k | for (i = 0; i < frame_len; i++) |
473 | 396k | { |
474 | 2.77M | for (n = 0; n < 6; n++) |
475 | 2.37M | { |
476 | 2.37M | if (n == 0) |
477 | 396k | { |
478 | 396k | input_re1[0] = MUL_F(QMF_RE(buffer[6+i]), filter[6]); |
479 | 396k | input_re2[0] = MUL_F(QMF_IM(buffer[6+i]), filter[6]); |
480 | 1.98M | } else { |
481 | 1.98M | input_re1[6-n] = MUL_F((QMF_RE(buffer[n+i]) + QMF_RE(buffer[12-n+i])), filter[n]); |
482 | 1.98M | input_re2[6-n] = MUL_F((QMF_IM(buffer[n+i]) + QMF_IM(buffer[12-n+i])), filter[n]); |
483 | 1.98M | } |
484 | 2.37M | input_im2[n] = MUL_F((QMF_RE(buffer[n+i]) - QMF_RE(buffer[12-n+i])), filter[n]); |
485 | 2.37M | input_im1[n] = MUL_F((QMF_IM(buffer[n+i]) - QMF_IM(buffer[12-n+i])), filter[n]); |
486 | 2.37M | } |
487 | | |
488 | 396k | DCT3_6_unscaled(out_re1, input_re1); |
489 | 396k | DCT3_6_unscaled(out_re2, input_re2); |
490 | | |
491 | 396k | DCT3_6_unscaled(out_im1, input_im1); |
492 | 396k | DCT3_6_unscaled(out_im2, input_im2); |
493 | | |
494 | 1.58M | for (n = 0; n < 6; n += 2) |
495 | 1.18M | { |
496 | 1.18M | QMF_RE(X_hybrid[i][n]) = out_re1[n] - out_im1[n]; |
497 | 1.18M | QMF_IM(X_hybrid[i][n]) = out_re2[n] + out_im2[n]; |
498 | 1.18M | QMF_RE(X_hybrid[i][n+1]) = out_re1[n+1] + out_im1[n+1]; |
499 | 1.18M | QMF_IM(X_hybrid[i][n+1]) = out_re2[n+1] - out_im2[n+1]; |
500 | | |
501 | 1.18M | QMF_RE(X_hybrid[i][10-n]) = out_re1[n+1] - out_im1[n+1]; |
502 | 1.18M | QMF_IM(X_hybrid[i][10-n]) = out_re2[n+1] + out_im2[n+1]; |
503 | 1.18M | QMF_RE(X_hybrid[i][11-n]) = out_re1[n] + out_im1[n]; |
504 | 1.18M | QMF_IM(X_hybrid[i][11-n]) = out_re2[n] - out_im2[n]; |
505 | 1.18M | } |
506 | 396k | } |
507 | 12.8k | } ps_dec.c:channel_filter12 Line | Count | Source | 466 | 6.44k | { | 467 | 6.44k | uint8_t i, n; | 468 | 6.44k | real_t input_re1[6], input_re2[6], input_im1[6], input_im2[6]; | 469 | 6.44k | real_t out_re1[6], out_re2[6], out_im1[6], out_im2[6]; | 470 | 6.44k | (void)hyb; /* TODO: remove parameter? */ | 471 | | | 472 | 204k | for (i = 0; i < frame_len; i++) | 473 | 198k | { | 474 | 1.38M | for (n = 0; n < 6; n++) | 475 | 1.18M | { | 476 | 1.18M | if (n == 0) | 477 | 198k | { | 478 | 198k | input_re1[0] = MUL_F(QMF_RE(buffer[6+i]), filter[6]); | 479 | 198k | input_re2[0] = MUL_F(QMF_IM(buffer[6+i]), filter[6]); | 480 | 990k | } else { | 481 | 990k | input_re1[6-n] = MUL_F((QMF_RE(buffer[n+i]) + QMF_RE(buffer[12-n+i])), filter[n]); | 482 | 990k | input_re2[6-n] = MUL_F((QMF_IM(buffer[n+i]) + QMF_IM(buffer[12-n+i])), filter[n]); | 483 | 990k | } | 484 | 1.18M | input_im2[n] = MUL_F((QMF_RE(buffer[n+i]) - QMF_RE(buffer[12-n+i])), filter[n]); | 485 | 1.18M | input_im1[n] = MUL_F((QMF_IM(buffer[n+i]) - QMF_IM(buffer[12-n+i])), filter[n]); | 486 | 1.18M | } | 487 | | | 488 | 198k | DCT3_6_unscaled(out_re1, input_re1); | 489 | 198k | DCT3_6_unscaled(out_re2, input_re2); | 490 | | | 491 | 198k | DCT3_6_unscaled(out_im1, input_im1); | 492 | 198k | DCT3_6_unscaled(out_im2, input_im2); | 493 | | | 494 | 792k | for (n = 0; n < 6; n += 2) | 495 | 594k | { | 496 | 594k | QMF_RE(X_hybrid[i][n]) = out_re1[n] - out_im1[n]; | 497 | 594k | QMF_IM(X_hybrid[i][n]) = out_re2[n] + out_im2[n]; | 498 | 594k | QMF_RE(X_hybrid[i][n+1]) = out_re1[n+1] + out_im1[n+1]; | 499 | 594k | QMF_IM(X_hybrid[i][n+1]) = out_re2[n+1] - out_im2[n+1]; | 500 | | | 501 | 594k | QMF_RE(X_hybrid[i][10-n]) = out_re1[n+1] - out_im1[n+1]; | 502 | 594k | QMF_IM(X_hybrid[i][10-n]) = out_re2[n+1] + out_im2[n+1]; | 503 | 594k | QMF_RE(X_hybrid[i][11-n]) = out_re1[n] + out_im1[n]; | 504 | 594k | QMF_IM(X_hybrid[i][11-n]) = out_re2[n] - out_im2[n]; | 505 | 594k | } | 506 | 198k | } | 507 | 6.44k | } |
ps_dec.c:channel_filter12 Line | Count | Source | 466 | 6.44k | { | 467 | 6.44k | uint8_t i, n; | 468 | 6.44k | real_t input_re1[6], input_re2[6], input_im1[6], input_im2[6]; | 469 | 6.44k | real_t out_re1[6], out_re2[6], out_im1[6], out_im2[6]; | 470 | 6.44k | (void)hyb; /* TODO: remove parameter? */ | 471 | | | 472 | 204k | for (i = 0; i < frame_len; i++) | 473 | 198k | { | 474 | 1.38M | for (n = 0; n < 6; n++) | 475 | 1.18M | { | 476 | 1.18M | if (n == 0) | 477 | 198k | { | 478 | 198k | input_re1[0] = MUL_F(QMF_RE(buffer[6+i]), filter[6]); | 479 | 198k | input_re2[0] = MUL_F(QMF_IM(buffer[6+i]), filter[6]); | 480 | 990k | } else { | 481 | 990k | input_re1[6-n] = MUL_F((QMF_RE(buffer[n+i]) + QMF_RE(buffer[12-n+i])), filter[n]); | 482 | 990k | input_re2[6-n] = MUL_F((QMF_IM(buffer[n+i]) + QMF_IM(buffer[12-n+i])), filter[n]); | 483 | 990k | } | 484 | 1.18M | input_im2[n] = MUL_F((QMF_RE(buffer[n+i]) - QMF_RE(buffer[12-n+i])), filter[n]); | 485 | 1.18M | input_im1[n] = MUL_F((QMF_IM(buffer[n+i]) - QMF_IM(buffer[12-n+i])), filter[n]); | 486 | 1.18M | } | 487 | | | 488 | 198k | DCT3_6_unscaled(out_re1, input_re1); | 489 | 198k | DCT3_6_unscaled(out_re2, input_re2); | 490 | | | 491 | 198k | DCT3_6_unscaled(out_im1, input_im1); | 492 | 198k | DCT3_6_unscaled(out_im2, input_im2); | 493 | | | 494 | 792k | for (n = 0; n < 6; n += 2) | 495 | 594k | { | 496 | 594k | QMF_RE(X_hybrid[i][n]) = out_re1[n] - out_im1[n]; | 497 | 594k | QMF_IM(X_hybrid[i][n]) = out_re2[n] + out_im2[n]; | 498 | 594k | QMF_RE(X_hybrid[i][n+1]) = out_re1[n+1] + out_im1[n+1]; | 499 | 594k | QMF_IM(X_hybrid[i][n+1]) = out_re2[n+1] - out_im2[n+1]; | 500 | | | 501 | 594k | QMF_RE(X_hybrid[i][10-n]) = out_re1[n+1] - out_im1[n+1]; | 502 | 594k | QMF_IM(X_hybrid[i][10-n]) = out_re2[n+1] + out_im2[n+1]; | 503 | 594k | QMF_RE(X_hybrid[i][11-n]) = out_re1[n] + out_im1[n]; | 504 | 594k | QMF_IM(X_hybrid[i][11-n]) = out_re2[n] - out_im2[n]; | 505 | 594k | } | 506 | 198k | } | 507 | 6.44k | } |
|
508 | | |
509 | | /* Hybrid analysis: further split up QMF subbands |
510 | | * to improve frequency resolution |
511 | | */ |
512 | | static void hybrid_analysis(hyb_info *hyb, qmf_t X[32][64], qmf_t X_hybrid[32][32], |
513 | | uint8_t use34, uint8_t numTimeSlotsRate) |
514 | 16.8k | { |
515 | 16.8k | uint8_t k, n, band; |
516 | 16.8k | uint8_t offset = 0; |
517 | 16.8k | uint8_t qmf_bands = (use34) ? 5 : 3; |
518 | 16.8k | uint8_t *resolution = (use34) ? hyb->resolution34 : hyb->resolution20; |
519 | | |
520 | 80.4k | for (band = 0; band < qmf_bands; band++) |
521 | 63.5k | { |
522 | | /* build working buffer */ |
523 | 63.5k | memcpy(hyb->work, hyb->buffer[band], 12 * sizeof(qmf_t)); |
524 | | |
525 | | /* add new samples */ |
526 | 2.03M | for (n = 0; n < hyb->frame_len; n++) |
527 | 1.97M | { |
528 | 1.97M | QMF_RE(hyb->work[12 + n]) = QMF_RE(X[n + 6 /*delay*/][band]); |
529 | 1.97M | QMF_IM(hyb->work[12 + n]) = QMF_IM(X[n + 6 /*delay*/][band]); |
530 | 1.97M | } |
531 | | |
532 | | /* store samples */ |
533 | 63.5k | memcpy(hyb->buffer[band], hyb->work + hyb->frame_len, 12 * sizeof(qmf_t)); |
534 | | |
535 | | |
536 | 63.5k | switch(resolution[band]) |
537 | 63.5k | { |
538 | 20.8k | case 2: |
539 | | /* Type B real filter, Q[p] = 2 */ |
540 | 20.8k | channel_filter2(hyb, hyb->frame_len, p2_13_20, hyb->work, hyb->temp); |
541 | 20.8k | break; |
542 | 19.3k | case 4: |
543 | | /* Type A complex filter, Q[p] = 4 */ |
544 | 19.3k | channel_filter4(hyb, hyb->frame_len, p4_13_34, hyb->work, hyb->temp); |
545 | 19.3k | break; |
546 | 16.8k | case 8: |
547 | | /* Type A complex filter, Q[p] = 8 */ |
548 | 16.8k | channel_filter8(hyb, hyb->frame_len, (use34) ? p8_13_34 : p8_13_20, |
549 | 16.8k | hyb->work, hyb->temp); |
550 | 16.8k | break; |
551 | 6.44k | case 12: |
552 | | /* Type A complex filter, Q[p] = 12 */ |
553 | 6.44k | channel_filter12(hyb, hyb->frame_len, p12_13_34, hyb->work, hyb->temp); |
554 | 6.44k | break; |
555 | 63.5k | } |
556 | | |
557 | 2.03M | for (n = 0; n < hyb->frame_len; n++) |
558 | 1.97M | { |
559 | 12.2M | for (k = 0; k < resolution[band]; k++) |
560 | 10.2M | { |
561 | 10.2M | QMF_RE(X_hybrid[n][offset + k]) = QMF_RE(hyb->temp[n][k]); |
562 | 10.2M | QMF_IM(X_hybrid[n][offset + k]) = QMF_IM(hyb->temp[n][k]); |
563 | 10.2M | } |
564 | 1.97M | } |
565 | 63.5k | offset += resolution[band]; |
566 | 63.5k | } |
567 | | |
568 | | /* group hybrid channels */ |
569 | 16.8k | if (!use34) |
570 | 10.4k | { |
571 | 338k | for (n = 0; n < numTimeSlotsRate; n++) |
572 | 328k | { |
573 | 328k | QMF_RE(X_hybrid[n][3]) += QMF_RE(X_hybrid[n][4]); |
574 | 328k | QMF_IM(X_hybrid[n][3]) += QMF_IM(X_hybrid[n][4]); |
575 | 328k | QMF_RE(X_hybrid[n][4]) = 0; |
576 | 328k | QMF_IM(X_hybrid[n][4]) = 0; |
577 | | |
578 | 328k | QMF_RE(X_hybrid[n][2]) += QMF_RE(X_hybrid[n][5]); |
579 | 328k | QMF_IM(X_hybrid[n][2]) += QMF_IM(X_hybrid[n][5]); |
580 | 328k | QMF_RE(X_hybrid[n][5]) = 0; |
581 | 328k | QMF_IM(X_hybrid[n][5]) = 0; |
582 | 328k | } |
583 | 10.4k | } |
584 | 16.8k | } |
585 | | |
586 | | static void hybrid_synthesis(hyb_info *hyb, qmf_t X[32][64], qmf_t X_hybrid[32][32], |
587 | | uint8_t use34, uint8_t numTimeSlotsRate) |
588 | 33.7k | { |
589 | 33.7k | uint8_t k, n, band; |
590 | 33.7k | uint8_t offset = 0; |
591 | 33.7k | uint8_t qmf_bands = (use34) ? 5 : 3; |
592 | 33.7k | uint8_t *resolution = (use34) ? hyb->resolution34 : hyb->resolution20; |
593 | 33.7k | (void)numTimeSlotsRate; /* TODO: remove parameter? */ |
594 | | |
595 | 160k | for(band = 0; band < qmf_bands; band++) |
596 | 127k | { |
597 | 4.07M | for (n = 0; n < hyb->frame_len; n++) |
598 | 3.95M | { |
599 | 3.95M | QMF_RE(X[n][band]) = 0; |
600 | 3.95M | QMF_IM(X[n][band]) = 0; |
601 | | |
602 | 24.5M | for (k = 0; k < resolution[band]; k++) |
603 | 20.5M | { |
604 | 20.5M | QMF_RE(X[n][band]) += QMF_RE(X_hybrid[n][offset + k]); |
605 | 20.5M | QMF_IM(X[n][band]) += QMF_IM(X_hybrid[n][offset + k]); |
606 | 20.5M | } |
607 | 3.95M | } |
608 | 127k | offset += resolution[band]; |
609 | 127k | } |
610 | 33.7k | } |
611 | | |
612 | | /* limits the value i to the range [min,max] */ |
613 | | static int8_t delta_clip(int8_t i, int8_t min, int8_t max) |
614 | 400k | { |
615 | 400k | if (i < min) |
616 | 55.2k | return min; |
617 | 345k | else if (i > max) |
618 | 8.10k | return max; |
619 | 337k | else |
620 | 337k | return i; |
621 | 400k | } |
622 | | |
623 | | //int iid = 0; |
624 | | |
625 | | /* delta decode array */ |
626 | | static void delta_decode(uint8_t enable, int8_t *index, int8_t *index_prev, |
627 | | uint8_t dt_flag, uint8_t nr_par, uint8_t stride, |
628 | | int8_t min_index, int8_t max_index) |
629 | 57.5k | { |
630 | 57.5k | int8_t i; |
631 | | |
632 | 57.5k | if (enable == 1) |
633 | 29.6k | { |
634 | 29.6k | if (dt_flag == 0) |
635 | 18.1k | { |
636 | | /* delta coded in frequency direction */ |
637 | 18.1k | index[0] = 0 + index[0]; |
638 | 18.1k | index[0] = delta_clip(index[0], min_index, max_index); |
639 | | |
640 | 252k | for (i = 1; i < nr_par; i++) |
641 | 234k | { |
642 | 234k | index[i] = index[i-1] + index[i]; |
643 | 234k | index[i] = delta_clip(index[i], min_index, max_index); |
644 | 234k | } |
645 | 18.1k | } else { |
646 | | /* delta coded in time direction */ |
647 | 159k | for (i = 0; i < nr_par; i++) |
648 | 148k | { |
649 | | //int8_t tmp2; |
650 | | //int8_t tmp = index[i]; |
651 | | |
652 | | //printf("%d %d\n", index_prev[i*stride], index[i]); |
653 | | //printf("%d\n", index[i]); |
654 | | |
655 | 148k | index[i] = index_prev[i*stride] + index[i]; |
656 | | //tmp2 = index[i]; |
657 | 148k | index[i] = delta_clip(index[i], min_index, max_index); |
658 | | |
659 | | //if (iid) |
660 | | //{ |
661 | | // if (index[i] == 7) |
662 | | // { |
663 | | // printf("%d %d %d\n", index_prev[i*stride], tmp, tmp2); |
664 | | // } |
665 | | //} |
666 | 148k | } |
667 | 11.4k | } |
668 | 29.6k | } else { |
669 | | /* set indices to zero */ |
670 | 54.4k | for (i = 0; i < nr_par; i++) |
671 | 26.5k | { |
672 | 26.5k | index[i] = 0; |
673 | 26.5k | } |
674 | 27.9k | } |
675 | | |
676 | | /* coarse */ |
677 | 57.5k | if (stride == 2) |
678 | 36.4k | { |
679 | 226k | for (i = (nr_par<<1)-1; i > 0; i--) |
680 | 190k | { |
681 | 190k | index[i] = index[i>>1]; |
682 | 190k | } |
683 | 36.4k | } |
684 | 57.5k | } |
685 | | |
686 | | /* delta modulo decode array */ |
687 | | /* in: log2 value of the modulo value to allow using AND instead of MOD */ |
688 | | static void delta_modulo_decode(uint8_t enable, int8_t *index, int8_t *index_prev, |
689 | | uint8_t dt_flag, uint8_t nr_par, uint8_t stride, |
690 | | int8_t and_modulo) |
691 | 57.5k | { |
692 | 57.5k | int8_t i; |
693 | | |
694 | 57.5k | if (enable == 1) |
695 | 18.7k | { |
696 | 18.7k | if (dt_flag == 0) |
697 | 11.4k | { |
698 | | /* delta coded in frequency direction */ |
699 | 11.4k | index[0] = 0 + index[0]; |
700 | 11.4k | index[0] &= and_modulo; |
701 | | |
702 | 44.8k | for (i = 1; i < nr_par; i++) |
703 | 33.4k | { |
704 | 33.4k | index[i] = index[i-1] + index[i]; |
705 | 33.4k | index[i] &= and_modulo; |
706 | 33.4k | } |
707 | 11.4k | } else { |
708 | | /* delta coded in time direction */ |
709 | 24.8k | for (i = 0; i < nr_par; i++) |
710 | 17.5k | { |
711 | 17.5k | index[i] = index_prev[i*stride] + index[i]; |
712 | 17.5k | index[i] &= and_modulo; |
713 | 17.5k | } |
714 | 7.35k | } |
715 | 38.7k | } else { |
716 | | /* set indices to zero */ |
717 | 144k | for (i = 0; i < nr_par; i++) |
718 | 105k | { |
719 | 105k | index[i] = 0; |
720 | 105k | } |
721 | 38.7k | } |
722 | | |
723 | | /* coarse */ |
724 | 57.5k | if (stride == 2) |
725 | 0 | { |
726 | 0 | index[0] = 0; |
727 | 0 | for (i = (nr_par<<1)-1; i > 0; i--) |
728 | 0 | { |
729 | 0 | index[i] = index[i>>1]; |
730 | 0 | } |
731 | 0 | } |
732 | 57.5k | } |
733 | | |
734 | | #ifdef PS_LOW_POWER |
735 | | static void map34indexto20(int8_t *index, uint8_t bins) |
736 | | { |
737 | | index[0] = (2*index[0]+index[1])/3; |
738 | | index[1] = (index[1]+2*index[2])/3; |
739 | | index[2] = (2*index[3]+index[4])/3; |
740 | | index[3] = (index[4]+2*index[5])/3; |
741 | | index[4] = (index[6]+index[7])/2; |
742 | | index[5] = (index[8]+index[9])/2; |
743 | | index[6] = index[10]; |
744 | | index[7] = index[11]; |
745 | | index[8] = (index[12]+index[13])/2; |
746 | | index[9] = (index[14]+index[15])/2; |
747 | | index[10] = index[16]; |
748 | | |
749 | | if (bins == 34) |
750 | | { |
751 | | index[11] = index[17]; |
752 | | index[12] = index[18]; |
753 | | index[13] = index[19]; |
754 | | index[14] = (index[20]+index[21])/2; |
755 | | index[15] = (index[22]+index[23])/2; |
756 | | index[16] = (index[24]+index[25])/2; |
757 | | index[17] = (index[26]+index[27])/2; |
758 | | index[18] = (index[28]+index[29]+index[30]+index[31])/4; |
759 | | index[19] = (index[32]+index[33])/2; |
760 | | } |
761 | | } |
762 | | #endif |
763 | | |
764 | | static void map20indexto34(int8_t *index, uint8_t bins) |
765 | 25.6k | { |
766 | 25.6k | index[0] = index[0]; |
767 | 25.6k | index[1] = (index[0] + index[1])/2; |
768 | 25.6k | index[2] = index[1]; |
769 | 25.6k | index[3] = index[2]; |
770 | 25.6k | index[4] = (index[2] + index[3])/2; |
771 | 25.6k | index[5] = index[3]; |
772 | 25.6k | index[6] = index[4]; |
773 | 25.6k | index[7] = index[4]; |
774 | 25.6k | index[8] = index[5]; |
775 | 25.6k | index[9] = index[5]; |
776 | 25.6k | index[10] = index[6]; |
777 | 25.6k | index[11] = index[7]; |
778 | 25.6k | index[12] = index[8]; |
779 | 25.6k | index[13] = index[8]; |
780 | 25.6k | index[14] = index[9]; |
781 | 25.6k | index[15] = index[9]; |
782 | 25.6k | index[16] = index[10]; |
783 | | |
784 | 25.6k | if (bins == 34) |
785 | 11.4k | { |
786 | 11.4k | index[17] = index[11]; |
787 | 11.4k | index[18] = index[12]; |
788 | 11.4k | index[19] = index[13]; |
789 | 11.4k | index[20] = index[14]; |
790 | 11.4k | index[21] = index[14]; |
791 | 11.4k | index[22] = index[15]; |
792 | 11.4k | index[23] = index[15]; |
793 | 11.4k | index[24] = index[16]; |
794 | 11.4k | index[25] = index[16]; |
795 | 11.4k | index[26] = index[17]; |
796 | 11.4k | index[27] = index[17]; |
797 | 11.4k | index[28] = index[18]; |
798 | 11.4k | index[29] = index[18]; |
799 | 11.4k | index[30] = index[18]; |
800 | 11.4k | index[31] = index[18]; |
801 | 11.4k | index[32] = index[19]; |
802 | 11.4k | index[33] = index[19]; |
803 | 11.4k | } |
804 | 25.6k | } |
805 | | |
806 | | /* parse the bitstream data decoded in ps_data() */ |
807 | | static void ps_data_decode(ps_info *ps) |
808 | 16.8k | { |
809 | 16.8k | uint8_t env, bin; |
810 | | |
811 | | /* ps data not available, use data from previous frame */ |
812 | 16.8k | if (ps->ps_data_available == 0) |
813 | 4.13k | { |
814 | 4.13k | ps->num_env = 0; |
815 | 4.13k | } |
816 | | |
817 | 45.6k | for (env = 0; env < ps->num_env; env++) |
818 | 28.7k | { |
819 | 28.7k | int8_t *iid_index_prev; |
820 | 28.7k | int8_t *icc_index_prev; |
821 | 28.7k | int8_t *ipd_index_prev; |
822 | 28.7k | int8_t *opd_index_prev; |
823 | | |
824 | 28.7k | int8_t num_iid_steps = (ps->iid_mode < 3) ? 7 : 15 /*fine quant*/; |
825 | | |
826 | 28.7k | if (env == 0) |
827 | 8.48k | { |
828 | | /* take last envelope from previous frame */ |
829 | 8.48k | iid_index_prev = ps->iid_index_prev; |
830 | 8.48k | icc_index_prev = ps->icc_index_prev; |
831 | 8.48k | ipd_index_prev = ps->ipd_index_prev; |
832 | 8.48k | opd_index_prev = ps->opd_index_prev; |
833 | 20.2k | } else { |
834 | | /* take index values from previous envelope */ |
835 | 20.2k | iid_index_prev = ps->iid_index[env - 1]; |
836 | 20.2k | icc_index_prev = ps->icc_index[env - 1]; |
837 | 20.2k | ipd_index_prev = ps->ipd_index[env - 1]; |
838 | 20.2k | opd_index_prev = ps->opd_index[env - 1]; |
839 | 20.2k | } |
840 | | |
841 | | // iid = 1; |
842 | | /* delta decode iid parameters */ |
843 | 28.7k | delta_decode(ps->enable_iid, ps->iid_index[env], iid_index_prev, |
844 | 28.7k | ps->iid_dt[env], ps->nr_iid_par, |
845 | 28.7k | (ps->iid_mode == 0 || ps->iid_mode == 3) ? 2 : 1, |
846 | 28.7k | -num_iid_steps, num_iid_steps); |
847 | | // iid = 0; |
848 | | |
849 | | /* delta decode icc parameters */ |
850 | 28.7k | delta_decode(ps->enable_icc, ps->icc_index[env], icc_index_prev, |
851 | 28.7k | ps->icc_dt[env], ps->nr_icc_par, |
852 | 28.7k | (ps->icc_mode == 0 || ps->icc_mode == 3) ? 2 : 1, |
853 | 28.7k | 0, 7); |
854 | | |
855 | | /* delta modulo decode ipd parameters */ |
856 | 28.7k | delta_modulo_decode(ps->enable_ipdopd, ps->ipd_index[env], ipd_index_prev, |
857 | 28.7k | ps->ipd_dt[env], ps->nr_ipdopd_par, 1, 7); |
858 | | |
859 | | /* delta modulo decode opd parameters */ |
860 | 28.7k | delta_modulo_decode(ps->enable_ipdopd, ps->opd_index[env], opd_index_prev, |
861 | 28.7k | ps->opd_dt[env], ps->nr_ipdopd_par, 1, 7); |
862 | 28.7k | } |
863 | | |
864 | | /* handle error case */ |
865 | 16.8k | if (ps->num_env == 0) |
866 | 8.39k | { |
867 | | /* force to 1 */ |
868 | 8.39k | ps->num_env = 1; |
869 | | |
870 | 8.39k | if (ps->enable_iid) |
871 | 5.75k | { |
872 | 201k | for (bin = 0; bin < 34; bin++) |
873 | 195k | ps->iid_index[0][bin] = ps->iid_index_prev[bin]; |
874 | 5.75k | } else { |
875 | 92.6k | for (bin = 0; bin < 34; bin++) |
876 | 89.9k | ps->iid_index[0][bin] = 0; |
877 | 2.64k | } |
878 | | |
879 | 8.39k | if (ps->enable_icc) |
880 | 3.83k | { |
881 | 134k | for (bin = 0; bin < 34; bin++) |
882 | 130k | ps->icc_index[0][bin] = ps->icc_index_prev[bin]; |
883 | 4.56k | } else { |
884 | 159k | for (bin = 0; bin < 34; bin++) |
885 | 155k | ps->icc_index[0][bin] = 0; |
886 | 4.56k | } |
887 | | |
888 | 8.39k | if (ps->enable_ipdopd) |
889 | 940 | { |
890 | 16.9k | for (bin = 0; bin < 17; bin++) |
891 | 15.9k | { |
892 | 15.9k | ps->ipd_index[0][bin] = ps->ipd_index_prev[bin]; |
893 | 15.9k | ps->opd_index[0][bin] = ps->opd_index_prev[bin]; |
894 | 15.9k | } |
895 | 7.45k | } else { |
896 | 134k | for (bin = 0; bin < 17; bin++) |
897 | 126k | { |
898 | 126k | ps->ipd_index[0][bin] = 0; |
899 | 126k | ps->opd_index[0][bin] = 0; |
900 | 126k | } |
901 | 7.45k | } |
902 | 8.39k | } |
903 | | |
904 | | /* update previous indices */ |
905 | 590k | for (bin = 0; bin < 34; bin++) |
906 | 574k | ps->iid_index_prev[bin] = ps->iid_index[ps->num_env-1][bin]; |
907 | 590k | for (bin = 0; bin < 34; bin++) |
908 | 574k | ps->icc_index_prev[bin] = ps->icc_index[ps->num_env-1][bin]; |
909 | 303k | for (bin = 0; bin < 17; bin++) |
910 | 287k | { |
911 | 287k | ps->ipd_index_prev[bin] = ps->ipd_index[ps->num_env-1][bin]; |
912 | 287k | ps->opd_index_prev[bin] = ps->opd_index[ps->num_env-1][bin]; |
913 | 287k | } |
914 | | |
915 | 16.8k | ps->ps_data_available = 0; |
916 | | |
917 | 16.8k | if (ps->frame_class == 0) |
918 | 10.5k | { |
919 | 10.5k | ps->border_position[0] = 0; |
920 | 18.7k | for (env = 1; env < ps->num_env; env++) |
921 | 8.20k | { |
922 | 8.20k | ps->border_position[env] = (env * ps->numTimeSlotsRate) / ps->num_env; |
923 | 8.20k | } |
924 | 10.5k | ps->border_position[ps->num_env] = ps->numTimeSlotsRate; |
925 | 10.5k | } else { |
926 | 6.34k | ps->border_position[0] = 0; |
927 | | |
928 | 6.34k | if (ps->border_position[ps->num_env] < ps->numTimeSlotsRate) |
929 | 4.94k | { |
930 | 173k | for (bin = 0; bin < 34; bin++) |
931 | 168k | { |
932 | 168k | ps->iid_index[ps->num_env][bin] = ps->iid_index[ps->num_env-1][bin]; |
933 | 168k | ps->icc_index[ps->num_env][bin] = ps->icc_index[ps->num_env-1][bin]; |
934 | 168k | } |
935 | 88.9k | for (bin = 0; bin < 17; bin++) |
936 | 84.0k | { |
937 | 84.0k | ps->ipd_index[ps->num_env][bin] = ps->ipd_index[ps->num_env-1][bin]; |
938 | 84.0k | ps->opd_index[ps->num_env][bin] = ps->opd_index[ps->num_env-1][bin]; |
939 | 84.0k | } |
940 | 4.94k | ps->num_env++; |
941 | 4.94k | ps->border_position[ps->num_env] = ps->numTimeSlotsRate; |
942 | 4.94k | } |
943 | | |
944 | 23.3k | for (env = 1; env < ps->num_env; env++) |
945 | 17.0k | { |
946 | 17.0k | int8_t thr = ps->numTimeSlotsRate - (ps->num_env - env); |
947 | | |
948 | 17.0k | if (ps->border_position[env] > thr) |
949 | 4.06k | { |
950 | 4.06k | ps->border_position[env] = thr; |
951 | 12.9k | } else { |
952 | 12.9k | thr = ps->border_position[env-1]+1; |
953 | 12.9k | if (ps->border_position[env] < thr) |
954 | 6.94k | { |
955 | 6.94k | ps->border_position[env] = thr; |
956 | 6.94k | } |
957 | 12.9k | } |
958 | 17.0k | } |
959 | 6.34k | } |
960 | | |
961 | | /* make sure that the indices of all parameters can be mapped |
962 | | * to the same hybrid synthesis filterbank |
963 | | */ |
964 | | #ifdef PS_LOW_POWER |
965 | | for (env = 0; env < ps->num_env; env++) |
966 | | { |
967 | | if (ps->iid_mode == 2 || ps->iid_mode == 5) |
968 | | map34indexto20(ps->iid_index[env], 34); |
969 | | if (ps->icc_mode == 2 || ps->icc_mode == 5) |
970 | | map34indexto20(ps->icc_index[env], 34); |
971 | | |
972 | | /* disable ipd/opd */ |
973 | | for (bin = 0; bin < 17; bin++) |
974 | | { |
975 | | ps->aaIpdIndex[env][bin] = 0; |
976 | | ps->aaOpdIndex[env][bin] = 0; |
977 | | } |
978 | | } |
979 | | #else |
980 | 16.8k | if (ps->use34hybrid_bands) |
981 | 6.44k | { |
982 | 18.5k | for (env = 0; env < ps->num_env; env++) |
983 | 12.0k | { |
984 | 12.0k | if (ps->iid_mode != 2 && ps->iid_mode != 5) |
985 | 7.08k | map20indexto34(ps->iid_index[env], 34); |
986 | 12.0k | if (ps->icc_mode != 2 && ps->icc_mode != 5) |
987 | 4.40k | map20indexto34(ps->icc_index[env], 34); |
988 | 12.0k | if (ps->ipd_mode != 2 && ps->ipd_mode != 5) |
989 | 7.08k | { |
990 | 7.08k | map20indexto34(ps->ipd_index[env], 17); |
991 | 7.08k | map20indexto34(ps->opd_index[env], 17); |
992 | 7.08k | } |
993 | 12.0k | } |
994 | 6.44k | } |
995 | 16.8k | #endif |
996 | | |
997 | | #if 0 |
998 | | for (env = 0; env < ps->num_env; env++) |
999 | | { |
1000 | | printf("iid[env:%d]:", env); |
1001 | | for (bin = 0; bin < 34; bin++) |
1002 | | { |
1003 | | printf(" %d", ps->iid_index[env][bin]); |
1004 | | } |
1005 | | printf("\n"); |
1006 | | } |
1007 | | for (env = 0; env < ps->num_env; env++) |
1008 | | { |
1009 | | printf("icc[env:%d]:", env); |
1010 | | for (bin = 0; bin < 34; bin++) |
1011 | | { |
1012 | | printf(" %d", ps->icc_index[env][bin]); |
1013 | | } |
1014 | | printf("\n"); |
1015 | | } |
1016 | | for (env = 0; env < ps->num_env; env++) |
1017 | | { |
1018 | | printf("ipd[env:%d]:", env); |
1019 | | for (bin = 0; bin < 17; bin++) |
1020 | | { |
1021 | | printf(" %d", ps->ipd_index[env][bin]); |
1022 | | } |
1023 | | printf("\n"); |
1024 | | } |
1025 | | for (env = 0; env < ps->num_env; env++) |
1026 | | { |
1027 | | printf("opd[env:%d]:", env); |
1028 | | for (bin = 0; bin < 17; bin++) |
1029 | | { |
1030 | | printf(" %d", ps->opd_index[env][bin]); |
1031 | | } |
1032 | | printf("\n"); |
1033 | | } |
1034 | | printf("\n"); |
1035 | | #endif |
1036 | 16.8k | } |
1037 | | |
1038 | | /* decorrelate the mono signal using an allpass filter */ |
1039 | | static void ps_decorrelate(ps_info *ps, qmf_t X_left[38][64], qmf_t X_right[38][64], |
1040 | | qmf_t X_hybrid_left[32][32], qmf_t X_hybrid_right[32][32]) |
1041 | 16.8k | { |
1042 | 16.8k | uint8_t gr, n, bk; |
1043 | 16.8k | uint8_t temp_delay = 0; |
1044 | 16.8k | uint8_t sb, maxsb; |
1045 | 16.8k | const complex_t *Phi_Fract_SubQmf; |
1046 | 16.8k | uint8_t temp_delay_ser[NO_ALLPASS_LINKS]; |
1047 | 16.8k | real_t P_SmoothPeakDecayDiffNrg, nrg; |
1048 | 16.8k | real_t P[32][34]; |
1049 | 16.8k | real_t G_TransientRatio[32][34] = {{0}}; |
1050 | 16.8k | complex_t inputLeft; |
1051 | | |
1052 | | |
1053 | | /* chose hybrid filterbank: 20 or 34 band case */ |
1054 | 16.8k | if (ps->use34hybrid_bands) |
1055 | 6.44k | { |
1056 | 6.44k | Phi_Fract_SubQmf = Phi_Fract_SubQmf34; |
1057 | 10.4k | } else{ |
1058 | 10.4k | Phi_Fract_SubQmf = Phi_Fract_SubQmf20; |
1059 | 10.4k | } |
1060 | | |
1061 | | /* clear the energy values */ |
1062 | 557k | for (n = 0; n < 32; n++) |
1063 | 540k | { |
1064 | 18.9M | for (bk = 0; bk < 34; bk++) |
1065 | 18.3M | { |
1066 | 18.3M | P[n][bk] = 0; |
1067 | 18.3M | } |
1068 | 540k | } |
1069 | | |
1070 | | /* calculate the energy in each parameter band b(k) */ |
1071 | 568k | for (gr = 0; gr < ps->num_groups; gr++) |
1072 | 551k | { |
1073 | | /* select the parameter index b(k) to which this group belongs */ |
1074 | 551k | bk = (~NEGATE_IPD_MASK) & ps->map_group2bk[gr]; |
1075 | | |
1076 | | /* select the upper subband border for this group */ |
1077 | 551k | maxsb = (gr < ps->num_hybrid_groups) ? ps->group_border[gr]+1 : ps->group_border[gr+1]; |
1078 | | |
1079 | 1.87M | for (sb = ps->group_border[gr]; sb < maxsb; sb++) |
1080 | 1.32M | { |
1081 | 42.7M | for (n = ps->border_position[0]; n < ps->border_position[ps->num_env]; n++) |
1082 | 41.4M | { |
1083 | | #ifdef FIXED_POINT |
1084 | | uint32_t in_re, in_im; |
1085 | | #endif |
1086 | | |
1087 | | /* input from hybrid subbands or QMF subbands */ |
1088 | 41.4M | if (gr < ps->num_hybrid_groups) |
1089 | 9.63M | { |
1090 | 9.63M | RE(inputLeft) = QMF_RE(X_hybrid_left[n][sb]); |
1091 | 9.63M | IM(inputLeft) = QMF_IM(X_hybrid_left[n][sb]); |
1092 | 31.7M | } else { |
1093 | 31.7M | RE(inputLeft) = QMF_RE(X_left[n][sb]); |
1094 | 31.7M | IM(inputLeft) = QMF_IM(X_left[n][sb]); |
1095 | 31.7M | } |
1096 | | |
1097 | | /* accumulate energy */ |
1098 | | #ifdef FIXED_POINT |
1099 | | /* NOTE: all input is scaled by 2^(-5) because of fixed point QMF |
1100 | | * meaning that P will be scaled by 2^(-10) compared to floating point version |
1101 | | */ |
1102 | 14.5M | in_re = ((abs(RE(inputLeft))+(1<<(REAL_BITS-1)))>>REAL_BITS); |
1103 | 14.5M | in_im = ((abs(IM(inputLeft))+(1<<(REAL_BITS-1)))>>REAL_BITS); |
1104 | | P[n][bk] += in_re*in_re + in_im*in_im; |
1105 | | #else |
1106 | 26.8M | P[n][bk] += MUL_R(RE(inputLeft),RE(inputLeft)) + MUL_R(IM(inputLeft),IM(inputLeft)); |
1107 | | #endif |
1108 | 41.4M | } |
1109 | 1.32M | } |
1110 | 551k | } |
1111 | | |
1112 | | #if 0 |
1113 | | for (n = 0; n < 32; n++) |
1114 | | { |
1115 | | for (bk = 0; bk < 34; bk++) |
1116 | | { |
1117 | | #ifdef FIXED_POINT |
1118 | | printf("%d %d: %d\n", n, bk, P[n][bk] /*/(float)REAL_PRECISION*/); |
1119 | | #else |
1120 | | printf("%d %d: %f\n", n, bk, P[n][bk]/1024.0); |
1121 | | #endif |
1122 | | } |
1123 | | } |
1124 | | #endif |
1125 | | |
1126 | | /* calculate transient reduction ratio for each parameter band b(k) */ |
1127 | 444k | for (bk = 0; bk < ps->nr_par_bands; bk++) |
1128 | 427k | { |
1129 | 13.7M | for (n = ps->border_position[0]; n < ps->border_position[ps->num_env]; n++) |
1130 | 13.3M | { |
1131 | 13.3M | const real_t gamma = COEF_CONST(1.5); |
1132 | | |
1133 | 13.3M | ps->P_PeakDecayNrg[bk] = MUL_F(ps->P_PeakDecayNrg[bk], ps->alpha_decay); |
1134 | 13.3M | if (ps->P_PeakDecayNrg[bk] < P[n][bk]) |
1135 | 154k | ps->P_PeakDecayNrg[bk] = P[n][bk]; |
1136 | | |
1137 | | /* apply smoothing filter to peak decay energy */ |
1138 | 13.3M | P_SmoothPeakDecayDiffNrg = ps->P_SmoothPeakDecayDiffNrg_prev[bk]; |
1139 | 13.3M | P_SmoothPeakDecayDiffNrg += MUL_F((ps->P_PeakDecayNrg[bk] - P[n][bk] - ps->P_SmoothPeakDecayDiffNrg_prev[bk]), ps->alpha_smooth); |
1140 | 13.3M | ps->P_SmoothPeakDecayDiffNrg_prev[bk] = P_SmoothPeakDecayDiffNrg; |
1141 | | |
1142 | | /* apply smoothing filter to energy */ |
1143 | 13.3M | nrg = ps->P_prev[bk]; |
1144 | 13.3M | nrg += MUL_F((P[n][bk] - ps->P_prev[bk]), ps->alpha_smooth); |
1145 | 13.3M | ps->P_prev[bk] = nrg; |
1146 | | |
1147 | | /* calculate transient ratio */ |
1148 | 13.3M | if (MUL_C(P_SmoothPeakDecayDiffNrg, gamma) <= nrg) |
1149 | 13.2M | { |
1150 | 13.2M | G_TransientRatio[n][bk] = REAL_CONST(1.0); |
1151 | 13.2M | } else { |
1152 | 124k | G_TransientRatio[n][bk] = DIV_R(nrg, (MUL_C(P_SmoothPeakDecayDiffNrg, gamma))); |
1153 | 124k | } |
1154 | 13.3M | } |
1155 | 427k | } |
1156 | | |
1157 | | #if 0 |
1158 | | for (n = 0; n < 32; n++) |
1159 | | { |
1160 | | for (bk = 0; bk < 34; bk++) |
1161 | | { |
1162 | | #ifdef FIXED_POINT |
1163 | | printf("%d %d: %f\n", n, bk, G_TransientRatio[n][bk]/(float)REAL_PRECISION); |
1164 | | #else |
1165 | | printf("%d %d: %f\n", n, bk, G_TransientRatio[n][bk]); |
1166 | | #endif |
1167 | | } |
1168 | | } |
1169 | | #endif |
1170 | | |
1171 | | /* apply stereo decorrelation filter to the signal */ |
1172 | 568k | for (gr = 0; gr < ps->num_groups; gr++) |
1173 | 551k | { |
1174 | 551k | if (gr < ps->num_hybrid_groups) |
1175 | 310k | maxsb = ps->group_border[gr] + 1; |
1176 | 241k | else |
1177 | 241k | maxsb = ps->group_border[gr + 1]; |
1178 | | |
1179 | | /* QMF channel */ |
1180 | 1.87M | for (sb = ps->group_border[gr]; sb < maxsb; sb++) |
1181 | 1.32M | { |
1182 | 1.32M | real_t g_DecaySlope; |
1183 | 1.32M | real_t g_DecaySlope_filt[NO_ALLPASS_LINKS]; |
1184 | | |
1185 | | /* g_DecaySlope: [0..1] */ |
1186 | 1.32M | if (gr < ps->num_hybrid_groups || sb <= ps->decay_cutoff) |
1187 | 327k | { |
1188 | 327k | g_DecaySlope = FRAC_CONST(1.0); |
1189 | 1.00M | } else { |
1190 | 1.00M | int8_t decay = ps->decay_cutoff - sb; |
1191 | 1.00M | if (decay <= -20 /* -1/DECAY_SLOPE */) |
1192 | 679k | { |
1193 | 679k | g_DecaySlope = 0; |
1194 | 679k | } else { |
1195 | | /* decay(int)*decay_slope(frac) = g_DecaySlope(frac) */ |
1196 | 320k | g_DecaySlope = FRAC_CONST(1.0) + DECAY_SLOPE * decay; |
1197 | 320k | } |
1198 | 1.00M | } |
1199 | | |
1200 | | /* calculate g_DecaySlope_filt for every n multiplied by filter_a[n] */ |
1201 | 5.30M | for (n = 0; n < NO_ALLPASS_LINKS; n++) |
1202 | 3.98M | { |
1203 | 3.98M | g_DecaySlope_filt[n] = MUL_F(g_DecaySlope, filter_a[n]); |
1204 | 3.98M | } |
1205 | | |
1206 | | |
1207 | | /* set delay indices */ |
1208 | 1.32M | temp_delay = ps->saved_delay; |
1209 | 5.30M | for (n = 0; n < NO_ALLPASS_LINKS; n++) |
1210 | 3.98M | temp_delay_ser[n] = ps->delay_buf_index_ser[n]; |
1211 | | |
1212 | 42.7M | for (n = ps->border_position[0]; n < ps->border_position[ps->num_env]; n++) |
1213 | 41.4M | { |
1214 | 41.4M | complex_t tmp, tmp0, R0; |
1215 | 41.4M | uint8_t m; |
1216 | | |
1217 | 41.4M | if (gr < ps->num_hybrid_groups) |
1218 | 9.63M | { |
1219 | | /* hybrid filterbank input */ |
1220 | 9.63M | RE(inputLeft) = QMF_RE(X_hybrid_left[n][sb]); |
1221 | 9.63M | IM(inputLeft) = QMF_IM(X_hybrid_left[n][sb]); |
1222 | 31.7M | } else { |
1223 | | /* QMF filterbank input */ |
1224 | 31.7M | RE(inputLeft) = QMF_RE(X_left[n][sb]); |
1225 | 31.7M | IM(inputLeft) = QMF_IM(X_left[n][sb]); |
1226 | 31.7M | } |
1227 | | |
1228 | 41.4M | if (sb > ps->nr_allpass_bands && gr >= ps->num_hybrid_groups) |
1229 | 21.6M | { |
1230 | | /* delay */ |
1231 | | |
1232 | | /* never hybrid subbands here, always QMF subbands */ |
1233 | 21.6M | RE(tmp) = RE(ps->delay_Qmf[ps->delay_buf_index_delay[sb]][sb]); |
1234 | 21.6M | IM(tmp) = IM(ps->delay_Qmf[ps->delay_buf_index_delay[sb]][sb]); |
1235 | 21.6M | RE(R0) = RE(tmp); |
1236 | 21.6M | IM(R0) = IM(tmp); |
1237 | 21.6M | RE(ps->delay_Qmf[ps->delay_buf_index_delay[sb]][sb]) = RE(inputLeft); |
1238 | 21.6M | IM(ps->delay_Qmf[ps->delay_buf_index_delay[sb]][sb]) = IM(inputLeft); |
1239 | 21.6M | } else { |
1240 | | /* allpass filter */ |
1241 | 19.7M | complex_t Phi_Fract; |
1242 | | |
1243 | | /* fetch parameters */ |
1244 | 19.7M | if (gr < ps->num_hybrid_groups) |
1245 | 9.63M | { |
1246 | | /* select data from the hybrid subbands */ |
1247 | 9.63M | RE(tmp0) = RE(ps->delay_SubQmf[temp_delay][sb]); |
1248 | 9.63M | IM(tmp0) = IM(ps->delay_SubQmf[temp_delay][sb]); |
1249 | | |
1250 | 9.63M | RE(ps->delay_SubQmf[temp_delay][sb]) = RE(inputLeft); |
1251 | 9.63M | IM(ps->delay_SubQmf[temp_delay][sb]) = IM(inputLeft); |
1252 | | |
1253 | 9.63M | RE(Phi_Fract) = RE(Phi_Fract_SubQmf[sb]); |
1254 | 9.63M | IM(Phi_Fract) = IM(Phi_Fract_SubQmf[sb]); |
1255 | 10.1M | } else { |
1256 | | /* select data from the QMF subbands */ |
1257 | 10.1M | RE(tmp0) = RE(ps->delay_Qmf[temp_delay][sb]); |
1258 | 10.1M | IM(tmp0) = IM(ps->delay_Qmf[temp_delay][sb]); |
1259 | | |
1260 | 10.1M | RE(ps->delay_Qmf[temp_delay][sb]) = RE(inputLeft); |
1261 | 10.1M | IM(ps->delay_Qmf[temp_delay][sb]) = IM(inputLeft); |
1262 | | |
1263 | 10.1M | RE(Phi_Fract) = RE(Phi_Fract_Qmf[sb]); |
1264 | 10.1M | IM(Phi_Fract) = IM(Phi_Fract_Qmf[sb]); |
1265 | 10.1M | } |
1266 | | |
1267 | | /* z^(-2) * Phi_Fract[k] */ |
1268 | 19.7M | ComplexMult(&RE(tmp), &IM(tmp), RE(tmp0), IM(tmp0), RE(Phi_Fract), IM(Phi_Fract)); |
1269 | | |
1270 | 19.7M | RE(R0) = RE(tmp); |
1271 | 19.7M | IM(R0) = IM(tmp); |
1272 | 79.1M | for (m = 0; m < NO_ALLPASS_LINKS; m++) |
1273 | 59.3M | { |
1274 | 59.3M | complex_t Q_Fract_allpass, tmp2; |
1275 | | |
1276 | | /* fetch parameters */ |
1277 | 59.3M | if (gr < ps->num_hybrid_groups) |
1278 | 28.9M | { |
1279 | | /* select data from the hybrid subbands */ |
1280 | 28.9M | RE(tmp0) = RE(ps->delay_SubQmf_ser[m][temp_delay_ser[m]][sb]); |
1281 | 28.9M | IM(tmp0) = IM(ps->delay_SubQmf_ser[m][temp_delay_ser[m]][sb]); |
1282 | | |
1283 | 28.9M | if (ps->use34hybrid_bands) |
1284 | 19.0M | { |
1285 | 19.0M | RE(Q_Fract_allpass) = RE(Q_Fract_allpass_SubQmf34[sb][m]); |
1286 | 19.0M | IM(Q_Fract_allpass) = IM(Q_Fract_allpass_SubQmf34[sb][m]); |
1287 | 19.0M | } else { |
1288 | 9.88M | RE(Q_Fract_allpass) = RE(Q_Fract_allpass_SubQmf20[sb][m]); |
1289 | 9.88M | IM(Q_Fract_allpass) = IM(Q_Fract_allpass_SubQmf20[sb][m]); |
1290 | 9.88M | } |
1291 | 30.4M | } else { |
1292 | | /* select data from the QMF subbands */ |
1293 | 30.4M | RE(tmp0) = RE(ps->delay_Qmf_ser[m][temp_delay_ser[m]][sb]); |
1294 | 30.4M | IM(tmp0) = IM(ps->delay_Qmf_ser[m][temp_delay_ser[m]][sb]); |
1295 | | |
1296 | 30.4M | RE(Q_Fract_allpass) = RE(Q_Fract_allpass_Qmf[sb][m]); |
1297 | 30.4M | IM(Q_Fract_allpass) = IM(Q_Fract_allpass_Qmf[sb][m]); |
1298 | 30.4M | } |
1299 | | |
1300 | | /* delay by a fraction */ |
1301 | | /* z^(-d(m)) * Q_Fract_allpass[k,m] */ |
1302 | 59.3M | ComplexMult(&RE(tmp), &IM(tmp), RE(tmp0), IM(tmp0), RE(Q_Fract_allpass), IM(Q_Fract_allpass)); |
1303 | | |
1304 | | /* -a(m) * g_DecaySlope[k] */ |
1305 | 59.3M | RE(tmp) += -MUL_F(g_DecaySlope_filt[m], RE(R0)); |
1306 | 59.3M | IM(tmp) += -MUL_F(g_DecaySlope_filt[m], IM(R0)); |
1307 | | |
1308 | | /* -a(m) * g_DecaySlope[k] * Q_Fract_allpass[k,m] * z^(-d(m)) */ |
1309 | 59.3M | RE(tmp2) = RE(R0) + MUL_F(g_DecaySlope_filt[m], RE(tmp)); |
1310 | 59.3M | IM(tmp2) = IM(R0) + MUL_F(g_DecaySlope_filt[m], IM(tmp)); |
1311 | | |
1312 | | /* store sample */ |
1313 | 59.3M | if (gr < ps->num_hybrid_groups) |
1314 | 28.9M | { |
1315 | 28.9M | RE(ps->delay_SubQmf_ser[m][temp_delay_ser[m]][sb]) = RE(tmp2); |
1316 | 28.9M | IM(ps->delay_SubQmf_ser[m][temp_delay_ser[m]][sb]) = IM(tmp2); |
1317 | 30.4M | } else { |
1318 | 30.4M | RE(ps->delay_Qmf_ser[m][temp_delay_ser[m]][sb]) = RE(tmp2); |
1319 | 30.4M | IM(ps->delay_Qmf_ser[m][temp_delay_ser[m]][sb]) = IM(tmp2); |
1320 | 30.4M | } |
1321 | | |
1322 | | /* store for next iteration (or as output value if last iteration) */ |
1323 | 59.3M | RE(R0) = RE(tmp); |
1324 | 59.3M | IM(R0) = IM(tmp); |
1325 | 59.3M | } |
1326 | 19.7M | } |
1327 | | |
1328 | | /* select b(k) for reading the transient ratio */ |
1329 | 41.4M | bk = (~NEGATE_IPD_MASK) & ps->map_group2bk[gr]; |
1330 | | |
1331 | | /* duck if a past transient is found */ |
1332 | 41.4M | RE(R0) = MUL_R(G_TransientRatio[n][bk], RE(R0)); |
1333 | 41.4M | IM(R0) = MUL_R(G_TransientRatio[n][bk], IM(R0)); |
1334 | | |
1335 | 41.4M | if (gr < ps->num_hybrid_groups) |
1336 | 9.63M | { |
1337 | | /* hybrid */ |
1338 | 9.63M | QMF_RE(X_hybrid_right[n][sb]) = RE(R0); |
1339 | 9.63M | QMF_IM(X_hybrid_right[n][sb]) = IM(R0); |
1340 | 31.7M | } else { |
1341 | | /* QMF */ |
1342 | 31.7M | QMF_RE(X_right[n][sb]) = RE(R0); |
1343 | 31.7M | QMF_IM(X_right[n][sb]) = IM(R0); |
1344 | 31.7M | } |
1345 | | |
1346 | | /* Update delay buffer index */ |
1347 | 41.4M | if (++temp_delay >= 2) |
1348 | 20.7M | { |
1349 | 20.7M | temp_delay = 0; |
1350 | 20.7M | } |
1351 | | |
1352 | | /* update delay indices */ |
1353 | 41.4M | if (sb > ps->nr_allpass_bands && gr >= ps->num_hybrid_groups) |
1354 | 21.6M | { |
1355 | | /* delay_D depends on the samplerate, it can hold the values 14 and 1 */ |
1356 | 21.6M | if (++ps->delay_buf_index_delay[sb] >= ps->delay_D[sb]) |
1357 | 15.7M | { |
1358 | 15.7M | ps->delay_buf_index_delay[sb] = 0; |
1359 | 15.7M | } |
1360 | 21.6M | } |
1361 | | |
1362 | 165M | for (m = 0; m < NO_ALLPASS_LINKS; m++) |
1363 | 124M | { |
1364 | 124M | if (++temp_delay_ser[m] >= ps->num_sample_delay_ser[m]) |
1365 | 31.7M | { |
1366 | 31.7M | temp_delay_ser[m] = 0; |
1367 | 31.7M | } |
1368 | 124M | } |
1369 | 41.4M | } |
1370 | 1.32M | } |
1371 | 551k | } |
1372 | | |
1373 | | /* update delay indices */ |
1374 | 16.8k | ps->saved_delay = temp_delay; |
1375 | 67.5k | for (n = 0; n < NO_ALLPASS_LINKS; n++) |
1376 | 50.6k | ps->delay_buf_index_ser[n] = temp_delay_ser[n]; |
1377 | 16.8k | } Line | Count | Source | 1041 | 5.87k | { | 1042 | 5.87k | uint8_t gr, n, bk; | 1043 | 5.87k | uint8_t temp_delay = 0; | 1044 | 5.87k | uint8_t sb, maxsb; | 1045 | 5.87k | const complex_t *Phi_Fract_SubQmf; | 1046 | 5.87k | uint8_t temp_delay_ser[NO_ALLPASS_LINKS]; | 1047 | 5.87k | real_t P_SmoothPeakDecayDiffNrg, nrg; | 1048 | 5.87k | real_t P[32][34]; | 1049 | 5.87k | real_t G_TransientRatio[32][34] = {{0}}; | 1050 | 5.87k | complex_t inputLeft; | 1051 | | | 1052 | | | 1053 | | /* chose hybrid filterbank: 20 or 34 band case */ | 1054 | 5.87k | if (ps->use34hybrid_bands) | 1055 | 2.36k | { | 1056 | 2.36k | Phi_Fract_SubQmf = Phi_Fract_SubQmf34; | 1057 | 3.50k | } else{ | 1058 | 3.50k | Phi_Fract_SubQmf = Phi_Fract_SubQmf20; | 1059 | 3.50k | } | 1060 | | | 1061 | | /* clear the energy values */ | 1062 | 193k | for (n = 0; n < 32; n++) | 1063 | 187k | { | 1064 | 6.57M | for (bk = 0; bk < 34; bk++) | 1065 | 6.38M | { | 1066 | 6.38M | P[n][bk] = 0; | 1067 | 6.38M | } | 1068 | 187k | } | 1069 | | | 1070 | | /* calculate the energy in each parameter band b(k) */ | 1071 | 201k | for (gr = 0; gr < ps->num_groups; gr++) | 1072 | 195k | { | 1073 | | /* select the parameter index b(k) to which this group belongs */ | 1074 | 195k | bk = (~NEGATE_IPD_MASK) & ps->map_group2bk[gr]; | 1075 | | | 1076 | | /* select the upper subband border for this group */ | 1077 | 195k | maxsb = (gr < ps->num_hybrid_groups) ? ps->group_border[gr]+1 : ps->group_border[gr+1]; | 1078 | | | 1079 | 659k | for (sb = ps->group_border[gr]; sb < maxsb; sb++) | 1080 | 464k | { | 1081 | 15.0M | for (n = ps->border_position[0]; n < ps->border_position[ps->num_env]; n++) | 1082 | 14.5M | { | 1083 | 14.5M | #ifdef FIXED_POINT | 1084 | 14.5M | uint32_t in_re, in_im; | 1085 | 14.5M | #endif | 1086 | | | 1087 | | /* input from hybrid subbands or QMF subbands */ | 1088 | 14.5M | if (gr < ps->num_hybrid_groups) | 1089 | 3.45M | { | 1090 | 3.45M | RE(inputLeft) = QMF_RE(X_hybrid_left[n][sb]); | 1091 | 3.45M | IM(inputLeft) = QMF_IM(X_hybrid_left[n][sb]); | 1092 | 11.0M | } else { | 1093 | 11.0M | RE(inputLeft) = QMF_RE(X_left[n][sb]); | 1094 | 11.0M | IM(inputLeft) = QMF_IM(X_left[n][sb]); | 1095 | 11.0M | } | 1096 | | | 1097 | | /* accumulate energy */ | 1098 | 14.5M | #ifdef FIXED_POINT | 1099 | | /* NOTE: all input is scaled by 2^(-5) because of fixed point QMF | 1100 | | * meaning that P will be scaled by 2^(-10) compared to floating point version | 1101 | | */ | 1102 | 14.5M | in_re = ((abs(RE(inputLeft))+(1<<(REAL_BITS-1)))>>REAL_BITS); | 1103 | 14.5M | in_im = ((abs(IM(inputLeft))+(1<<(REAL_BITS-1)))>>REAL_BITS); | 1104 | 14.5M | P[n][bk] += in_re*in_re + in_im*in_im; | 1105 | | #else | 1106 | | P[n][bk] += MUL_R(RE(inputLeft),RE(inputLeft)) + MUL_R(IM(inputLeft),IM(inputLeft)); | 1107 | | #endif | 1108 | 14.5M | } | 1109 | 464k | } | 1110 | 195k | } | 1111 | | | 1112 | | #if 0 | 1113 | | for (n = 0; n < 32; n++) | 1114 | | { | 1115 | | for (bk = 0; bk < 34; bk++) | 1116 | | { | 1117 | | #ifdef FIXED_POINT | 1118 | | printf("%d %d: %d\n", n, bk, P[n][bk] /*/(float)REAL_PRECISION*/); | 1119 | | #else | 1120 | | printf("%d %d: %f\n", n, bk, P[n][bk]/1024.0); | 1121 | | #endif | 1122 | | } | 1123 | | } | 1124 | | #endif | 1125 | | | 1126 | | /* calculate transient reduction ratio for each parameter band b(k) */ | 1127 | 156k | for (bk = 0; bk < ps->nr_par_bands; bk++) | 1128 | 150k | { | 1129 | 4.85M | for (n = ps->border_position[0]; n < ps->border_position[ps->num_env]; n++) | 1130 | 4.70M | { | 1131 | 4.70M | const real_t gamma = COEF_CONST(1.5); | 1132 | | | 1133 | 4.70M | ps->P_PeakDecayNrg[bk] = MUL_F(ps->P_PeakDecayNrg[bk], ps->alpha_decay); | 1134 | 4.70M | if (ps->P_PeakDecayNrg[bk] < P[n][bk]) | 1135 | 18.9k | ps->P_PeakDecayNrg[bk] = P[n][bk]; | 1136 | | | 1137 | | /* apply smoothing filter to peak decay energy */ | 1138 | 4.70M | P_SmoothPeakDecayDiffNrg = ps->P_SmoothPeakDecayDiffNrg_prev[bk]; | 1139 | 4.70M | P_SmoothPeakDecayDiffNrg += MUL_F((ps->P_PeakDecayNrg[bk] - P[n][bk] - ps->P_SmoothPeakDecayDiffNrg_prev[bk]), ps->alpha_smooth); | 1140 | 4.70M | ps->P_SmoothPeakDecayDiffNrg_prev[bk] = P_SmoothPeakDecayDiffNrg; | 1141 | | | 1142 | | /* apply smoothing filter to energy */ | 1143 | 4.70M | nrg = ps->P_prev[bk]; | 1144 | 4.70M | nrg += MUL_F((P[n][bk] - ps->P_prev[bk]), ps->alpha_smooth); | 1145 | 4.70M | ps->P_prev[bk] = nrg; | 1146 | | | 1147 | | /* calculate transient ratio */ | 1148 | 4.70M | if (MUL_C(P_SmoothPeakDecayDiffNrg, gamma) <= nrg) | 1149 | 4.69M | { | 1150 | 4.69M | G_TransientRatio[n][bk] = REAL_CONST(1.0); | 1151 | 4.69M | } else { | 1152 | 10.5k | G_TransientRatio[n][bk] = DIV_R(nrg, (MUL_C(P_SmoothPeakDecayDiffNrg, gamma))); | 1153 | 10.5k | } | 1154 | 4.70M | } | 1155 | 150k | } | 1156 | | | 1157 | | #if 0 | 1158 | | for (n = 0; n < 32; n++) | 1159 | | { | 1160 | | for (bk = 0; bk < 34; bk++) | 1161 | | { | 1162 | | #ifdef FIXED_POINT | 1163 | | printf("%d %d: %f\n", n, bk, G_TransientRatio[n][bk]/(float)REAL_PRECISION); | 1164 | | #else | 1165 | | printf("%d %d: %f\n", n, bk, G_TransientRatio[n][bk]); | 1166 | | #endif | 1167 | | } | 1168 | | } | 1169 | | #endif | 1170 | | | 1171 | | /* apply stereo decorrelation filter to the signal */ | 1172 | 201k | for (gr = 0; gr < ps->num_groups; gr++) | 1173 | 195k | { | 1174 | 195k | if (gr < ps->num_hybrid_groups) | 1175 | 110k | maxsb = ps->group_border[gr] + 1; | 1176 | 84.6k | else | 1177 | 84.6k | maxsb = ps->group_border[gr + 1]; | 1178 | | | 1179 | | /* QMF channel */ | 1180 | 659k | for (sb = ps->group_border[gr]; sb < maxsb; sb++) | 1181 | 464k | { | 1182 | 464k | real_t g_DecaySlope; | 1183 | 464k | real_t g_DecaySlope_filt[NO_ALLPASS_LINKS]; | 1184 | | | 1185 | | /* g_DecaySlope: [0..1] */ | 1186 | 464k | if (gr < ps->num_hybrid_groups || sb <= ps->decay_cutoff) | 1187 | 116k | { | 1188 | 116k | g_DecaySlope = FRAC_CONST(1.0); | 1189 | 347k | } else { | 1190 | 347k | int8_t decay = ps->decay_cutoff - sb; | 1191 | 347k | if (decay <= -20 /* -1/DECAY_SLOPE */) | 1192 | 236k | { | 1193 | 236k | g_DecaySlope = 0; | 1194 | 236k | } else { | 1195 | | /* decay(int)*decay_slope(frac) = g_DecaySlope(frac) */ | 1196 | 111k | g_DecaySlope = FRAC_CONST(1.0) + DECAY_SLOPE * decay; | 1197 | 111k | } | 1198 | 347k | } | 1199 | | | 1200 | | /* calculate g_DecaySlope_filt for every n multiplied by filter_a[n] */ | 1201 | 1.85M | for (n = 0; n < NO_ALLPASS_LINKS; n++) | 1202 | 1.39M | { | 1203 | 1.39M | g_DecaySlope_filt[n] = MUL_F(g_DecaySlope, filter_a[n]); | 1204 | 1.39M | } | 1205 | | | 1206 | | | 1207 | | /* set delay indices */ | 1208 | 464k | temp_delay = ps->saved_delay; | 1209 | 1.85M | for (n = 0; n < NO_ALLPASS_LINKS; n++) | 1210 | 1.39M | temp_delay_ser[n] = ps->delay_buf_index_ser[n]; | 1211 | | | 1212 | 15.0M | for (n = ps->border_position[0]; n < ps->border_position[ps->num_env]; n++) | 1213 | 14.5M | { | 1214 | 14.5M | complex_t tmp, tmp0, R0; | 1215 | 14.5M | uint8_t m; | 1216 | | | 1217 | 14.5M | if (gr < ps->num_hybrid_groups) | 1218 | 3.45M | { | 1219 | | /* hybrid filterbank input */ | 1220 | 3.45M | RE(inputLeft) = QMF_RE(X_hybrid_left[n][sb]); | 1221 | 3.45M | IM(inputLeft) = QMF_IM(X_hybrid_left[n][sb]); | 1222 | 11.0M | } else { | 1223 | | /* QMF filterbank input */ | 1224 | 11.0M | RE(inputLeft) = QMF_RE(X_left[n][sb]); | 1225 | 11.0M | IM(inputLeft) = QMF_IM(X_left[n][sb]); | 1226 | 11.0M | } | 1227 | | | 1228 | 14.5M | if (sb > ps->nr_allpass_bands && gr >= ps->num_hybrid_groups) | 1229 | 7.55M | { | 1230 | | /* delay */ | 1231 | | | 1232 | | /* never hybrid subbands here, always QMF subbands */ | 1233 | 7.55M | RE(tmp) = RE(ps->delay_Qmf[ps->delay_buf_index_delay[sb]][sb]); | 1234 | 7.55M | IM(tmp) = IM(ps->delay_Qmf[ps->delay_buf_index_delay[sb]][sb]); | 1235 | 7.55M | RE(R0) = RE(tmp); | 1236 | 7.55M | IM(R0) = IM(tmp); | 1237 | 7.55M | RE(ps->delay_Qmf[ps->delay_buf_index_delay[sb]][sb]) = RE(inputLeft); | 1238 | 7.55M | IM(ps->delay_Qmf[ps->delay_buf_index_delay[sb]][sb]) = IM(inputLeft); | 1239 | 7.55M | } else { | 1240 | | /* allpass filter */ | 1241 | 6.98M | complex_t Phi_Fract; | 1242 | | | 1243 | | /* fetch parameters */ | 1244 | 6.98M | if (gr < ps->num_hybrid_groups) | 1245 | 3.45M | { | 1246 | | /* select data from the hybrid subbands */ | 1247 | 3.45M | RE(tmp0) = RE(ps->delay_SubQmf[temp_delay][sb]); | 1248 | 3.45M | IM(tmp0) = IM(ps->delay_SubQmf[temp_delay][sb]); | 1249 | | | 1250 | 3.45M | RE(ps->delay_SubQmf[temp_delay][sb]) = RE(inputLeft); | 1251 | 3.45M | IM(ps->delay_SubQmf[temp_delay][sb]) = IM(inputLeft); | 1252 | | | 1253 | 3.45M | RE(Phi_Fract) = RE(Phi_Fract_SubQmf[sb]); | 1254 | 3.45M | IM(Phi_Fract) = IM(Phi_Fract_SubQmf[sb]); | 1255 | 3.53M | } else { | 1256 | | /* select data from the QMF subbands */ | 1257 | 3.53M | RE(tmp0) = RE(ps->delay_Qmf[temp_delay][sb]); | 1258 | 3.53M | IM(tmp0) = IM(ps->delay_Qmf[temp_delay][sb]); | 1259 | | | 1260 | 3.53M | RE(ps->delay_Qmf[temp_delay][sb]) = RE(inputLeft); | 1261 | 3.53M | IM(ps->delay_Qmf[temp_delay][sb]) = IM(inputLeft); | 1262 | | | 1263 | 3.53M | RE(Phi_Fract) = RE(Phi_Fract_Qmf[sb]); | 1264 | 3.53M | IM(Phi_Fract) = IM(Phi_Fract_Qmf[sb]); | 1265 | 3.53M | } | 1266 | | | 1267 | | /* z^(-2) * Phi_Fract[k] */ | 1268 | 6.98M | ComplexMult(&RE(tmp), &IM(tmp), RE(tmp0), IM(tmp0), RE(Phi_Fract), IM(Phi_Fract)); | 1269 | | | 1270 | 6.98M | RE(R0) = RE(tmp); | 1271 | 6.98M | IM(R0) = IM(tmp); | 1272 | 27.9M | for (m = 0; m < NO_ALLPASS_LINKS; m++) | 1273 | 20.9M | { | 1274 | 20.9M | complex_t Q_Fract_allpass, tmp2; | 1275 | | | 1276 | | /* fetch parameters */ | 1277 | 20.9M | if (gr < ps->num_hybrid_groups) | 1278 | 10.3M | { | 1279 | | /* select data from the hybrid subbands */ | 1280 | 10.3M | RE(tmp0) = RE(ps->delay_SubQmf_ser[m][temp_delay_ser[m]][sb]); | 1281 | 10.3M | IM(tmp0) = IM(ps->delay_SubQmf_ser[m][temp_delay_ser[m]][sb]); | 1282 | | | 1283 | 10.3M | if (ps->use34hybrid_bands) | 1284 | 7.01M | { | 1285 | 7.01M | RE(Q_Fract_allpass) = RE(Q_Fract_allpass_SubQmf34[sb][m]); | 1286 | 7.01M | IM(Q_Fract_allpass) = IM(Q_Fract_allpass_SubQmf34[sb][m]); | 1287 | 7.01M | } else { | 1288 | 3.33M | RE(Q_Fract_allpass) = RE(Q_Fract_allpass_SubQmf20[sb][m]); | 1289 | 3.33M | IM(Q_Fract_allpass) = IM(Q_Fract_allpass_SubQmf20[sb][m]); | 1290 | 3.33M | } | 1291 | 10.6M | } else { | 1292 | | /* select data from the QMF subbands */ | 1293 | 10.6M | RE(tmp0) = RE(ps->delay_Qmf_ser[m][temp_delay_ser[m]][sb]); | 1294 | 10.6M | IM(tmp0) = IM(ps->delay_Qmf_ser[m][temp_delay_ser[m]][sb]); | 1295 | | | 1296 | 10.6M | RE(Q_Fract_allpass) = RE(Q_Fract_allpass_Qmf[sb][m]); | 1297 | 10.6M | IM(Q_Fract_allpass) = IM(Q_Fract_allpass_Qmf[sb][m]); | 1298 | 10.6M | } | 1299 | | | 1300 | | /* delay by a fraction */ | 1301 | | /* z^(-d(m)) * Q_Fract_allpass[k,m] */ | 1302 | 20.9M | ComplexMult(&RE(tmp), &IM(tmp), RE(tmp0), IM(tmp0), RE(Q_Fract_allpass), IM(Q_Fract_allpass)); | 1303 | | | 1304 | | /* -a(m) * g_DecaySlope[k] */ | 1305 | 20.9M | RE(tmp) += -MUL_F(g_DecaySlope_filt[m], RE(R0)); | 1306 | 20.9M | IM(tmp) += -MUL_F(g_DecaySlope_filt[m], IM(R0)); | 1307 | | | 1308 | | /* -a(m) * g_DecaySlope[k] * Q_Fract_allpass[k,m] * z^(-d(m)) */ | 1309 | 20.9M | RE(tmp2) = RE(R0) + MUL_F(g_DecaySlope_filt[m], RE(tmp)); | 1310 | 20.9M | IM(tmp2) = IM(R0) + MUL_F(g_DecaySlope_filt[m], IM(tmp)); | 1311 | | | 1312 | | /* store sample */ | 1313 | 20.9M | if (gr < ps->num_hybrid_groups) | 1314 | 10.3M | { | 1315 | 10.3M | RE(ps->delay_SubQmf_ser[m][temp_delay_ser[m]][sb]) = RE(tmp2); | 1316 | 10.3M | IM(ps->delay_SubQmf_ser[m][temp_delay_ser[m]][sb]) = IM(tmp2); | 1317 | 10.6M | } else { | 1318 | 10.6M | RE(ps->delay_Qmf_ser[m][temp_delay_ser[m]][sb]) = RE(tmp2); | 1319 | 10.6M | IM(ps->delay_Qmf_ser[m][temp_delay_ser[m]][sb]) = IM(tmp2); | 1320 | 10.6M | } | 1321 | | | 1322 | | /* store for next iteration (or as output value if last iteration) */ | 1323 | 20.9M | RE(R0) = RE(tmp); | 1324 | 20.9M | IM(R0) = IM(tmp); | 1325 | 20.9M | } | 1326 | 6.98M | } | 1327 | | | 1328 | | /* select b(k) for reading the transient ratio */ | 1329 | 14.5M | bk = (~NEGATE_IPD_MASK) & ps->map_group2bk[gr]; | 1330 | | | 1331 | | /* duck if a past transient is found */ | 1332 | 14.5M | RE(R0) = MUL_R(G_TransientRatio[n][bk], RE(R0)); | 1333 | 14.5M | IM(R0) = MUL_R(G_TransientRatio[n][bk], IM(R0)); | 1334 | | | 1335 | 14.5M | if (gr < ps->num_hybrid_groups) | 1336 | 3.45M | { | 1337 | | /* hybrid */ | 1338 | 3.45M | QMF_RE(X_hybrid_right[n][sb]) = RE(R0); | 1339 | 3.45M | QMF_IM(X_hybrid_right[n][sb]) = IM(R0); | 1340 | 11.0M | } else { | 1341 | | /* QMF */ | 1342 | 11.0M | QMF_RE(X_right[n][sb]) = RE(R0); | 1343 | 11.0M | QMF_IM(X_right[n][sb]) = IM(R0); | 1344 | 11.0M | } | 1345 | | | 1346 | | /* Update delay buffer index */ | 1347 | 14.5M | if (++temp_delay >= 2) | 1348 | 7.26M | { | 1349 | 7.26M | temp_delay = 0; | 1350 | 7.26M | } | 1351 | | | 1352 | | /* update delay indices */ | 1353 | 14.5M | if (sb > ps->nr_allpass_bands && gr >= ps->num_hybrid_groups) | 1354 | 7.55M | { | 1355 | | /* delay_D depends on the samplerate, it can hold the values 14 and 1 */ | 1356 | 7.55M | if (++ps->delay_buf_index_delay[sb] >= ps->delay_D[sb]) | 1357 | 5.48M | { | 1358 | 5.48M | ps->delay_buf_index_delay[sb] = 0; | 1359 | 5.48M | } | 1360 | 7.55M | } | 1361 | | | 1362 | 58.1M | for (m = 0; m < NO_ALLPASS_LINKS; m++) | 1363 | 43.6M | { | 1364 | 43.6M | if (++temp_delay_ser[m] >= ps->num_sample_delay_ser[m]) | 1365 | 11.1M | { | 1366 | 11.1M | temp_delay_ser[m] = 0; | 1367 | 11.1M | } | 1368 | 43.6M | } | 1369 | 14.5M | } | 1370 | 464k | } | 1371 | 195k | } | 1372 | | | 1373 | | /* update delay indices */ | 1374 | 5.87k | ps->saved_delay = temp_delay; | 1375 | 23.4k | for (n = 0; n < NO_ALLPASS_LINKS; n++) | 1376 | 17.6k | ps->delay_buf_index_ser[n] = temp_delay_ser[n]; | 1377 | 5.87k | } |
Line | Count | Source | 1041 | 11.0k | { | 1042 | 11.0k | uint8_t gr, n, bk; | 1043 | 11.0k | uint8_t temp_delay = 0; | 1044 | 11.0k | uint8_t sb, maxsb; | 1045 | 11.0k | const complex_t *Phi_Fract_SubQmf; | 1046 | 11.0k | uint8_t temp_delay_ser[NO_ALLPASS_LINKS]; | 1047 | 11.0k | real_t P_SmoothPeakDecayDiffNrg, nrg; | 1048 | 11.0k | real_t P[32][34]; | 1049 | 11.0k | real_t G_TransientRatio[32][34] = {{0}}; | 1050 | 11.0k | complex_t inputLeft; | 1051 | | | 1052 | | | 1053 | | /* chose hybrid filterbank: 20 or 34 band case */ | 1054 | 11.0k | if (ps->use34hybrid_bands) | 1055 | 4.07k | { | 1056 | 4.07k | Phi_Fract_SubQmf = Phi_Fract_SubQmf34; | 1057 | 6.93k | } else{ | 1058 | 6.93k | Phi_Fract_SubQmf = Phi_Fract_SubQmf20; | 1059 | 6.93k | } | 1060 | | | 1061 | | /* clear the energy values */ | 1062 | 363k | for (n = 0; n < 32; n++) | 1063 | 352k | { | 1064 | 12.3M | for (bk = 0; bk < 34; bk++) | 1065 | 11.9M | { | 1066 | 11.9M | P[n][bk] = 0; | 1067 | 11.9M | } | 1068 | 352k | } | 1069 | | | 1070 | | /* calculate the energy in each parameter band b(k) */ | 1071 | 367k | for (gr = 0; gr < ps->num_groups; gr++) | 1072 | 356k | { | 1073 | | /* select the parameter index b(k) to which this group belongs */ | 1074 | 356k | bk = (~NEGATE_IPD_MASK) & ps->map_group2bk[gr]; | 1075 | | | 1076 | | /* select the upper subband border for this group */ | 1077 | 356k | maxsb = (gr < ps->num_hybrid_groups) ? ps->group_border[gr]+1 : ps->group_border[gr+1]; | 1078 | | | 1079 | 1.21M | for (sb = ps->group_border[gr]; sb < maxsb; sb++) | 1080 | 863k | { | 1081 | 27.7M | for (n = ps->border_position[0]; n < ps->border_position[ps->num_env]; n++) | 1082 | 26.8M | { | 1083 | | #ifdef FIXED_POINT | 1084 | | uint32_t in_re, in_im; | 1085 | | #endif | 1086 | | | 1087 | | /* input from hybrid subbands or QMF subbands */ | 1088 | 26.8M | if (gr < ps->num_hybrid_groups) | 1089 | 6.18M | { | 1090 | 6.18M | RE(inputLeft) = QMF_RE(X_hybrid_left[n][sb]); | 1091 | 6.18M | IM(inputLeft) = QMF_IM(X_hybrid_left[n][sb]); | 1092 | 20.7M | } else { | 1093 | 20.7M | RE(inputLeft) = QMF_RE(X_left[n][sb]); | 1094 | 20.7M | IM(inputLeft) = QMF_IM(X_left[n][sb]); | 1095 | 20.7M | } | 1096 | | | 1097 | | /* accumulate energy */ | 1098 | | #ifdef FIXED_POINT | 1099 | | /* NOTE: all input is scaled by 2^(-5) because of fixed point QMF | 1100 | | * meaning that P will be scaled by 2^(-10) compared to floating point version | 1101 | | */ | 1102 | | in_re = ((abs(RE(inputLeft))+(1<<(REAL_BITS-1)))>>REAL_BITS); | 1103 | | in_im = ((abs(IM(inputLeft))+(1<<(REAL_BITS-1)))>>REAL_BITS); | 1104 | | P[n][bk] += in_re*in_re + in_im*in_im; | 1105 | | #else | 1106 | 26.8M | P[n][bk] += MUL_R(RE(inputLeft),RE(inputLeft)) + MUL_R(IM(inputLeft),IM(inputLeft)); | 1107 | 26.8M | #endif | 1108 | 26.8M | } | 1109 | 863k | } | 1110 | 356k | } | 1111 | | | 1112 | | #if 0 | 1113 | | for (n = 0; n < 32; n++) | 1114 | | { | 1115 | | for (bk = 0; bk < 34; bk++) | 1116 | | { | 1117 | | #ifdef FIXED_POINT | 1118 | | printf("%d %d: %d\n", n, bk, P[n][bk] /*/(float)REAL_PRECISION*/); | 1119 | | #else | 1120 | | printf("%d %d: %f\n", n, bk, P[n][bk]/1024.0); | 1121 | | #endif | 1122 | | } | 1123 | | } | 1124 | | #endif | 1125 | | | 1126 | | /* calculate transient reduction ratio for each parameter band b(k) */ | 1127 | 288k | for (bk = 0; bk < ps->nr_par_bands; bk++) | 1128 | 277k | { | 1129 | 8.89M | for (n = ps->border_position[0]; n < ps->border_position[ps->num_env]; n++) | 1130 | 8.62M | { | 1131 | 8.62M | const real_t gamma = COEF_CONST(1.5); | 1132 | | | 1133 | 8.62M | ps->P_PeakDecayNrg[bk] = MUL_F(ps->P_PeakDecayNrg[bk], ps->alpha_decay); | 1134 | 8.62M | if (ps->P_PeakDecayNrg[bk] < P[n][bk]) | 1135 | 135k | ps->P_PeakDecayNrg[bk] = P[n][bk]; | 1136 | | | 1137 | | /* apply smoothing filter to peak decay energy */ | 1138 | 8.62M | P_SmoothPeakDecayDiffNrg = ps->P_SmoothPeakDecayDiffNrg_prev[bk]; | 1139 | 8.62M | P_SmoothPeakDecayDiffNrg += MUL_F((ps->P_PeakDecayNrg[bk] - P[n][bk] - ps->P_SmoothPeakDecayDiffNrg_prev[bk]), ps->alpha_smooth); | 1140 | 8.62M | ps->P_SmoothPeakDecayDiffNrg_prev[bk] = P_SmoothPeakDecayDiffNrg; | 1141 | | | 1142 | | /* apply smoothing filter to energy */ | 1143 | 8.62M | nrg = ps->P_prev[bk]; | 1144 | 8.62M | nrg += MUL_F((P[n][bk] - ps->P_prev[bk]), ps->alpha_smooth); | 1145 | 8.62M | ps->P_prev[bk] = nrg; | 1146 | | | 1147 | | /* calculate transient ratio */ | 1148 | 8.62M | if (MUL_C(P_SmoothPeakDecayDiffNrg, gamma) <= nrg) | 1149 | 8.50M | { | 1150 | 8.50M | G_TransientRatio[n][bk] = REAL_CONST(1.0); | 1151 | 8.50M | } else { | 1152 | 114k | G_TransientRatio[n][bk] = DIV_R(nrg, (MUL_C(P_SmoothPeakDecayDiffNrg, gamma))); | 1153 | 114k | } | 1154 | 8.62M | } | 1155 | 277k | } | 1156 | | | 1157 | | #if 0 | 1158 | | for (n = 0; n < 32; n++) | 1159 | | { | 1160 | | for (bk = 0; bk < 34; bk++) | 1161 | | { | 1162 | | #ifdef FIXED_POINT | 1163 | | printf("%d %d: %f\n", n, bk, G_TransientRatio[n][bk]/(float)REAL_PRECISION); | 1164 | | #else | 1165 | | printf("%d %d: %f\n", n, bk, G_TransientRatio[n][bk]); | 1166 | | #endif | 1167 | | } | 1168 | | } | 1169 | | #endif | 1170 | | | 1171 | | /* apply stereo decorrelation filter to the signal */ | 1172 | 367k | for (gr = 0; gr < ps->num_groups; gr++) | 1173 | 356k | { | 1174 | 356k | if (gr < ps->num_hybrid_groups) | 1175 | 199k | maxsb = ps->group_border[gr] + 1; | 1176 | 156k | else | 1177 | 156k | maxsb = ps->group_border[gr + 1]; | 1178 | | | 1179 | | /* QMF channel */ | 1180 | 1.21M | for (sb = ps->group_border[gr]; sb < maxsb; sb++) | 1181 | 863k | { | 1182 | 863k | real_t g_DecaySlope; | 1183 | 863k | real_t g_DecaySlope_filt[NO_ALLPASS_LINKS]; | 1184 | | | 1185 | | /* g_DecaySlope: [0..1] */ | 1186 | 863k | if (gr < ps->num_hybrid_groups || sb <= ps->decay_cutoff) | 1187 | 210k | { | 1188 | 210k | g_DecaySlope = FRAC_CONST(1.0); | 1189 | 652k | } else { | 1190 | 652k | int8_t decay = ps->decay_cutoff - sb; | 1191 | 652k | if (decay <= -20 /* -1/DECAY_SLOPE */) | 1192 | 443k | { | 1193 | 443k | g_DecaySlope = 0; | 1194 | 443k | } else { | 1195 | | /* decay(int)*decay_slope(frac) = g_DecaySlope(frac) */ | 1196 | 209k | g_DecaySlope = FRAC_CONST(1.0) + DECAY_SLOPE * decay; | 1197 | 209k | } | 1198 | 652k | } | 1199 | | | 1200 | | /* calculate g_DecaySlope_filt for every n multiplied by filter_a[n] */ | 1201 | 3.45M | for (n = 0; n < NO_ALLPASS_LINKS; n++) | 1202 | 2.58M | { | 1203 | 2.58M | g_DecaySlope_filt[n] = MUL_F(g_DecaySlope, filter_a[n]); | 1204 | 2.58M | } | 1205 | | | 1206 | | | 1207 | | /* set delay indices */ | 1208 | 863k | temp_delay = ps->saved_delay; | 1209 | 3.45M | for (n = 0; n < NO_ALLPASS_LINKS; n++) | 1210 | 2.58M | temp_delay_ser[n] = ps->delay_buf_index_ser[n]; | 1211 | | | 1212 | 27.7M | for (n = ps->border_position[0]; n < ps->border_position[ps->num_env]; n++) | 1213 | 26.8M | { | 1214 | 26.8M | complex_t tmp, tmp0, R0; | 1215 | 26.8M | uint8_t m; | 1216 | | | 1217 | 26.8M | if (gr < ps->num_hybrid_groups) | 1218 | 6.18M | { | 1219 | | /* hybrid filterbank input */ | 1220 | 6.18M | RE(inputLeft) = QMF_RE(X_hybrid_left[n][sb]); | 1221 | 6.18M | IM(inputLeft) = QMF_IM(X_hybrid_left[n][sb]); | 1222 | 20.7M | } else { | 1223 | | /* QMF filterbank input */ | 1224 | 20.7M | RE(inputLeft) = QMF_RE(X_left[n][sb]); | 1225 | 20.7M | IM(inputLeft) = QMF_IM(X_left[n][sb]); | 1226 | 20.7M | } | 1227 | | | 1228 | 26.8M | if (sb > ps->nr_allpass_bands && gr >= ps->num_hybrid_groups) | 1229 | 14.0M | { | 1230 | | /* delay */ | 1231 | | | 1232 | | /* never hybrid subbands here, always QMF subbands */ | 1233 | 14.0M | RE(tmp) = RE(ps->delay_Qmf[ps->delay_buf_index_delay[sb]][sb]); | 1234 | 14.0M | IM(tmp) = IM(ps->delay_Qmf[ps->delay_buf_index_delay[sb]][sb]); | 1235 | 14.0M | RE(R0) = RE(tmp); | 1236 | 14.0M | IM(R0) = IM(tmp); | 1237 | 14.0M | RE(ps->delay_Qmf[ps->delay_buf_index_delay[sb]][sb]) = RE(inputLeft); | 1238 | 14.0M | IM(ps->delay_Qmf[ps->delay_buf_index_delay[sb]][sb]) = IM(inputLeft); | 1239 | 14.0M | } else { | 1240 | | /* allpass filter */ | 1241 | 12.8M | complex_t Phi_Fract; | 1242 | | | 1243 | | /* fetch parameters */ | 1244 | 12.8M | if (gr < ps->num_hybrid_groups) | 1245 | 6.18M | { | 1246 | | /* select data from the hybrid subbands */ | 1247 | 6.18M | RE(tmp0) = RE(ps->delay_SubQmf[temp_delay][sb]); | 1248 | 6.18M | IM(tmp0) = IM(ps->delay_SubQmf[temp_delay][sb]); | 1249 | | | 1250 | 6.18M | RE(ps->delay_SubQmf[temp_delay][sb]) = RE(inputLeft); | 1251 | 6.18M | IM(ps->delay_SubQmf[temp_delay][sb]) = IM(inputLeft); | 1252 | | | 1253 | 6.18M | RE(Phi_Fract) = RE(Phi_Fract_SubQmf[sb]); | 1254 | 6.18M | IM(Phi_Fract) = IM(Phi_Fract_SubQmf[sb]); | 1255 | 6.61M | } else { | 1256 | | /* select data from the QMF subbands */ | 1257 | 6.61M | RE(tmp0) = RE(ps->delay_Qmf[temp_delay][sb]); | 1258 | 6.61M | IM(tmp0) = IM(ps->delay_Qmf[temp_delay][sb]); | 1259 | | | 1260 | 6.61M | RE(ps->delay_Qmf[temp_delay][sb]) = RE(inputLeft); | 1261 | 6.61M | IM(ps->delay_Qmf[temp_delay][sb]) = IM(inputLeft); | 1262 | | | 1263 | 6.61M | RE(Phi_Fract) = RE(Phi_Fract_Qmf[sb]); | 1264 | 6.61M | IM(Phi_Fract) = IM(Phi_Fract_Qmf[sb]); | 1265 | 6.61M | } | 1266 | | | 1267 | | /* z^(-2) * Phi_Fract[k] */ | 1268 | 12.8M | ComplexMult(&RE(tmp), &IM(tmp), RE(tmp0), IM(tmp0), RE(Phi_Fract), IM(Phi_Fract)); | 1269 | | | 1270 | 12.8M | RE(R0) = RE(tmp); | 1271 | 12.8M | IM(R0) = IM(tmp); | 1272 | 51.2M | for (m = 0; m < NO_ALLPASS_LINKS; m++) | 1273 | 38.4M | { | 1274 | 38.4M | complex_t Q_Fract_allpass, tmp2; | 1275 | | | 1276 | | /* fetch parameters */ | 1277 | 38.4M | if (gr < ps->num_hybrid_groups) | 1278 | 18.5M | { | 1279 | | /* select data from the hybrid subbands */ | 1280 | 18.5M | RE(tmp0) = RE(ps->delay_SubQmf_ser[m][temp_delay_ser[m]][sb]); | 1281 | 18.5M | IM(tmp0) = IM(ps->delay_SubQmf_ser[m][temp_delay_ser[m]][sb]); | 1282 | | | 1283 | 18.5M | if (ps->use34hybrid_bands) | 1284 | 12.0M | { | 1285 | 12.0M | RE(Q_Fract_allpass) = RE(Q_Fract_allpass_SubQmf34[sb][m]); | 1286 | 12.0M | IM(Q_Fract_allpass) = IM(Q_Fract_allpass_SubQmf34[sb][m]); | 1287 | 12.0M | } else { | 1288 | 6.55M | RE(Q_Fract_allpass) = RE(Q_Fract_allpass_SubQmf20[sb][m]); | 1289 | 6.55M | IM(Q_Fract_allpass) = IM(Q_Fract_allpass_SubQmf20[sb][m]); | 1290 | 6.55M | } | 1291 | 19.8M | } else { | 1292 | | /* select data from the QMF subbands */ | 1293 | 19.8M | RE(tmp0) = RE(ps->delay_Qmf_ser[m][temp_delay_ser[m]][sb]); | 1294 | 19.8M | IM(tmp0) = IM(ps->delay_Qmf_ser[m][temp_delay_ser[m]][sb]); | 1295 | | | 1296 | 19.8M | RE(Q_Fract_allpass) = RE(Q_Fract_allpass_Qmf[sb][m]); | 1297 | 19.8M | IM(Q_Fract_allpass) = IM(Q_Fract_allpass_Qmf[sb][m]); | 1298 | 19.8M | } | 1299 | | | 1300 | | /* delay by a fraction */ | 1301 | | /* z^(-d(m)) * Q_Fract_allpass[k,m] */ | 1302 | 38.4M | ComplexMult(&RE(tmp), &IM(tmp), RE(tmp0), IM(tmp0), RE(Q_Fract_allpass), IM(Q_Fract_allpass)); | 1303 | | | 1304 | | /* -a(m) * g_DecaySlope[k] */ | 1305 | 38.4M | RE(tmp) += -MUL_F(g_DecaySlope_filt[m], RE(R0)); | 1306 | 38.4M | IM(tmp) += -MUL_F(g_DecaySlope_filt[m], IM(R0)); | 1307 | | | 1308 | | /* -a(m) * g_DecaySlope[k] * Q_Fract_allpass[k,m] * z^(-d(m)) */ | 1309 | 38.4M | RE(tmp2) = RE(R0) + MUL_F(g_DecaySlope_filt[m], RE(tmp)); | 1310 | 38.4M | IM(tmp2) = IM(R0) + MUL_F(g_DecaySlope_filt[m], IM(tmp)); | 1311 | | | 1312 | | /* store sample */ | 1313 | 38.4M | if (gr < ps->num_hybrid_groups) | 1314 | 18.5M | { | 1315 | 18.5M | RE(ps->delay_SubQmf_ser[m][temp_delay_ser[m]][sb]) = RE(tmp2); | 1316 | 18.5M | IM(ps->delay_SubQmf_ser[m][temp_delay_ser[m]][sb]) = IM(tmp2); | 1317 | 19.8M | } else { | 1318 | 19.8M | RE(ps->delay_Qmf_ser[m][temp_delay_ser[m]][sb]) = RE(tmp2); | 1319 | 19.8M | IM(ps->delay_Qmf_ser[m][temp_delay_ser[m]][sb]) = IM(tmp2); | 1320 | 19.8M | } | 1321 | | | 1322 | | /* store for next iteration (or as output value if last iteration) */ | 1323 | 38.4M | RE(R0) = RE(tmp); | 1324 | 38.4M | IM(R0) = IM(tmp); | 1325 | 38.4M | } | 1326 | 12.8M | } | 1327 | | | 1328 | | /* select b(k) for reading the transient ratio */ | 1329 | 26.8M | bk = (~NEGATE_IPD_MASK) & ps->map_group2bk[gr]; | 1330 | | | 1331 | | /* duck if a past transient is found */ | 1332 | 26.8M | RE(R0) = MUL_R(G_TransientRatio[n][bk], RE(R0)); | 1333 | 26.8M | IM(R0) = MUL_R(G_TransientRatio[n][bk], IM(R0)); | 1334 | | | 1335 | 26.8M | if (gr < ps->num_hybrid_groups) | 1336 | 6.18M | { | 1337 | | /* hybrid */ | 1338 | 6.18M | QMF_RE(X_hybrid_right[n][sb]) = RE(R0); | 1339 | 6.18M | QMF_IM(X_hybrid_right[n][sb]) = IM(R0); | 1340 | 20.7M | } else { | 1341 | | /* QMF */ | 1342 | 20.7M | QMF_RE(X_right[n][sb]) = RE(R0); | 1343 | 20.7M | QMF_IM(X_right[n][sb]) = IM(R0); | 1344 | 20.7M | } | 1345 | | | 1346 | | /* Update delay buffer index */ | 1347 | 26.8M | if (++temp_delay >= 2) | 1348 | 13.4M | { | 1349 | 13.4M | temp_delay = 0; | 1350 | 13.4M | } | 1351 | | | 1352 | | /* update delay indices */ | 1353 | 26.8M | if (sb > ps->nr_allpass_bands && gr >= ps->num_hybrid_groups) | 1354 | 14.0M | { | 1355 | | /* delay_D depends on the samplerate, it can hold the values 14 and 1 */ | 1356 | 14.0M | if (++ps->delay_buf_index_delay[sb] >= ps->delay_D[sb]) | 1357 | 10.2M | { | 1358 | 10.2M | ps->delay_buf_index_delay[sb] = 0; | 1359 | 10.2M | } | 1360 | 14.0M | } | 1361 | | | 1362 | 107M | for (m = 0; m < NO_ALLPASS_LINKS; m++) | 1363 | 80.6M | { | 1364 | 80.6M | if (++temp_delay_ser[m] >= ps->num_sample_delay_ser[m]) | 1365 | 20.6M | { | 1366 | 20.6M | temp_delay_ser[m] = 0; | 1367 | 20.6M | } | 1368 | 80.6M | } | 1369 | 26.8M | } | 1370 | 863k | } | 1371 | 356k | } | 1372 | | | 1373 | | /* update delay indices */ | 1374 | 11.0k | ps->saved_delay = temp_delay; | 1375 | 44.0k | for (n = 0; n < NO_ALLPASS_LINKS; n++) | 1376 | 33.0k | ps->delay_buf_index_ser[n] = temp_delay_ser[n]; | 1377 | 11.0k | } |
|
1378 | | |
1379 | | #if 0 |
1380 | | #ifdef FIXED_POINT |
1381 | | #define step(shift) \ |
1382 | | if ((0x40000000l >> shift) + root <= value) \ |
1383 | | { \ |
1384 | | value -= (0x40000000l >> shift) + root; \ |
1385 | | root = (root >> 1) | (0x40000000l >> shift); \ |
1386 | | } else { \ |
1387 | | root = root >> 1; \ |
1388 | | } |
1389 | | |
1390 | | /* fixed point square root approximation */ |
1391 | | static real_t ps_sqrt(real_t value) |
1392 | | { |
1393 | | real_t root = 0; |
1394 | | |
1395 | | step( 0); step( 2); step( 4); step( 6); |
1396 | | step( 8); step(10); step(12); step(14); |
1397 | | step(16); step(18); step(20); step(22); |
1398 | | step(24); step(26); step(28); step(30); |
1399 | | |
1400 | | if (root < value) |
1401 | | ++root; |
1402 | | |
1403 | | root <<= (REAL_BITS/2); |
1404 | | |
1405 | | return root; |
1406 | | } |
1407 | | #else |
1408 | | #define ps_sqrt(A) sqrt(A) |
1409 | | #endif |
1410 | | #endif |
1411 | | |
1412 | | static const real_t ipdopd_cos_tab[] = { |
1413 | | FRAC_CONST(1.000000000000000), |
1414 | | FRAC_CONST(0.707106781186548), |
1415 | | FRAC_CONST(0.000000000000000), |
1416 | | FRAC_CONST(-0.707106781186547), |
1417 | | FRAC_CONST(-1.000000000000000), |
1418 | | FRAC_CONST(-0.707106781186548), |
1419 | | FRAC_CONST(-0.000000000000000), |
1420 | | FRAC_CONST(0.707106781186547), |
1421 | | FRAC_CONST(1.000000000000000) |
1422 | | }; |
1423 | | |
1424 | | static const real_t ipdopd_sin_tab[] = { |
1425 | | FRAC_CONST(0.000000000000000), |
1426 | | FRAC_CONST(0.707106781186547), |
1427 | | FRAC_CONST(1.000000000000000), |
1428 | | FRAC_CONST(0.707106781186548), |
1429 | | FRAC_CONST(0.000000000000000), |
1430 | | FRAC_CONST(-0.707106781186547), |
1431 | | FRAC_CONST(-1.000000000000000), |
1432 | | FRAC_CONST(-0.707106781186548), |
1433 | | FRAC_CONST(-0.000000000000000) |
1434 | | }; |
1435 | | |
1436 | | static real_t magnitude_c(complex_t c) |
1437 | 319k | { |
1438 | | #ifdef FIXED_POINT |
1439 | 251k | #define ps_abs(A) (((A) > 0) ? (A) : (-(A))) |
1440 | | #define ALPHA FRAC_CONST(0.948059448969) |
1441 | | #define BETA FRAC_CONST(0.392699081699) |
1442 | | |
1443 | 125k | real_t abs_inphase = ps_abs(RE(c)); |
1444 | 125k | real_t abs_quadrature = ps_abs(IM(c)); |
1445 | | |
1446 | 125k | if (abs_inphase > abs_quadrature) { |
1447 | 99.0k | return MUL_F(abs_inphase, ALPHA) + MUL_F(abs_quadrature, BETA); |
1448 | 99.0k | } else { |
1449 | 26.6k | return MUL_F(abs_quadrature, ALPHA) + MUL_F(abs_inphase, BETA); |
1450 | 26.6k | } |
1451 | | #else |
1452 | 193k | return sqrt(RE(c)*RE(c) + IM(c)*IM(c)); |
1453 | | #endif |
1454 | 319k | } Line | Count | Source | 1437 | 125k | { | 1438 | 125k | #ifdef FIXED_POINT | 1439 | 125k | #define ps_abs(A) (((A) > 0) ? (A) : (-(A))) | 1440 | 125k | #define ALPHA FRAC_CONST(0.948059448969) | 1441 | 125k | #define BETA FRAC_CONST(0.392699081699) | 1442 | | | 1443 | 125k | real_t abs_inphase = ps_abs(RE(c)); | 1444 | 125k | real_t abs_quadrature = ps_abs(IM(c)); | 1445 | | | 1446 | 125k | if (abs_inphase > abs_quadrature) { | 1447 | 99.0k | return MUL_F(abs_inphase, ALPHA) + MUL_F(abs_quadrature, BETA); | 1448 | 99.0k | } else { | 1449 | 26.6k | return MUL_F(abs_quadrature, ALPHA) + MUL_F(abs_inphase, BETA); | 1450 | 26.6k | } | 1451 | | #else | 1452 | | return sqrt(RE(c)*RE(c) + IM(c)*IM(c)); | 1453 | | #endif | 1454 | 125k | } |
Line | Count | Source | 1437 | 193k | { | 1438 | | #ifdef FIXED_POINT | 1439 | | #define ps_abs(A) (((A) > 0) ? (A) : (-(A))) | 1440 | | #define ALPHA FRAC_CONST(0.948059448969) | 1441 | | #define BETA FRAC_CONST(0.392699081699) | 1442 | | | 1443 | | real_t abs_inphase = ps_abs(RE(c)); | 1444 | | real_t abs_quadrature = ps_abs(IM(c)); | 1445 | | | 1446 | | if (abs_inphase > abs_quadrature) { | 1447 | | return MUL_F(abs_inphase, ALPHA) + MUL_F(abs_quadrature, BETA); | 1448 | | } else { | 1449 | | return MUL_F(abs_quadrature, ALPHA) + MUL_F(abs_inphase, BETA); | 1450 | | } | 1451 | | #else | 1452 | 193k | return sqrt(RE(c)*RE(c) + IM(c)*IM(c)); | 1453 | 193k | #endif | 1454 | 193k | } |
|
1455 | | |
1456 | | static void ps_mix_phase(ps_info *ps, qmf_t X_left[38][64], qmf_t X_right[38][64], |
1457 | | qmf_t X_hybrid_left[32][32], qmf_t X_hybrid_right[32][32]) |
1458 | 16.8k | { |
1459 | 16.8k | uint8_t n; |
1460 | 16.8k | uint8_t gr; |
1461 | 16.8k | uint8_t bk = 0; |
1462 | 16.8k | uint8_t sb, maxsb; |
1463 | 16.8k | uint8_t env; |
1464 | 16.8k | uint8_t nr_ipdopd_par; |
1465 | 16.8k | complex_t h11, h12, h21, h22; // COEF |
1466 | 16.8k | complex_t H11, H12, H21, H22; // COEF |
1467 | 16.8k | complex_t deltaH11, deltaH12, deltaH21, deltaH22; // COEF |
1468 | 16.8k | complex_t tempLeft, tempRight; // FRAC |
1469 | 16.8k | complex_t phaseLeft, phaseRight; // FRAC |
1470 | 16.8k | real_t L; |
1471 | 16.8k | const real_t *sf_iid; |
1472 | 16.8k | uint8_t no_iid_steps; |
1473 | | |
1474 | 16.8k | if (ps->iid_mode >= 3) |
1475 | 6.77k | { |
1476 | 6.77k | no_iid_steps = 15; |
1477 | 6.77k | sf_iid = sf_iid_fine; |
1478 | 10.1k | } else { |
1479 | 10.1k | no_iid_steps = 7; |
1480 | 10.1k | sf_iid = sf_iid_normal; |
1481 | 10.1k | } |
1482 | | |
1483 | 16.8k | if (ps->ipd_mode == 0 || ps->ipd_mode == 3) |
1484 | 10.0k | { |
1485 | 10.0k | nr_ipdopd_par = 11; /* resolution */ |
1486 | 10.0k | } else { |
1487 | 6.84k | nr_ipdopd_par = ps->nr_ipdopd_par; |
1488 | 6.84k | } |
1489 | | |
1490 | 568k | for (gr = 0; gr < ps->num_groups; gr++) |
1491 | 551k | { |
1492 | 551k | bk = (~NEGATE_IPD_MASK) & ps->map_group2bk[gr]; |
1493 | | |
1494 | | /* use one channel per group in the subqmf domain */ |
1495 | 551k | maxsb = (gr < ps->num_hybrid_groups) ? ps->group_border[gr] + 1 : ps->group_border[gr + 1]; |
1496 | | |
1497 | 1.81M | for (env = 0; env < ps->num_env; env++) |
1498 | 1.26M | { |
1499 | 1.26M | uint8_t abs_iid = (uint8_t)abs(ps->iid_index[env][bk]); |
1500 | | /* index range is supposed to be -7...7 or -15...15 depending on iid_mode |
1501 | | (Table 8.24, ISO/IEC 14496-3:2005). |
1502 | | if it is outside these boundaries, this is most likely an error. sanitize |
1503 | | it and try to process further. */ |
1504 | 1.26M | if (ps->iid_index[env][bk] < -no_iid_steps) { |
1505 | 352 | fprintf(stderr, "Warning: invalid iid_index: %d < %d\n", ps->iid_index[env][bk], |
1506 | 352 | -no_iid_steps); |
1507 | 352 | ps->iid_index[env][bk] = -no_iid_steps; |
1508 | 352 | abs_iid = no_iid_steps; |
1509 | 1.26M | } else if (ps->iid_index[env][bk] > no_iid_steps) { |
1510 | 267 | fprintf(stderr, "Warning: invalid iid_index: %d > %d\n", ps->iid_index[env][bk], |
1511 | 267 | no_iid_steps); |
1512 | 267 | ps->iid_index[env][bk] = no_iid_steps; |
1513 | 267 | abs_iid = no_iid_steps; |
1514 | 267 | } |
1515 | 1.26M | if (ps->icc_index[env][bk] < 0) { |
1516 | 624 | fprintf(stderr, "Warning: invalid icc_index: %d < 0\n", ps->icc_index[env][bk]); |
1517 | 624 | ps->icc_index[env][bk] = 0; |
1518 | 1.26M | } else if (ps->icc_index[env][bk] > 7) { |
1519 | 0 | fprintf(stderr, "Warning: invalid icc_index: %d > 7\n", ps->icc_index[env][bk]); |
1520 | 0 | ps->icc_index[env][bk] = 7; |
1521 | 0 | } |
1522 | | |
1523 | 1.26M | if (ps->icc_mode < 3) |
1524 | 737k | { |
1525 | | /* type 'A' mixing as described in 8.6.4.6.2.1 */ |
1526 | 737k | real_t c_1, c_2; // COEF |
1527 | 737k | real_t cosa, sina; // COEF |
1528 | 737k | real_t cosb, sinb; // COEF |
1529 | 737k | real_t ab1, ab2; // COEF |
1530 | 737k | real_t ab3, ab4; // COEF |
1531 | | |
1532 | | /* |
1533 | | c_1 = sqrt(2.0 / (1.0 + pow(10.0, quant_iid[no_iid_steps + iid_index] / 10.0))); |
1534 | | c_2 = sqrt(2.0 / (1.0 + pow(10.0, quant_iid[no_iid_steps - iid_index] / 10.0))); |
1535 | | alpha = 0.5 * acos(quant_rho[icc_index]); |
1536 | | beta = alpha * ( c_1 - c_2 ) / sqrt(2.0); |
1537 | | */ |
1538 | | |
1539 | | //printf("%d\n", ps->iid_index[env][bk]); |
1540 | | |
1541 | | /* calculate the scalefactors c_1 and c_2 from the intensity differences */ |
1542 | 737k | c_1 = sf_iid[no_iid_steps + ps->iid_index[env][bk]]; |
1543 | 737k | c_2 = sf_iid[no_iid_steps - ps->iid_index[env][bk]]; |
1544 | | |
1545 | | /* calculate alpha and beta using the ICC parameters */ |
1546 | 737k | cosa = cos_alphas[ps->icc_index[env][bk]]; |
1547 | 737k | sina = sin_alphas[ps->icc_index[env][bk]]; |
1548 | | |
1549 | 737k | if (ps->iid_mode >= 3) |
1550 | 274k | { |
1551 | 274k | cosb = cos_betas_fine[abs_iid][ps->icc_index[env][bk]]; |
1552 | 274k | sinb = sin_betas_fine[abs_iid][ps->icc_index[env][bk]]; |
1553 | 463k | } else { |
1554 | 463k | cosb = cos_betas_normal[abs_iid][ps->icc_index[env][bk]]; |
1555 | 463k | sinb = sin_betas_normal[abs_iid][ps->icc_index[env][bk]]; |
1556 | 463k | } |
1557 | | |
1558 | 737k | ab1 = MUL_C(cosb, cosa); |
1559 | 737k | ab2 = MUL_C(sinb, sina); |
1560 | 737k | ab3 = MUL_C(sinb, cosa); |
1561 | 737k | ab4 = MUL_C(cosb, sina); |
1562 | | |
1563 | | /* h_xy: COEF */ |
1564 | 737k | RE(h11) = MUL_C(c_2, (ab1 - ab2)); |
1565 | 737k | RE(h12) = MUL_C(c_1, (ab1 + ab2)); |
1566 | 737k | RE(h21) = MUL_C(c_2, (ab3 + ab4)); |
1567 | 737k | RE(h22) = MUL_C(c_1, (ab3 - ab4)); |
1568 | 737k | } else { |
1569 | | /* type 'B' mixing as described in 8.6.4.6.2.2 */ |
1570 | 528k | real_t sina, cosa; // COEF |
1571 | 528k | real_t cosg, sing; // COEF |
1572 | | |
1573 | | /* |
1574 | | real_t c, rho, mu, alpha, gamma; |
1575 | | uint8_t i; |
1576 | | |
1577 | | i = ps->iid_index[env][bk]; |
1578 | | c = (real_t)pow(10.0, ((i)?(((i>0)?1:-1)*quant_iid[((i>0)?i:-i)-1]):0.)/20.0); |
1579 | | rho = quant_rho[ps->icc_index[env][bk]]; |
1580 | | |
1581 | | if (rho == 0.0f && c == 1.) |
1582 | | { |
1583 | | alpha = (real_t)M_PI/4.0f; |
1584 | | rho = 0.05f; |
1585 | | } else { |
1586 | | if (rho <= 0.05f) |
1587 | | { |
1588 | | rho = 0.05f; |
1589 | | } |
1590 | | alpha = 0.5f*(real_t)atan( (2.0f*c*rho) / (c*c-1.0f) ); |
1591 | | |
1592 | | if (alpha < 0.) |
1593 | | { |
1594 | | alpha += (real_t)M_PI/2.0f; |
1595 | | } |
1596 | | if (rho < 0.) |
1597 | | { |
1598 | | alpha += (real_t)M_PI; |
1599 | | } |
1600 | | } |
1601 | | mu = c+1.0f/c; |
1602 | | mu = 1+(4.0f*rho*rho-4.0f)/(mu*mu); |
1603 | | gamma = (real_t)atan(sqrt((1.0f-sqrt(mu))/(1.0f+sqrt(mu)))); |
1604 | | */ |
1605 | | |
1606 | 528k | if (ps->iid_mode >= 3) |
1607 | 296k | { |
1608 | 296k | cosa = sincos_alphas_B_fine[no_iid_steps + ps->iid_index[env][bk]][ps->icc_index[env][bk]]; |
1609 | 296k | sina = sincos_alphas_B_fine[30 - (no_iid_steps + ps->iid_index[env][bk])][ps->icc_index[env][bk]]; |
1610 | 296k | cosg = cos_gammas_fine[abs_iid][ps->icc_index[env][bk]]; |
1611 | 296k | sing = sin_gammas_fine[abs_iid][ps->icc_index[env][bk]]; |
1612 | 296k | } else { |
1613 | 231k | cosa = sincos_alphas_B_normal[no_iid_steps + ps->iid_index[env][bk]][ps->icc_index[env][bk]]; |
1614 | 231k | sina = sincos_alphas_B_normal[14 - (no_iid_steps + ps->iid_index[env][bk])][ps->icc_index[env][bk]]; |
1615 | 231k | cosg = cos_gammas_normal[abs_iid][ps->icc_index[env][bk]]; |
1616 | 231k | sing = sin_gammas_normal[abs_iid][ps->icc_index[env][bk]]; |
1617 | 231k | } |
1618 | | |
1619 | 528k | RE(h11) = MUL_C(COEF_SQRT2, MUL_C(cosa, cosg)); |
1620 | 528k | RE(h12) = MUL_C(COEF_SQRT2, MUL_C(sina, cosg)); |
1621 | 528k | RE(h21) = MUL_C(COEF_SQRT2, MUL_C(-cosa, sing)); |
1622 | 528k | RE(h22) = MUL_C(COEF_SQRT2, MUL_C(sina, sing)); |
1623 | 528k | } |
1624 | 1.26M | IM(h11) = IM(h12) = IM(h21) = IM(h22) = 0; |
1625 | | |
1626 | | /* calculate phase rotation parameters H_xy */ |
1627 | | /* note that the imaginary part of these parameters are only calculated when |
1628 | | IPD and OPD are enabled |
1629 | | */ |
1630 | 1.26M | if ((ps->enable_ipdopd) && (bk < nr_ipdopd_par)) |
1631 | 159k | { |
1632 | 159k | int8_t i; |
1633 | 159k | real_t xy, pq, xypq; // FRAC |
1634 | | |
1635 | | /* ringbuffer index */ |
1636 | 159k | i = ps->phase_hist; |
1637 | | |
1638 | | /* previous value */ |
1639 | | #ifdef FIXED_POINT |
1640 | | /* divide by 4*2, shift right 3 bits; |
1641 | | extra halving to avoid overflows; it is ok, because result is normalized */ |
1642 | 62.8k | RE(tempLeft) = RE(ps->ipd_prev[bk][i]) >> 3; |
1643 | 62.8k | IM(tempLeft) = IM(ps->ipd_prev[bk][i]) >> 3; |
1644 | 62.8k | RE(tempRight) = RE(ps->opd_prev[bk][i]) >> 3; |
1645 | 62.8k | IM(tempRight) = IM(ps->opd_prev[bk][i]) >> 3; |
1646 | | #else |
1647 | 96.9k | RE(tempLeft) = MUL_F(RE(ps->ipd_prev[bk][i]), FRAC_CONST(0.25)); |
1648 | 96.9k | IM(tempLeft) = MUL_F(IM(ps->ipd_prev[bk][i]), FRAC_CONST(0.25)); |
1649 | 96.9k | RE(tempRight) = MUL_F(RE(ps->opd_prev[bk][i]), FRAC_CONST(0.25)); |
1650 | 96.9k | IM(tempRight) = MUL_F(IM(ps->opd_prev[bk][i]), FRAC_CONST(0.25)); |
1651 | | #endif |
1652 | | |
1653 | | /* save current value */ |
1654 | 159k | RE(ps->ipd_prev[bk][i]) = ipdopd_cos_tab[abs(ps->ipd_index[env][bk])]; |
1655 | 159k | IM(ps->ipd_prev[bk][i]) = ipdopd_sin_tab[abs(ps->ipd_index[env][bk])]; |
1656 | 159k | RE(ps->opd_prev[bk][i]) = ipdopd_cos_tab[abs(ps->opd_index[env][bk])]; |
1657 | 159k | IM(ps->opd_prev[bk][i]) = ipdopd_sin_tab[abs(ps->opd_index[env][bk])]; |
1658 | | |
1659 | | /* add current value */ |
1660 | | #ifdef FIXED_POINT |
1661 | | /* extra halving to avoid overflows */ |
1662 | 62.8k | RE(tempLeft) += RE(ps->ipd_prev[bk][i]) >> 1; |
1663 | 62.8k | IM(tempLeft) += IM(ps->ipd_prev[bk][i]) >> 1; |
1664 | 62.8k | RE(tempRight) += RE(ps->opd_prev[bk][i]) >> 1; |
1665 | 62.8k | IM(tempRight) += IM(ps->opd_prev[bk][i]) >> 1; |
1666 | | #else |
1667 | 96.9k | RE(tempLeft) += RE(ps->ipd_prev[bk][i]); |
1668 | 96.9k | IM(tempLeft) += IM(ps->ipd_prev[bk][i]); |
1669 | 96.9k | RE(tempRight) += RE(ps->opd_prev[bk][i]); |
1670 | 96.9k | IM(tempRight) += IM(ps->opd_prev[bk][i]); |
1671 | | #endif |
1672 | | |
1673 | | /* ringbuffer index */ |
1674 | 159k | if (i == 0) |
1675 | 80.7k | { |
1676 | 80.7k | i = 2; |
1677 | 80.7k | } |
1678 | 159k | i--; |
1679 | | |
1680 | | /* get value before previous */ |
1681 | | #ifdef FIXED_POINT |
1682 | | /* dividing by 2*2, shift right 2 bits; extra halving to avoid overflows */ |
1683 | 62.8k | RE(tempLeft) += (RE(ps->ipd_prev[bk][i]) >> 2); |
1684 | 62.8k | IM(tempLeft) += (IM(ps->ipd_prev[bk][i]) >> 2); |
1685 | 62.8k | RE(tempRight) += (RE(ps->opd_prev[bk][i]) >> 2); |
1686 | 62.8k | IM(tempRight) += (IM(ps->opd_prev[bk][i]) >> 2); |
1687 | | #else |
1688 | 96.9k | RE(tempLeft) += MUL_F(RE(ps->ipd_prev[bk][i]), FRAC_CONST(0.5)); |
1689 | 96.9k | IM(tempLeft) += MUL_F(IM(ps->ipd_prev[bk][i]), FRAC_CONST(0.5)); |
1690 | 96.9k | RE(tempRight) += MUL_F(RE(ps->opd_prev[bk][i]), FRAC_CONST(0.5)); |
1691 | 96.9k | IM(tempRight) += MUL_F(IM(ps->opd_prev[bk][i]), FRAC_CONST(0.5)); |
1692 | | #endif |
1693 | | |
1694 | | #if 0 /* original code */ |
1695 | | ipd = (float)atan2(IM(tempLeft), RE(tempLeft)); |
1696 | | opd = (float)atan2(IM(tempRight), RE(tempRight)); |
1697 | | |
1698 | | /* phase rotation */ |
1699 | | RE(phaseLeft) = (float)cos(opd); |
1700 | | IM(phaseLeft) = (float)sin(opd); |
1701 | | opd -= ipd; |
1702 | | RE(phaseRight) = (float)cos(opd); |
1703 | | IM(phaseRight) = (float)sin(opd); |
1704 | | #else |
1705 | | |
1706 | | // x = IM(tempLeft) |
1707 | | // y = RE(tempLeft) |
1708 | | // p = IM(tempRight) |
1709 | | // q = RE(tempRight) |
1710 | | // cos(atan2(x,y)) = y/sqrt((x*x) + (y*y)) |
1711 | | // sin(atan2(x,y)) = x/sqrt((x*x) + (y*y)) |
1712 | | // cos(atan2(x,y)-atan2(p,q)) = (y*q + x*p) / ( sqrt((x*x) + (y*y)) * sqrt((p*p) + (q*q)) ); |
1713 | | // sin(atan2(x,y)-atan2(p,q)) = (x*q - y*p) / ( sqrt((x*x) + (y*y)) * sqrt((p*p) + (q*q)) ); |
1714 | | |
1715 | 159k | xy = magnitude_c(tempRight); |
1716 | 159k | pq = magnitude_c(tempLeft); |
1717 | | |
1718 | 159k | if (xy != 0) |
1719 | 159k | { |
1720 | 159k | RE(phaseLeft) = DIV_F(RE(tempRight), xy); |
1721 | 159k | IM(phaseLeft) = DIV_F(IM(tempRight), xy); |
1722 | 159k | } else { |
1723 | 0 | RE(phaseLeft) = 0; |
1724 | 0 | IM(phaseLeft) = 0; |
1725 | 0 | } |
1726 | | |
1727 | 159k | xypq = MUL_F(xy, pq); |
1728 | | |
1729 | 159k | if (xypq != 0) |
1730 | 159k | { |
1731 | 159k | real_t tmp1 = MUL_F(RE(tempRight), RE(tempLeft)) + MUL_F(IM(tempRight), IM(tempLeft)); |
1732 | 159k | real_t tmp2 = MUL_F(IM(tempRight), RE(tempLeft)) - MUL_F(RE(tempRight), IM(tempLeft)); |
1733 | | |
1734 | 159k | RE(phaseRight) = DIV_F(tmp1, xypq); |
1735 | 159k | IM(phaseRight) = DIV_F(tmp2, xypq); |
1736 | 159k | } else { |
1737 | 0 | RE(phaseRight) = 0; |
1738 | 0 | IM(phaseRight) = 0; |
1739 | 0 | } |
1740 | | |
1741 | 159k | #endif |
1742 | | |
1743 | | /* MUL_F(COEF, REAL) = COEF */ |
1744 | 159k | IM(h11) = MUL_F(RE(h11), IM(phaseLeft)); |
1745 | 159k | IM(h12) = MUL_F(RE(h12), IM(phaseRight)); |
1746 | 159k | IM(h21) = MUL_F(RE(h21), IM(phaseLeft)); |
1747 | 159k | IM(h22) = MUL_F(RE(h22), IM(phaseRight)); |
1748 | | |
1749 | 159k | RE(h11) = MUL_F(RE(h11), RE(phaseLeft)); |
1750 | 159k | RE(h12) = MUL_F(RE(h12), RE(phaseRight)); |
1751 | 159k | RE(h21) = MUL_F(RE(h21), RE(phaseLeft)); |
1752 | 159k | RE(h22) = MUL_F(RE(h22), RE(phaseRight)); |
1753 | 159k | } |
1754 | | |
1755 | | /* length of the envelope n_e+1 - n_e (in time samples) */ |
1756 | | /* 0 < L <= 32: integer */ |
1757 | 1.26M | L = (real_t)(ps->border_position[env + 1] - ps->border_position[env]); |
1758 | | |
1759 | | /* obtain final H_xy by means of linear interpolation */ |
1760 | 1.26M | RE(deltaH11) = (RE(h11) - RE(ps->h11_prev[gr])) / L; |
1761 | 1.26M | RE(deltaH12) = (RE(h12) - RE(ps->h12_prev[gr])) / L; |
1762 | 1.26M | RE(deltaH21) = (RE(h21) - RE(ps->h21_prev[gr])) / L; |
1763 | 1.26M | RE(deltaH22) = (RE(h22) - RE(ps->h22_prev[gr])) / L; |
1764 | | |
1765 | 1.26M | RE(H11) = RE(ps->h11_prev[gr]); |
1766 | 1.26M | RE(H12) = RE(ps->h12_prev[gr]); |
1767 | 1.26M | RE(H21) = RE(ps->h21_prev[gr]); |
1768 | 1.26M | RE(H22) = RE(ps->h22_prev[gr]); |
1769 | 1.26M | IM(H11) = IM(H12) = IM(H21) = IM(H22) = 0; |
1770 | | |
1771 | 1.26M | RE(ps->h11_prev[gr]) = RE(h11); |
1772 | 1.26M | RE(ps->h12_prev[gr]) = RE(h12); |
1773 | 1.26M | RE(ps->h21_prev[gr]) = RE(h21); |
1774 | 1.26M | RE(ps->h22_prev[gr]) = RE(h22); |
1775 | | |
1776 | | /* only calculate imaginary part when needed */ |
1777 | 1.26M | if ((ps->enable_ipdopd) && (bk < nr_ipdopd_par)) |
1778 | 159k | { |
1779 | | /* obtain final H_xy by means of linear interpolation */ |
1780 | 159k | IM(deltaH11) = (IM(h11) - IM(ps->h11_prev[gr])) / L; |
1781 | 159k | IM(deltaH12) = (IM(h12) - IM(ps->h12_prev[gr])) / L; |
1782 | 159k | IM(deltaH21) = (IM(h21) - IM(ps->h21_prev[gr])) / L; |
1783 | 159k | IM(deltaH22) = (IM(h22) - IM(ps->h22_prev[gr])) / L; |
1784 | | |
1785 | 159k | IM(H11) = IM(ps->h11_prev[gr]); |
1786 | 159k | IM(H12) = IM(ps->h12_prev[gr]); |
1787 | 159k | IM(H21) = IM(ps->h21_prev[gr]); |
1788 | 159k | IM(H22) = IM(ps->h22_prev[gr]); |
1789 | | |
1790 | 159k | if ((NEGATE_IPD_MASK & ps->map_group2bk[gr]) != 0) |
1791 | 22.5k | { |
1792 | 22.5k | IM(deltaH11) = -IM(deltaH11); |
1793 | 22.5k | IM(deltaH12) = -IM(deltaH12); |
1794 | 22.5k | IM(deltaH21) = -IM(deltaH21); |
1795 | 22.5k | IM(deltaH22) = -IM(deltaH22); |
1796 | | |
1797 | 22.5k | IM(H11) = -IM(H11); |
1798 | 22.5k | IM(H12) = -IM(H12); |
1799 | 22.5k | IM(H21) = -IM(H21); |
1800 | 22.5k | IM(H22) = -IM(H22); |
1801 | 22.5k | } |
1802 | | |
1803 | 159k | IM(ps->h11_prev[gr]) = IM(h11); |
1804 | 159k | IM(ps->h12_prev[gr]) = IM(h12); |
1805 | 159k | IM(ps->h21_prev[gr]) = IM(h21); |
1806 | 159k | IM(ps->h22_prev[gr]) = IM(h22); |
1807 | 159k | } |
1808 | | |
1809 | | /* apply H_xy to the current envelope band of the decorrelated subband */ |
1810 | 18.4M | for (n = ps->border_position[env]; n < ps->border_position[env + 1]; n++) |
1811 | 17.1M | { |
1812 | | /* addition finalises the interpolation over every n */ |
1813 | 17.1M | RE(H11) += RE(deltaH11); |
1814 | 17.1M | RE(H12) += RE(deltaH12); |
1815 | 17.1M | RE(H21) += RE(deltaH21); |
1816 | 17.1M | RE(H22) += RE(deltaH22); |
1817 | 17.1M | if ((ps->enable_ipdopd) && (bk < nr_ipdopd_par)) |
1818 | 1.64M | { |
1819 | 1.64M | IM(H11) += IM(deltaH11); |
1820 | 1.64M | IM(H12) += IM(deltaH12); |
1821 | 1.64M | IM(H21) += IM(deltaH21); |
1822 | 1.64M | IM(H22) += IM(deltaH22); |
1823 | 1.64M | } |
1824 | | |
1825 | | /* channel is an alias to the subband */ |
1826 | 58.5M | for (sb = ps->group_border[gr]; sb < maxsb; sb++) |
1827 | 41.4M | { |
1828 | 41.4M | complex_t inLeft, inRight; // precision_of in(Left|Right) == precision_of X_(left|right) |
1829 | | |
1830 | | /* load decorrelated samples */ |
1831 | 41.4M | if (gr < ps->num_hybrid_groups) |
1832 | 9.63M | { |
1833 | 9.63M | RE(inLeft) = RE(X_hybrid_left[n][sb]); |
1834 | 9.63M | IM(inLeft) = IM(X_hybrid_left[n][sb]); |
1835 | 9.63M | RE(inRight) = RE(X_hybrid_right[n][sb]); |
1836 | 9.63M | IM(inRight) = IM(X_hybrid_right[n][sb]); |
1837 | 31.7M | } else { |
1838 | 31.7M | RE(inLeft) = RE(X_left[n][sb]); |
1839 | 31.7M | IM(inLeft) = IM(X_left[n][sb]); |
1840 | 31.7M | RE(inRight) = RE(X_right[n][sb]); |
1841 | 31.7M | IM(inRight) = IM(X_right[n][sb]); |
1842 | 31.7M | } |
1843 | | |
1844 | | /* precision_of temp(Left|Right) == precision_of X_(left|right) */ |
1845 | | |
1846 | | /* apply mixing */ |
1847 | 41.4M | RE(tempLeft) = MUL_C(RE(H11), RE(inLeft)) + MUL_C(RE(H21), RE(inRight)); |
1848 | 41.4M | IM(tempLeft) = MUL_C(RE(H11), IM(inLeft)) + MUL_C(RE(H21), IM(inRight)); |
1849 | 41.4M | RE(tempRight) = MUL_C(RE(H12), RE(inLeft)) + MUL_C(RE(H22), RE(inRight)); |
1850 | 41.4M | IM(tempRight) = MUL_C(RE(H12), IM(inLeft)) + MUL_C(RE(H22), IM(inRight)); |
1851 | | |
1852 | | /* only perform imaginary operations when needed */ |
1853 | 41.4M | if ((ps->enable_ipdopd) && (bk < nr_ipdopd_par)) |
1854 | 1.65M | { |
1855 | | /* apply rotation */ |
1856 | 1.65M | RE(tempLeft) -= MUL_C(IM(H11), IM(inLeft)) + MUL_C(IM(H21), IM(inRight)); |
1857 | 1.65M | IM(tempLeft) += MUL_C(IM(H11), RE(inLeft)) + MUL_C(IM(H21), RE(inRight)); |
1858 | 1.65M | RE(tempRight) -= MUL_C(IM(H12), IM(inLeft)) + MUL_C(IM(H22), IM(inRight)); |
1859 | 1.65M | IM(tempRight) += MUL_C(IM(H12), RE(inLeft)) + MUL_C(IM(H22), RE(inRight)); |
1860 | 1.65M | } |
1861 | | |
1862 | | /* store final samples */ |
1863 | 41.4M | if (gr < ps->num_hybrid_groups) |
1864 | 9.63M | { |
1865 | 9.63M | RE(X_hybrid_left[n][sb]) = RE(tempLeft); |
1866 | 9.63M | IM(X_hybrid_left[n][sb]) = IM(tempLeft); |
1867 | 9.63M | RE(X_hybrid_right[n][sb]) = RE(tempRight); |
1868 | 9.63M | IM(X_hybrid_right[n][sb]) = IM(tempRight); |
1869 | 31.7M | } else { |
1870 | 31.7M | RE(X_left[n][sb]) = RE(tempLeft); |
1871 | 31.7M | IM(X_left[n][sb]) = IM(tempLeft); |
1872 | 31.7M | RE(X_right[n][sb]) = RE(tempRight); |
1873 | 31.7M | IM(X_right[n][sb]) = IM(tempRight); |
1874 | 31.7M | } |
1875 | 41.4M | } |
1876 | 17.1M | } |
1877 | | |
1878 | | /* shift phase smoother's circular buffer index */ |
1879 | 1.26M | ps->phase_hist++; |
1880 | 1.26M | if (ps->phase_hist == 2) |
1881 | 632k | { |
1882 | 632k | ps->phase_hist = 0; |
1883 | 632k | } |
1884 | 1.26M | } |
1885 | 551k | } |
1886 | 16.8k | } Line | Count | Source | 1458 | 5.87k | { | 1459 | 5.87k | uint8_t n; | 1460 | 5.87k | uint8_t gr; | 1461 | 5.87k | uint8_t bk = 0; | 1462 | 5.87k | uint8_t sb, maxsb; | 1463 | 5.87k | uint8_t env; | 1464 | 5.87k | uint8_t nr_ipdopd_par; | 1465 | 5.87k | complex_t h11, h12, h21, h22; // COEF | 1466 | 5.87k | complex_t H11, H12, H21, H22; // COEF | 1467 | 5.87k | complex_t deltaH11, deltaH12, deltaH21, deltaH22; // COEF | 1468 | 5.87k | complex_t tempLeft, tempRight; // FRAC | 1469 | 5.87k | complex_t phaseLeft, phaseRight; // FRAC | 1470 | 5.87k | real_t L; | 1471 | 5.87k | const real_t *sf_iid; | 1472 | 5.87k | uint8_t no_iid_steps; | 1473 | | | 1474 | 5.87k | if (ps->iid_mode >= 3) | 1475 | 2.00k | { | 1476 | 2.00k | no_iid_steps = 15; | 1477 | 2.00k | sf_iid = sf_iid_fine; | 1478 | 3.87k | } else { | 1479 | 3.87k | no_iid_steps = 7; | 1480 | 3.87k | sf_iid = sf_iid_normal; | 1481 | 3.87k | } | 1482 | | | 1483 | 5.87k | if (ps->ipd_mode == 0 || ps->ipd_mode == 3) | 1484 | 3.36k | { | 1485 | 3.36k | nr_ipdopd_par = 11; /* resolution */ | 1486 | 3.36k | } else { | 1487 | 2.51k | nr_ipdopd_par = ps->nr_ipdopd_par; | 1488 | 2.51k | } | 1489 | | | 1490 | 201k | for (gr = 0; gr < ps->num_groups; gr++) | 1491 | 195k | { | 1492 | 195k | bk = (~NEGATE_IPD_MASK) & ps->map_group2bk[gr]; | 1493 | | | 1494 | | /* use one channel per group in the subqmf domain */ | 1495 | 195k | maxsb = (gr < ps->num_hybrid_groups) ? ps->group_border[gr] + 1 : ps->group_border[gr + 1]; | 1496 | | | 1497 | 664k | for (env = 0; env < ps->num_env; env++) | 1498 | 469k | { | 1499 | 469k | uint8_t abs_iid = (uint8_t)abs(ps->iid_index[env][bk]); | 1500 | | /* index range is supposed to be -7...7 or -15...15 depending on iid_mode | 1501 | | (Table 8.24, ISO/IEC 14496-3:2005). | 1502 | | if it is outside these boundaries, this is most likely an error. sanitize | 1503 | | it and try to process further. */ | 1504 | 469k | if (ps->iid_index[env][bk] < -no_iid_steps) { | 1505 | 103 | fprintf(stderr, "Warning: invalid iid_index: %d < %d\n", ps->iid_index[env][bk], | 1506 | 103 | -no_iid_steps); | 1507 | 103 | ps->iid_index[env][bk] = -no_iid_steps; | 1508 | 103 | abs_iid = no_iid_steps; | 1509 | 469k | } else if (ps->iid_index[env][bk] > no_iid_steps) { | 1510 | 110 | fprintf(stderr, "Warning: invalid iid_index: %d > %d\n", ps->iid_index[env][bk], | 1511 | 110 | no_iid_steps); | 1512 | 110 | ps->iid_index[env][bk] = no_iid_steps; | 1513 | 110 | abs_iid = no_iid_steps; | 1514 | 110 | } | 1515 | 469k | if (ps->icc_index[env][bk] < 0) { | 1516 | 211 | fprintf(stderr, "Warning: invalid icc_index: %d < 0\n", ps->icc_index[env][bk]); | 1517 | 211 | ps->icc_index[env][bk] = 0; | 1518 | 469k | } else if (ps->icc_index[env][bk] > 7) { | 1519 | 0 | fprintf(stderr, "Warning: invalid icc_index: %d > 7\n", ps->icc_index[env][bk]); | 1520 | 0 | ps->icc_index[env][bk] = 7; | 1521 | 0 | } | 1522 | | | 1523 | 469k | if (ps->icc_mode < 3) | 1524 | 226k | { | 1525 | | /* type 'A' mixing as described in 8.6.4.6.2.1 */ | 1526 | 226k | real_t c_1, c_2; // COEF | 1527 | 226k | real_t cosa, sina; // COEF | 1528 | 226k | real_t cosb, sinb; // COEF | 1529 | 226k | real_t ab1, ab2; // COEF | 1530 | 226k | real_t ab3, ab4; // COEF | 1531 | | | 1532 | | /* | 1533 | | c_1 = sqrt(2.0 / (1.0 + pow(10.0, quant_iid[no_iid_steps + iid_index] / 10.0))); | 1534 | | c_2 = sqrt(2.0 / (1.0 + pow(10.0, quant_iid[no_iid_steps - iid_index] / 10.0))); | 1535 | | alpha = 0.5 * acos(quant_rho[icc_index]); | 1536 | | beta = alpha * ( c_1 - c_2 ) / sqrt(2.0); | 1537 | | */ | 1538 | | | 1539 | | //printf("%d\n", ps->iid_index[env][bk]); | 1540 | | | 1541 | | /* calculate the scalefactors c_1 and c_2 from the intensity differences */ | 1542 | 226k | c_1 = sf_iid[no_iid_steps + ps->iid_index[env][bk]]; | 1543 | 226k | c_2 = sf_iid[no_iid_steps - ps->iid_index[env][bk]]; | 1544 | | | 1545 | | /* calculate alpha and beta using the ICC parameters */ | 1546 | 226k | cosa = cos_alphas[ps->icc_index[env][bk]]; | 1547 | 226k | sina = sin_alphas[ps->icc_index[env][bk]]; | 1548 | | | 1549 | 226k | if (ps->iid_mode >= 3) | 1550 | 41.9k | { | 1551 | 41.9k | cosb = cos_betas_fine[abs_iid][ps->icc_index[env][bk]]; | 1552 | 41.9k | sinb = sin_betas_fine[abs_iid][ps->icc_index[env][bk]]; | 1553 | 184k | } else { | 1554 | 184k | cosb = cos_betas_normal[abs_iid][ps->icc_index[env][bk]]; | 1555 | 184k | sinb = sin_betas_normal[abs_iid][ps->icc_index[env][bk]]; | 1556 | 184k | } | 1557 | | | 1558 | 226k | ab1 = MUL_C(cosb, cosa); | 1559 | 226k | ab2 = MUL_C(sinb, sina); | 1560 | 226k | ab3 = MUL_C(sinb, cosa); | 1561 | 226k | ab4 = MUL_C(cosb, sina); | 1562 | | | 1563 | | /* h_xy: COEF */ | 1564 | 226k | RE(h11) = MUL_C(c_2, (ab1 - ab2)); | 1565 | 226k | RE(h12) = MUL_C(c_1, (ab1 + ab2)); | 1566 | 226k | RE(h21) = MUL_C(c_2, (ab3 + ab4)); | 1567 | 226k | RE(h22) = MUL_C(c_1, (ab3 - ab4)); | 1568 | 242k | } else { | 1569 | | /* type 'B' mixing as described in 8.6.4.6.2.2 */ | 1570 | 242k | real_t sina, cosa; // COEF | 1571 | 242k | real_t cosg, sing; // COEF | 1572 | | | 1573 | | /* | 1574 | | real_t c, rho, mu, alpha, gamma; | 1575 | | uint8_t i; | 1576 | | | 1577 | | i = ps->iid_index[env][bk]; | 1578 | | c = (real_t)pow(10.0, ((i)?(((i>0)?1:-1)*quant_iid[((i>0)?i:-i)-1]):0.)/20.0); | 1579 | | rho = quant_rho[ps->icc_index[env][bk]]; | 1580 | | | 1581 | | if (rho == 0.0f && c == 1.) | 1582 | | { | 1583 | | alpha = (real_t)M_PI/4.0f; | 1584 | | rho = 0.05f; | 1585 | | } else { | 1586 | | if (rho <= 0.05f) | 1587 | | { | 1588 | | rho = 0.05f; | 1589 | | } | 1590 | | alpha = 0.5f*(real_t)atan( (2.0f*c*rho) / (c*c-1.0f) ); | 1591 | | | 1592 | | if (alpha < 0.) | 1593 | | { | 1594 | | alpha += (real_t)M_PI/2.0f; | 1595 | | } | 1596 | | if (rho < 0.) | 1597 | | { | 1598 | | alpha += (real_t)M_PI; | 1599 | | } | 1600 | | } | 1601 | | mu = c+1.0f/c; | 1602 | | mu = 1+(4.0f*rho*rho-4.0f)/(mu*mu); | 1603 | | gamma = (real_t)atan(sqrt((1.0f-sqrt(mu))/(1.0f+sqrt(mu)))); | 1604 | | */ | 1605 | | | 1606 | 242k | if (ps->iid_mode >= 3) | 1607 | 144k | { | 1608 | 144k | cosa = sincos_alphas_B_fine[no_iid_steps + ps->iid_index[env][bk]][ps->icc_index[env][bk]]; | 1609 | 144k | sina = sincos_alphas_B_fine[30 - (no_iid_steps + ps->iid_index[env][bk])][ps->icc_index[env][bk]]; | 1610 | 144k | cosg = cos_gammas_fine[abs_iid][ps->icc_index[env][bk]]; | 1611 | 144k | sing = sin_gammas_fine[abs_iid][ps->icc_index[env][bk]]; | 1612 | 144k | } else { | 1613 | 98.0k | cosa = sincos_alphas_B_normal[no_iid_steps + ps->iid_index[env][bk]][ps->icc_index[env][bk]]; | 1614 | 98.0k | sina = sincos_alphas_B_normal[14 - (no_iid_steps + ps->iid_index[env][bk])][ps->icc_index[env][bk]]; | 1615 | 98.0k | cosg = cos_gammas_normal[abs_iid][ps->icc_index[env][bk]]; | 1616 | 98.0k | sing = sin_gammas_normal[abs_iid][ps->icc_index[env][bk]]; | 1617 | 98.0k | } | 1618 | | | 1619 | 242k | RE(h11) = MUL_C(COEF_SQRT2, MUL_C(cosa, cosg)); | 1620 | 242k | RE(h12) = MUL_C(COEF_SQRT2, MUL_C(sina, cosg)); | 1621 | 242k | RE(h21) = MUL_C(COEF_SQRT2, MUL_C(-cosa, sing)); | 1622 | 242k | RE(h22) = MUL_C(COEF_SQRT2, MUL_C(sina, sing)); | 1623 | 242k | } | 1624 | 469k | IM(h11) = IM(h12) = IM(h21) = IM(h22) = 0; | 1625 | | | 1626 | | /* calculate phase rotation parameters H_xy */ | 1627 | | /* note that the imaginary part of these parameters are only calculated when | 1628 | | IPD and OPD are enabled | 1629 | | */ | 1630 | 469k | if ((ps->enable_ipdopd) && (bk < nr_ipdopd_par)) | 1631 | 62.8k | { | 1632 | 62.8k | int8_t i; | 1633 | 62.8k | real_t xy, pq, xypq; // FRAC | 1634 | | | 1635 | | /* ringbuffer index */ | 1636 | 62.8k | i = ps->phase_hist; | 1637 | | | 1638 | | /* previous value */ | 1639 | 62.8k | #ifdef FIXED_POINT | 1640 | | /* divide by 4*2, shift right 3 bits; | 1641 | | extra halving to avoid overflows; it is ok, because result is normalized */ | 1642 | 62.8k | RE(tempLeft) = RE(ps->ipd_prev[bk][i]) >> 3; | 1643 | 62.8k | IM(tempLeft) = IM(ps->ipd_prev[bk][i]) >> 3; | 1644 | 62.8k | RE(tempRight) = RE(ps->opd_prev[bk][i]) >> 3; | 1645 | 62.8k | IM(tempRight) = IM(ps->opd_prev[bk][i]) >> 3; | 1646 | | #else | 1647 | | RE(tempLeft) = MUL_F(RE(ps->ipd_prev[bk][i]), FRAC_CONST(0.25)); | 1648 | | IM(tempLeft) = MUL_F(IM(ps->ipd_prev[bk][i]), FRAC_CONST(0.25)); | 1649 | | RE(tempRight) = MUL_F(RE(ps->opd_prev[bk][i]), FRAC_CONST(0.25)); | 1650 | | IM(tempRight) = MUL_F(IM(ps->opd_prev[bk][i]), FRAC_CONST(0.25)); | 1651 | | #endif | 1652 | | | 1653 | | /* save current value */ | 1654 | 62.8k | RE(ps->ipd_prev[bk][i]) = ipdopd_cos_tab[abs(ps->ipd_index[env][bk])]; | 1655 | 62.8k | IM(ps->ipd_prev[bk][i]) = ipdopd_sin_tab[abs(ps->ipd_index[env][bk])]; | 1656 | 62.8k | RE(ps->opd_prev[bk][i]) = ipdopd_cos_tab[abs(ps->opd_index[env][bk])]; | 1657 | 62.8k | IM(ps->opd_prev[bk][i]) = ipdopd_sin_tab[abs(ps->opd_index[env][bk])]; | 1658 | | | 1659 | | /* add current value */ | 1660 | 62.8k | #ifdef FIXED_POINT | 1661 | | /* extra halving to avoid overflows */ | 1662 | 62.8k | RE(tempLeft) += RE(ps->ipd_prev[bk][i]) >> 1; | 1663 | 62.8k | IM(tempLeft) += IM(ps->ipd_prev[bk][i]) >> 1; | 1664 | 62.8k | RE(tempRight) += RE(ps->opd_prev[bk][i]) >> 1; | 1665 | 62.8k | IM(tempRight) += IM(ps->opd_prev[bk][i]) >> 1; | 1666 | | #else | 1667 | | RE(tempLeft) += RE(ps->ipd_prev[bk][i]); | 1668 | | IM(tempLeft) += IM(ps->ipd_prev[bk][i]); | 1669 | | RE(tempRight) += RE(ps->opd_prev[bk][i]); | 1670 | | IM(tempRight) += IM(ps->opd_prev[bk][i]); | 1671 | | #endif | 1672 | | | 1673 | | /* ringbuffer index */ | 1674 | 62.8k | if (i == 0) | 1675 | 31.7k | { | 1676 | 31.7k | i = 2; | 1677 | 31.7k | } | 1678 | 62.8k | i--; | 1679 | | | 1680 | | /* get value before previous */ | 1681 | 62.8k | #ifdef FIXED_POINT | 1682 | | /* dividing by 2*2, shift right 2 bits; extra halving to avoid overflows */ | 1683 | 62.8k | RE(tempLeft) += (RE(ps->ipd_prev[bk][i]) >> 2); | 1684 | 62.8k | IM(tempLeft) += (IM(ps->ipd_prev[bk][i]) >> 2); | 1685 | 62.8k | RE(tempRight) += (RE(ps->opd_prev[bk][i]) >> 2); | 1686 | 62.8k | IM(tempRight) += (IM(ps->opd_prev[bk][i]) >> 2); | 1687 | | #else | 1688 | | RE(tempLeft) += MUL_F(RE(ps->ipd_prev[bk][i]), FRAC_CONST(0.5)); | 1689 | | IM(tempLeft) += MUL_F(IM(ps->ipd_prev[bk][i]), FRAC_CONST(0.5)); | 1690 | | RE(tempRight) += MUL_F(RE(ps->opd_prev[bk][i]), FRAC_CONST(0.5)); | 1691 | | IM(tempRight) += MUL_F(IM(ps->opd_prev[bk][i]), FRAC_CONST(0.5)); | 1692 | | #endif | 1693 | | | 1694 | | #if 0 /* original code */ | 1695 | | ipd = (float)atan2(IM(tempLeft), RE(tempLeft)); | 1696 | | opd = (float)atan2(IM(tempRight), RE(tempRight)); | 1697 | | | 1698 | | /* phase rotation */ | 1699 | | RE(phaseLeft) = (float)cos(opd); | 1700 | | IM(phaseLeft) = (float)sin(opd); | 1701 | | opd -= ipd; | 1702 | | RE(phaseRight) = (float)cos(opd); | 1703 | | IM(phaseRight) = (float)sin(opd); | 1704 | | #else | 1705 | | | 1706 | | // x = IM(tempLeft) | 1707 | | // y = RE(tempLeft) | 1708 | | // p = IM(tempRight) | 1709 | | // q = RE(tempRight) | 1710 | | // cos(atan2(x,y)) = y/sqrt((x*x) + (y*y)) | 1711 | | // sin(atan2(x,y)) = x/sqrt((x*x) + (y*y)) | 1712 | | // cos(atan2(x,y)-atan2(p,q)) = (y*q + x*p) / ( sqrt((x*x) + (y*y)) * sqrt((p*p) + (q*q)) ); | 1713 | | // sin(atan2(x,y)-atan2(p,q)) = (x*q - y*p) / ( sqrt((x*x) + (y*y)) * sqrt((p*p) + (q*q)) ); | 1714 | | | 1715 | 62.8k | xy = magnitude_c(tempRight); | 1716 | 62.8k | pq = magnitude_c(tempLeft); | 1717 | | | 1718 | 62.8k | if (xy != 0) | 1719 | 62.8k | { | 1720 | 62.8k | RE(phaseLeft) = DIV_F(RE(tempRight), xy); | 1721 | 62.8k | IM(phaseLeft) = DIV_F(IM(tempRight), xy); | 1722 | 62.8k | } else { | 1723 | 0 | RE(phaseLeft) = 0; | 1724 | 0 | IM(phaseLeft) = 0; | 1725 | 0 | } | 1726 | | | 1727 | 62.8k | xypq = MUL_F(xy, pq); | 1728 | | | 1729 | 62.8k | if (xypq != 0) | 1730 | 62.8k | { | 1731 | 62.8k | real_t tmp1 = MUL_F(RE(tempRight), RE(tempLeft)) + MUL_F(IM(tempRight), IM(tempLeft)); | 1732 | 62.8k | real_t tmp2 = MUL_F(IM(tempRight), RE(tempLeft)) - MUL_F(RE(tempRight), IM(tempLeft)); | 1733 | | | 1734 | 62.8k | RE(phaseRight) = DIV_F(tmp1, xypq); | 1735 | 62.8k | IM(phaseRight) = DIV_F(tmp2, xypq); | 1736 | 62.8k | } else { | 1737 | 0 | RE(phaseRight) = 0; | 1738 | 0 | IM(phaseRight) = 0; | 1739 | 0 | } | 1740 | | | 1741 | 62.8k | #endif | 1742 | | | 1743 | | /* MUL_F(COEF, REAL) = COEF */ | 1744 | 62.8k | IM(h11) = MUL_F(RE(h11), IM(phaseLeft)); | 1745 | 62.8k | IM(h12) = MUL_F(RE(h12), IM(phaseRight)); | 1746 | 62.8k | IM(h21) = MUL_F(RE(h21), IM(phaseLeft)); | 1747 | 62.8k | IM(h22) = MUL_F(RE(h22), IM(phaseRight)); | 1748 | | | 1749 | 62.8k | RE(h11) = MUL_F(RE(h11), RE(phaseLeft)); | 1750 | 62.8k | RE(h12) = MUL_F(RE(h12), RE(phaseRight)); | 1751 | 62.8k | RE(h21) = MUL_F(RE(h21), RE(phaseLeft)); | 1752 | 62.8k | RE(h22) = MUL_F(RE(h22), RE(phaseRight)); | 1753 | 62.8k | } | 1754 | | | 1755 | | /* length of the envelope n_e+1 - n_e (in time samples) */ | 1756 | | /* 0 < L <= 32: integer */ | 1757 | 469k | L = (real_t)(ps->border_position[env + 1] - ps->border_position[env]); | 1758 | | | 1759 | | /* obtain final H_xy by means of linear interpolation */ | 1760 | 469k | RE(deltaH11) = (RE(h11) - RE(ps->h11_prev[gr])) / L; | 1761 | 469k | RE(deltaH12) = (RE(h12) - RE(ps->h12_prev[gr])) / L; | 1762 | 469k | RE(deltaH21) = (RE(h21) - RE(ps->h21_prev[gr])) / L; | 1763 | 469k | RE(deltaH22) = (RE(h22) - RE(ps->h22_prev[gr])) / L; | 1764 | | | 1765 | 469k | RE(H11) = RE(ps->h11_prev[gr]); | 1766 | 469k | RE(H12) = RE(ps->h12_prev[gr]); | 1767 | 469k | RE(H21) = RE(ps->h21_prev[gr]); | 1768 | 469k | RE(H22) = RE(ps->h22_prev[gr]); | 1769 | 469k | IM(H11) = IM(H12) = IM(H21) = IM(H22) = 0; | 1770 | | | 1771 | 469k | RE(ps->h11_prev[gr]) = RE(h11); | 1772 | 469k | RE(ps->h12_prev[gr]) = RE(h12); | 1773 | 469k | RE(ps->h21_prev[gr]) = RE(h21); | 1774 | 469k | RE(ps->h22_prev[gr]) = RE(h22); | 1775 | | | 1776 | | /* only calculate imaginary part when needed */ | 1777 | 469k | if ((ps->enable_ipdopd) && (bk < nr_ipdopd_par)) | 1778 | 62.8k | { | 1779 | | /* obtain final H_xy by means of linear interpolation */ | 1780 | 62.8k | IM(deltaH11) = (IM(h11) - IM(ps->h11_prev[gr])) / L; | 1781 | 62.8k | IM(deltaH12) = (IM(h12) - IM(ps->h12_prev[gr])) / L; | 1782 | 62.8k | IM(deltaH21) = (IM(h21) - IM(ps->h21_prev[gr])) / L; | 1783 | 62.8k | IM(deltaH22) = (IM(h22) - IM(ps->h22_prev[gr])) / L; | 1784 | | | 1785 | 62.8k | IM(H11) = IM(ps->h11_prev[gr]); | 1786 | 62.8k | IM(H12) = IM(ps->h12_prev[gr]); | 1787 | 62.8k | IM(H21) = IM(ps->h21_prev[gr]); | 1788 | 62.8k | IM(H22) = IM(ps->h22_prev[gr]); | 1789 | | | 1790 | 62.8k | if ((NEGATE_IPD_MASK & ps->map_group2bk[gr]) != 0) | 1791 | 8.71k | { | 1792 | 8.71k | IM(deltaH11) = -IM(deltaH11); | 1793 | 8.71k | IM(deltaH12) = -IM(deltaH12); | 1794 | 8.71k | IM(deltaH21) = -IM(deltaH21); | 1795 | 8.71k | IM(deltaH22) = -IM(deltaH22); | 1796 | | | 1797 | 8.71k | IM(H11) = -IM(H11); | 1798 | 8.71k | IM(H12) = -IM(H12); | 1799 | 8.71k | IM(H21) = -IM(H21); | 1800 | 8.71k | IM(H22) = -IM(H22); | 1801 | 8.71k | } | 1802 | | | 1803 | 62.8k | IM(ps->h11_prev[gr]) = IM(h11); | 1804 | 62.8k | IM(ps->h12_prev[gr]) = IM(h12); | 1805 | 62.8k | IM(ps->h21_prev[gr]) = IM(h21); | 1806 | 62.8k | IM(ps->h22_prev[gr]) = IM(h22); | 1807 | 62.8k | } | 1808 | | | 1809 | | /* apply H_xy to the current envelope band of the decorrelated subband */ | 1810 | 6.56M | for (n = ps->border_position[env]; n < ps->border_position[env + 1]; n++) | 1811 | 6.10M | { | 1812 | | /* addition finalises the interpolation over every n */ | 1813 | 6.10M | RE(H11) += RE(deltaH11); | 1814 | 6.10M | RE(H12) += RE(deltaH12); | 1815 | 6.10M | RE(H21) += RE(deltaH21); | 1816 | 6.10M | RE(H22) += RE(deltaH22); | 1817 | 6.10M | if ((ps->enable_ipdopd) && (bk < nr_ipdopd_par)) | 1818 | 651k | { | 1819 | 651k | IM(H11) += IM(deltaH11); | 1820 | 651k | IM(H12) += IM(deltaH12); | 1821 | 651k | IM(H21) += IM(deltaH21); | 1822 | 651k | IM(H22) += IM(deltaH22); | 1823 | 651k | } | 1824 | | | 1825 | | /* channel is an alias to the subband */ | 1826 | 20.6M | for (sb = ps->group_border[gr]; sb < maxsb; sb++) | 1827 | 14.5M | { | 1828 | 14.5M | complex_t inLeft, inRight; // precision_of in(Left|Right) == precision_of X_(left|right) | 1829 | | | 1830 | | /* load decorrelated samples */ | 1831 | 14.5M | if (gr < ps->num_hybrid_groups) | 1832 | 3.45M | { | 1833 | 3.45M | RE(inLeft) = RE(X_hybrid_left[n][sb]); | 1834 | 3.45M | IM(inLeft) = IM(X_hybrid_left[n][sb]); | 1835 | 3.45M | RE(inRight) = RE(X_hybrid_right[n][sb]); | 1836 | 3.45M | IM(inRight) = IM(X_hybrid_right[n][sb]); | 1837 | 11.0M | } else { | 1838 | 11.0M | RE(inLeft) = RE(X_left[n][sb]); | 1839 | 11.0M | IM(inLeft) = IM(X_left[n][sb]); | 1840 | 11.0M | RE(inRight) = RE(X_right[n][sb]); | 1841 | 11.0M | IM(inRight) = IM(X_right[n][sb]); | 1842 | 11.0M | } | 1843 | | | 1844 | | /* precision_of temp(Left|Right) == precision_of X_(left|right) */ | 1845 | | | 1846 | | /* apply mixing */ | 1847 | 14.5M | RE(tempLeft) = MUL_C(RE(H11), RE(inLeft)) + MUL_C(RE(H21), RE(inRight)); | 1848 | 14.5M | IM(tempLeft) = MUL_C(RE(H11), IM(inLeft)) + MUL_C(RE(H21), IM(inRight)); | 1849 | 14.5M | RE(tempRight) = MUL_C(RE(H12), RE(inLeft)) + MUL_C(RE(H22), RE(inRight)); | 1850 | 14.5M | IM(tempRight) = MUL_C(RE(H12), IM(inLeft)) + MUL_C(RE(H22), IM(inRight)); | 1851 | | | 1852 | | /* only perform imaginary operations when needed */ | 1853 | 14.5M | if ((ps->enable_ipdopd) && (bk < nr_ipdopd_par)) | 1854 | 656k | { | 1855 | | /* apply rotation */ | 1856 | 656k | RE(tempLeft) -= MUL_C(IM(H11), IM(inLeft)) + MUL_C(IM(H21), IM(inRight)); | 1857 | 656k | IM(tempLeft) += MUL_C(IM(H11), RE(inLeft)) + MUL_C(IM(H21), RE(inRight)); | 1858 | 656k | RE(tempRight) -= MUL_C(IM(H12), IM(inLeft)) + MUL_C(IM(H22), IM(inRight)); | 1859 | 656k | IM(tempRight) += MUL_C(IM(H12), RE(inLeft)) + MUL_C(IM(H22), RE(inRight)); | 1860 | 656k | } | 1861 | | | 1862 | | /* store final samples */ | 1863 | 14.5M | if (gr < ps->num_hybrid_groups) | 1864 | 3.45M | { | 1865 | 3.45M | RE(X_hybrid_left[n][sb]) = RE(tempLeft); | 1866 | 3.45M | IM(X_hybrid_left[n][sb]) = IM(tempLeft); | 1867 | 3.45M | RE(X_hybrid_right[n][sb]) = RE(tempRight); | 1868 | 3.45M | IM(X_hybrid_right[n][sb]) = IM(tempRight); | 1869 | 11.0M | } else { | 1870 | 11.0M | RE(X_left[n][sb]) = RE(tempLeft); | 1871 | 11.0M | IM(X_left[n][sb]) = IM(tempLeft); | 1872 | 11.0M | RE(X_right[n][sb]) = RE(tempRight); | 1873 | 11.0M | IM(X_right[n][sb]) = IM(tempRight); | 1874 | 11.0M | } | 1875 | 14.5M | } | 1876 | 6.10M | } | 1877 | | | 1878 | | /* shift phase smoother's circular buffer index */ | 1879 | 469k | ps->phase_hist++; | 1880 | 469k | if (ps->phase_hist == 2) | 1881 | 234k | { | 1882 | 234k | ps->phase_hist = 0; | 1883 | 234k | } | 1884 | 469k | } | 1885 | 195k | } | 1886 | 5.87k | } |
Line | Count | Source | 1458 | 11.0k | { | 1459 | 11.0k | uint8_t n; | 1460 | 11.0k | uint8_t gr; | 1461 | 11.0k | uint8_t bk = 0; | 1462 | 11.0k | uint8_t sb, maxsb; | 1463 | 11.0k | uint8_t env; | 1464 | 11.0k | uint8_t nr_ipdopd_par; | 1465 | 11.0k | complex_t h11, h12, h21, h22; // COEF | 1466 | 11.0k | complex_t H11, H12, H21, H22; // COEF | 1467 | 11.0k | complex_t deltaH11, deltaH12, deltaH21, deltaH22; // COEF | 1468 | 11.0k | complex_t tempLeft, tempRight; // FRAC | 1469 | 11.0k | complex_t phaseLeft, phaseRight; // FRAC | 1470 | 11.0k | real_t L; | 1471 | 11.0k | const real_t *sf_iid; | 1472 | 11.0k | uint8_t no_iid_steps; | 1473 | | | 1474 | 11.0k | if (ps->iid_mode >= 3) | 1475 | 4.77k | { | 1476 | 4.77k | no_iid_steps = 15; | 1477 | 4.77k | sf_iid = sf_iid_fine; | 1478 | 6.23k | } else { | 1479 | 6.23k | no_iid_steps = 7; | 1480 | 6.23k | sf_iid = sf_iid_normal; | 1481 | 6.23k | } | 1482 | | | 1483 | 11.0k | if (ps->ipd_mode == 0 || ps->ipd_mode == 3) | 1484 | 6.67k | { | 1485 | 6.67k | nr_ipdopd_par = 11; /* resolution */ | 1486 | 6.67k | } else { | 1487 | 4.33k | nr_ipdopd_par = ps->nr_ipdopd_par; | 1488 | 4.33k | } | 1489 | | | 1490 | 367k | for (gr = 0; gr < ps->num_groups; gr++) | 1491 | 356k | { | 1492 | 356k | bk = (~NEGATE_IPD_MASK) & ps->map_group2bk[gr]; | 1493 | | | 1494 | | /* use one channel per group in the subqmf domain */ | 1495 | 356k | maxsb = (gr < ps->num_hybrid_groups) ? ps->group_border[gr] + 1 : ps->group_border[gr + 1]; | 1496 | | | 1497 | 1.15M | for (env = 0; env < ps->num_env; env++) | 1498 | 796k | { | 1499 | 796k | uint8_t abs_iid = (uint8_t)abs(ps->iid_index[env][bk]); | 1500 | | /* index range is supposed to be -7...7 or -15...15 depending on iid_mode | 1501 | | (Table 8.24, ISO/IEC 14496-3:2005). | 1502 | | if it is outside these boundaries, this is most likely an error. sanitize | 1503 | | it and try to process further. */ | 1504 | 796k | if (ps->iid_index[env][bk] < -no_iid_steps) { | 1505 | 249 | fprintf(stderr, "Warning: invalid iid_index: %d < %d\n", ps->iid_index[env][bk], | 1506 | 249 | -no_iid_steps); | 1507 | 249 | ps->iid_index[env][bk] = -no_iid_steps; | 1508 | 249 | abs_iid = no_iid_steps; | 1509 | 795k | } else if (ps->iid_index[env][bk] > no_iid_steps) { | 1510 | 157 | fprintf(stderr, "Warning: invalid iid_index: %d > %d\n", ps->iid_index[env][bk], | 1511 | 157 | no_iid_steps); | 1512 | 157 | ps->iid_index[env][bk] = no_iid_steps; | 1513 | 157 | abs_iid = no_iid_steps; | 1514 | 157 | } | 1515 | 796k | if (ps->icc_index[env][bk] < 0) { | 1516 | 413 | fprintf(stderr, "Warning: invalid icc_index: %d < 0\n", ps->icc_index[env][bk]); | 1517 | 413 | ps->icc_index[env][bk] = 0; | 1518 | 795k | } else if (ps->icc_index[env][bk] > 7) { | 1519 | 0 | fprintf(stderr, "Warning: invalid icc_index: %d > 7\n", ps->icc_index[env][bk]); | 1520 | 0 | ps->icc_index[env][bk] = 7; | 1521 | 0 | } | 1522 | | | 1523 | 796k | if (ps->icc_mode < 3) | 1524 | 510k | { | 1525 | | /* type 'A' mixing as described in 8.6.4.6.2.1 */ | 1526 | 510k | real_t c_1, c_2; // COEF | 1527 | 510k | real_t cosa, sina; // COEF | 1528 | 510k | real_t cosb, sinb; // COEF | 1529 | 510k | real_t ab1, ab2; // COEF | 1530 | 510k | real_t ab3, ab4; // COEF | 1531 | | | 1532 | | /* | 1533 | | c_1 = sqrt(2.0 / (1.0 + pow(10.0, quant_iid[no_iid_steps + iid_index] / 10.0))); | 1534 | | c_2 = sqrt(2.0 / (1.0 + pow(10.0, quant_iid[no_iid_steps - iid_index] / 10.0))); | 1535 | | alpha = 0.5 * acos(quant_rho[icc_index]); | 1536 | | beta = alpha * ( c_1 - c_2 ) / sqrt(2.0); | 1537 | | */ | 1538 | | | 1539 | | //printf("%d\n", ps->iid_index[env][bk]); | 1540 | | | 1541 | | /* calculate the scalefactors c_1 and c_2 from the intensity differences */ | 1542 | 510k | c_1 = sf_iid[no_iid_steps + ps->iid_index[env][bk]]; | 1543 | 510k | c_2 = sf_iid[no_iid_steps - ps->iid_index[env][bk]]; | 1544 | | | 1545 | | /* calculate alpha and beta using the ICC parameters */ | 1546 | 510k | cosa = cos_alphas[ps->icc_index[env][bk]]; | 1547 | 510k | sina = sin_alphas[ps->icc_index[env][bk]]; | 1548 | | | 1549 | 510k | if (ps->iid_mode >= 3) | 1550 | 232k | { | 1551 | 232k | cosb = cos_betas_fine[abs_iid][ps->icc_index[env][bk]]; | 1552 | 232k | sinb = sin_betas_fine[abs_iid][ps->icc_index[env][bk]]; | 1553 | 278k | } else { | 1554 | 278k | cosb = cos_betas_normal[abs_iid][ps->icc_index[env][bk]]; | 1555 | 278k | sinb = sin_betas_normal[abs_iid][ps->icc_index[env][bk]]; | 1556 | 278k | } | 1557 | | | 1558 | 510k | ab1 = MUL_C(cosb, cosa); | 1559 | 510k | ab2 = MUL_C(sinb, sina); | 1560 | 510k | ab3 = MUL_C(sinb, cosa); | 1561 | 510k | ab4 = MUL_C(cosb, sina); | 1562 | | | 1563 | | /* h_xy: COEF */ | 1564 | 510k | RE(h11) = MUL_C(c_2, (ab1 - ab2)); | 1565 | 510k | RE(h12) = MUL_C(c_1, (ab1 + ab2)); | 1566 | 510k | RE(h21) = MUL_C(c_2, (ab3 + ab4)); | 1567 | 510k | RE(h22) = MUL_C(c_1, (ab3 - ab4)); | 1568 | 510k | } else { | 1569 | | /* type 'B' mixing as described in 8.6.4.6.2.2 */ | 1570 | 285k | real_t sina, cosa; // COEF | 1571 | 285k | real_t cosg, sing; // COEF | 1572 | | | 1573 | | /* | 1574 | | real_t c, rho, mu, alpha, gamma; | 1575 | | uint8_t i; | 1576 | | | 1577 | | i = ps->iid_index[env][bk]; | 1578 | | c = (real_t)pow(10.0, ((i)?(((i>0)?1:-1)*quant_iid[((i>0)?i:-i)-1]):0.)/20.0); | 1579 | | rho = quant_rho[ps->icc_index[env][bk]]; | 1580 | | | 1581 | | if (rho == 0.0f && c == 1.) | 1582 | | { | 1583 | | alpha = (real_t)M_PI/4.0f; | 1584 | | rho = 0.05f; | 1585 | | } else { | 1586 | | if (rho <= 0.05f) | 1587 | | { | 1588 | | rho = 0.05f; | 1589 | | } | 1590 | | alpha = 0.5f*(real_t)atan( (2.0f*c*rho) / (c*c-1.0f) ); | 1591 | | | 1592 | | if (alpha < 0.) | 1593 | | { | 1594 | | alpha += (real_t)M_PI/2.0f; | 1595 | | } | 1596 | | if (rho < 0.) | 1597 | | { | 1598 | | alpha += (real_t)M_PI; | 1599 | | } | 1600 | | } | 1601 | | mu = c+1.0f/c; | 1602 | | mu = 1+(4.0f*rho*rho-4.0f)/(mu*mu); | 1603 | | gamma = (real_t)atan(sqrt((1.0f-sqrt(mu))/(1.0f+sqrt(mu)))); | 1604 | | */ | 1605 | | | 1606 | 285k | if (ps->iid_mode >= 3) | 1607 | 151k | { | 1608 | 151k | cosa = sincos_alphas_B_fine[no_iid_steps + ps->iid_index[env][bk]][ps->icc_index[env][bk]]; | 1609 | 151k | sina = sincos_alphas_B_fine[30 - (no_iid_steps + ps->iid_index[env][bk])][ps->icc_index[env][bk]]; | 1610 | 151k | cosg = cos_gammas_fine[abs_iid][ps->icc_index[env][bk]]; | 1611 | 151k | sing = sin_gammas_fine[abs_iid][ps->icc_index[env][bk]]; | 1612 | 151k | } else { | 1613 | 133k | cosa = sincos_alphas_B_normal[no_iid_steps + ps->iid_index[env][bk]][ps->icc_index[env][bk]]; | 1614 | 133k | sina = sincos_alphas_B_normal[14 - (no_iid_steps + ps->iid_index[env][bk])][ps->icc_index[env][bk]]; | 1615 | 133k | cosg = cos_gammas_normal[abs_iid][ps->icc_index[env][bk]]; | 1616 | 133k | sing = sin_gammas_normal[abs_iid][ps->icc_index[env][bk]]; | 1617 | 133k | } | 1618 | | | 1619 | 285k | RE(h11) = MUL_C(COEF_SQRT2, MUL_C(cosa, cosg)); | 1620 | 285k | RE(h12) = MUL_C(COEF_SQRT2, MUL_C(sina, cosg)); | 1621 | 285k | RE(h21) = MUL_C(COEF_SQRT2, MUL_C(-cosa, sing)); | 1622 | 285k | RE(h22) = MUL_C(COEF_SQRT2, MUL_C(sina, sing)); | 1623 | 285k | } | 1624 | 796k | IM(h11) = IM(h12) = IM(h21) = IM(h22) = 0; | 1625 | | | 1626 | | /* calculate phase rotation parameters H_xy */ | 1627 | | /* note that the imaginary part of these parameters are only calculated when | 1628 | | IPD and OPD are enabled | 1629 | | */ | 1630 | 796k | if ((ps->enable_ipdopd) && (bk < nr_ipdopd_par)) | 1631 | 96.9k | { | 1632 | 96.9k | int8_t i; | 1633 | 96.9k | real_t xy, pq, xypq; // FRAC | 1634 | | | 1635 | | /* ringbuffer index */ | 1636 | 96.9k | i = ps->phase_hist; | 1637 | | | 1638 | | /* previous value */ | 1639 | | #ifdef FIXED_POINT | 1640 | | /* divide by 4*2, shift right 3 bits; | 1641 | | extra halving to avoid overflows; it is ok, because result is normalized */ | 1642 | | RE(tempLeft) = RE(ps->ipd_prev[bk][i]) >> 3; | 1643 | | IM(tempLeft) = IM(ps->ipd_prev[bk][i]) >> 3; | 1644 | | RE(tempRight) = RE(ps->opd_prev[bk][i]) >> 3; | 1645 | | IM(tempRight) = IM(ps->opd_prev[bk][i]) >> 3; | 1646 | | #else | 1647 | 96.9k | RE(tempLeft) = MUL_F(RE(ps->ipd_prev[bk][i]), FRAC_CONST(0.25)); | 1648 | 96.9k | IM(tempLeft) = MUL_F(IM(ps->ipd_prev[bk][i]), FRAC_CONST(0.25)); | 1649 | 96.9k | RE(tempRight) = MUL_F(RE(ps->opd_prev[bk][i]), FRAC_CONST(0.25)); | 1650 | 96.9k | IM(tempRight) = MUL_F(IM(ps->opd_prev[bk][i]), FRAC_CONST(0.25)); | 1651 | 96.9k | #endif | 1652 | | | 1653 | | /* save current value */ | 1654 | 96.9k | RE(ps->ipd_prev[bk][i]) = ipdopd_cos_tab[abs(ps->ipd_index[env][bk])]; | 1655 | 96.9k | IM(ps->ipd_prev[bk][i]) = ipdopd_sin_tab[abs(ps->ipd_index[env][bk])]; | 1656 | 96.9k | RE(ps->opd_prev[bk][i]) = ipdopd_cos_tab[abs(ps->opd_index[env][bk])]; | 1657 | 96.9k | IM(ps->opd_prev[bk][i]) = ipdopd_sin_tab[abs(ps->opd_index[env][bk])]; | 1658 | | | 1659 | | /* add current value */ | 1660 | | #ifdef FIXED_POINT | 1661 | | /* extra halving to avoid overflows */ | 1662 | | RE(tempLeft) += RE(ps->ipd_prev[bk][i]) >> 1; | 1663 | | IM(tempLeft) += IM(ps->ipd_prev[bk][i]) >> 1; | 1664 | | RE(tempRight) += RE(ps->opd_prev[bk][i]) >> 1; | 1665 | | IM(tempRight) += IM(ps->opd_prev[bk][i]) >> 1; | 1666 | | #else | 1667 | 96.9k | RE(tempLeft) += RE(ps->ipd_prev[bk][i]); | 1668 | 96.9k | IM(tempLeft) += IM(ps->ipd_prev[bk][i]); | 1669 | 96.9k | RE(tempRight) += RE(ps->opd_prev[bk][i]); | 1670 | 96.9k | IM(tempRight) += IM(ps->opd_prev[bk][i]); | 1671 | 96.9k | #endif | 1672 | | | 1673 | | /* ringbuffer index */ | 1674 | 96.9k | if (i == 0) | 1675 | 49.0k | { | 1676 | 49.0k | i = 2; | 1677 | 49.0k | } | 1678 | 96.9k | i--; | 1679 | | | 1680 | | /* get value before previous */ | 1681 | | #ifdef FIXED_POINT | 1682 | | /* dividing by 2*2, shift right 2 bits; extra halving to avoid overflows */ | 1683 | | RE(tempLeft) += (RE(ps->ipd_prev[bk][i]) >> 2); | 1684 | | IM(tempLeft) += (IM(ps->ipd_prev[bk][i]) >> 2); | 1685 | | RE(tempRight) += (RE(ps->opd_prev[bk][i]) >> 2); | 1686 | | IM(tempRight) += (IM(ps->opd_prev[bk][i]) >> 2); | 1687 | | #else | 1688 | 96.9k | RE(tempLeft) += MUL_F(RE(ps->ipd_prev[bk][i]), FRAC_CONST(0.5)); | 1689 | 96.9k | IM(tempLeft) += MUL_F(IM(ps->ipd_prev[bk][i]), FRAC_CONST(0.5)); | 1690 | 96.9k | RE(tempRight) += MUL_F(RE(ps->opd_prev[bk][i]), FRAC_CONST(0.5)); | 1691 | 96.9k | IM(tempRight) += MUL_F(IM(ps->opd_prev[bk][i]), FRAC_CONST(0.5)); | 1692 | 96.9k | #endif | 1693 | | | 1694 | | #if 0 /* original code */ | 1695 | | ipd = (float)atan2(IM(tempLeft), RE(tempLeft)); | 1696 | | opd = (float)atan2(IM(tempRight), RE(tempRight)); | 1697 | | | 1698 | | /* phase rotation */ | 1699 | | RE(phaseLeft) = (float)cos(opd); | 1700 | | IM(phaseLeft) = (float)sin(opd); | 1701 | | opd -= ipd; | 1702 | | RE(phaseRight) = (float)cos(opd); | 1703 | | IM(phaseRight) = (float)sin(opd); | 1704 | | #else | 1705 | | | 1706 | | // x = IM(tempLeft) | 1707 | | // y = RE(tempLeft) | 1708 | | // p = IM(tempRight) | 1709 | | // q = RE(tempRight) | 1710 | | // cos(atan2(x,y)) = y/sqrt((x*x) + (y*y)) | 1711 | | // sin(atan2(x,y)) = x/sqrt((x*x) + (y*y)) | 1712 | | // cos(atan2(x,y)-atan2(p,q)) = (y*q + x*p) / ( sqrt((x*x) + (y*y)) * sqrt((p*p) + (q*q)) ); | 1713 | | // sin(atan2(x,y)-atan2(p,q)) = (x*q - y*p) / ( sqrt((x*x) + (y*y)) * sqrt((p*p) + (q*q)) ); | 1714 | | | 1715 | 96.9k | xy = magnitude_c(tempRight); | 1716 | 96.9k | pq = magnitude_c(tempLeft); | 1717 | | | 1718 | 96.9k | if (xy != 0) | 1719 | 96.9k | { | 1720 | 96.9k | RE(phaseLeft) = DIV_F(RE(tempRight), xy); | 1721 | 96.9k | IM(phaseLeft) = DIV_F(IM(tempRight), xy); | 1722 | 96.9k | } else { | 1723 | 0 | RE(phaseLeft) = 0; | 1724 | 0 | IM(phaseLeft) = 0; | 1725 | 0 | } | 1726 | | | 1727 | 96.9k | xypq = MUL_F(xy, pq); | 1728 | | | 1729 | 96.9k | if (xypq != 0) | 1730 | 96.9k | { | 1731 | 96.9k | real_t tmp1 = MUL_F(RE(tempRight), RE(tempLeft)) + MUL_F(IM(tempRight), IM(tempLeft)); | 1732 | 96.9k | real_t tmp2 = MUL_F(IM(tempRight), RE(tempLeft)) - MUL_F(RE(tempRight), IM(tempLeft)); | 1733 | | | 1734 | 96.9k | RE(phaseRight) = DIV_F(tmp1, xypq); | 1735 | 96.9k | IM(phaseRight) = DIV_F(tmp2, xypq); | 1736 | 96.9k | } else { | 1737 | 0 | RE(phaseRight) = 0; | 1738 | 0 | IM(phaseRight) = 0; | 1739 | 0 | } | 1740 | | | 1741 | 96.9k | #endif | 1742 | | | 1743 | | /* MUL_F(COEF, REAL) = COEF */ | 1744 | 96.9k | IM(h11) = MUL_F(RE(h11), IM(phaseLeft)); | 1745 | 96.9k | IM(h12) = MUL_F(RE(h12), IM(phaseRight)); | 1746 | 96.9k | IM(h21) = MUL_F(RE(h21), IM(phaseLeft)); | 1747 | 96.9k | IM(h22) = MUL_F(RE(h22), IM(phaseRight)); | 1748 | | | 1749 | 96.9k | RE(h11) = MUL_F(RE(h11), RE(phaseLeft)); | 1750 | 96.9k | RE(h12) = MUL_F(RE(h12), RE(phaseRight)); | 1751 | 96.9k | RE(h21) = MUL_F(RE(h21), RE(phaseLeft)); | 1752 | 96.9k | RE(h22) = MUL_F(RE(h22), RE(phaseRight)); | 1753 | 96.9k | } | 1754 | | | 1755 | | /* length of the envelope n_e+1 - n_e (in time samples) */ | 1756 | | /* 0 < L <= 32: integer */ | 1757 | 796k | L = (real_t)(ps->border_position[env + 1] - ps->border_position[env]); | 1758 | | | 1759 | | /* obtain final H_xy by means of linear interpolation */ | 1760 | 796k | RE(deltaH11) = (RE(h11) - RE(ps->h11_prev[gr])) / L; | 1761 | 796k | RE(deltaH12) = (RE(h12) - RE(ps->h12_prev[gr])) / L; | 1762 | 796k | RE(deltaH21) = (RE(h21) - RE(ps->h21_prev[gr])) / L; | 1763 | 796k | RE(deltaH22) = (RE(h22) - RE(ps->h22_prev[gr])) / L; | 1764 | | | 1765 | 796k | RE(H11) = RE(ps->h11_prev[gr]); | 1766 | 796k | RE(H12) = RE(ps->h12_prev[gr]); | 1767 | 796k | RE(H21) = RE(ps->h21_prev[gr]); | 1768 | 796k | RE(H22) = RE(ps->h22_prev[gr]); | 1769 | 796k | IM(H11) = IM(H12) = IM(H21) = IM(H22) = 0; | 1770 | | | 1771 | 796k | RE(ps->h11_prev[gr]) = RE(h11); | 1772 | 796k | RE(ps->h12_prev[gr]) = RE(h12); | 1773 | 796k | RE(ps->h21_prev[gr]) = RE(h21); | 1774 | 796k | RE(ps->h22_prev[gr]) = RE(h22); | 1775 | | | 1776 | | /* only calculate imaginary part when needed */ | 1777 | 796k | if ((ps->enable_ipdopd) && (bk < nr_ipdopd_par)) | 1778 | 96.9k | { | 1779 | | /* obtain final H_xy by means of linear interpolation */ | 1780 | 96.9k | IM(deltaH11) = (IM(h11) - IM(ps->h11_prev[gr])) / L; | 1781 | 96.9k | IM(deltaH12) = (IM(h12) - IM(ps->h12_prev[gr])) / L; | 1782 | 96.9k | IM(deltaH21) = (IM(h21) - IM(ps->h21_prev[gr])) / L; | 1783 | 96.9k | IM(deltaH22) = (IM(h22) - IM(ps->h22_prev[gr])) / L; | 1784 | | | 1785 | 96.9k | IM(H11) = IM(ps->h11_prev[gr]); | 1786 | 96.9k | IM(H12) = IM(ps->h12_prev[gr]); | 1787 | 96.9k | IM(H21) = IM(ps->h21_prev[gr]); | 1788 | 96.9k | IM(H22) = IM(ps->h22_prev[gr]); | 1789 | | | 1790 | 96.9k | if ((NEGATE_IPD_MASK & ps->map_group2bk[gr]) != 0) | 1791 | 13.8k | { | 1792 | 13.8k | IM(deltaH11) = -IM(deltaH11); | 1793 | 13.8k | IM(deltaH12) = -IM(deltaH12); | 1794 | 13.8k | IM(deltaH21) = -IM(deltaH21); | 1795 | 13.8k | IM(deltaH22) = -IM(deltaH22); | 1796 | | | 1797 | 13.8k | IM(H11) = -IM(H11); | 1798 | 13.8k | IM(H12) = -IM(H12); | 1799 | 13.8k | IM(H21) = -IM(H21); | 1800 | 13.8k | IM(H22) = -IM(H22); | 1801 | 13.8k | } | 1802 | | | 1803 | 96.9k | IM(ps->h11_prev[gr]) = IM(h11); | 1804 | 96.9k | IM(ps->h12_prev[gr]) = IM(h12); | 1805 | 96.9k | IM(ps->h21_prev[gr]) = IM(h21); | 1806 | 96.9k | IM(ps->h22_prev[gr]) = IM(h22); | 1807 | 96.9k | } | 1808 | | | 1809 | | /* apply H_xy to the current envelope band of the decorrelated subband */ | 1810 | 11.8M | for (n = ps->border_position[env]; n < ps->border_position[env + 1]; n++) | 1811 | 11.0M | { | 1812 | | /* addition finalises the interpolation over every n */ | 1813 | 11.0M | RE(H11) += RE(deltaH11); | 1814 | 11.0M | RE(H12) += RE(deltaH12); | 1815 | 11.0M | RE(H21) += RE(deltaH21); | 1816 | 11.0M | RE(H22) += RE(deltaH22); | 1817 | 11.0M | if ((ps->enable_ipdopd) && (bk < nr_ipdopd_par)) | 1818 | 994k | { | 1819 | 994k | IM(H11) += IM(deltaH11); | 1820 | 994k | IM(H12) += IM(deltaH12); | 1821 | 994k | IM(H21) += IM(deltaH21); | 1822 | 994k | IM(H22) += IM(deltaH22); | 1823 | 994k | } | 1824 | | | 1825 | | /* channel is an alias to the subband */ | 1826 | 37.9M | for (sb = ps->group_border[gr]; sb < maxsb; sb++) | 1827 | 26.8M | { | 1828 | 26.8M | complex_t inLeft, inRight; // precision_of in(Left|Right) == precision_of X_(left|right) | 1829 | | | 1830 | | /* load decorrelated samples */ | 1831 | 26.8M | if (gr < ps->num_hybrid_groups) | 1832 | 6.18M | { | 1833 | 6.18M | RE(inLeft) = RE(X_hybrid_left[n][sb]); | 1834 | 6.18M | IM(inLeft) = IM(X_hybrid_left[n][sb]); | 1835 | 6.18M | RE(inRight) = RE(X_hybrid_right[n][sb]); | 1836 | 6.18M | IM(inRight) = IM(X_hybrid_right[n][sb]); | 1837 | 20.7M | } else { | 1838 | 20.7M | RE(inLeft) = RE(X_left[n][sb]); | 1839 | 20.7M | IM(inLeft) = IM(X_left[n][sb]); | 1840 | 20.7M | RE(inRight) = RE(X_right[n][sb]); | 1841 | 20.7M | IM(inRight) = IM(X_right[n][sb]); | 1842 | 20.7M | } | 1843 | | | 1844 | | /* precision_of temp(Left|Right) == precision_of X_(left|right) */ | 1845 | | | 1846 | | /* apply mixing */ | 1847 | 26.8M | RE(tempLeft) = MUL_C(RE(H11), RE(inLeft)) + MUL_C(RE(H21), RE(inRight)); | 1848 | 26.8M | IM(tempLeft) = MUL_C(RE(H11), IM(inLeft)) + MUL_C(RE(H21), IM(inRight)); | 1849 | 26.8M | RE(tempRight) = MUL_C(RE(H12), RE(inLeft)) + MUL_C(RE(H22), RE(inRight)); | 1850 | 26.8M | IM(tempRight) = MUL_C(RE(H12), IM(inLeft)) + MUL_C(RE(H22), IM(inRight)); | 1851 | | | 1852 | | /* only perform imaginary operations when needed */ | 1853 | 26.8M | if ((ps->enable_ipdopd) && (bk < nr_ipdopd_par)) | 1854 | 996k | { | 1855 | | /* apply rotation */ | 1856 | 996k | RE(tempLeft) -= MUL_C(IM(H11), IM(inLeft)) + MUL_C(IM(H21), IM(inRight)); | 1857 | 996k | IM(tempLeft) += MUL_C(IM(H11), RE(inLeft)) + MUL_C(IM(H21), RE(inRight)); | 1858 | 996k | RE(tempRight) -= MUL_C(IM(H12), IM(inLeft)) + MUL_C(IM(H22), IM(inRight)); | 1859 | 996k | IM(tempRight) += MUL_C(IM(H12), RE(inLeft)) + MUL_C(IM(H22), RE(inRight)); | 1860 | 996k | } | 1861 | | | 1862 | | /* store final samples */ | 1863 | 26.8M | if (gr < ps->num_hybrid_groups) | 1864 | 6.18M | { | 1865 | 6.18M | RE(X_hybrid_left[n][sb]) = RE(tempLeft); | 1866 | 6.18M | IM(X_hybrid_left[n][sb]) = IM(tempLeft); | 1867 | 6.18M | RE(X_hybrid_right[n][sb]) = RE(tempRight); | 1868 | 6.18M | IM(X_hybrid_right[n][sb]) = IM(tempRight); | 1869 | 20.7M | } else { | 1870 | 20.7M | RE(X_left[n][sb]) = RE(tempLeft); | 1871 | 20.7M | IM(X_left[n][sb]) = IM(tempLeft); | 1872 | 20.7M | RE(X_right[n][sb]) = RE(tempRight); | 1873 | 20.7M | IM(X_right[n][sb]) = IM(tempRight); | 1874 | 20.7M | } | 1875 | 26.8M | } | 1876 | 11.0M | } | 1877 | | | 1878 | | /* shift phase smoother's circular buffer index */ | 1879 | 796k | ps->phase_hist++; | 1880 | 796k | if (ps->phase_hist == 2) | 1881 | 398k | { | 1882 | 398k | ps->phase_hist = 0; | 1883 | 398k | } | 1884 | 796k | } | 1885 | 356k | } | 1886 | 11.0k | } |
|
1887 | | |
1888 | | void ps_free(ps_info *ps) |
1889 | 26.6k | { |
1890 | | /* free hybrid filterbank structures */ |
1891 | 26.6k | hybrid_free(ps->hyb); |
1892 | | |
1893 | 26.6k | faad_free(ps); |
1894 | 26.6k | } |
1895 | | |
1896 | | ps_info *ps_init(uint8_t sr_index, uint8_t numTimeSlotsRate) |
1897 | 26.6k | { |
1898 | 26.6k | uint8_t i; |
1899 | 26.6k | uint8_t short_delay_band; |
1900 | | |
1901 | 26.6k | ps_info *ps = (ps_info*)faad_malloc(sizeof(ps_info)); |
1902 | 26.6k | memset(ps, 0, sizeof(ps_info)); |
1903 | | |
1904 | 26.6k | ps->hyb = hybrid_init(numTimeSlotsRate); |
1905 | 26.6k | ps->numTimeSlotsRate = numTimeSlotsRate; |
1906 | | |
1907 | 26.6k | ps->ps_data_available = 0; |
1908 | | |
1909 | | /* delay stuff*/ |
1910 | 26.6k | ps->saved_delay = 0; |
1911 | | |
1912 | 1.73M | for (i = 0; i < 64; i++) |
1913 | 1.70M | { |
1914 | 1.70M | ps->delay_buf_index_delay[i] = 0; |
1915 | 1.70M | } |
1916 | | |
1917 | 106k | for (i = 0; i < NO_ALLPASS_LINKS; i++) |
1918 | 80.0k | { |
1919 | 80.0k | ps->delay_buf_index_ser[i] = 0; |
1920 | | #ifdef PARAM_32KHZ |
1921 | | if (sr_index <= 5) /* >= 32 kHz*/ |
1922 | | { |
1923 | | ps->num_sample_delay_ser[i] = delay_length_d[1][i]; |
1924 | | } else { |
1925 | | ps->num_sample_delay_ser[i] = delay_length_d[0][i]; |
1926 | | } |
1927 | | #else |
1928 | 80.0k | (void)sr_index; |
1929 | | /* THESE ARE CONSTANTS NOW */ |
1930 | 80.0k | ps->num_sample_delay_ser[i] = delay_length_d[i]; |
1931 | 80.0k | #endif |
1932 | 80.0k | } |
1933 | | |
1934 | | #ifdef PARAM_32KHZ |
1935 | | if (sr_index <= 5) /* >= 32 kHz*/ |
1936 | | { |
1937 | | short_delay_band = 35; |
1938 | | ps->nr_allpass_bands = 22; |
1939 | | ps->alpha_decay = FRAC_CONST(0.76592833836465); |
1940 | | ps->alpha_smooth = FRAC_CONST(0.25); |
1941 | | } else { |
1942 | | short_delay_band = 64; |
1943 | | ps->nr_allpass_bands = 45; |
1944 | | ps->alpha_decay = FRAC_CONST(0.58664621951003); |
1945 | | ps->alpha_smooth = FRAC_CONST(0.6); |
1946 | | } |
1947 | | #else |
1948 | | /* THESE ARE CONSTANTS NOW */ |
1949 | 26.6k | short_delay_band = 35; |
1950 | 26.6k | ps->nr_allpass_bands = 22; |
1951 | 26.6k | ps->alpha_decay = FRAC_CONST(0.76592833836465); |
1952 | 26.6k | ps->alpha_smooth = FRAC_CONST(0.25); |
1953 | 26.6k | #endif |
1954 | | |
1955 | | /* THESE ARE CONSTANT NOW IF PS IS INDEPENDANT OF SAMPLERATE */ |
1956 | 960k | for (i = 0; i < short_delay_band; i++) |
1957 | 933k | { |
1958 | 933k | ps->delay_D[i] = 14; |
1959 | 933k | } |
1960 | 800k | for (i = short_delay_band; i < 64; i++) |
1961 | 773k | { |
1962 | 773k | ps->delay_D[i] = 1; |
1963 | 773k | } |
1964 | | |
1965 | | /* mixing and phase */ |
1966 | 1.36M | for (i = 0; i < 50; i++) |
1967 | 1.33M | { |
1968 | 1.33M | RE(ps->h11_prev[i]) = 1; |
1969 | 1.33M | IM(ps->h11_prev[i]) = 1; |
1970 | 1.33M | RE(ps->h12_prev[i]) = 1; |
1971 | 1.33M | IM(ps->h12_prev[i]) = 1; |
1972 | 1.33M | } |
1973 | | |
1974 | 26.6k | ps->phase_hist = 0; |
1975 | | |
1976 | 560k | for (i = 0; i < 20; i++) |
1977 | 533k | { |
1978 | 533k | RE(ps->ipd_prev[i][0]) = 0; |
1979 | 533k | IM(ps->ipd_prev[i][0]) = 0; |
1980 | 533k | RE(ps->ipd_prev[i][1]) = 0; |
1981 | 533k | IM(ps->ipd_prev[i][1]) = 0; |
1982 | 533k | RE(ps->opd_prev[i][0]) = 0; |
1983 | 533k | IM(ps->opd_prev[i][0]) = 0; |
1984 | 533k | RE(ps->opd_prev[i][1]) = 0; |
1985 | 533k | IM(ps->opd_prev[i][1]) = 0; |
1986 | 533k | } |
1987 | | |
1988 | 26.6k | return ps; |
1989 | 26.6k | } Line | Count | Source | 1897 | 10.2k | { | 1898 | 10.2k | uint8_t i; | 1899 | 10.2k | uint8_t short_delay_band; | 1900 | | | 1901 | 10.2k | ps_info *ps = (ps_info*)faad_malloc(sizeof(ps_info)); | 1902 | 10.2k | memset(ps, 0, sizeof(ps_info)); | 1903 | | | 1904 | 10.2k | ps->hyb = hybrid_init(numTimeSlotsRate); | 1905 | 10.2k | ps->numTimeSlotsRate = numTimeSlotsRate; | 1906 | | | 1907 | 10.2k | ps->ps_data_available = 0; | 1908 | | | 1909 | | /* delay stuff*/ | 1910 | 10.2k | ps->saved_delay = 0; | 1911 | | | 1912 | 667k | for (i = 0; i < 64; i++) | 1913 | 657k | { | 1914 | 657k | ps->delay_buf_index_delay[i] = 0; | 1915 | 657k | } | 1916 | | | 1917 | 41.0k | for (i = 0; i < NO_ALLPASS_LINKS; i++) | 1918 | 30.8k | { | 1919 | 30.8k | ps->delay_buf_index_ser[i] = 0; | 1920 | | #ifdef PARAM_32KHZ | 1921 | | if (sr_index <= 5) /* >= 32 kHz*/ | 1922 | | { | 1923 | | ps->num_sample_delay_ser[i] = delay_length_d[1][i]; | 1924 | | } else { | 1925 | | ps->num_sample_delay_ser[i] = delay_length_d[0][i]; | 1926 | | } | 1927 | | #else | 1928 | 30.8k | (void)sr_index; | 1929 | | /* THESE ARE CONSTANTS NOW */ | 1930 | 30.8k | ps->num_sample_delay_ser[i] = delay_length_d[i]; | 1931 | 30.8k | #endif | 1932 | 30.8k | } | 1933 | | | 1934 | | #ifdef PARAM_32KHZ | 1935 | | if (sr_index <= 5) /* >= 32 kHz*/ | 1936 | | { | 1937 | | short_delay_band = 35; | 1938 | | ps->nr_allpass_bands = 22; | 1939 | | ps->alpha_decay = FRAC_CONST(0.76592833836465); | 1940 | | ps->alpha_smooth = FRAC_CONST(0.25); | 1941 | | } else { | 1942 | | short_delay_band = 64; | 1943 | | ps->nr_allpass_bands = 45; | 1944 | | ps->alpha_decay = FRAC_CONST(0.58664621951003); | 1945 | | ps->alpha_smooth = FRAC_CONST(0.6); | 1946 | | } | 1947 | | #else | 1948 | | /* THESE ARE CONSTANTS NOW */ | 1949 | 10.2k | short_delay_band = 35; | 1950 | 10.2k | ps->nr_allpass_bands = 22; | 1951 | 10.2k | ps->alpha_decay = FRAC_CONST(0.76592833836465); | 1952 | 10.2k | ps->alpha_smooth = FRAC_CONST(0.25); | 1953 | 10.2k | #endif | 1954 | | | 1955 | | /* THESE ARE CONSTANT NOW IF PS IS INDEPENDANT OF SAMPLERATE */ | 1956 | 369k | for (i = 0; i < short_delay_band; i++) | 1957 | 359k | { | 1958 | 359k | ps->delay_D[i] = 14; | 1959 | 359k | } | 1960 | 308k | for (i = short_delay_band; i < 64; i++) | 1961 | 297k | { | 1962 | 297k | ps->delay_D[i] = 1; | 1963 | 297k | } | 1964 | | | 1965 | | /* mixing and phase */ | 1966 | 523k | for (i = 0; i < 50; i++) | 1967 | 513k | { | 1968 | 513k | RE(ps->h11_prev[i]) = 1; | 1969 | 513k | IM(ps->h11_prev[i]) = 1; | 1970 | 513k | RE(ps->h12_prev[i]) = 1; | 1971 | 513k | IM(ps->h12_prev[i]) = 1; | 1972 | 513k | } | 1973 | | | 1974 | 10.2k | ps->phase_hist = 0; | 1975 | | | 1976 | 215k | for (i = 0; i < 20; i++) | 1977 | 205k | { | 1978 | 205k | RE(ps->ipd_prev[i][0]) = 0; | 1979 | 205k | IM(ps->ipd_prev[i][0]) = 0; | 1980 | 205k | RE(ps->ipd_prev[i][1]) = 0; | 1981 | 205k | IM(ps->ipd_prev[i][1]) = 0; | 1982 | 205k | RE(ps->opd_prev[i][0]) = 0; | 1983 | 205k | IM(ps->opd_prev[i][0]) = 0; | 1984 | 205k | RE(ps->opd_prev[i][1]) = 0; | 1985 | 205k | IM(ps->opd_prev[i][1]) = 0; | 1986 | 205k | } | 1987 | | | 1988 | 10.2k | return ps; | 1989 | 10.2k | } |
Line | Count | Source | 1897 | 16.3k | { | 1898 | 16.3k | uint8_t i; | 1899 | 16.3k | uint8_t short_delay_band; | 1900 | | | 1901 | 16.3k | ps_info *ps = (ps_info*)faad_malloc(sizeof(ps_info)); | 1902 | 16.3k | memset(ps, 0, sizeof(ps_info)); | 1903 | | | 1904 | 16.3k | ps->hyb = hybrid_init(numTimeSlotsRate); | 1905 | 16.3k | ps->numTimeSlotsRate = numTimeSlotsRate; | 1906 | | | 1907 | 16.3k | ps->ps_data_available = 0; | 1908 | | | 1909 | | /* delay stuff*/ | 1910 | 16.3k | ps->saved_delay = 0; | 1911 | | | 1912 | 1.06M | for (i = 0; i < 64; i++) | 1913 | 1.04M | { | 1914 | 1.04M | ps->delay_buf_index_delay[i] = 0; | 1915 | 1.04M | } | 1916 | | | 1917 | 65.5k | for (i = 0; i < NO_ALLPASS_LINKS; i++) | 1918 | 49.1k | { | 1919 | 49.1k | ps->delay_buf_index_ser[i] = 0; | 1920 | | #ifdef PARAM_32KHZ | 1921 | | if (sr_index <= 5) /* >= 32 kHz*/ | 1922 | | { | 1923 | | ps->num_sample_delay_ser[i] = delay_length_d[1][i]; | 1924 | | } else { | 1925 | | ps->num_sample_delay_ser[i] = delay_length_d[0][i]; | 1926 | | } | 1927 | | #else | 1928 | 49.1k | (void)sr_index; | 1929 | | /* THESE ARE CONSTANTS NOW */ | 1930 | 49.1k | ps->num_sample_delay_ser[i] = delay_length_d[i]; | 1931 | 49.1k | #endif | 1932 | 49.1k | } | 1933 | | | 1934 | | #ifdef PARAM_32KHZ | 1935 | | if (sr_index <= 5) /* >= 32 kHz*/ | 1936 | | { | 1937 | | short_delay_band = 35; | 1938 | | ps->nr_allpass_bands = 22; | 1939 | | ps->alpha_decay = FRAC_CONST(0.76592833836465); | 1940 | | ps->alpha_smooth = FRAC_CONST(0.25); | 1941 | | } else { | 1942 | | short_delay_band = 64; | 1943 | | ps->nr_allpass_bands = 45; | 1944 | | ps->alpha_decay = FRAC_CONST(0.58664621951003); | 1945 | | ps->alpha_smooth = FRAC_CONST(0.6); | 1946 | | } | 1947 | | #else | 1948 | | /* THESE ARE CONSTANTS NOW */ | 1949 | 16.3k | short_delay_band = 35; | 1950 | 16.3k | ps->nr_allpass_bands = 22; | 1951 | 16.3k | ps->alpha_decay = FRAC_CONST(0.76592833836465); | 1952 | 16.3k | ps->alpha_smooth = FRAC_CONST(0.25); | 1953 | 16.3k | #endif | 1954 | | | 1955 | | /* THESE ARE CONSTANT NOW IF PS IS INDEPENDANT OF SAMPLERATE */ | 1956 | 590k | for (i = 0; i < short_delay_band; i++) | 1957 | 573k | { | 1958 | 573k | ps->delay_D[i] = 14; | 1959 | 573k | } | 1960 | 491k | for (i = short_delay_band; i < 64; i++) | 1961 | 475k | { | 1962 | 475k | ps->delay_D[i] = 1; | 1963 | 475k | } | 1964 | | | 1965 | | /* mixing and phase */ | 1966 | 836k | for (i = 0; i < 50; i++) | 1967 | 819k | { | 1968 | 819k | RE(ps->h11_prev[i]) = 1; | 1969 | 819k | IM(ps->h11_prev[i]) = 1; | 1970 | 819k | RE(ps->h12_prev[i]) = 1; | 1971 | 819k | IM(ps->h12_prev[i]) = 1; | 1972 | 819k | } | 1973 | | | 1974 | 16.3k | ps->phase_hist = 0; | 1975 | | | 1976 | 344k | for (i = 0; i < 20; i++) | 1977 | 327k | { | 1978 | 327k | RE(ps->ipd_prev[i][0]) = 0; | 1979 | 327k | IM(ps->ipd_prev[i][0]) = 0; | 1980 | 327k | RE(ps->ipd_prev[i][1]) = 0; | 1981 | 327k | IM(ps->ipd_prev[i][1]) = 0; | 1982 | 327k | RE(ps->opd_prev[i][0]) = 0; | 1983 | 327k | IM(ps->opd_prev[i][0]) = 0; | 1984 | 327k | RE(ps->opd_prev[i][1]) = 0; | 1985 | 327k | IM(ps->opd_prev[i][1]) = 0; | 1986 | 327k | } | 1987 | | | 1988 | 16.3k | return ps; | 1989 | 16.3k | } |
|
1990 | | |
1991 | | /* main Parametric Stereo decoding function */ |
1992 | | uint8_t ps_decode(ps_info *ps, qmf_t X_left[38][64], qmf_t X_right[38][64]) |
1993 | 16.8k | { |
1994 | 16.8k | qmf_t X_hybrid_left[32][32] = {{{0}}}; |
1995 | 16.8k | qmf_t X_hybrid_right[32][32] = {{{0}}}; |
1996 | | |
1997 | | /* delta decoding of the bitstream data */ |
1998 | 16.8k | ps_data_decode(ps); |
1999 | | |
2000 | | /* set up some parameters depending on filterbank type */ |
2001 | 16.8k | if (ps->use34hybrid_bands) |
2002 | 6.44k | { |
2003 | 6.44k | ps->group_border = (uint8_t*)group_border34; |
2004 | 6.44k | ps->map_group2bk = (uint16_t*)map_group2bk34; |
2005 | 6.44k | ps->num_groups = 32+18; |
2006 | 6.44k | ps->num_hybrid_groups = 32; |
2007 | 6.44k | ps->nr_par_bands = 34; |
2008 | 6.44k | ps->decay_cutoff = 5; |
2009 | 10.4k | } else { |
2010 | 10.4k | ps->group_border = (uint8_t*)group_border20; |
2011 | 10.4k | ps->map_group2bk = (uint16_t*)map_group2bk20; |
2012 | 10.4k | ps->num_groups = 10+12; |
2013 | 10.4k | ps->num_hybrid_groups = 10; |
2014 | 10.4k | ps->nr_par_bands = 20; |
2015 | 10.4k | ps->decay_cutoff = 3; |
2016 | 10.4k | } |
2017 | | |
2018 | | /* Perform further analysis on the lowest subbands to get a higher |
2019 | | * frequency resolution |
2020 | | */ |
2021 | 16.8k | hybrid_analysis((hyb_info*)ps->hyb, X_left, X_hybrid_left, |
2022 | 16.8k | ps->use34hybrid_bands, ps->numTimeSlotsRate); |
2023 | | |
2024 | | /* decorrelate mono signal */ |
2025 | 16.8k | ps_decorrelate(ps, X_left, X_right, X_hybrid_left, X_hybrid_right); |
2026 | | |
2027 | | /* apply mixing and phase parameters */ |
2028 | 16.8k | ps_mix_phase(ps, X_left, X_right, X_hybrid_left, X_hybrid_right); |
2029 | | |
2030 | | /* hybrid synthesis, to rebuild the SBR QMF matrices */ |
2031 | 16.8k | hybrid_synthesis((hyb_info*)ps->hyb, X_left, X_hybrid_left, |
2032 | 16.8k | ps->use34hybrid_bands, ps->numTimeSlotsRate); |
2033 | | |
2034 | 16.8k | hybrid_synthesis((hyb_info*)ps->hyb, X_right, X_hybrid_right, |
2035 | 16.8k | ps->use34hybrid_bands, ps->numTimeSlotsRate); |
2036 | | |
2037 | 16.8k | return 0; |
2038 | 16.8k | } |
2039 | | |
2040 | | #endif |