Coverage Report

Created: 2026-02-26 06:56

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/proc/self/cwd/libfaad/ps_dec.c
Line
Count
Source
1
/*
2
** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding
3
** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com
4
**
5
** This program is free software; you can redistribute it and/or modify
6
** it under the terms of the GNU General Public License as published by
7
** the Free Software Foundation; either version 2 of the License, or
8
** (at your option) any later version.
9
**
10
** This program is distributed in the hope that it will be useful,
11
** but WITHOUT ANY WARRANTY; without even the implied warranty of
12
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13
** GNU General Public License for more details.
14
**
15
** You should have received a copy of the GNU General Public License
16
** along with this program; if not, write to the Free Software
17
** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
18
**
19
** Any non-GPL usage of this software or parts of this software is strictly
20
** forbidden.
21
**
22
** The "appropriate copyright message" mentioned in section 2c of the GPLv2
23
** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com"
24
**
25
** Commercial non-GPL licensing of this software is possible.
26
** For more info contact Nero AG through Mpeg4AAClicense@nero.com.
27
**
28
** $Id: 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
52.8M
#define NEGATE_IPD_MASK            (0x1000)
42
399k
#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
31.6k
{
198
31.6k
    uint8_t i;
199
200
31.6k
    hyb_info *hyb = (hyb_info*)faad_malloc(sizeof(hyb_info));
201
202
31.6k
    hyb->resolution34[0] = 12;
203
31.6k
    hyb->resolution34[1] = 8;
204
31.6k
    hyb->resolution34[2] = 4;
205
31.6k
    hyb->resolution34[3] = 4;
206
31.6k
    hyb->resolution34[4] = 4;
207
208
31.6k
    hyb->resolution20[0] = 8;
209
31.6k
    hyb->resolution20[1] = 2;
210
31.6k
    hyb->resolution20[2] = 2;
211
212
31.6k
    hyb->frame_len = numTimeSlotsRate;
213
214
31.6k
    hyb->work = (qmf_t*)faad_malloc((hyb->frame_len+12) * sizeof(qmf_t));
215
31.6k
    memset(hyb->work, 0, (hyb->frame_len+12) * sizeof(qmf_t));
216
217
31.6k
    hyb->buffer = (qmf_t**)faad_malloc(5 * sizeof(qmf_t*));
218
189k
    for (i = 0; i < 5; i++)
219
158k
    {
220
158k
        hyb->buffer[i] = (qmf_t*)faad_malloc(hyb->frame_len * sizeof(qmf_t));
221
158k
        memset(hyb->buffer[i], 0, hyb->frame_len * sizeof(qmf_t));
222
158k
    }
223
224
31.6k
    hyb->temp = (qmf_t**)faad_malloc(hyb->frame_len * sizeof(qmf_t*));
225
1.03M
    for (i = 0; i < hyb->frame_len; i++)
226
999k
    {
227
999k
        hyb->temp[i] = (qmf_t*)faad_malloc(12 /*max*/ * sizeof(qmf_t));
228
999k
    }
229
230
31.6k
    return hyb;
231
31.6k
}
232
233
static void hybrid_free(hyb_info *hyb)
234
31.6k
{
235
31.6k
    uint8_t i;
236
237
31.6k
  if (!hyb) return;
238
239
31.6k
    if (hyb->work)
240
31.6k
        faad_free(hyb->work);
241
242
189k
    for (i = 0; i < 5; i++)
243
158k
    {
244
158k
        if (hyb->buffer[i])
245
158k
            faad_free(hyb->buffer[i]);
246
158k
    }
247
31.6k
    if (hyb->buffer)
248
31.6k
        faad_free(hyb->buffer);
249
250
1.03M
    for (i = 0; i < hyb->frame_len; i++)
251
999k
    {
252
999k
        if (hyb->temp[i])
253
999k
            faad_free(hyb->temp[i]);
254
999k
    }
255
31.6k
    if (hyb->temp)
256
31.6k
        faad_free(hyb->temp);
257
258
31.6k
    faad_free(hyb);
259
31.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
54.4k
{
265
54.4k
    uint8_t i;
266
54.4k
    (void)hyb;  /* TODO: remove parameter? */
267
268
1.76M
    for (i = 0; i < frame_len; i++)
269
1.70M
    {
270
1.70M
        real_t r0 = MUL_F(filter[0],(QMF_RE(buffer[0+i]) + QMF_RE(buffer[12+i])));
271
1.70M
        real_t r1 = MUL_F(filter[1],(QMF_RE(buffer[1+i]) + QMF_RE(buffer[11+i])));
272
1.70M
        real_t r2 = MUL_F(filter[2],(QMF_RE(buffer[2+i]) + QMF_RE(buffer[10+i])));
273
1.70M
        real_t r3 = MUL_F(filter[3],(QMF_RE(buffer[3+i]) + QMF_RE(buffer[9+i])));
274
1.70M
        real_t r4 = MUL_F(filter[4],(QMF_RE(buffer[4+i]) + QMF_RE(buffer[8+i])));
275
1.70M
        real_t r5 = MUL_F(filter[5],(QMF_RE(buffer[5+i]) + QMF_RE(buffer[7+i])));
276
1.70M
        real_t r6 = MUL_F(filter[6],QMF_RE(buffer[6+i]));
277
1.70M
        real_t i0 = MUL_F(filter[0],(QMF_IM(buffer[0+i]) + QMF_IM(buffer[12+i])));
278
1.70M
        real_t i1 = MUL_F(filter[1],(QMF_IM(buffer[1+i]) + QMF_IM(buffer[11+i])));
279
1.70M
        real_t i2 = MUL_F(filter[2],(QMF_IM(buffer[2+i]) + QMF_IM(buffer[10+i])));
280
1.70M
        real_t i3 = MUL_F(filter[3],(QMF_IM(buffer[3+i]) + QMF_IM(buffer[9+i])));
281
1.70M
        real_t i4 = MUL_F(filter[4],(QMF_IM(buffer[4+i]) + QMF_IM(buffer[8+i])));
282
1.70M
        real_t i5 = MUL_F(filter[5],(QMF_IM(buffer[5+i]) + QMF_IM(buffer[7+i])));
283
1.70M
        real_t i6 = MUL_F(filter[6],QMF_IM(buffer[6+i]));
284
285
        /* q = 0 */
286
1.70M
        QMF_RE(X_hybrid[i][0]) = r0 + r1 + r2 + r3 + r4 + r5 + r6;
287
1.70M
        QMF_IM(X_hybrid[i][0]) = i0 + i1 + i2 + i3 + i4 + i5 + i6;
288
289
        /* q = 1 */
290
1.70M
        QMF_RE(X_hybrid[i][1]) = r0 - r1 + r2 - r3 + r4 - r5 + r6;
291
1.70M
        QMF_IM(X_hybrid[i][1]) = i0 - i1 + i2 - i3 + i4 - i5 + i6;
292
1.70M
    }
293
54.4k
}
ps_dec.c:channel_filter2
Line
Count
Source
264
27.2k
{
265
27.2k
    uint8_t i;
266
27.2k
    (void)hyb;  /* TODO: remove parameter? */
267
268
881k
    for (i = 0; i < frame_len; i++)
269
854k
    {
270
854k
        real_t r0 = MUL_F(filter[0],(QMF_RE(buffer[0+i]) + QMF_RE(buffer[12+i])));
271
854k
        real_t r1 = MUL_F(filter[1],(QMF_RE(buffer[1+i]) + QMF_RE(buffer[11+i])));
272
854k
        real_t r2 = MUL_F(filter[2],(QMF_RE(buffer[2+i]) + QMF_RE(buffer[10+i])));
273
854k
        real_t r3 = MUL_F(filter[3],(QMF_RE(buffer[3+i]) + QMF_RE(buffer[9+i])));
274
854k
        real_t r4 = MUL_F(filter[4],(QMF_RE(buffer[4+i]) + QMF_RE(buffer[8+i])));
275
854k
        real_t r5 = MUL_F(filter[5],(QMF_RE(buffer[5+i]) + QMF_RE(buffer[7+i])));
276
854k
        real_t r6 = MUL_F(filter[6],QMF_RE(buffer[6+i]));
277
854k
        real_t i0 = MUL_F(filter[0],(QMF_IM(buffer[0+i]) + QMF_IM(buffer[12+i])));
278
854k
        real_t i1 = MUL_F(filter[1],(QMF_IM(buffer[1+i]) + QMF_IM(buffer[11+i])));
279
854k
        real_t i2 = MUL_F(filter[2],(QMF_IM(buffer[2+i]) + QMF_IM(buffer[10+i])));
280
854k
        real_t i3 = MUL_F(filter[3],(QMF_IM(buffer[3+i]) + QMF_IM(buffer[9+i])));
281
854k
        real_t i4 = MUL_F(filter[4],(QMF_IM(buffer[4+i]) + QMF_IM(buffer[8+i])));
282
854k
        real_t i5 = MUL_F(filter[5],(QMF_IM(buffer[5+i]) + QMF_IM(buffer[7+i])));
283
854k
        real_t i6 = MUL_F(filter[6],QMF_IM(buffer[6+i]));
284
285
        /* q = 0 */
286
854k
        QMF_RE(X_hybrid[i][0]) = r0 + r1 + r2 + r3 + r4 + r5 + r6;
287
854k
        QMF_IM(X_hybrid[i][0]) = i0 + i1 + i2 + i3 + i4 + i5 + i6;
288
289
        /* q = 1 */
290
854k
        QMF_RE(X_hybrid[i][1]) = r0 - r1 + r2 - r3 + r4 - r5 + r6;
291
854k
        QMF_IM(X_hybrid[i][1]) = i0 - i1 + i2 - i3 + i4 - i5 + i6;
292
854k
    }
293
27.2k
}
ps_dec.c:channel_filter2
Line
Count
Source
264
27.2k
{
265
27.2k
    uint8_t i;
266
27.2k
    (void)hyb;  /* TODO: remove parameter? */
267
268
881k
    for (i = 0; i < frame_len; i++)
269
854k
    {
270
854k
        real_t r0 = MUL_F(filter[0],(QMF_RE(buffer[0+i]) + QMF_RE(buffer[12+i])));
271
854k
        real_t r1 = MUL_F(filter[1],(QMF_RE(buffer[1+i]) + QMF_RE(buffer[11+i])));
272
854k
        real_t r2 = MUL_F(filter[2],(QMF_RE(buffer[2+i]) + QMF_RE(buffer[10+i])));
273
854k
        real_t r3 = MUL_F(filter[3],(QMF_RE(buffer[3+i]) + QMF_RE(buffer[9+i])));
274
854k
        real_t r4 = MUL_F(filter[4],(QMF_RE(buffer[4+i]) + QMF_RE(buffer[8+i])));
275
854k
        real_t r5 = MUL_F(filter[5],(QMF_RE(buffer[5+i]) + QMF_RE(buffer[7+i])));
276
854k
        real_t r6 = MUL_F(filter[6],QMF_RE(buffer[6+i]));
277
854k
        real_t i0 = MUL_F(filter[0],(QMF_IM(buffer[0+i]) + QMF_IM(buffer[12+i])));
278
854k
        real_t i1 = MUL_F(filter[1],(QMF_IM(buffer[1+i]) + QMF_IM(buffer[11+i])));
279
854k
        real_t i2 = MUL_F(filter[2],(QMF_IM(buffer[2+i]) + QMF_IM(buffer[10+i])));
280
854k
        real_t i3 = MUL_F(filter[3],(QMF_IM(buffer[3+i]) + QMF_IM(buffer[9+i])));
281
854k
        real_t i4 = MUL_F(filter[4],(QMF_IM(buffer[4+i]) + QMF_IM(buffer[8+i])));
282
854k
        real_t i5 = MUL_F(filter[5],(QMF_IM(buffer[5+i]) + QMF_IM(buffer[7+i])));
283
854k
        real_t i6 = MUL_F(filter[6],QMF_IM(buffer[6+i]));
284
285
        /* q = 0 */
286
854k
        QMF_RE(X_hybrid[i][0]) = r0 + r1 + r2 + r3 + r4 + r5 + r6;
287
854k
        QMF_IM(X_hybrid[i][0]) = i0 + i1 + i2 + i3 + i4 + i5 + i6;
288
289
        /* q = 1 */
290
854k
        QMF_RE(X_hybrid[i][1]) = r0 - r1 + r2 - r3 + r4 - r5 + r6;
291
854k
        QMF_IM(X_hybrid[i][1]) = i0 - i1 + i2 - i3 + i4 - i5 + i6;
292
854k
    }
293
27.2k
}
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
22.2k
{
299
22.2k
    uint8_t i;
300
22.2k
    real_t input_re1[2], input_re2[2], input_im1[2], input_im2[2];
301
22.2k
    (void)hyb;  /* TODO: remove parameter? */
302
303
709k
    for (i = 0; i < frame_len; i++)
304
686k
    {
305
686k
        input_re1[0] = -MUL_F(filter[2], (QMF_RE(buffer[i+2]) + QMF_RE(buffer[i+10]))) +
306
686k
            MUL_F(filter[6], QMF_RE(buffer[i+6]));
307
686k
        input_re1[1] = MUL_F(FRAC_CONST(-0.70710678118655),
308
686k
            (MUL_F(filter[1], (QMF_RE(buffer[i+1]) + QMF_RE(buffer[i+11]))) +
309
686k
            MUL_F(filter[3], (QMF_RE(buffer[i+3]) + QMF_RE(buffer[i+9]))) -
310
686k
            MUL_F(filter[5], (QMF_RE(buffer[i+5]) + QMF_RE(buffer[i+7])))));
311
312
686k
        input_im1[0] = MUL_F(filter[0], (QMF_IM(buffer[i+0]) - QMF_IM(buffer[i+12]))) -
313
686k
            MUL_F(filter[4], (QMF_IM(buffer[i+4]) - QMF_IM(buffer[i+8])));
314
686k
        input_im1[1] = MUL_F(FRAC_CONST(0.70710678118655),
315
686k
            (MUL_F(filter[1], (QMF_IM(buffer[i+1]) - QMF_IM(buffer[i+11]))) -
316
686k
            MUL_F(filter[3], (QMF_IM(buffer[i+3]) - QMF_IM(buffer[i+9]))) -
317
686k
            MUL_F(filter[5], (QMF_IM(buffer[i+5]) - QMF_IM(buffer[i+7])))));
318
319
686k
        input_re2[0] = MUL_F(filter[0], (QMF_RE(buffer[i+0]) - QMF_RE(buffer[i+12]))) -
320
686k
            MUL_F(filter[4], (QMF_RE(buffer[i+4]) - QMF_RE(buffer[i+8])));
321
686k
        input_re2[1] = MUL_F(FRAC_CONST(0.70710678118655),
322
686k
            (MUL_F(filter[1], (QMF_RE(buffer[i+1]) - QMF_RE(buffer[i+11]))) -
323
686k
            MUL_F(filter[3], (QMF_RE(buffer[i+3]) - QMF_RE(buffer[i+9]))) -
324
686k
            MUL_F(filter[5], (QMF_RE(buffer[i+5]) - QMF_RE(buffer[i+7])))));
325
326
686k
        input_im2[0] = -MUL_F(filter[2], (QMF_IM(buffer[i+2]) + QMF_IM(buffer[i+10]))) +
327
686k
            MUL_F(filter[6], QMF_IM(buffer[i+6]));
328
686k
        input_im2[1] = MUL_F(FRAC_CONST(-0.70710678118655),
329
686k
            (MUL_F(filter[1], (QMF_IM(buffer[i+1]) + QMF_IM(buffer[i+11]))) +
330
686k
            MUL_F(filter[3], (QMF_IM(buffer[i+3]) + QMF_IM(buffer[i+9]))) -
331
686k
            MUL_F(filter[5], (QMF_IM(buffer[i+5]) + QMF_IM(buffer[i+7])))));
332
333
        /* q == 0 */
334
686k
        QMF_RE(X_hybrid[i][0]) =  input_re1[0] + input_re1[1] + input_im1[0] + input_im1[1];
335
686k
        QMF_IM(X_hybrid[i][0]) = -input_re2[0] - input_re2[1] + input_im2[0] + input_im2[1];
336
337
        /* q == 1 */
338
686k
        QMF_RE(X_hybrid[i][1]) =  input_re1[0] - input_re1[1] - input_im1[0] + input_im1[1];
339
686k
        QMF_IM(X_hybrid[i][1]) =  input_re2[0] - input_re2[1] + input_im2[0] - input_im2[1];
340
341
        /* q == 2 */
342
686k
        QMF_RE(X_hybrid[i][2]) =  input_re1[0] - input_re1[1] + input_im1[0] - input_im1[1];
343
686k
        QMF_IM(X_hybrid[i][2]) = -input_re2[0] + input_re2[1] + input_im2[0] - input_im2[1];
344
345
        /* q == 3 */
346
686k
        QMF_RE(X_hybrid[i][3]) =  input_re1[0] + input_re1[1] - input_im1[0] - input_im1[1];
347
686k
        QMF_IM(X_hybrid[i][3]) =  input_re2[0] + input_re2[1] + input_im2[0] + input_im2[1];
348
686k
    }
349
22.2k
}
ps_dec.c:channel_filter4
Line
Count
Source
298
9.24k
{
299
9.24k
    uint8_t i;
300
9.24k
    real_t input_re1[2], input_re2[2], input_im1[2], input_im2[2];
301
9.24k
    (void)hyb;  /* TODO: remove parameter? */
302
303
294k
    for (i = 0; i < frame_len; i++)
304
285k
    {
305
285k
        input_re1[0] = -MUL_F(filter[2], (QMF_RE(buffer[i+2]) + QMF_RE(buffer[i+10]))) +
306
285k
            MUL_F(filter[6], QMF_RE(buffer[i+6]));
307
285k
        input_re1[1] = MUL_F(FRAC_CONST(-0.70710678118655),
308
285k
            (MUL_F(filter[1], (QMF_RE(buffer[i+1]) + QMF_RE(buffer[i+11]))) +
309
285k
            MUL_F(filter[3], (QMF_RE(buffer[i+3]) + QMF_RE(buffer[i+9]))) -
310
285k
            MUL_F(filter[5], (QMF_RE(buffer[i+5]) + QMF_RE(buffer[i+7])))));
311
312
285k
        input_im1[0] = MUL_F(filter[0], (QMF_IM(buffer[i+0]) - QMF_IM(buffer[i+12]))) -
313
285k
            MUL_F(filter[4], (QMF_IM(buffer[i+4]) - QMF_IM(buffer[i+8])));
314
285k
        input_im1[1] = MUL_F(FRAC_CONST(0.70710678118655),
315
285k
            (MUL_F(filter[1], (QMF_IM(buffer[i+1]) - QMF_IM(buffer[i+11]))) -
316
285k
            MUL_F(filter[3], (QMF_IM(buffer[i+3]) - QMF_IM(buffer[i+9]))) -
317
285k
            MUL_F(filter[5], (QMF_IM(buffer[i+5]) - QMF_IM(buffer[i+7])))));
318
319
285k
        input_re2[0] = MUL_F(filter[0], (QMF_RE(buffer[i+0]) - QMF_RE(buffer[i+12]))) -
320
285k
            MUL_F(filter[4], (QMF_RE(buffer[i+4]) - QMF_RE(buffer[i+8])));
321
285k
        input_re2[1] = MUL_F(FRAC_CONST(0.70710678118655),
322
285k
            (MUL_F(filter[1], (QMF_RE(buffer[i+1]) - QMF_RE(buffer[i+11]))) -
323
285k
            MUL_F(filter[3], (QMF_RE(buffer[i+3]) - QMF_RE(buffer[i+9]))) -
324
285k
            MUL_F(filter[5], (QMF_RE(buffer[i+5]) - QMF_RE(buffer[i+7])))));
325
326
285k
        input_im2[0] = -MUL_F(filter[2], (QMF_IM(buffer[i+2]) + QMF_IM(buffer[i+10]))) +
327
285k
            MUL_F(filter[6], QMF_IM(buffer[i+6]));
328
285k
        input_im2[1] = MUL_F(FRAC_CONST(-0.70710678118655),
329
285k
            (MUL_F(filter[1], (QMF_IM(buffer[i+1]) + QMF_IM(buffer[i+11]))) +
330
285k
            MUL_F(filter[3], (QMF_IM(buffer[i+3]) + QMF_IM(buffer[i+9]))) -
331
285k
            MUL_F(filter[5], (QMF_IM(buffer[i+5]) + QMF_IM(buffer[i+7])))));
332
333
        /* q == 0 */
334
285k
        QMF_RE(X_hybrid[i][0]) =  input_re1[0] + input_re1[1] + input_im1[0] + input_im1[1];
335
285k
        QMF_IM(X_hybrid[i][0]) = -input_re2[0] - input_re2[1] + input_im2[0] + input_im2[1];
336
337
        /* q == 1 */
338
285k
        QMF_RE(X_hybrid[i][1]) =  input_re1[0] - input_re1[1] - input_im1[0] + input_im1[1];
339
285k
        QMF_IM(X_hybrid[i][1]) =  input_re2[0] - input_re2[1] + input_im2[0] - input_im2[1];
340
341
        /* q == 2 */
342
285k
        QMF_RE(X_hybrid[i][2]) =  input_re1[0] - input_re1[1] + input_im1[0] - input_im1[1];
343
285k
        QMF_IM(X_hybrid[i][2]) = -input_re2[0] + input_re2[1] + input_im2[0] - input_im2[1];
344
345
        /* q == 3 */
346
285k
        QMF_RE(X_hybrid[i][3]) =  input_re1[0] + input_re1[1] - input_im1[0] - input_im1[1];
347
285k
        QMF_IM(X_hybrid[i][3]) =  input_re2[0] + input_re2[1] + input_im2[0] + input_im2[1];
348
285k
    }
349
9.24k
}
ps_dec.c:channel_filter4
Line
Count
Source
298
13.0k
{
299
13.0k
    uint8_t i;
300
13.0k
    real_t input_re1[2], input_re2[2], input_im1[2], input_im2[2];
301
13.0k
    (void)hyb;  /* TODO: remove parameter? */
302
303
414k
    for (i = 0; i < frame_len; i++)
304
401k
    {
305
401k
        input_re1[0] = -MUL_F(filter[2], (QMF_RE(buffer[i+2]) + QMF_RE(buffer[i+10]))) +
306
401k
            MUL_F(filter[6], QMF_RE(buffer[i+6]));
307
401k
        input_re1[1] = MUL_F(FRAC_CONST(-0.70710678118655),
308
401k
            (MUL_F(filter[1], (QMF_RE(buffer[i+1]) + QMF_RE(buffer[i+11]))) +
309
401k
            MUL_F(filter[3], (QMF_RE(buffer[i+3]) + QMF_RE(buffer[i+9]))) -
310
401k
            MUL_F(filter[5], (QMF_RE(buffer[i+5]) + QMF_RE(buffer[i+7])))));
311
312
401k
        input_im1[0] = MUL_F(filter[0], (QMF_IM(buffer[i+0]) - QMF_IM(buffer[i+12]))) -
313
401k
            MUL_F(filter[4], (QMF_IM(buffer[i+4]) - QMF_IM(buffer[i+8])));
314
401k
        input_im1[1] = MUL_F(FRAC_CONST(0.70710678118655),
315
401k
            (MUL_F(filter[1], (QMF_IM(buffer[i+1]) - QMF_IM(buffer[i+11]))) -
316
401k
            MUL_F(filter[3], (QMF_IM(buffer[i+3]) - QMF_IM(buffer[i+9]))) -
317
401k
            MUL_F(filter[5], (QMF_IM(buffer[i+5]) - QMF_IM(buffer[i+7])))));
318
319
401k
        input_re2[0] = MUL_F(filter[0], (QMF_RE(buffer[i+0]) - QMF_RE(buffer[i+12]))) -
320
401k
            MUL_F(filter[4], (QMF_RE(buffer[i+4]) - QMF_RE(buffer[i+8])));
321
401k
        input_re2[1] = MUL_F(FRAC_CONST(0.70710678118655),
322
401k
            (MUL_F(filter[1], (QMF_RE(buffer[i+1]) - QMF_RE(buffer[i+11]))) -
323
401k
            MUL_F(filter[3], (QMF_RE(buffer[i+3]) - QMF_RE(buffer[i+9]))) -
324
401k
            MUL_F(filter[5], (QMF_RE(buffer[i+5]) - QMF_RE(buffer[i+7])))));
325
326
401k
        input_im2[0] = -MUL_F(filter[2], (QMF_IM(buffer[i+2]) + QMF_IM(buffer[i+10]))) +
327
401k
            MUL_F(filter[6], QMF_IM(buffer[i+6]));
328
401k
        input_im2[1] = MUL_F(FRAC_CONST(-0.70710678118655),
329
401k
            (MUL_F(filter[1], (QMF_IM(buffer[i+1]) + QMF_IM(buffer[i+11]))) +
330
401k
            MUL_F(filter[3], (QMF_IM(buffer[i+3]) + QMF_IM(buffer[i+9]))) -
331
401k
            MUL_F(filter[5], (QMF_IM(buffer[i+5]) + QMF_IM(buffer[i+7])))));
332
333
        /* q == 0 */
334
401k
        QMF_RE(X_hybrid[i][0]) =  input_re1[0] + input_re1[1] + input_im1[0] + input_im1[1];
335
401k
        QMF_IM(X_hybrid[i][0]) = -input_re2[0] - input_re2[1] + input_im2[0] + input_im2[1];
336
337
        /* q == 1 */
338
401k
        QMF_RE(X_hybrid[i][1]) =  input_re1[0] - input_re1[1] - input_im1[0] + input_im1[1];
339
401k
        QMF_IM(X_hybrid[i][1]) =  input_re2[0] - input_re2[1] + input_im2[0] - input_im2[1];
340
341
        /* q == 2 */
342
401k
        QMF_RE(X_hybrid[i][2]) =  input_re1[0] - input_re1[1] + input_im1[0] - input_im1[1];
343
401k
        QMF_IM(X_hybrid[i][2]) = -input_re2[0] + input_re2[1] + input_im2[0] - input_im2[1];
344
345
        /* q == 3 */
346
401k
        QMF_RE(X_hybrid[i][3]) =  input_re1[0] + input_re1[1] - input_im1[0] - input_im1[1];
347
401k
        QMF_IM(X_hybrid[i][3]) =  input_re2[0] + input_re2[1] + input_im2[0] + input_im2[1];
348
401k
    }
349
13.0k
}
350
351
static void INLINE DCT3_4_unscaled(real_t *y, real_t *x)
352
2.62M
{
353
2.62M
    real_t f0, f1, f2, f3, f4, f5, f6, f7, f8;
354
355
2.62M
    f0 = MUL_F(x[2], FRAC_CONST(0.7071067811865476));
356
2.62M
    f1 = x[0] - f0;
357
2.62M
    f2 = x[0] + f0;
358
2.62M
    f3 = x[1] + x[3];
359
2.62M
    f4 = MUL_C(x[1], COEF_CONST(1.3065629648763766));
360
2.62M
    f5 = MUL_F(f3, FRAC_CONST(-0.9238795325112866));
361
2.62M
    f6 = MUL_F(x[3], FRAC_CONST(-0.5411961001461967));
362
2.62M
    f7 = f4 + f5;
363
2.62M
    f8 = f6 - f5;
364
2.62M
    y[3] = f2 - f8;
365
2.62M
    y[0] = f2 + f8;
366
2.62M
    y[2] = f1 - f7;
367
2.62M
    y[1] = f1 + f7;
368
2.62M
}
ps_dec.c:DCT3_4_unscaled
Line
Count
Source
352
1.13M
{
353
1.13M
    real_t f0, f1, f2, f3, f4, f5, f6, f7, f8;
354
355
1.13M
    f0 = MUL_F(x[2], FRAC_CONST(0.7071067811865476));
356
1.13M
    f1 = x[0] - f0;
357
1.13M
    f2 = x[0] + f0;
358
1.13M
    f3 = x[1] + x[3];
359
1.13M
    f4 = MUL_C(x[1], COEF_CONST(1.3065629648763766));
360
1.13M
    f5 = MUL_F(f3, FRAC_CONST(-0.9238795325112866));
361
1.13M
    f6 = MUL_F(x[3], FRAC_CONST(-0.5411961001461967));
362
1.13M
    f7 = f4 + f5;
363
1.13M
    f8 = f6 - f5;
364
1.13M
    y[3] = f2 - f8;
365
1.13M
    y[0] = f2 + f8;
366
1.13M
    y[2] = f1 - f7;
367
1.13M
    y[1] = f1 + f7;
368
1.13M
}
ps_dec.c:DCT3_4_unscaled
Line
Count
Source
352
1.48M
{
353
1.48M
    real_t f0, f1, f2, f3, f4, f5, f6, f7, f8;
354
355
1.48M
    f0 = MUL_F(x[2], FRAC_CONST(0.7071067811865476));
356
1.48M
    f1 = x[0] - f0;
357
1.48M
    f2 = x[0] + f0;
358
1.48M
    f3 = x[1] + x[3];
359
1.48M
    f4 = MUL_C(x[1], COEF_CONST(1.3065629648763766));
360
1.48M
    f5 = MUL_F(f3, FRAC_CONST(-0.9238795325112866));
361
1.48M
    f6 = MUL_F(x[3], FRAC_CONST(-0.5411961001461967));
362
1.48M
    f7 = f4 + f5;
363
1.48M
    f8 = f6 - f5;
364
1.48M
    y[3] = f2 - f8;
365
1.48M
    y[0] = f2 + f8;
366
1.48M
    y[2] = f1 - f7;
367
1.48M
    y[1] = f1 + f7;
368
1.48M
}
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
42.0k
{
374
42.0k
    uint8_t i, n;
375
42.0k
    real_t input_re1[4], input_re2[4], input_im1[4], input_im2[4];
376
42.0k
    real_t x[4];
377
42.0k
    (void)hyb;  /* TODO: remove parameter? */
378
379
1.35M
    for (i = 0; i < frame_len; i++)
380
1.31M
    {
381
1.31M
        input_re1[0] =  MUL_F(filter[6],QMF_RE(buffer[6+i]));
382
1.31M
        input_re1[1] =  MUL_F(filter[5],(QMF_RE(buffer[5+i]) + QMF_RE(buffer[7+i])));
383
1.31M
        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.31M
        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.31M
        input_im1[0] = MUL_F(filter[5],(QMF_IM(buffer[7+i]) - QMF_IM(buffer[5+i])));
387
1.31M
        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.31M
        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.31M
        input_im1[3] = MUL_F(filter[2],(QMF_IM(buffer[10+i]) - QMF_IM(buffer[2+i])));
390
391
6.55M
        for (n = 0; n < 4; n++)
392
5.24M
        {
393
5.24M
            x[n] = input_re1[n] - input_im1[3-n];
394
5.24M
        }
395
1.31M
        DCT3_4_unscaled(x, x);
396
1.31M
        QMF_RE(X_hybrid[i][7]) = x[0];
397
1.31M
        QMF_RE(X_hybrid[i][5]) = x[2];
398
1.31M
        QMF_RE(X_hybrid[i][3]) = x[3];
399
1.31M
        QMF_RE(X_hybrid[i][1]) = x[1];
400
401
6.55M
        for (n = 0; n < 4; n++)
402
5.24M
        {
403
5.24M
            x[n] = input_re1[n] + input_im1[3-n];
404
5.24M
        }
405
1.31M
        DCT3_4_unscaled(x, x);
406
1.31M
        QMF_RE(X_hybrid[i][6]) = x[1];
407
1.31M
        QMF_RE(X_hybrid[i][4]) = x[3];
408
1.31M
        QMF_RE(X_hybrid[i][2]) = x[2];
409
1.31M
        QMF_RE(X_hybrid[i][0]) = x[0];
410
411
1.31M
        input_im2[0] =  MUL_F(filter[6],QMF_IM(buffer[6+i]));
412
1.31M
        input_im2[1] =  MUL_F(filter[5],(QMF_IM(buffer[5+i]) + QMF_IM(buffer[7+i])));
413
1.31M
        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.31M
        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.31M
        input_re2[0] = MUL_F(filter[5],(QMF_RE(buffer[7+i]) - QMF_RE(buffer[5+i])));
417
1.31M
        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.31M
        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.31M
        input_re2[3] = MUL_F(filter[2],(QMF_RE(buffer[10+i]) - QMF_RE(buffer[2+i])));
420
421
6.55M
        for (n = 0; n < 4; n++)
422
5.24M
        {
423
5.24M
            x[n] = input_im2[n] + input_re2[3-n];
424
5.24M
        }
425
1.31M
        DCT3_4_unscaled(x, x);
426
1.31M
        QMF_IM(X_hybrid[i][7]) = x[0];
427
1.31M
        QMF_IM(X_hybrid[i][5]) = x[2];
428
1.31M
        QMF_IM(X_hybrid[i][3]) = x[3];
429
1.31M
        QMF_IM(X_hybrid[i][1]) = x[1];
430
431
6.55M
        for (n = 0; n < 4; n++)
432
5.24M
        {
433
5.24M
            x[n] = input_im2[n] - input_re2[3-n];
434
5.24M
        }
435
1.31M
        DCT3_4_unscaled(x, x);
436
1.31M
        QMF_IM(X_hybrid[i][6]) = x[1];
437
1.31M
        QMF_IM(X_hybrid[i][4]) = x[3];
438
1.31M
        QMF_IM(X_hybrid[i][2]) = x[2];
439
1.31M
        QMF_IM(X_hybrid[i][0]) = x[0];
440
1.31M
    }
441
42.0k
}
ps_dec.c:channel_filter8
Line
Count
Source
373
21.0k
{
374
21.0k
    uint8_t i, n;
375
21.0k
    real_t input_re1[4], input_re2[4], input_im1[4], input_im2[4];
376
21.0k
    real_t x[4];
377
21.0k
    (void)hyb;  /* TODO: remove parameter? */
378
379
677k
    for (i = 0; i < frame_len; i++)
380
655k
    {
381
655k
        input_re1[0] =  MUL_F(filter[6],QMF_RE(buffer[6+i]));
382
655k
        input_re1[1] =  MUL_F(filter[5],(QMF_RE(buffer[5+i]) + QMF_RE(buffer[7+i])));
383
655k
        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
655k
        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
655k
        input_im1[0] = MUL_F(filter[5],(QMF_IM(buffer[7+i]) - QMF_IM(buffer[5+i])));
387
655k
        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
655k
        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
655k
        input_im1[3] = MUL_F(filter[2],(QMF_IM(buffer[10+i]) - QMF_IM(buffer[2+i])));
390
391
3.27M
        for (n = 0; n < 4; n++)
392
2.62M
        {
393
2.62M
            x[n] = input_re1[n] - input_im1[3-n];
394
2.62M
        }
395
655k
        DCT3_4_unscaled(x, x);
396
655k
        QMF_RE(X_hybrid[i][7]) = x[0];
397
655k
        QMF_RE(X_hybrid[i][5]) = x[2];
398
655k
        QMF_RE(X_hybrid[i][3]) = x[3];
399
655k
        QMF_RE(X_hybrid[i][1]) = x[1];
400
401
3.27M
        for (n = 0; n < 4; n++)
402
2.62M
        {
403
2.62M
            x[n] = input_re1[n] + input_im1[3-n];
404
2.62M
        }
405
655k
        DCT3_4_unscaled(x, x);
406
655k
        QMF_RE(X_hybrid[i][6]) = x[1];
407
655k
        QMF_RE(X_hybrid[i][4]) = x[3];
408
655k
        QMF_RE(X_hybrid[i][2]) = x[2];
409
655k
        QMF_RE(X_hybrid[i][0]) = x[0];
410
411
655k
        input_im2[0] =  MUL_F(filter[6],QMF_IM(buffer[6+i]));
412
655k
        input_im2[1] =  MUL_F(filter[5],(QMF_IM(buffer[5+i]) + QMF_IM(buffer[7+i])));
413
655k
        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
655k
        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
655k
        input_re2[0] = MUL_F(filter[5],(QMF_RE(buffer[7+i]) - QMF_RE(buffer[5+i])));
417
655k
        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
655k
        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
655k
        input_re2[3] = MUL_F(filter[2],(QMF_RE(buffer[10+i]) - QMF_RE(buffer[2+i])));
420
421
3.27M
        for (n = 0; n < 4; n++)
422
2.62M
        {
423
2.62M
            x[n] = input_im2[n] + input_re2[3-n];
424
2.62M
        }
425
655k
        DCT3_4_unscaled(x, x);
426
655k
        QMF_IM(X_hybrid[i][7]) = x[0];
427
655k
        QMF_IM(X_hybrid[i][5]) = x[2];
428
655k
        QMF_IM(X_hybrid[i][3]) = x[3];
429
655k
        QMF_IM(X_hybrid[i][1]) = x[1];
430
431
3.27M
        for (n = 0; n < 4; n++)
432
2.62M
        {
433
2.62M
            x[n] = input_im2[n] - input_re2[3-n];
434
2.62M
        }
435
655k
        DCT3_4_unscaled(x, x);
436
655k
        QMF_IM(X_hybrid[i][6]) = x[1];
437
655k
        QMF_IM(X_hybrid[i][4]) = x[3];
438
655k
        QMF_IM(X_hybrid[i][2]) = x[2];
439
655k
        QMF_IM(X_hybrid[i][0]) = x[0];
440
655k
    }
441
21.0k
}
ps_dec.c:channel_filter8
Line
Count
Source
373
21.0k
{
374
21.0k
    uint8_t i, n;
375
21.0k
    real_t input_re1[4], input_re2[4], input_im1[4], input_im2[4];
376
21.0k
    real_t x[4];
377
21.0k
    (void)hyb;  /* TODO: remove parameter? */
378
379
677k
    for (i = 0; i < frame_len; i++)
380
655k
    {
381
655k
        input_re1[0] =  MUL_F(filter[6],QMF_RE(buffer[6+i]));
382
655k
        input_re1[1] =  MUL_F(filter[5],(QMF_RE(buffer[5+i]) + QMF_RE(buffer[7+i])));
383
655k
        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
655k
        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
655k
        input_im1[0] = MUL_F(filter[5],(QMF_IM(buffer[7+i]) - QMF_IM(buffer[5+i])));
387
655k
        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
655k
        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
655k
        input_im1[3] = MUL_F(filter[2],(QMF_IM(buffer[10+i]) - QMF_IM(buffer[2+i])));
390
391
3.27M
        for (n = 0; n < 4; n++)
392
2.62M
        {
393
2.62M
            x[n] = input_re1[n] - input_im1[3-n];
394
2.62M
        }
395
655k
        DCT3_4_unscaled(x, x);
396
655k
        QMF_RE(X_hybrid[i][7]) = x[0];
397
655k
        QMF_RE(X_hybrid[i][5]) = x[2];
398
655k
        QMF_RE(X_hybrid[i][3]) = x[3];
399
655k
        QMF_RE(X_hybrid[i][1]) = x[1];
400
401
3.27M
        for (n = 0; n < 4; n++)
402
2.62M
        {
403
2.62M
            x[n] = input_re1[n] + input_im1[3-n];
404
2.62M
        }
405
655k
        DCT3_4_unscaled(x, x);
406
655k
        QMF_RE(X_hybrid[i][6]) = x[1];
407
655k
        QMF_RE(X_hybrid[i][4]) = x[3];
408
655k
        QMF_RE(X_hybrid[i][2]) = x[2];
409
655k
        QMF_RE(X_hybrid[i][0]) = x[0];
410
411
655k
        input_im2[0] =  MUL_F(filter[6],QMF_IM(buffer[6+i]));
412
655k
        input_im2[1] =  MUL_F(filter[5],(QMF_IM(buffer[5+i]) + QMF_IM(buffer[7+i])));
413
655k
        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
655k
        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
655k
        input_re2[0] = MUL_F(filter[5],(QMF_RE(buffer[7+i]) - QMF_RE(buffer[5+i])));
417
655k
        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
655k
        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
655k
        input_re2[3] = MUL_F(filter[2],(QMF_RE(buffer[10+i]) - QMF_RE(buffer[2+i])));
420
421
3.27M
        for (n = 0; n < 4; n++)
422
2.62M
        {
423
2.62M
            x[n] = input_im2[n] + input_re2[3-n];
424
2.62M
        }
425
655k
        DCT3_4_unscaled(x, x);
426
655k
        QMF_IM(X_hybrid[i][7]) = x[0];
427
655k
        QMF_IM(X_hybrid[i][5]) = x[2];
428
655k
        QMF_IM(X_hybrid[i][3]) = x[3];
429
655k
        QMF_IM(X_hybrid[i][1]) = x[1];
430
431
3.27M
        for (n = 0; n < 4; n++)
432
2.62M
        {
433
2.62M
            x[n] = input_im2[n] - input_re2[3-n];
434
2.62M
        }
435
655k
        DCT3_4_unscaled(x, x);
436
655k
        QMF_IM(X_hybrid[i][6]) = x[1];
437
655k
        QMF_IM(X_hybrid[i][4]) = x[3];
438
655k
        QMF_IM(X_hybrid[i][2]) = x[2];
439
655k
        QMF_IM(X_hybrid[i][0]) = x[0];
440
655k
    }
441
21.0k
}
442
443
static void INLINE DCT3_6_unscaled(real_t *y, real_t *x)
444
915k
{
445
915k
    real_t f0, f1, f2, f3, f4, f5, f6, f7;
446
447
915k
    f0 = MUL_F(x[3], FRAC_CONST(0.70710678118655));
448
915k
    f1 = x[0] + f0;
449
915k
    f2 = x[0] - f0;
450
915k
    f3 = MUL_F((x[1] - x[5]), FRAC_CONST(0.70710678118655));
451
915k
    f4 = MUL_F(x[2], FRAC_CONST(0.86602540378444)) + MUL_F(x[4], FRAC_CONST(0.5));
452
915k
    f5 = f4 - x[4];
453
915k
    f6 = MUL_F(x[1], FRAC_CONST(0.96592582628907)) + MUL_F(x[5], FRAC_CONST(0.25881904510252));
454
915k
    f7 = f6 - f3;
455
915k
    y[0] = f1 + f6 + f4;
456
915k
    y[1] = f2 + f3 - x[4];
457
915k
    y[2] = f7 + f2 - f5;
458
915k
    y[3] = f1 - f7 - f5;
459
915k
    y[4] = f1 - f3 - x[4];
460
915k
    y[5] = f2 - f6 + f4;
461
915k
}
ps_dec.c:DCT3_6_unscaled
Line
Count
Source
444
380k
{
445
380k
    real_t f0, f1, f2, f3, f4, f5, f6, f7;
446
447
380k
    f0 = MUL_F(x[3], FRAC_CONST(0.70710678118655));
448
380k
    f1 = x[0] + f0;
449
380k
    f2 = x[0] - f0;
450
380k
    f3 = MUL_F((x[1] - x[5]), FRAC_CONST(0.70710678118655));
451
380k
    f4 = MUL_F(x[2], FRAC_CONST(0.86602540378444)) + MUL_F(x[4], FRAC_CONST(0.5));
452
380k
    f5 = f4 - x[4];
453
380k
    f6 = MUL_F(x[1], FRAC_CONST(0.96592582628907)) + MUL_F(x[5], FRAC_CONST(0.25881904510252));
454
380k
    f7 = f6 - f3;
455
380k
    y[0] = f1 + f6 + f4;
456
380k
    y[1] = f2 + f3 - x[4];
457
380k
    y[2] = f7 + f2 - f5;
458
380k
    y[3] = f1 - f7 - f5;
459
380k
    y[4] = f1 - f3 - x[4];
460
380k
    y[5] = f2 - f6 + f4;
461
380k
}
ps_dec.c:DCT3_6_unscaled
Line
Count
Source
444
535k
{
445
535k
    real_t f0, f1, f2, f3, f4, f5, f6, f7;
446
447
535k
    f0 = MUL_F(x[3], FRAC_CONST(0.70710678118655));
448
535k
    f1 = x[0] + f0;
449
535k
    f2 = x[0] - f0;
450
535k
    f3 = MUL_F((x[1] - x[5]), FRAC_CONST(0.70710678118655));
451
535k
    f4 = MUL_F(x[2], FRAC_CONST(0.86602540378444)) + MUL_F(x[4], FRAC_CONST(0.5));
452
535k
    f5 = f4 - x[4];
453
535k
    f6 = MUL_F(x[1], FRAC_CONST(0.96592582628907)) + MUL_F(x[5], FRAC_CONST(0.25881904510252));
454
535k
    f7 = f6 - f3;
455
535k
    y[0] = f1 + f6 + f4;
456
535k
    y[1] = f2 + f3 - x[4];
457
535k
    y[2] = f7 + f2 - f5;
458
535k
    y[3] = f1 - f7 - f5;
459
535k
    y[4] = f1 - f3 - x[4];
460
535k
    y[5] = f2 - f6 + f4;
461
535k
}
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
14.8k
{
467
14.8k
    uint8_t i, n;
468
14.8k
    real_t input_re1[6], input_re2[6], input_im1[6], input_im2[6];
469
14.8k
    real_t out_re1[6], out_re2[6], out_im1[6], out_im2[6];
470
14.8k
    (void)hyb;  /* TODO: remove parameter? */
471
472
472k
    for (i = 0; i < frame_len; i++)
473
457k
    {
474
3.20M
        for (n = 0; n < 6; n++)
475
2.74M
        {
476
2.74M
            if (n == 0)
477
457k
            {
478
457k
                input_re1[0] = MUL_F(QMF_RE(buffer[6+i]), filter[6]);
479
457k
                input_re2[0] = MUL_F(QMF_IM(buffer[6+i]), filter[6]);
480
2.28M
            } else {
481
2.28M
                input_re1[6-n] = MUL_F((QMF_RE(buffer[n+i]) + QMF_RE(buffer[12-n+i])), filter[n]);
482
2.28M
                input_re2[6-n] = MUL_F((QMF_IM(buffer[n+i]) + QMF_IM(buffer[12-n+i])), filter[n]);
483
2.28M
            }
484
2.74M
            input_im2[n] = MUL_F((QMF_RE(buffer[n+i]) - QMF_RE(buffer[12-n+i])), filter[n]);
485
2.74M
            input_im1[n] = MUL_F((QMF_IM(buffer[n+i]) - QMF_IM(buffer[12-n+i])), filter[n]);
486
2.74M
        }
487
488
457k
        DCT3_6_unscaled(out_re1, input_re1);
489
457k
        DCT3_6_unscaled(out_re2, input_re2);
490
491
457k
        DCT3_6_unscaled(out_im1, input_im1);
492
457k
        DCT3_6_unscaled(out_im2, input_im2);
493
494
1.83M
        for (n = 0; n < 6; n += 2)
495
1.37M
        {
496
1.37M
            QMF_RE(X_hybrid[i][n]) = out_re1[n] - out_im1[n];
497
1.37M
            QMF_IM(X_hybrid[i][n]) = out_re2[n] + out_im2[n];
498
1.37M
            QMF_RE(X_hybrid[i][n+1]) = out_re1[n+1] + out_im1[n+1];
499
1.37M
            QMF_IM(X_hybrid[i][n+1]) = out_re2[n+1] - out_im2[n+1];
500
501
1.37M
            QMF_RE(X_hybrid[i][10-n]) = out_re1[n+1] - out_im1[n+1];
502
1.37M
            QMF_IM(X_hybrid[i][10-n]) = out_re2[n+1] + out_im2[n+1];
503
1.37M
            QMF_RE(X_hybrid[i][11-n]) = out_re1[n] + out_im1[n];
504
1.37M
            QMF_IM(X_hybrid[i][11-n]) = out_re2[n] - out_im2[n];
505
1.37M
        }
506
457k
    }
507
14.8k
}
ps_dec.c:channel_filter12
Line
Count
Source
466
7.42k
{
467
7.42k
    uint8_t i, n;
468
7.42k
    real_t input_re1[6], input_re2[6], input_im1[6], input_im2[6];
469
7.42k
    real_t out_re1[6], out_re2[6], out_im1[6], out_im2[6];
470
7.42k
    (void)hyb;  /* TODO: remove parameter? */
471
472
236k
    for (i = 0; i < frame_len; i++)
473
228k
    {
474
1.60M
        for (n = 0; n < 6; n++)
475
1.37M
        {
476
1.37M
            if (n == 0)
477
228k
            {
478
228k
                input_re1[0] = MUL_F(QMF_RE(buffer[6+i]), filter[6]);
479
228k
                input_re2[0] = MUL_F(QMF_IM(buffer[6+i]), filter[6]);
480
1.14M
            } else {
481
1.14M
                input_re1[6-n] = MUL_F((QMF_RE(buffer[n+i]) + QMF_RE(buffer[12-n+i])), filter[n]);
482
1.14M
                input_re2[6-n] = MUL_F((QMF_IM(buffer[n+i]) + QMF_IM(buffer[12-n+i])), filter[n]);
483
1.14M
            }
484
1.37M
            input_im2[n] = MUL_F((QMF_RE(buffer[n+i]) - QMF_RE(buffer[12-n+i])), filter[n]);
485
1.37M
            input_im1[n] = MUL_F((QMF_IM(buffer[n+i]) - QMF_IM(buffer[12-n+i])), filter[n]);
486
1.37M
        }
487
488
228k
        DCT3_6_unscaled(out_re1, input_re1);
489
228k
        DCT3_6_unscaled(out_re2, input_re2);
490
491
228k
        DCT3_6_unscaled(out_im1, input_im1);
492
228k
        DCT3_6_unscaled(out_im2, input_im2);
493
494
915k
        for (n = 0; n < 6; n += 2)
495
686k
        {
496
686k
            QMF_RE(X_hybrid[i][n]) = out_re1[n] - out_im1[n];
497
686k
            QMF_IM(X_hybrid[i][n]) = out_re2[n] + out_im2[n];
498
686k
            QMF_RE(X_hybrid[i][n+1]) = out_re1[n+1] + out_im1[n+1];
499
686k
            QMF_IM(X_hybrid[i][n+1]) = out_re2[n+1] - out_im2[n+1];
500
501
686k
            QMF_RE(X_hybrid[i][10-n]) = out_re1[n+1] - out_im1[n+1];
502
686k
            QMF_IM(X_hybrid[i][10-n]) = out_re2[n+1] + out_im2[n+1];
503
686k
            QMF_RE(X_hybrid[i][11-n]) = out_re1[n] + out_im1[n];
504
686k
            QMF_IM(X_hybrid[i][11-n]) = out_re2[n] - out_im2[n];
505
686k
        }
506
228k
    }
507
7.42k
}
ps_dec.c:channel_filter12
Line
Count
Source
466
7.42k
{
467
7.42k
    uint8_t i, n;
468
7.42k
    real_t input_re1[6], input_re2[6], input_im1[6], input_im2[6];
469
7.42k
    real_t out_re1[6], out_re2[6], out_im1[6], out_im2[6];
470
7.42k
    (void)hyb;  /* TODO: remove parameter? */
471
472
236k
    for (i = 0; i < frame_len; i++)
473
228k
    {
474
1.60M
        for (n = 0; n < 6; n++)
475
1.37M
        {
476
1.37M
            if (n == 0)
477
228k
            {
478
228k
                input_re1[0] = MUL_F(QMF_RE(buffer[6+i]), filter[6]);
479
228k
                input_re2[0] = MUL_F(QMF_IM(buffer[6+i]), filter[6]);
480
1.14M
            } else {
481
1.14M
                input_re1[6-n] = MUL_F((QMF_RE(buffer[n+i]) + QMF_RE(buffer[12-n+i])), filter[n]);
482
1.14M
                input_re2[6-n] = MUL_F((QMF_IM(buffer[n+i]) + QMF_IM(buffer[12-n+i])), filter[n]);
483
1.14M
            }
484
1.37M
            input_im2[n] = MUL_F((QMF_RE(buffer[n+i]) - QMF_RE(buffer[12-n+i])), filter[n]);
485
1.37M
            input_im1[n] = MUL_F((QMF_IM(buffer[n+i]) - QMF_IM(buffer[12-n+i])), filter[n]);
486
1.37M
        }
487
488
228k
        DCT3_6_unscaled(out_re1, input_re1);
489
228k
        DCT3_6_unscaled(out_re2, input_re2);
490
491
228k
        DCT3_6_unscaled(out_im1, input_im1);
492
228k
        DCT3_6_unscaled(out_im2, input_im2);
493
494
915k
        for (n = 0; n < 6; n += 2)
495
686k
        {
496
686k
            QMF_RE(X_hybrid[i][n]) = out_re1[n] - out_im1[n];
497
686k
            QMF_IM(X_hybrid[i][n]) = out_re2[n] + out_im2[n];
498
686k
            QMF_RE(X_hybrid[i][n+1]) = out_re1[n+1] + out_im1[n+1];
499
686k
            QMF_IM(X_hybrid[i][n+1]) = out_re2[n+1] - out_im2[n+1];
500
501
686k
            QMF_RE(X_hybrid[i][10-n]) = out_re1[n+1] - out_im1[n+1];
502
686k
            QMF_IM(X_hybrid[i][10-n]) = out_re2[n+1] + out_im2[n+1];
503
686k
            QMF_RE(X_hybrid[i][11-n]) = out_re1[n] + out_im1[n];
504
686k
            QMF_IM(X_hybrid[i][11-n]) = out_re2[n] - out_im2[n];
505
686k
        }
506
228k
    }
507
7.42k
}
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
21.0k
{
515
21.0k
    uint8_t k, n, band;
516
21.0k
    uint8_t offset = 0;
517
21.0k
    uint8_t qmf_bands = (use34) ? 5 : 3;
518
21.0k
    uint8_t *resolution = (use34) ? hyb->resolution34 : hyb->resolution20;
519
520
99.0k
    for (band = 0; band < qmf_bands; band++)
521
77.9k
    {
522
        /* build working buffer */
523
77.9k
        memcpy(hyb->work, hyb->buffer[band], 12 * sizeof(qmf_t));
524
525
        /* add new samples */
526
2.50M
        for (n = 0; n < hyb->frame_len; n++)
527
2.42M
        {
528
2.42M
            QMF_RE(hyb->work[12 + n]) = QMF_RE(X[n + 6 /*delay*/][band]);
529
2.42M
            QMF_IM(hyb->work[12 + n]) = QMF_IM(X[n + 6 /*delay*/][band]);
530
2.42M
        }
531
532
        /* store samples */
533
77.9k
        memcpy(hyb->buffer[band], hyb->work + hyb->frame_len, 12 * sizeof(qmf_t));
534
535
536
77.9k
        switch(resolution[band])
537
77.9k
        {
538
27.2k
        case 2:
539
            /* Type B real filter, Q[p] = 2 */
540
27.2k
            channel_filter2(hyb, hyb->frame_len, p2_13_20, hyb->work, hyb->temp);
541
27.2k
            break;
542
22.2k
        case 4:
543
            /* Type A complex filter, Q[p] = 4 */
544
22.2k
            channel_filter4(hyb, hyb->frame_len, p4_13_34, hyb->work, hyb->temp);
545
22.2k
            break;
546
21.0k
        case 8:
547
            /* Type A complex filter, Q[p] = 8 */
548
21.0k
            channel_filter8(hyb, hyb->frame_len, (use34) ? p8_13_34 : p8_13_20,
549
21.0k
                hyb->work, hyb->temp);
550
21.0k
            break;
551
7.42k
        case 12:
552
            /* Type A complex filter, Q[p] = 12 */
553
7.42k
            channel_filter12(hyb, hyb->frame_len, p12_13_34, hyb->work, hyb->temp);
554
7.42k
            break;
555
77.9k
        }
556
557
2.50M
        for (n = 0; n < hyb->frame_len; n++)
558
2.42M
        {
559
14.8M
            for (k = 0; k < resolution[band]; k++)
560
12.4M
            {
561
12.4M
                QMF_RE(X_hybrid[n][offset + k]) = QMF_RE(hyb->temp[n][k]);
562
12.4M
                QMF_IM(X_hybrid[n][offset + k]) = QMF_IM(hyb->temp[n][k]);
563
12.4M
            }
564
2.42M
        }
565
77.9k
        offset += resolution[band];
566
77.9k
    }
567
568
    /* group hybrid channels */
569
21.0k
    if (!use34)
570
13.6k
    {
571
440k
        for (n = 0; n < numTimeSlotsRate; n++)
572
427k
        {
573
427k
            QMF_RE(X_hybrid[n][3]) += QMF_RE(X_hybrid[n][4]);
574
427k
            QMF_IM(X_hybrid[n][3]) += QMF_IM(X_hybrid[n][4]);
575
427k
            QMF_RE(X_hybrid[n][4]) = 0;
576
427k
            QMF_IM(X_hybrid[n][4]) = 0;
577
578
427k
            QMF_RE(X_hybrid[n][2]) += QMF_RE(X_hybrid[n][5]);
579
427k
            QMF_IM(X_hybrid[n][2]) += QMF_IM(X_hybrid[n][5]);
580
427k
            QMF_RE(X_hybrid[n][5]) = 0;
581
427k
            QMF_IM(X_hybrid[n][5]) = 0;
582
427k
        }
583
13.6k
    }
584
21.0k
}
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
42.0k
{
589
42.0k
    uint8_t k, n, band;
590
42.0k
    uint8_t offset = 0;
591
42.0k
    uint8_t qmf_bands = (use34) ? 5 : 3;
592
42.0k
    uint8_t *resolution = (use34) ? hyb->resolution34 : hyb->resolution20;
593
42.0k
    (void)numTimeSlotsRate;  /* TODO: remove parameter? */
594
595
198k
    for(band = 0; band < qmf_bands; band++)
596
155k
    {
597
5.00M
        for (n = 0; n < hyb->frame_len; n++)
598
4.85M
        {
599
4.85M
            QMF_RE(X[n][band]) = 0;
600
4.85M
            QMF_IM(X[n][band]) = 0;
601
602
29.7M
            for (k = 0; k < resolution[band]; k++)
603
24.9M
            {
604
24.9M
                QMF_RE(X[n][band]) += QMF_RE(X_hybrid[n][offset + k]);
605
24.9M
                QMF_IM(X[n][band]) += QMF_IM(X_hybrid[n][offset + k]);
606
24.9M
            }
607
4.85M
        }
608
155k
        offset += resolution[band];
609
155k
    }
610
42.0k
}
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
454k
{
615
454k
    if (i < min)
616
55.1k
        return min;
617
399k
    else if (i > max)
618
5.86k
        return max;
619
393k
    else
620
393k
        return i;
621
454k
}
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
74.5k
{
630
74.5k
    int8_t i;
631
632
74.5k
    if (enable == 1)
633
38.6k
    {
634
38.6k
        if (dt_flag == 0)
635
23.3k
        {
636
            /* delta coded in frequency direction */
637
23.3k
            index[0] = 0 + index[0];
638
23.3k
            index[0] = delta_clip(index[0], min_index, max_index);
639
640
293k
            for (i = 1; i < nr_par; i++)
641
270k
            {
642
270k
                index[i] = index[i-1] + index[i];
643
270k
                index[i] = delta_clip(index[i], min_index, max_index);
644
270k
            }
645
23.3k
        } else {
646
            /* delta coded in time direction */
647
176k
            for (i = 0; i < nr_par; i++)
648
160k
            {
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
160k
                index[i] = index_prev[i*stride] + index[i];
656
                //tmp2 = index[i];
657
160k
                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
160k
            }
667
15.3k
        }
668
38.6k
    } else {
669
        /* set indices to zero */
670
59.0k
        for (i = 0; i < nr_par; i++)
671
23.0k
        {
672
23.0k
            index[i] = 0;
673
23.0k
        }
674
35.9k
    }
675
676
    /* coarse */
677
74.5k
    if (stride == 2)
678
49.6k
    {
679
334k
        for (i = (nr_par<<1)-1; i > 0; i--)
680
284k
        {
681
284k
            index[i] = index[i>>1];
682
284k
        }
683
49.6k
    }
684
74.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
74.5k
{
692
74.5k
    int8_t i;
693
694
74.5k
    if (enable == 1)
695
24.4k
    {
696
24.4k
        if (dt_flag == 0)
697
14.9k
        {
698
            /* delta coded in frequency direction */
699
14.9k
            index[0] = 0 + index[0];
700
14.9k
            index[0] &= and_modulo;
701
702
60.9k
            for (i = 1; i < nr_par; i++)
703
45.9k
            {
704
45.9k
                index[i] = index[i-1] + index[i];
705
45.9k
                index[i] &= and_modulo;
706
45.9k
            }
707
14.9k
        } else {
708
            /* delta coded in time direction */
709
31.4k
            for (i = 0; i < nr_par; i++)
710
21.9k
            {
711
21.9k
                index[i] = index_prev[i*stride] + index[i];
712
21.9k
                index[i] &= and_modulo;
713
21.9k
            }
714
9.50k
        }
715
50.1k
    } else {
716
        /* set indices to zero */
717
183k
        for (i = 0; i < nr_par; i++)
718
133k
        {
719
133k
            index[i] = 0;
720
133k
        }
721
50.1k
    }
722
723
    /* coarse */
724
74.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
74.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.9k
{
766
25.9k
    index[0] = index[0];
767
25.9k
    index[1] = (index[0] + index[1])/2;
768
25.9k
    index[2] = index[1];
769
25.9k
    index[3] = index[2];
770
25.9k
    index[4] = (index[2] + index[3])/2;
771
25.9k
    index[5] = index[3];
772
25.9k
    index[6] = index[4];
773
25.9k
    index[7] = index[4];
774
25.9k
    index[8] = index[5];
775
25.9k
    index[9] = index[5];
776
25.9k
    index[10] = index[6];
777
25.9k
    index[11] = index[7];
778
25.9k
    index[12] = index[8];
779
25.9k
    index[13] = index[8];
780
25.9k
    index[14] = index[9];
781
25.9k
    index[15] = index[9];
782
25.9k
    index[16] = index[10];
783
784
25.9k
    if (bins == 34)
785
12.4k
    {
786
12.4k
        index[17] = index[11];
787
12.4k
        index[18] = index[12];
788
12.4k
        index[19] = index[13];
789
12.4k
        index[20] = index[14];
790
12.4k
        index[21] = index[14];
791
12.4k
        index[22] = index[15];
792
12.4k
        index[23] = index[15];
793
12.4k
        index[24] = index[16];
794
12.4k
        index[25] = index[16];
795
12.4k
        index[26] = index[17];
796
12.4k
        index[27] = index[17];
797
12.4k
        index[28] = index[18];
798
12.4k
        index[29] = index[18];
799
12.4k
        index[30] = index[18];
800
12.4k
        index[31] = index[18];
801
12.4k
        index[32] = index[19];
802
12.4k
        index[33] = index[19];
803
12.4k
    }
804
25.9k
}
805
806
/* parse the bitstream data decoded in ps_data() */
807
static void ps_data_decode(ps_info *ps)
808
21.0k
{
809
21.0k
    uint8_t env, bin;
810
811
    /* ps data not available, use data from previous frame */
812
21.0k
    if (ps->ps_data_available == 0)
813
5.34k
    {
814
5.34k
        ps->num_env = 0;
815
5.34k
    }
816
817
58.3k
    for (env = 0; env < ps->num_env; env++)
818
37.2k
    {
819
37.2k
        int8_t *iid_index_prev;
820
37.2k
        int8_t *icc_index_prev;
821
37.2k
        int8_t *ipd_index_prev;
822
37.2k
        int8_t *opd_index_prev;
823
824
37.2k
        int8_t num_iid_steps = (ps->iid_mode < 3) ? 7 : 15 /*fine quant*/;
825
826
37.2k
        if (env == 0)
827
11.1k
        {
828
            /* take last envelope from previous frame */
829
11.1k
            iid_index_prev = ps->iid_index_prev;
830
11.1k
            icc_index_prev = ps->icc_index_prev;
831
11.1k
            ipd_index_prev = ps->ipd_index_prev;
832
11.1k
            opd_index_prev = ps->opd_index_prev;
833
26.1k
        } else {
834
            /* take index values from previous envelope */
835
26.1k
            iid_index_prev = ps->iid_index[env - 1];
836
26.1k
            icc_index_prev = ps->icc_index[env - 1];
837
26.1k
            ipd_index_prev = ps->ipd_index[env - 1];
838
26.1k
            opd_index_prev = ps->opd_index[env - 1];
839
26.1k
        }
840
841
//        iid = 1;
842
        /* delta decode iid parameters */
843
37.2k
        delta_decode(ps->enable_iid, ps->iid_index[env], iid_index_prev,
844
37.2k
            ps->iid_dt[env], ps->nr_iid_par,
845
37.2k
            (ps->iid_mode == 0 || ps->iid_mode == 3) ? 2 : 1,
846
37.2k
            -num_iid_steps, num_iid_steps);
847
//        iid = 0;
848
849
        /* delta decode icc parameters */
850
37.2k
        delta_decode(ps->enable_icc, ps->icc_index[env], icc_index_prev,
851
37.2k
            ps->icc_dt[env], ps->nr_icc_par,
852
37.2k
            (ps->icc_mode == 0 || ps->icc_mode == 3) ? 2 : 1,
853
37.2k
            0, 7);
854
855
        /* delta modulo decode ipd parameters */
856
37.2k
        delta_modulo_decode(ps->enable_ipdopd, ps->ipd_index[env], ipd_index_prev,
857
37.2k
            ps->ipd_dt[env], ps->nr_ipdopd_par, 1, 7);
858
859
        /* delta modulo decode opd parameters */
860
37.2k
        delta_modulo_decode(ps->enable_ipdopd, ps->opd_index[env], opd_index_prev,
861
37.2k
            ps->opd_dt[env], ps->nr_ipdopd_par, 1, 7);
862
37.2k
    }
863
864
    /* handle error case */
865
21.0k
    if (ps->num_env == 0)
866
9.89k
    {
867
        /* force to 1 */
868
9.89k
        ps->num_env = 1;
869
870
9.89k
        if (ps->enable_iid)
871
6.91k
        {
872
241k
            for (bin = 0; bin < 34; bin++)
873
234k
                ps->iid_index[0][bin] = ps->iid_index_prev[bin];
874
6.91k
        } else {
875
104k
            for (bin = 0; bin < 34; bin++)
876
101k
                ps->iid_index[0][bin] = 0;
877
2.98k
        }
878
879
9.89k
        if (ps->enable_icc)
880
4.96k
        {
881
173k
            for (bin = 0; bin < 34; bin++)
882
168k
                ps->icc_index[0][bin] = ps->icc_index_prev[bin];
883
4.96k
        } else {
884
172k
            for (bin = 0; bin < 34; bin++)
885
167k
                ps->icc_index[0][bin] = 0;
886
4.92k
        }
887
888
9.89k
        if (ps->enable_ipdopd)
889
1.42k
        {
890
25.6k
            for (bin = 0; bin < 17; bin++)
891
24.2k
            {
892
24.2k
                ps->ipd_index[0][bin] = ps->ipd_index_prev[bin];
893
24.2k
                ps->opd_index[0][bin] = ps->opd_index_prev[bin];
894
24.2k
            }
895
8.46k
        } else {
896
152k
            for (bin = 0; bin < 17; bin++)
897
143k
            {
898
143k
                ps->ipd_index[0][bin] = 0;
899
143k
                ps->opd_index[0][bin] = 0;
900
143k
            }
901
8.46k
        }
902
9.89k
    }
903
904
    /* update previous indices */
905
736k
    for (bin = 0; bin < 34; bin++)
906
715k
        ps->iid_index_prev[bin] = ps->iid_index[ps->num_env-1][bin];
907
736k
    for (bin = 0; bin < 34; bin++)
908
715k
        ps->icc_index_prev[bin] = ps->icc_index[ps->num_env-1][bin];
909
378k
    for (bin = 0; bin < 17; bin++)
910
357k
    {
911
357k
        ps->ipd_index_prev[bin] = ps->ipd_index[ps->num_env-1][bin];
912
357k
        ps->opd_index_prev[bin] = ps->opd_index[ps->num_env-1][bin];
913
357k
    }
914
915
21.0k
    ps->ps_data_available = 0;
916
917
21.0k
    if (ps->frame_class == 0)
918
12.5k
    {
919
12.5k
        ps->border_position[0] = 0;
920
23.1k
        for (env = 1; env < ps->num_env; env++)
921
10.5k
        {
922
10.5k
            ps->border_position[env] = (env * ps->numTimeSlotsRate) / ps->num_env;
923
10.5k
        }
924
12.5k
        ps->border_position[ps->num_env] = ps->numTimeSlotsRate;
925
12.5k
    } else {
926
8.49k
        ps->border_position[0] = 0;
927
928
8.49k
        if (ps->border_position[ps->num_env] < ps->numTimeSlotsRate)
929
6.48k
        {
930
226k
            for (bin = 0; bin < 34; bin++)
931
220k
            {
932
220k
                ps->iid_index[ps->num_env][bin] = ps->iid_index[ps->num_env-1][bin];
933
220k
                ps->icc_index[ps->num_env][bin] = ps->icc_index[ps->num_env-1][bin];
934
220k
            }
935
116k
            for (bin = 0; bin < 17; bin++)
936
110k
            {
937
110k
                ps->ipd_index[ps->num_env][bin] = ps->ipd_index[ps->num_env-1][bin];
938
110k
                ps->opd_index[ps->num_env][bin] = ps->opd_index[ps->num_env-1][bin];
939
110k
            }
940
6.48k
            ps->num_env++;
941
6.48k
            ps->border_position[ps->num_env] = ps->numTimeSlotsRate;
942
6.48k
        }
943
944
30.5k
        for (env = 1; env < ps->num_env; env++)
945
22.0k
        {
946
22.0k
            int8_t thr = ps->numTimeSlotsRate - (ps->num_env - env);
947
948
22.0k
            if (ps->border_position[env] > thr)
949
4.89k
            {
950
4.89k
                ps->border_position[env] = thr;
951
17.1k
            } else {
952
17.1k
                thr = ps->border_position[env-1]+1;
953
17.1k
                if (ps->border_position[env] < thr)
954
8.96k
                {
955
8.96k
                    ps->border_position[env] = thr;
956
8.96k
                }
957
17.1k
            }
958
22.0k
        }
959
8.49k
    }
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
21.0k
    if (ps->use34hybrid_bands)
981
7.42k
    {
982
20.7k
        for (env = 0; env < ps->num_env; env++)
983
13.2k
        {
984
13.2k
            if (ps->iid_mode != 2 && ps->iid_mode != 5)
985
6.75k
                map20indexto34(ps->iid_index[env], 34);
986
13.2k
            if (ps->icc_mode != 2 && ps->icc_mode != 5)
987
5.68k
                map20indexto34(ps->icc_index[env], 34);
988
13.2k
            if (ps->ipd_mode != 2 && ps->ipd_mode != 5)
989
6.75k
            {
990
6.75k
                map20indexto34(ps->ipd_index[env], 17);
991
6.75k
                map20indexto34(ps->opd_index[env], 17);
992
6.75k
            }
993
13.2k
        }
994
7.42k
    }
995
21.0k
#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
21.0k
}
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
21.0k
{
1042
21.0k
    uint8_t gr, n, bk;
1043
21.0k
    uint8_t temp_delay = 0;
1044
21.0k
    uint8_t sb, maxsb;
1045
21.0k
    const complex_t *Phi_Fract_SubQmf;
1046
21.0k
    uint8_t temp_delay_ser[NO_ALLPASS_LINKS];
1047
21.0k
    real_t P_SmoothPeakDecayDiffNrg, nrg;
1048
21.0k
    real_t P[32][34];
1049
21.0k
    real_t G_TransientRatio[32][34] = {{0}};
1050
21.0k
    complex_t inputLeft;
1051
1052
1053
    /* chose hybrid filterbank: 20 or 34 band case */
1054
21.0k
    if (ps->use34hybrid_bands)
1055
7.42k
    {
1056
7.42k
        Phi_Fract_SubQmf = Phi_Fract_SubQmf34;
1057
13.6k
    } else{
1058
13.6k
        Phi_Fract_SubQmf = Phi_Fract_SubQmf20;
1059
13.6k
    }
1060
1061
    /* clear the energy values */
1062
694k
    for (n = 0; n < 32; n++)
1063
673k
    {
1064
23.5M
        for (bk = 0; bk < 34; bk++)
1065
22.8M
        {
1066
22.8M
            P[n][bk] = 0;
1067
22.8M
        }
1068
673k
    }
1069
1070
    /* calculate the energy in each parameter band b(k) */
1071
691k
    for (gr = 0; gr < ps->num_groups; gr++)
1072
670k
    {
1073
        /* select the parameter index b(k) to which this group belongs */
1074
670k
        bk = (~NEGATE_IPD_MASK) & ps->map_group2bk[gr];
1075
1076
        /* select the upper subband border for this group */
1077
670k
        maxsb = (gr < ps->num_hybrid_groups) ? ps->group_border[gr]+1 : ps->group_border[gr+1];
1078
1079
2.31M
        for (sb = ps->group_border[gr]; sb < maxsb; sb++)
1080
1.64M
        {
1081
52.9M
            for (n = ps->border_position[0]; n < ps->border_position[ps->num_env]; n++)
1082
51.3M
            {
1083
#ifdef FIXED_POINT
1084
                uint32_t in_re, in_im;
1085
#endif
1086
1087
                /* input from hybrid subbands or QMF subbands */
1088
51.3M
                if (gr < ps->num_hybrid_groups)
1089
11.6M
                {
1090
11.6M
                    RE(inputLeft) = QMF_RE(X_hybrid_left[n][sb]);
1091
11.6M
                    IM(inputLeft) = QMF_IM(X_hybrid_left[n][sb]);
1092
39.6M
                } else {
1093
39.6M
                    RE(inputLeft) = QMF_RE(X_left[n][sb]);
1094
39.6M
                    IM(inputLeft) = QMF_IM(X_left[n][sb]);
1095
39.6M
                }
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
22.1M
                in_re = ((abs(RE(inputLeft))+(1<<(REAL_BITS-1)))>>REAL_BITS);
1103
22.1M
                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
29.1M
                P[n][bk] += MUL_R(RE(inputLeft),RE(inputLeft)) + MUL_R(IM(inputLeft),IM(inputLeft));
1107
#endif
1108
51.3M
            }
1109
1.64M
        }
1110
670k
    }
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
545k
    for (bk = 0; bk < ps->nr_par_bands; bk++)
1128
524k
    {
1129
16.8M
        for (n = ps->border_position[0]; n < ps->border_position[ps->num_env]; n++)
1130
16.3M
        {
1131
16.3M
            const real_t gamma = COEF_CONST(1.5);
1132
1133
16.3M
            ps->P_PeakDecayNrg[bk] = MUL_F(ps->P_PeakDecayNrg[bk], ps->alpha_decay);
1134
16.3M
            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
16.3M
            P_SmoothPeakDecayDiffNrg = ps->P_SmoothPeakDecayDiffNrg_prev[bk];
1139
16.3M
            P_SmoothPeakDecayDiffNrg += MUL_F((ps->P_PeakDecayNrg[bk] - P[n][bk] - ps->P_SmoothPeakDecayDiffNrg_prev[bk]), ps->alpha_smooth);
1140
16.3M
            ps->P_SmoothPeakDecayDiffNrg_prev[bk] = P_SmoothPeakDecayDiffNrg;
1141
1142
            /* apply smoothing filter to energy */
1143
16.3M
            nrg = ps->P_prev[bk];
1144
16.3M
            nrg += MUL_F((P[n][bk] - ps->P_prev[bk]), ps->alpha_smooth);
1145
16.3M
            ps->P_prev[bk] = nrg;
1146
1147
            /* calculate transient ratio */
1148
16.3M
            if (MUL_C(P_SmoothPeakDecayDiffNrg, gamma) <= nrg)
1149
16.2M
            {
1150
16.2M
                G_TransientRatio[n][bk] = REAL_CONST(1.0);
1151
16.2M
            } else {
1152
110k
                G_TransientRatio[n][bk] = DIV_R(nrg, (MUL_C(P_SmoothPeakDecayDiffNrg, gamma)));
1153
110k
            }
1154
16.3M
        }
1155
524k
    }
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
691k
    for (gr = 0; gr < ps->num_groups; gr++)
1173
670k
    {
1174
670k
        if (gr < ps->num_hybrid_groups)
1175
373k
            maxsb = ps->group_border[gr] + 1;
1176
297k
        else
1177
297k
            maxsb = ps->group_border[gr + 1];
1178
1179
        /* QMF channel */
1180
2.31M
        for (sb = ps->group_border[gr]; sb < maxsb; sb++)
1181
1.64M
        {
1182
1.64M
            real_t g_DecaySlope;
1183
1.64M
            real_t g_DecaySlope_filt[NO_ALLPASS_LINKS];
1184
1185
            /* g_DecaySlope: [0..1] */
1186
1.64M
            if (gr < ps->num_hybrid_groups || sb <= ps->decay_cutoff)
1187
394k
            {
1188
394k
                g_DecaySlope = FRAC_CONST(1.0);
1189
1.24M
            } else {
1190
1.24M
                int8_t decay = ps->decay_cutoff - sb;
1191
1.24M
                if (decay <= -20 /* -1/DECAY_SLOPE */)
1192
847k
                {
1193
847k
                    g_DecaySlope = 0;
1194
847k
                } else {
1195
                    /* decay(int)*decay_slope(frac) = g_DecaySlope(frac) */
1196
399k
                    g_DecaySlope = FRAC_CONST(1.0) + DECAY_SLOPE * decay;
1197
399k
                }
1198
1.24M
            }
1199
1200
            /* calculate g_DecaySlope_filt for every n multiplied by filter_a[n] */
1201
6.56M
            for (n = 0; n < NO_ALLPASS_LINKS; n++)
1202
4.92M
            {
1203
4.92M
                g_DecaySlope_filt[n] = MUL_F(g_DecaySlope, filter_a[n]);
1204
4.92M
            }
1205
1206
1207
            /* set delay indices */
1208
1.64M
            temp_delay = ps->saved_delay;
1209
6.56M
            for (n = 0; n < NO_ALLPASS_LINKS; n++)
1210
4.92M
                temp_delay_ser[n] = ps->delay_buf_index_ser[n];
1211
1212
52.9M
            for (n = ps->border_position[0]; n < ps->border_position[ps->num_env]; n++)
1213
51.3M
            {
1214
51.3M
                complex_t tmp, tmp0, R0;
1215
51.3M
                uint8_t m;
1216
1217
51.3M
                if (gr < ps->num_hybrid_groups)
1218
11.6M
                {
1219
                    /* hybrid filterbank input */
1220
11.6M
                    RE(inputLeft) = QMF_RE(X_hybrid_left[n][sb]);
1221
11.6M
                    IM(inputLeft) = QMF_IM(X_hybrid_left[n][sb]);
1222
39.6M
                } else {
1223
                    /* QMF filterbank input */
1224
39.6M
                    RE(inputLeft) = QMF_RE(X_left[n][sb]);
1225
39.6M
                    IM(inputLeft) = QMF_IM(X_left[n][sb]);
1226
39.6M
                }
1227
1228
51.3M
                if (sb > ps->nr_allpass_bands && gr >= ps->num_hybrid_groups)
1229
26.9M
                {
1230
                    /* delay */
1231
1232
                    /* never hybrid subbands here, always QMF subbands */
1233
26.9M
                    RE(tmp) = RE(ps->delay_Qmf[ps->delay_buf_index_delay[sb]][sb]);
1234
26.9M
                    IM(tmp) = IM(ps->delay_Qmf[ps->delay_buf_index_delay[sb]][sb]);
1235
26.9M
                    RE(R0) = RE(tmp);
1236
26.9M
                    IM(R0) = IM(tmp);
1237
26.9M
                    RE(ps->delay_Qmf[ps->delay_buf_index_delay[sb]][sb]) = RE(inputLeft);
1238
26.9M
                    IM(ps->delay_Qmf[ps->delay_buf_index_delay[sb]][sb]) = IM(inputLeft);
1239
26.9M
                } else {
1240
                    /* allpass filter */
1241
24.3M
                    complex_t Phi_Fract;
1242
1243
                    /* fetch parameters */
1244
24.3M
                    if (gr < ps->num_hybrid_groups)
1245
11.6M
                    {
1246
                        /* select data from the hybrid subbands */
1247
11.6M
                        RE(tmp0) = RE(ps->delay_SubQmf[temp_delay][sb]);
1248
11.6M
                        IM(tmp0) = IM(ps->delay_SubQmf[temp_delay][sb]);
1249
1250
11.6M
                        RE(ps->delay_SubQmf[temp_delay][sb]) = RE(inputLeft);
1251
11.6M
                        IM(ps->delay_SubQmf[temp_delay][sb]) = IM(inputLeft);
1252
1253
11.6M
                        RE(Phi_Fract) = RE(Phi_Fract_SubQmf[sb]);
1254
11.6M
                        IM(Phi_Fract) = IM(Phi_Fract_SubQmf[sb]);
1255
12.7M
                    } else {
1256
                        /* select data from the QMF subbands */
1257
12.7M
                        RE(tmp0) = RE(ps->delay_Qmf[temp_delay][sb]);
1258
12.7M
                        IM(tmp0) = IM(ps->delay_Qmf[temp_delay][sb]);
1259
1260
12.7M
                        RE(ps->delay_Qmf[temp_delay][sb]) = RE(inputLeft);
1261
12.7M
                        IM(ps->delay_Qmf[temp_delay][sb]) = IM(inputLeft);
1262
1263
12.7M
                        RE(Phi_Fract) = RE(Phi_Fract_Qmf[sb]);
1264
12.7M
                        IM(Phi_Fract) = IM(Phi_Fract_Qmf[sb]);
1265
12.7M
                    }
1266
1267
                    /* z^(-2) * Phi_Fract[k] */
1268
24.3M
                    ComplexMult(&RE(tmp), &IM(tmp), RE(tmp0), IM(tmp0), RE(Phi_Fract), IM(Phi_Fract));
1269
1270
24.3M
                    RE(R0) = RE(tmp);
1271
24.3M
                    IM(R0) = IM(tmp);
1272
97.3M
                    for (m = 0; m < NO_ALLPASS_LINKS; m++)
1273
72.9M
                    {
1274
72.9M
                        complex_t Q_Fract_allpass, tmp2;
1275
1276
                        /* fetch parameters */
1277
72.9M
                        if (gr < ps->num_hybrid_groups)
1278
34.8M
                        {
1279
                            /* select data from the hybrid subbands */
1280
34.8M
                            RE(tmp0) = RE(ps->delay_SubQmf_ser[m][temp_delay_ser[m]][sb]);
1281
34.8M
                            IM(tmp0) = IM(ps->delay_SubQmf_ser[m][temp_delay_ser[m]][sb]);
1282
1283
34.8M
                            if (ps->use34hybrid_bands)
1284
22.0M
                            {
1285
22.0M
                                RE(Q_Fract_allpass) = RE(Q_Fract_allpass_SubQmf34[sb][m]);
1286
22.0M
                                IM(Q_Fract_allpass) = IM(Q_Fract_allpass_SubQmf34[sb][m]);
1287
22.0M
                            } else {
1288
12.8M
                                RE(Q_Fract_allpass) = RE(Q_Fract_allpass_SubQmf20[sb][m]);
1289
12.8M
                                IM(Q_Fract_allpass) = IM(Q_Fract_allpass_SubQmf20[sb][m]);
1290
12.8M
                            }
1291
38.1M
                        } else {
1292
                            /* select data from the QMF subbands */
1293
38.1M
                            RE(tmp0) = RE(ps->delay_Qmf_ser[m][temp_delay_ser[m]][sb]);
1294
38.1M
                            IM(tmp0) = IM(ps->delay_Qmf_ser[m][temp_delay_ser[m]][sb]);
1295
1296
38.1M
                            RE(Q_Fract_allpass) = RE(Q_Fract_allpass_Qmf[sb][m]);
1297
38.1M
                            IM(Q_Fract_allpass) = IM(Q_Fract_allpass_Qmf[sb][m]);
1298
38.1M
                        }
1299
1300
                        /* delay by a fraction */
1301
                        /* z^(-d(m)) * Q_Fract_allpass[k,m] */
1302
72.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
72.9M
                        RE(tmp) += -MUL_F(g_DecaySlope_filt[m], RE(R0));
1306
72.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
72.9M
                        RE(tmp2) = RE(R0) + MUL_F(g_DecaySlope_filt[m], RE(tmp));
1310
72.9M
                        IM(tmp2) = IM(R0) + MUL_F(g_DecaySlope_filt[m], IM(tmp));
1311
1312
                        /* store sample */
1313
72.9M
                        if (gr < ps->num_hybrid_groups)
1314
34.8M
                        {
1315
34.8M
                            RE(ps->delay_SubQmf_ser[m][temp_delay_ser[m]][sb]) = RE(tmp2);
1316
34.8M
                            IM(ps->delay_SubQmf_ser[m][temp_delay_ser[m]][sb]) = IM(tmp2);
1317
38.1M
                        } else {
1318
38.1M
                            RE(ps->delay_Qmf_ser[m][temp_delay_ser[m]][sb]) = RE(tmp2);
1319
38.1M
                            IM(ps->delay_Qmf_ser[m][temp_delay_ser[m]][sb]) = IM(tmp2);
1320
38.1M
                        }
1321
1322
                        /* store for next iteration (or as output value if last iteration) */
1323
72.9M
                        RE(R0) = RE(tmp);
1324
72.9M
                        IM(R0) = IM(tmp);
1325
72.9M
                    }
1326
24.3M
                }
1327
1328
                /* select b(k) for reading the transient ratio */
1329
51.3M
                bk = (~NEGATE_IPD_MASK) & ps->map_group2bk[gr];
1330
1331
                /* duck if a past transient is found */
1332
51.3M
                RE(R0) = MUL_R(G_TransientRatio[n][bk], RE(R0));
1333
51.3M
                IM(R0) = MUL_R(G_TransientRatio[n][bk], IM(R0));
1334
1335
51.3M
                if (gr < ps->num_hybrid_groups)
1336
11.6M
                {
1337
                    /* hybrid */
1338
11.6M
                    QMF_RE(X_hybrid_right[n][sb]) = RE(R0);
1339
11.6M
                    QMF_IM(X_hybrid_right[n][sb]) = IM(R0);
1340
39.6M
                } else {
1341
                    /* QMF */
1342
39.6M
                    QMF_RE(X_right[n][sb]) = RE(R0);
1343
39.6M
                    QMF_IM(X_right[n][sb]) = IM(R0);
1344
39.6M
                }
1345
1346
                /* Update delay buffer index */
1347
51.3M
                if (++temp_delay >= 2)
1348
25.6M
                {
1349
25.6M
                    temp_delay = 0;
1350
25.6M
                }
1351
1352
                /* update delay indices */
1353
51.3M
                if (sb > ps->nr_allpass_bands && gr >= ps->num_hybrid_groups)
1354
26.9M
                {
1355
                    /* delay_D depends on the samplerate, it can hold the values 14 and 1 */
1356
26.9M
                    if (++ps->delay_buf_index_delay[sb] >= ps->delay_D[sb])
1357
19.5M
                    {
1358
19.5M
                        ps->delay_buf_index_delay[sb] = 0;
1359
19.5M
                    }
1360
26.9M
                }
1361
1362
205M
                for (m = 0; m < NO_ALLPASS_LINKS; m++)
1363
153M
                {
1364
153M
                    if (++temp_delay_ser[m] >= ps->num_sample_delay_ser[m])
1365
39.3M
                    {
1366
39.3M
                        temp_delay_ser[m] = 0;
1367
39.3M
                    }
1368
153M
                }
1369
51.3M
            }
1370
1.64M
        }
1371
670k
    }
1372
1373
    /* update delay indices */
1374
21.0k
    ps->saved_delay = temp_delay;
1375
84.1k
    for (n = 0; n < NO_ALLPASS_LINKS; n++)
1376
63.1k
        ps->delay_buf_index_ser[n] = temp_delay_ser[n];
1377
21.0k
}
ps_dec.c:ps_decorrelate
Line
Count
Source
1041
9.10k
{
1042
9.10k
    uint8_t gr, n, bk;
1043
9.10k
    uint8_t temp_delay = 0;
1044
9.10k
    uint8_t sb, maxsb;
1045
9.10k
    const complex_t *Phi_Fract_SubQmf;
1046
9.10k
    uint8_t temp_delay_ser[NO_ALLPASS_LINKS];
1047
9.10k
    real_t P_SmoothPeakDecayDiffNrg, nrg;
1048
9.10k
    real_t P[32][34];
1049
9.10k
    real_t G_TransientRatio[32][34] = {{0}};
1050
9.10k
    complex_t inputLeft;
1051
1052
1053
    /* chose hybrid filterbank: 20 or 34 band case */
1054
9.10k
    if (ps->use34hybrid_bands)
1055
3.08k
    {
1056
3.08k
        Phi_Fract_SubQmf = Phi_Fract_SubQmf34;
1057
6.02k
    } else{
1058
6.02k
        Phi_Fract_SubQmf = Phi_Fract_SubQmf20;
1059
6.02k
    }
1060
1061
    /* clear the energy values */
1062
300k
    for (n = 0; n < 32; n++)
1063
291k
    {
1064
10.1M
        for (bk = 0; bk < 34; bk++)
1065
9.90M
        {
1066
9.90M
            P[n][bk] = 0;
1067
9.90M
        }
1068
291k
    }
1069
1070
    /* calculate the energy in each parameter band b(k) */
1071
295k
    for (gr = 0; gr < ps->num_groups; gr++)
1072
286k
    {
1073
        /* select the parameter index b(k) to which this group belongs */
1074
286k
        bk = (~NEGATE_IPD_MASK) & ps->map_group2bk[gr];
1075
1076
        /* select the upper subband border for this group */
1077
286k
        maxsb = (gr < ps->num_hybrid_groups) ? ps->group_border[gr]+1 : ps->group_border[gr+1];
1078
1079
994k
        for (sb = ps->group_border[gr]; sb < maxsb; sb++)
1080
708k
        {
1081
22.8M
            for (n = ps->border_position[0]; n < ps->border_position[ps->num_env]; n++)
1082
22.1M
            {
1083
22.1M
#ifdef FIXED_POINT
1084
22.1M
                uint32_t in_re, in_im;
1085
22.1M
#endif
1086
1087
                /* input from hybrid subbands or QMF subbands */
1088
22.1M
                if (gr < ps->num_hybrid_groups)
1089
4.94M
                {
1090
4.94M
                    RE(inputLeft) = QMF_RE(X_hybrid_left[n][sb]);
1091
4.94M
                    IM(inputLeft) = QMF_IM(X_hybrid_left[n][sb]);
1092
17.1M
                } else {
1093
17.1M
                    RE(inputLeft) = QMF_RE(X_left[n][sb]);
1094
17.1M
                    IM(inputLeft) = QMF_IM(X_left[n][sb]);
1095
17.1M
                }
1096
1097
                /* accumulate energy */
1098
22.1M
#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
22.1M
                in_re = ((abs(RE(inputLeft))+(1<<(REAL_BITS-1)))>>REAL_BITS);
1103
22.1M
                in_im = ((abs(IM(inputLeft))+(1<<(REAL_BITS-1)))>>REAL_BITS);
1104
22.1M
                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
22.1M
            }
1109
708k
        }
1110
286k
    }
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
234k
    for (bk = 0; bk < ps->nr_par_bands; bk++)
1128
225k
    {
1129
7.25M
        for (n = ps->border_position[0]; n < ps->border_position[ps->num_env]; n++)
1130
7.03M
        {
1131
7.03M
            const real_t gamma = COEF_CONST(1.5);
1132
1133
7.03M
            ps->P_PeakDecayNrg[bk] = MUL_F(ps->P_PeakDecayNrg[bk], ps->alpha_decay);
1134
7.03M
            if (ps->P_PeakDecayNrg[bk] < P[n][bk])
1135
12.0k
                ps->P_PeakDecayNrg[bk] = P[n][bk];
1136
1137
            /* apply smoothing filter to peak decay energy */
1138
7.03M
            P_SmoothPeakDecayDiffNrg = ps->P_SmoothPeakDecayDiffNrg_prev[bk];
1139
7.03M
            P_SmoothPeakDecayDiffNrg += MUL_F((ps->P_PeakDecayNrg[bk] - P[n][bk] - ps->P_SmoothPeakDecayDiffNrg_prev[bk]), ps->alpha_smooth);
1140
7.03M
            ps->P_SmoothPeakDecayDiffNrg_prev[bk] = P_SmoothPeakDecayDiffNrg;
1141
1142
            /* apply smoothing filter to energy */
1143
7.03M
            nrg = ps->P_prev[bk];
1144
7.03M
            nrg += MUL_F((P[n][bk] - ps->P_prev[bk]), ps->alpha_smooth);
1145
7.03M
            ps->P_prev[bk] = nrg;
1146
1147
            /* calculate transient ratio */
1148
7.03M
            if (MUL_C(P_SmoothPeakDecayDiffNrg, gamma) <= nrg)
1149
7.02M
            {
1150
7.02M
                G_TransientRatio[n][bk] = REAL_CONST(1.0);
1151
7.02M
            } else {
1152
9.87k
                G_TransientRatio[n][bk] = DIV_R(nrg, (MUL_C(P_SmoothPeakDecayDiffNrg, gamma)));
1153
9.87k
            }
1154
7.03M
        }
1155
225k
    }
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
295k
    for (gr = 0; gr < ps->num_groups; gr++)
1173
286k
    {
1174
286k
        if (gr < ps->num_hybrid_groups)
1175
158k
            maxsb = ps->group_border[gr] + 1;
1176
127k
        else
1177
127k
            maxsb = ps->group_border[gr + 1];
1178
1179
        /* QMF channel */
1180
994k
        for (sb = ps->group_border[gr]; sb < maxsb; sb++)
1181
708k
        {
1182
708k
            real_t g_DecaySlope;
1183
708k
            real_t g_DecaySlope_filt[NO_ALLPASS_LINKS];
1184
1185
            /* g_DecaySlope: [0..1] */
1186
708k
            if (gr < ps->num_hybrid_groups || sb <= ps->decay_cutoff)
1187
167k
            {
1188
167k
                g_DecaySlope = FRAC_CONST(1.0);
1189
540k
            } else {
1190
540k
                int8_t decay = ps->decay_cutoff - sb;
1191
540k
                if (decay <= -20 /* -1/DECAY_SLOPE */)
1192
367k
                {
1193
367k
                    g_DecaySlope = 0;
1194
367k
                } else {
1195
                    /* decay(int)*decay_slope(frac) = g_DecaySlope(frac) */
1196
173k
                    g_DecaySlope = FRAC_CONST(1.0) + DECAY_SLOPE * decay;
1197
173k
                }
1198
540k
            }
1199
1200
            /* calculate g_DecaySlope_filt for every n multiplied by filter_a[n] */
1201
2.83M
            for (n = 0; n < NO_ALLPASS_LINKS; n++)
1202
2.12M
            {
1203
2.12M
                g_DecaySlope_filt[n] = MUL_F(g_DecaySlope, filter_a[n]);
1204
2.12M
            }
1205
1206
1207
            /* set delay indices */
1208
708k
            temp_delay = ps->saved_delay;
1209
2.83M
            for (n = 0; n < NO_ALLPASS_LINKS; n++)
1210
2.12M
                temp_delay_ser[n] = ps->delay_buf_index_ser[n];
1211
1212
22.8M
            for (n = ps->border_position[0]; n < ps->border_position[ps->num_env]; n++)
1213
22.1M
            {
1214
22.1M
                complex_t tmp, tmp0, R0;
1215
22.1M
                uint8_t m;
1216
1217
22.1M
                if (gr < ps->num_hybrid_groups)
1218
4.94M
                {
1219
                    /* hybrid filterbank input */
1220
4.94M
                    RE(inputLeft) = QMF_RE(X_hybrid_left[n][sb]);
1221
4.94M
                    IM(inputLeft) = QMF_IM(X_hybrid_left[n][sb]);
1222
17.1M
                } else {
1223
                    /* QMF filterbank input */
1224
17.1M
                    RE(inputLeft) = QMF_RE(X_left[n][sb]);
1225
17.1M
                    IM(inputLeft) = QMF_IM(X_left[n][sb]);
1226
17.1M
                }
1227
1228
22.1M
                if (sb > ps->nr_allpass_bands && gr >= ps->num_hybrid_groups)
1229
11.6M
                {
1230
                    /* delay */
1231
1232
                    /* never hybrid subbands here, always QMF subbands */
1233
11.6M
                    RE(tmp) = RE(ps->delay_Qmf[ps->delay_buf_index_delay[sb]][sb]);
1234
11.6M
                    IM(tmp) = IM(ps->delay_Qmf[ps->delay_buf_index_delay[sb]][sb]);
1235
11.6M
                    RE(R0) = RE(tmp);
1236
11.6M
                    IM(R0) = IM(tmp);
1237
11.6M
                    RE(ps->delay_Qmf[ps->delay_buf_index_delay[sb]][sb]) = RE(inputLeft);
1238
11.6M
                    IM(ps->delay_Qmf[ps->delay_buf_index_delay[sb]][sb]) = IM(inputLeft);
1239
11.6M
                } else {
1240
                    /* allpass filter */
1241
10.4M
                    complex_t Phi_Fract;
1242
1243
                    /* fetch parameters */
1244
10.4M
                    if (gr < ps->num_hybrid_groups)
1245
4.94M
                    {
1246
                        /* select data from the hybrid subbands */
1247
4.94M
                        RE(tmp0) = RE(ps->delay_SubQmf[temp_delay][sb]);
1248
4.94M
                        IM(tmp0) = IM(ps->delay_SubQmf[temp_delay][sb]);
1249
1250
4.94M
                        RE(ps->delay_SubQmf[temp_delay][sb]) = RE(inputLeft);
1251
4.94M
                        IM(ps->delay_SubQmf[temp_delay][sb]) = IM(inputLeft);
1252
1253
4.94M
                        RE(Phi_Fract) = RE(Phi_Fract_SubQmf[sb]);
1254
4.94M
                        IM(Phi_Fract) = IM(Phi_Fract_SubQmf[sb]);
1255
5.50M
                    } else {
1256
                        /* select data from the QMF subbands */
1257
5.50M
                        RE(tmp0) = RE(ps->delay_Qmf[temp_delay][sb]);
1258
5.50M
                        IM(tmp0) = IM(ps->delay_Qmf[temp_delay][sb]);
1259
1260
5.50M
                        RE(ps->delay_Qmf[temp_delay][sb]) = RE(inputLeft);
1261
5.50M
                        IM(ps->delay_Qmf[temp_delay][sb]) = IM(inputLeft);
1262
1263
5.50M
                        RE(Phi_Fract) = RE(Phi_Fract_Qmf[sb]);
1264
5.50M
                        IM(Phi_Fract) = IM(Phi_Fract_Qmf[sb]);
1265
5.50M
                    }
1266
1267
                    /* z^(-2) * Phi_Fract[k] */
1268
10.4M
                    ComplexMult(&RE(tmp), &IM(tmp), RE(tmp0), IM(tmp0), RE(Phi_Fract), IM(Phi_Fract));
1269
1270
10.4M
                    RE(R0) = RE(tmp);
1271
10.4M
                    IM(R0) = IM(tmp);
1272
41.8M
                    for (m = 0; m < NO_ALLPASS_LINKS; m++)
1273
31.3M
                    {
1274
31.3M
                        complex_t Q_Fract_allpass, tmp2;
1275
1276
                        /* fetch parameters */
1277
31.3M
                        if (gr < ps->num_hybrid_groups)
1278
14.8M
                        {
1279
                            /* select data from the hybrid subbands */
1280
14.8M
                            RE(tmp0) = RE(ps->delay_SubQmf_ser[m][temp_delay_ser[m]][sb]);
1281
14.8M
                            IM(tmp0) = IM(ps->delay_SubQmf_ser[m][temp_delay_ser[m]][sb]);
1282
1283
14.8M
                            if (ps->use34hybrid_bands)
1284
9.14M
                            {
1285
9.14M
                                RE(Q_Fract_allpass) = RE(Q_Fract_allpass_SubQmf34[sb][m]);
1286
9.14M
                                IM(Q_Fract_allpass) = IM(Q_Fract_allpass_SubQmf34[sb][m]);
1287
9.14M
                            } else {
1288
5.68M
                                RE(Q_Fract_allpass) = RE(Q_Fract_allpass_SubQmf20[sb][m]);
1289
5.68M
                                IM(Q_Fract_allpass) = IM(Q_Fract_allpass_SubQmf20[sb][m]);
1290
5.68M
                            }
1291
16.5M
                        } else {
1292
                            /* select data from the QMF subbands */
1293
16.5M
                            RE(tmp0) = RE(ps->delay_Qmf_ser[m][temp_delay_ser[m]][sb]);
1294
16.5M
                            IM(tmp0) = IM(ps->delay_Qmf_ser[m][temp_delay_ser[m]][sb]);
1295
1296
16.5M
                            RE(Q_Fract_allpass) = RE(Q_Fract_allpass_Qmf[sb][m]);
1297
16.5M
                            IM(Q_Fract_allpass) = IM(Q_Fract_allpass_Qmf[sb][m]);
1298
16.5M
                        }
1299
1300
                        /* delay by a fraction */
1301
                        /* z^(-d(m)) * Q_Fract_allpass[k,m] */
1302
31.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
31.3M
                        RE(tmp) += -MUL_F(g_DecaySlope_filt[m], RE(R0));
1306
31.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
31.3M
                        RE(tmp2) = RE(R0) + MUL_F(g_DecaySlope_filt[m], RE(tmp));
1310
31.3M
                        IM(tmp2) = IM(R0) + MUL_F(g_DecaySlope_filt[m], IM(tmp));
1311
1312
                        /* store sample */
1313
31.3M
                        if (gr < ps->num_hybrid_groups)
1314
14.8M
                        {
1315
14.8M
                            RE(ps->delay_SubQmf_ser[m][temp_delay_ser[m]][sb]) = RE(tmp2);
1316
14.8M
                            IM(ps->delay_SubQmf_ser[m][temp_delay_ser[m]][sb]) = IM(tmp2);
1317
16.5M
                        } else {
1318
16.5M
                            RE(ps->delay_Qmf_ser[m][temp_delay_ser[m]][sb]) = RE(tmp2);
1319
16.5M
                            IM(ps->delay_Qmf_ser[m][temp_delay_ser[m]][sb]) = IM(tmp2);
1320
16.5M
                        }
1321
1322
                        /* store for next iteration (or as output value if last iteration) */
1323
31.3M
                        RE(R0) = RE(tmp);
1324
31.3M
                        IM(R0) = IM(tmp);
1325
31.3M
                    }
1326
10.4M
                }
1327
1328
                /* select b(k) for reading the transient ratio */
1329
22.1M
                bk = (~NEGATE_IPD_MASK) & ps->map_group2bk[gr];
1330
1331
                /* duck if a past transient is found */
1332
22.1M
                RE(R0) = MUL_R(G_TransientRatio[n][bk], RE(R0));
1333
22.1M
                IM(R0) = MUL_R(G_TransientRatio[n][bk], IM(R0));
1334
1335
22.1M
                if (gr < ps->num_hybrid_groups)
1336
4.94M
                {
1337
                    /* hybrid */
1338
4.94M
                    QMF_RE(X_hybrid_right[n][sb]) = RE(R0);
1339
4.94M
                    QMF_IM(X_hybrid_right[n][sb]) = IM(R0);
1340
17.1M
                } else {
1341
                    /* QMF */
1342
17.1M
                    QMF_RE(X_right[n][sb]) = RE(R0);
1343
17.1M
                    QMF_IM(X_right[n][sb]) = IM(R0);
1344
17.1M
                }
1345
1346
                /* Update delay buffer index */
1347
22.1M
                if (++temp_delay >= 2)
1348
11.0M
                {
1349
11.0M
                    temp_delay = 0;
1350
11.0M
                }
1351
1352
                /* update delay indices */
1353
22.1M
                if (sb > ps->nr_allpass_bands && gr >= ps->num_hybrid_groups)
1354
11.6M
                {
1355
                    /* delay_D depends on the samplerate, it can hold the values 14 and 1 */
1356
11.6M
                    if (++ps->delay_buf_index_delay[sb] >= ps->delay_D[sb])
1357
8.48M
                    {
1358
8.48M
                        ps->delay_buf_index_delay[sb] = 0;
1359
8.48M
                    }
1360
11.6M
                }
1361
1362
88.5M
                for (m = 0; m < NO_ALLPASS_LINKS; m++)
1363
66.4M
                {
1364
66.4M
                    if (++temp_delay_ser[m] >= ps->num_sample_delay_ser[m])
1365
16.9M
                    {
1366
16.9M
                        temp_delay_ser[m] = 0;
1367
16.9M
                    }
1368
66.4M
                }
1369
22.1M
            }
1370
708k
        }
1371
286k
    }
1372
1373
    /* update delay indices */
1374
9.10k
    ps->saved_delay = temp_delay;
1375
36.4k
    for (n = 0; n < NO_ALLPASS_LINKS; n++)
1376
27.3k
        ps->delay_buf_index_ser[n] = temp_delay_ser[n];
1377
9.10k
}
ps_dec.c:ps_decorrelate
Line
Count
Source
1041
11.9k
{
1042
11.9k
    uint8_t gr, n, bk;
1043
11.9k
    uint8_t temp_delay = 0;
1044
11.9k
    uint8_t sb, maxsb;
1045
11.9k
    const complex_t *Phi_Fract_SubQmf;
1046
11.9k
    uint8_t temp_delay_ser[NO_ALLPASS_LINKS];
1047
11.9k
    real_t P_SmoothPeakDecayDiffNrg, nrg;
1048
11.9k
    real_t P[32][34];
1049
11.9k
    real_t G_TransientRatio[32][34] = {{0}};
1050
11.9k
    complex_t inputLeft;
1051
1052
1053
    /* chose hybrid filterbank: 20 or 34 band case */
1054
11.9k
    if (ps->use34hybrid_bands)
1055
4.34k
    {
1056
4.34k
        Phi_Fract_SubQmf = Phi_Fract_SubQmf34;
1057
7.58k
    } else{
1058
7.58k
        Phi_Fract_SubQmf = Phi_Fract_SubQmf20;
1059
7.58k
    }
1060
1061
    /* clear the energy values */
1062
393k
    for (n = 0; n < 32; n++)
1063
381k
    {
1064
13.3M
        for (bk = 0; bk < 34; bk++)
1065
12.9M
        {
1066
12.9M
            P[n][bk] = 0;
1067
12.9M
        }
1068
381k
    }
1069
1070
    /* calculate the energy in each parameter band b(k) */
1071
396k
    for (gr = 0; gr < ps->num_groups; gr++)
1072
384k
    {
1073
        /* select the parameter index b(k) to which this group belongs */
1074
384k
        bk = (~NEGATE_IPD_MASK) & ps->map_group2bk[gr];
1075
1076
        /* select the upper subband border for this group */
1077
384k
        maxsb = (gr < ps->num_hybrid_groups) ? ps->group_border[gr]+1 : ps->group_border[gr+1];
1078
1079
1.31M
        for (sb = ps->group_border[gr]; sb < maxsb; sb++)
1080
934k
        {
1081
30.1M
            for (n = ps->border_position[0]; n < ps->border_position[ps->num_env]; n++)
1082
29.1M
            {
1083
#ifdef FIXED_POINT
1084
                uint32_t in_re, in_im;
1085
#endif
1086
1087
                /* input from hybrid subbands or QMF subbands */
1088
29.1M
                if (gr < ps->num_hybrid_groups)
1089
6.68M
                {
1090
6.68M
                    RE(inputLeft) = QMF_RE(X_hybrid_left[n][sb]);
1091
6.68M
                    IM(inputLeft) = QMF_IM(X_hybrid_left[n][sb]);
1092
22.5M
                } else {
1093
22.5M
                    RE(inputLeft) = QMF_RE(X_left[n][sb]);
1094
22.5M
                    IM(inputLeft) = QMF_IM(X_left[n][sb]);
1095
22.5M
                }
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
29.1M
                P[n][bk] += MUL_R(RE(inputLeft),RE(inputLeft)) + MUL_R(IM(inputLeft),IM(inputLeft));
1107
29.1M
#endif
1108
29.1M
            }
1109
934k
        }
1110
384k
    }
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
311k
    for (bk = 0; bk < ps->nr_par_bands; bk++)
1128
299k
    {
1129
9.64M
        for (n = ps->border_position[0]; n < ps->border_position[ps->num_env]; n++)
1130
9.34M
        {
1131
9.34M
            const real_t gamma = COEF_CONST(1.5);
1132
1133
9.34M
            ps->P_PeakDecayNrg[bk] = MUL_F(ps->P_PeakDecayNrg[bk], ps->alpha_decay);
1134
9.34M
            if (ps->P_PeakDecayNrg[bk] < P[n][bk])
1135
123k
                ps->P_PeakDecayNrg[bk] = P[n][bk];
1136
1137
            /* apply smoothing filter to peak decay energy */
1138
9.34M
            P_SmoothPeakDecayDiffNrg = ps->P_SmoothPeakDecayDiffNrg_prev[bk];
1139
9.34M
            P_SmoothPeakDecayDiffNrg += MUL_F((ps->P_PeakDecayNrg[bk] - P[n][bk] - ps->P_SmoothPeakDecayDiffNrg_prev[bk]), ps->alpha_smooth);
1140
9.34M
            ps->P_SmoothPeakDecayDiffNrg_prev[bk] = P_SmoothPeakDecayDiffNrg;
1141
1142
            /* apply smoothing filter to energy */
1143
9.34M
            nrg = ps->P_prev[bk];
1144
9.34M
            nrg += MUL_F((P[n][bk] - ps->P_prev[bk]), ps->alpha_smooth);
1145
9.34M
            ps->P_prev[bk] = nrg;
1146
1147
            /* calculate transient ratio */
1148
9.34M
            if (MUL_C(P_SmoothPeakDecayDiffNrg, gamma) <= nrg)
1149
9.24M
            {
1150
9.24M
                G_TransientRatio[n][bk] = REAL_CONST(1.0);
1151
9.24M
            } else {
1152
100k
                G_TransientRatio[n][bk] = DIV_R(nrg, (MUL_C(P_SmoothPeakDecayDiffNrg, gamma)));
1153
100k
            }
1154
9.34M
        }
1155
299k
    }
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
396k
    for (gr = 0; gr < ps->num_groups; gr++)
1173
384k
    {
1174
384k
        if (gr < ps->num_hybrid_groups)
1175
214k
            maxsb = ps->group_border[gr] + 1;
1176
169k
        else
1177
169k
            maxsb = ps->group_border[gr + 1];
1178
1179
        /* QMF channel */
1180
1.31M
        for (sb = ps->group_border[gr]; sb < maxsb; sb++)
1181
934k
        {
1182
934k
            real_t g_DecaySlope;
1183
934k
            real_t g_DecaySlope_filt[NO_ALLPASS_LINKS];
1184
1185
            /* g_DecaySlope: [0..1] */
1186
934k
            if (gr < ps->num_hybrid_groups || sb <= ps->decay_cutoff)
1187
226k
            {
1188
226k
                g_DecaySlope = FRAC_CONST(1.0);
1189
707k
            } else {
1190
707k
                int8_t decay = ps->decay_cutoff - sb;
1191
707k
                if (decay <= -20 /* -1/DECAY_SLOPE */)
1192
480k
                {
1193
480k
                    g_DecaySlope = 0;
1194
480k
                } else {
1195
                    /* decay(int)*decay_slope(frac) = g_DecaySlope(frac) */
1196
226k
                    g_DecaySlope = FRAC_CONST(1.0) + DECAY_SLOPE * decay;
1197
226k
                }
1198
707k
            }
1199
1200
            /* calculate g_DecaySlope_filt for every n multiplied by filter_a[n] */
1201
3.73M
            for (n = 0; n < NO_ALLPASS_LINKS; n++)
1202
2.80M
            {
1203
2.80M
                g_DecaySlope_filt[n] = MUL_F(g_DecaySlope, filter_a[n]);
1204
2.80M
            }
1205
1206
1207
            /* set delay indices */
1208
934k
            temp_delay = ps->saved_delay;
1209
3.73M
            for (n = 0; n < NO_ALLPASS_LINKS; n++)
1210
2.80M
                temp_delay_ser[n] = ps->delay_buf_index_ser[n];
1211
1212
30.1M
            for (n = ps->border_position[0]; n < ps->border_position[ps->num_env]; n++)
1213
29.1M
            {
1214
29.1M
                complex_t tmp, tmp0, R0;
1215
29.1M
                uint8_t m;
1216
1217
29.1M
                if (gr < ps->num_hybrid_groups)
1218
6.68M
                {
1219
                    /* hybrid filterbank input */
1220
6.68M
                    RE(inputLeft) = QMF_RE(X_hybrid_left[n][sb]);
1221
6.68M
                    IM(inputLeft) = QMF_IM(X_hybrid_left[n][sb]);
1222
22.5M
                } else {
1223
                    /* QMF filterbank input */
1224
22.5M
                    RE(inputLeft) = QMF_RE(X_left[n][sb]);
1225
22.5M
                    IM(inputLeft) = QMF_IM(X_left[n][sb]);
1226
22.5M
                }
1227
1228
29.1M
                if (sb > ps->nr_allpass_bands && gr >= ps->num_hybrid_groups)
1229
15.3M
                {
1230
                    /* delay */
1231
1232
                    /* never hybrid subbands here, always QMF subbands */
1233
15.3M
                    RE(tmp) = RE(ps->delay_Qmf[ps->delay_buf_index_delay[sb]][sb]);
1234
15.3M
                    IM(tmp) = IM(ps->delay_Qmf[ps->delay_buf_index_delay[sb]][sb]);
1235
15.3M
                    RE(R0) = RE(tmp);
1236
15.3M
                    IM(R0) = IM(tmp);
1237
15.3M
                    RE(ps->delay_Qmf[ps->delay_buf_index_delay[sb]][sb]) = RE(inputLeft);
1238
15.3M
                    IM(ps->delay_Qmf[ps->delay_buf_index_delay[sb]][sb]) = IM(inputLeft);
1239
15.3M
                } else {
1240
                    /* allpass filter */
1241
13.8M
                    complex_t Phi_Fract;
1242
1243
                    /* fetch parameters */
1244
13.8M
                    if (gr < ps->num_hybrid_groups)
1245
6.68M
                    {
1246
                        /* select data from the hybrid subbands */
1247
6.68M
                        RE(tmp0) = RE(ps->delay_SubQmf[temp_delay][sb]);
1248
6.68M
                        IM(tmp0) = IM(ps->delay_SubQmf[temp_delay][sb]);
1249
1250
6.68M
                        RE(ps->delay_SubQmf[temp_delay][sb]) = RE(inputLeft);
1251
6.68M
                        IM(ps->delay_SubQmf[temp_delay][sb]) = IM(inputLeft);
1252
1253
6.68M
                        RE(Phi_Fract) = RE(Phi_Fract_SubQmf[sb]);
1254
6.68M
                        IM(Phi_Fract) = IM(Phi_Fract_SubQmf[sb]);
1255
7.20M
                    } else {
1256
                        /* select data from the QMF subbands */
1257
7.20M
                        RE(tmp0) = RE(ps->delay_Qmf[temp_delay][sb]);
1258
7.20M
                        IM(tmp0) = IM(ps->delay_Qmf[temp_delay][sb]);
1259
1260
7.20M
                        RE(ps->delay_Qmf[temp_delay][sb]) = RE(inputLeft);
1261
7.20M
                        IM(ps->delay_Qmf[temp_delay][sb]) = IM(inputLeft);
1262
1263
7.20M
                        RE(Phi_Fract) = RE(Phi_Fract_Qmf[sb]);
1264
7.20M
                        IM(Phi_Fract) = IM(Phi_Fract_Qmf[sb]);
1265
7.20M
                    }
1266
1267
                    /* z^(-2) * Phi_Fract[k] */
1268
13.8M
                    ComplexMult(&RE(tmp), &IM(tmp), RE(tmp0), IM(tmp0), RE(Phi_Fract), IM(Phi_Fract));
1269
1270
13.8M
                    RE(R0) = RE(tmp);
1271
13.8M
                    IM(R0) = IM(tmp);
1272
55.5M
                    for (m = 0; m < NO_ALLPASS_LINKS; m++)
1273
41.6M
                    {
1274
41.6M
                        complex_t Q_Fract_allpass, tmp2;
1275
1276
                        /* fetch parameters */
1277
41.6M
                        if (gr < ps->num_hybrid_groups)
1278
20.0M
                        {
1279
                            /* select data from the hybrid subbands */
1280
20.0M
                            RE(tmp0) = RE(ps->delay_SubQmf_ser[m][temp_delay_ser[m]][sb]);
1281
20.0M
                            IM(tmp0) = IM(ps->delay_SubQmf_ser[m][temp_delay_ser[m]][sb]);
1282
1283
20.0M
                            if (ps->use34hybrid_bands)
1284
12.8M
                            {
1285
12.8M
                                RE(Q_Fract_allpass) = RE(Q_Fract_allpass_SubQmf34[sb][m]);
1286
12.8M
                                IM(Q_Fract_allpass) = IM(Q_Fract_allpass_SubQmf34[sb][m]);
1287
12.8M
                            } else {
1288
7.18M
                                RE(Q_Fract_allpass) = RE(Q_Fract_allpass_SubQmf20[sb][m]);
1289
7.18M
                                IM(Q_Fract_allpass) = IM(Q_Fract_allpass_SubQmf20[sb][m]);
1290
7.18M
                            }
1291
21.6M
                        } else {
1292
                            /* select data from the QMF subbands */
1293
21.6M
                            RE(tmp0) = RE(ps->delay_Qmf_ser[m][temp_delay_ser[m]][sb]);
1294
21.6M
                            IM(tmp0) = IM(ps->delay_Qmf_ser[m][temp_delay_ser[m]][sb]);
1295
1296
21.6M
                            RE(Q_Fract_allpass) = RE(Q_Fract_allpass_Qmf[sb][m]);
1297
21.6M
                            IM(Q_Fract_allpass) = IM(Q_Fract_allpass_Qmf[sb][m]);
1298
21.6M
                        }
1299
1300
                        /* delay by a fraction */
1301
                        /* z^(-d(m)) * Q_Fract_allpass[k,m] */
1302
41.6M
                        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
41.6M
                        RE(tmp) += -MUL_F(g_DecaySlope_filt[m], RE(R0));
1306
41.6M
                        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
41.6M
                        RE(tmp2) = RE(R0) + MUL_F(g_DecaySlope_filt[m], RE(tmp));
1310
41.6M
                        IM(tmp2) = IM(R0) + MUL_F(g_DecaySlope_filt[m], IM(tmp));
1311
1312
                        /* store sample */
1313
41.6M
                        if (gr < ps->num_hybrid_groups)
1314
20.0M
                        {
1315
20.0M
                            RE(ps->delay_SubQmf_ser[m][temp_delay_ser[m]][sb]) = RE(tmp2);
1316
20.0M
                            IM(ps->delay_SubQmf_ser[m][temp_delay_ser[m]][sb]) = IM(tmp2);
1317
21.6M
                        } else {
1318
21.6M
                            RE(ps->delay_Qmf_ser[m][temp_delay_ser[m]][sb]) = RE(tmp2);
1319
21.6M
                            IM(ps->delay_Qmf_ser[m][temp_delay_ser[m]][sb]) = IM(tmp2);
1320
21.6M
                        }
1321
1322
                        /* store for next iteration (or as output value if last iteration) */
1323
41.6M
                        RE(R0) = RE(tmp);
1324
41.6M
                        IM(R0) = IM(tmp);
1325
41.6M
                    }
1326
13.8M
                }
1327
1328
                /* select b(k) for reading the transient ratio */
1329
29.1M
                bk = (~NEGATE_IPD_MASK) & ps->map_group2bk[gr];
1330
1331
                /* duck if a past transient is found */
1332
29.1M
                RE(R0) = MUL_R(G_TransientRatio[n][bk], RE(R0));
1333
29.1M
                IM(R0) = MUL_R(G_TransientRatio[n][bk], IM(R0));
1334
1335
29.1M
                if (gr < ps->num_hybrid_groups)
1336
6.68M
                {
1337
                    /* hybrid */
1338
6.68M
                    QMF_RE(X_hybrid_right[n][sb]) = RE(R0);
1339
6.68M
                    QMF_IM(X_hybrid_right[n][sb]) = IM(R0);
1340
22.5M
                } else {
1341
                    /* QMF */
1342
22.5M
                    QMF_RE(X_right[n][sb]) = RE(R0);
1343
22.5M
                    QMF_IM(X_right[n][sb]) = IM(R0);
1344
22.5M
                }
1345
1346
                /* Update delay buffer index */
1347
29.1M
                if (++temp_delay >= 2)
1348
14.5M
                {
1349
14.5M
                    temp_delay = 0;
1350
14.5M
                }
1351
1352
                /* update delay indices */
1353
29.1M
                if (sb > ps->nr_allpass_bands && gr >= ps->num_hybrid_groups)
1354
15.3M
                {
1355
                    /* delay_D depends on the samplerate, it can hold the values 14 and 1 */
1356
15.3M
                    if (++ps->delay_buf_index_delay[sb] >= ps->delay_D[sb])
1357
11.1M
                    {
1358
11.1M
                        ps->delay_buf_index_delay[sb] = 0;
1359
11.1M
                    }
1360
15.3M
                }
1361
1362
116M
                for (m = 0; m < NO_ALLPASS_LINKS; m++)
1363
87.5M
                {
1364
87.5M
                    if (++temp_delay_ser[m] >= ps->num_sample_delay_ser[m])
1365
22.4M
                    {
1366
22.4M
                        temp_delay_ser[m] = 0;
1367
22.4M
                    }
1368
87.5M
                }
1369
29.1M
            }
1370
934k
        }
1371
384k
    }
1372
1373
    /* update delay indices */
1374
11.9k
    ps->saved_delay = temp_delay;
1375
47.7k
    for (n = 0; n < NO_ALLPASS_LINKS; n++)
1376
35.7k
        ps->delay_buf_index_ser[n] = temp_delay_ser[n];
1377
11.9k
}
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
436k
{
1438
#ifdef FIXED_POINT
1439
445k
#define ps_abs(A) (((A) > 0) ? (A) : (-(A)))
1440
#define ALPHA FRAC_CONST(0.948059448969)
1441
#define BETA  FRAC_CONST(0.392699081699)
1442
1443
222k
    real_t abs_inphase = ps_abs(RE(c));
1444
222k
    real_t abs_quadrature = ps_abs(IM(c));
1445
1446
222k
    if (abs_inphase > abs_quadrature) {
1447
186k
        return MUL_F(abs_inphase, ALPHA) + MUL_F(abs_quadrature, BETA);
1448
186k
    } else {
1449
36.4k
        return MUL_F(abs_quadrature, ALPHA) + MUL_F(abs_inphase, BETA);
1450
36.4k
    }
1451
#else
1452
214k
    return sqrt(RE(c)*RE(c) + IM(c)*IM(c));
1453
#endif
1454
436k
}
ps_dec.c:magnitude_c
Line
Count
Source
1437
222k
{
1438
222k
#ifdef FIXED_POINT
1439
222k
#define ps_abs(A) (((A) > 0) ? (A) : (-(A)))
1440
222k
#define ALPHA FRAC_CONST(0.948059448969)
1441
222k
#define BETA  FRAC_CONST(0.392699081699)
1442
1443
222k
    real_t abs_inphase = ps_abs(RE(c));
1444
222k
    real_t abs_quadrature = ps_abs(IM(c));
1445
1446
222k
    if (abs_inphase > abs_quadrature) {
1447
186k
        return MUL_F(abs_inphase, ALPHA) + MUL_F(abs_quadrature, BETA);
1448
186k
    } else {
1449
36.4k
        return MUL_F(abs_quadrature, ALPHA) + MUL_F(abs_inphase, BETA);
1450
36.4k
    }
1451
#else
1452
    return sqrt(RE(c)*RE(c) + IM(c)*IM(c));
1453
#endif
1454
222k
}
ps_dec.c:magnitude_c
Line
Count
Source
1437
214k
{
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
214k
    return sqrt(RE(c)*RE(c) + IM(c)*IM(c));
1453
214k
#endif
1454
214k
}
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
21.0k
{
1459
21.0k
    uint8_t n;
1460
21.0k
    uint8_t gr;
1461
21.0k
    uint8_t bk = 0;
1462
21.0k
    uint8_t sb, maxsb;
1463
21.0k
    uint8_t env;
1464
21.0k
    uint8_t nr_ipdopd_par;
1465
21.0k
    complex_t h11, h12, h21, h22;  // COEF
1466
21.0k
    complex_t H11, H12, H21, H22;  // COEF
1467
21.0k
    complex_t deltaH11, deltaH12, deltaH21, deltaH22;  // COEF
1468
21.0k
    complex_t tempLeft, tempRight; // FRAC
1469
21.0k
    complex_t phaseLeft, phaseRight; // FRAC
1470
21.0k
    real_t L;
1471
21.0k
    const real_t *sf_iid;
1472
21.0k
    uint8_t no_iid_steps;
1473
1474
21.0k
    if (ps->iid_mode >= 3)
1475
8.41k
    {
1476
8.41k
        no_iid_steps = 15;
1477
8.41k
        sf_iid = sf_iid_fine;
1478
12.6k
    } else {
1479
12.6k
        no_iid_steps = 7;
1480
12.6k
        sf_iid = sf_iid_normal;
1481
12.6k
    }
1482
1483
21.0k
    if (ps->ipd_mode == 0 || ps->ipd_mode == 3)
1484
12.5k
    {
1485
12.5k
        nr_ipdopd_par = 11; /* resolution */
1486
12.5k
    } else {
1487
8.49k
        nr_ipdopd_par = ps->nr_ipdopd_par;
1488
8.49k
    }
1489
1490
691k
    for (gr = 0; gr < ps->num_groups; gr++)
1491
670k
    {
1492
670k
        bk = (~NEGATE_IPD_MASK) & ps->map_group2bk[gr];
1493
1494
        /* use one channel per group in the subqmf domain */
1495
670k
        maxsb = (gr < ps->num_hybrid_groups) ? ps->group_border[gr] + 1 : ps->group_border[gr + 1];
1496
1497
2.22M
        for (env = 0; env < ps->num_env; env++)
1498
1.55M
        {
1499
1.55M
            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.55M
            if (ps->iid_index[env][bk] < -no_iid_steps) {
1505
423
                fprintf(stderr, "Warning: invalid iid_index: %d < %d\n", ps->iid_index[env][bk],
1506
423
                    -no_iid_steps);
1507
423
                ps->iid_index[env][bk] = -no_iid_steps;
1508
423
                abs_iid = no_iid_steps;
1509
1.55M
            } else if (ps->iid_index[env][bk] > no_iid_steps) {
1510
210
                fprintf(stderr, "Warning: invalid iid_index: %d > %d\n", ps->iid_index[env][bk],
1511
210
                    no_iid_steps);
1512
210
                ps->iid_index[env][bk] = no_iid_steps;
1513
210
                abs_iid = no_iid_steps;
1514
210
            }
1515
1.55M
            if (ps->icc_index[env][bk] < 0) {
1516
443
                fprintf(stderr, "Warning: invalid icc_index: %d < 0\n", ps->icc_index[env][bk]);
1517
443
                ps->icc_index[env][bk] = 0;
1518
1.55M
            } 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.55M
            if (ps->icc_mode < 3)
1524
835k
            {
1525
                /* type 'A' mixing as described in 8.6.4.6.2.1 */
1526
835k
                real_t c_1, c_2;  // COEF
1527
835k
                real_t cosa, sina;  // COEF
1528
835k
                real_t cosb, sinb;  // COEF
1529
835k
                real_t ab1, ab2;  // COEF
1530
835k
                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
835k
                c_1 = sf_iid[no_iid_steps + ps->iid_index[env][bk]];
1543
835k
                c_2 = sf_iid[no_iid_steps - ps->iid_index[env][bk]];
1544
1545
                /* calculate alpha and beta using the ICC parameters */
1546
835k
                cosa = cos_alphas[ps->icc_index[env][bk]];
1547
835k
                sina = sin_alphas[ps->icc_index[env][bk]];
1548
1549
835k
                if (ps->iid_mode >= 3)
1550
255k
                {
1551
255k
                    cosb = cos_betas_fine[abs_iid][ps->icc_index[env][bk]];
1552
255k
                    sinb = sin_betas_fine[abs_iid][ps->icc_index[env][bk]];
1553
579k
                } else {
1554
579k
                    cosb = cos_betas_normal[abs_iid][ps->icc_index[env][bk]];
1555
579k
                    sinb = sin_betas_normal[abs_iid][ps->icc_index[env][bk]];
1556
579k
                }
1557
1558
835k
                ab1 = MUL_C(cosb, cosa);
1559
835k
                ab2 = MUL_C(sinb, sina);
1560
835k
                ab3 = MUL_C(sinb, cosa);
1561
835k
                ab4 = MUL_C(cosb, sina);
1562
1563
                /* h_xy: COEF */
1564
835k
                RE(h11) = MUL_C(c_2, (ab1 - ab2));
1565
835k
                RE(h12) = MUL_C(c_1, (ab1 + ab2));
1566
835k
                RE(h21) = MUL_C(c_2, (ab3 + ab4));
1567
835k
                RE(h22) = MUL_C(c_1, (ab3 - ab4));
1568
835k
            } else {
1569
                /* type 'B' mixing as described in 8.6.4.6.2.2 */
1570
716k
                real_t sina, cosa;  // COEF
1571
716k
                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
716k
                if (ps->iid_mode >= 3)
1607
443k
                {
1608
443k
                    cosa = sincos_alphas_B_fine[no_iid_steps + ps->iid_index[env][bk]][ps->icc_index[env][bk]];
1609
443k
                    sina = sincos_alphas_B_fine[30 - (no_iid_steps + ps->iid_index[env][bk])][ps->icc_index[env][bk]];
1610
443k
                    cosg = cos_gammas_fine[abs_iid][ps->icc_index[env][bk]];
1611
443k
                    sing = sin_gammas_fine[abs_iid][ps->icc_index[env][bk]];
1612
443k
                } else {
1613
273k
                    cosa = sincos_alphas_B_normal[no_iid_steps + ps->iid_index[env][bk]][ps->icc_index[env][bk]];
1614
273k
                    sina = sincos_alphas_B_normal[14 - (no_iid_steps + ps->iid_index[env][bk])][ps->icc_index[env][bk]];
1615
273k
                    cosg = cos_gammas_normal[abs_iid][ps->icc_index[env][bk]];
1616
273k
                    sing = sin_gammas_normal[abs_iid][ps->icc_index[env][bk]];
1617
273k
                }
1618
1619
716k
                RE(h11) = MUL_C(COEF_SQRT2, MUL_C(cosa, cosg));
1620
716k
                RE(h12) = MUL_C(COEF_SQRT2, MUL_C(sina, cosg));
1621
716k
                RE(h21) = MUL_C(COEF_SQRT2, MUL_C(-cosa, sing));
1622
716k
                RE(h22) = MUL_C(COEF_SQRT2, MUL_C(sina, sing));
1623
716k
            }
1624
1.55M
            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.55M
            if ((ps->enable_ipdopd) && (bk < nr_ipdopd_par))
1631
218k
            {
1632
218k
                int8_t i;
1633
218k
                real_t xy, pq, xypq;  // FRAC
1634
1635
                /* ringbuffer index */
1636
218k
                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
111k
                RE(tempLeft)  = RE(ps->ipd_prev[bk][i]) >> 3;
1643
111k
                IM(tempLeft)  = IM(ps->ipd_prev[bk][i]) >> 3;
1644
111k
                RE(tempRight) = RE(ps->opd_prev[bk][i]) >> 3;
1645
111k
                IM(tempRight) = IM(ps->opd_prev[bk][i]) >> 3;
1646
#else
1647
107k
                RE(tempLeft)  = MUL_F(RE(ps->ipd_prev[bk][i]), FRAC_CONST(0.25));
1648
107k
                IM(tempLeft)  = MUL_F(IM(ps->ipd_prev[bk][i]), FRAC_CONST(0.25));
1649
107k
                RE(tempRight) = MUL_F(RE(ps->opd_prev[bk][i]), FRAC_CONST(0.25));
1650
107k
                IM(tempRight) = MUL_F(IM(ps->opd_prev[bk][i]), FRAC_CONST(0.25));
1651
#endif
1652
1653
                /* save current value */
1654
218k
                RE(ps->ipd_prev[bk][i]) = ipdopd_cos_tab[abs(ps->ipd_index[env][bk])];
1655
218k
                IM(ps->ipd_prev[bk][i]) = ipdopd_sin_tab[abs(ps->ipd_index[env][bk])];
1656
218k
                RE(ps->opd_prev[bk][i]) = ipdopd_cos_tab[abs(ps->opd_index[env][bk])];
1657
218k
                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
111k
                RE(tempLeft)  += RE(ps->ipd_prev[bk][i]) >> 1;
1663
111k
                IM(tempLeft)  += IM(ps->ipd_prev[bk][i]) >> 1;
1664
111k
                RE(tempRight) += RE(ps->opd_prev[bk][i]) >> 1;
1665
111k
                IM(tempRight) += IM(ps->opd_prev[bk][i]) >> 1;
1666
#else
1667
107k
                RE(tempLeft)  += RE(ps->ipd_prev[bk][i]);
1668
107k
                IM(tempLeft)  += IM(ps->ipd_prev[bk][i]);
1669
107k
                RE(tempRight) += RE(ps->opd_prev[bk][i]);
1670
107k
                IM(tempRight) += IM(ps->opd_prev[bk][i]);
1671
#endif
1672
1673
                /* ringbuffer index */
1674
218k
                if (i == 0)
1675
110k
                {
1676
110k
                    i = 2;
1677
110k
                }
1678
218k
                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
111k
                RE(tempLeft)  += (RE(ps->ipd_prev[bk][i]) >> 2);
1684
111k
                IM(tempLeft)  += (IM(ps->ipd_prev[bk][i]) >> 2);
1685
111k
                RE(tempRight) += (RE(ps->opd_prev[bk][i]) >> 2);
1686
111k
                IM(tempRight) += (IM(ps->opd_prev[bk][i]) >> 2);
1687
#else
1688
107k
                RE(tempLeft)  += MUL_F(RE(ps->ipd_prev[bk][i]), FRAC_CONST(0.5));
1689
107k
                IM(tempLeft)  += MUL_F(IM(ps->ipd_prev[bk][i]), FRAC_CONST(0.5));
1690
107k
                RE(tempRight) += MUL_F(RE(ps->opd_prev[bk][i]), FRAC_CONST(0.5));
1691
107k
                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
218k
                xy = magnitude_c(tempRight);
1716
218k
                pq = magnitude_c(tempLeft);
1717
1718
218k
                if (xy != 0)
1719
218k
                {
1720
218k
                    RE(phaseLeft) = DIV_F(RE(tempRight), xy);
1721
218k
                    IM(phaseLeft) = DIV_F(IM(tempRight), xy);
1722
218k
                } else {
1723
0
                    RE(phaseLeft) = 0;
1724
0
                    IM(phaseLeft) = 0;
1725
0
                }
1726
1727
218k
                xypq = MUL_F(xy, pq);
1728
1729
218k
                if (xypq != 0)
1730
218k
                {
1731
218k
                    real_t tmp1 = MUL_F(RE(tempRight), RE(tempLeft)) + MUL_F(IM(tempRight), IM(tempLeft));
1732
218k
                    real_t tmp2 = MUL_F(IM(tempRight), RE(tempLeft)) - MUL_F(RE(tempRight), IM(tempLeft));
1733
1734
218k
                    RE(phaseRight) = DIV_F(tmp1, xypq);
1735
218k
                    IM(phaseRight) = DIV_F(tmp2, xypq);
1736
218k
                } else {
1737
0
                    RE(phaseRight) = 0;
1738
0
                    IM(phaseRight) = 0;
1739
0
                }
1740
1741
218k
#endif
1742
1743
                /* MUL_F(COEF, REAL) = COEF */
1744
218k
                IM(h11) = MUL_F(RE(h11), IM(phaseLeft));
1745
218k
                IM(h12) = MUL_F(RE(h12), IM(phaseRight));
1746
218k
                IM(h21) = MUL_F(RE(h21), IM(phaseLeft));
1747
218k
                IM(h22) = MUL_F(RE(h22), IM(phaseRight));
1748
1749
218k
                RE(h11) = MUL_F(RE(h11), RE(phaseLeft));
1750
218k
                RE(h12) = MUL_F(RE(h12), RE(phaseRight));
1751
218k
                RE(h21) = MUL_F(RE(h21), RE(phaseLeft));
1752
218k
                RE(h22) = MUL_F(RE(h22), RE(phaseRight));
1753
218k
            }
1754
1755
            /* length of the envelope n_e+1 - n_e (in time samples) */
1756
            /* 0 < L <= 32: integer */
1757
1.55M
            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.55M
            RE(deltaH11) = (RE(h11) - RE(ps->h11_prev[gr])) / L;
1761
1.55M
            RE(deltaH12) = (RE(h12) - RE(ps->h12_prev[gr])) / L;
1762
1.55M
            RE(deltaH21) = (RE(h21) - RE(ps->h21_prev[gr])) / L;
1763
1.55M
            RE(deltaH22) = (RE(h22) - RE(ps->h22_prev[gr])) / L;
1764
1765
1.55M
            RE(H11) = RE(ps->h11_prev[gr]);
1766
1.55M
            RE(H12) = RE(ps->h12_prev[gr]);
1767
1.55M
            RE(H21) = RE(ps->h21_prev[gr]);
1768
1.55M
            RE(H22) = RE(ps->h22_prev[gr]);
1769
1.55M
            IM(H11) = IM(H12) = IM(H21) = IM(H22) = 0;
1770
1771
1.55M
            RE(ps->h11_prev[gr]) = RE(h11);
1772
1.55M
            RE(ps->h12_prev[gr]) = RE(h12);
1773
1.55M
            RE(ps->h21_prev[gr]) = RE(h21);
1774
1.55M
            RE(ps->h22_prev[gr]) = RE(h22);
1775
1776
            /* only calculate imaginary part when needed */
1777
1.55M
            if ((ps->enable_ipdopd) && (bk < nr_ipdopd_par))
1778
218k
            {
1779
                /* obtain final H_xy by means of linear interpolation */
1780
218k
                IM(deltaH11) = (IM(h11) - IM(ps->h11_prev[gr])) / L;
1781
218k
                IM(deltaH12) = (IM(h12) - IM(ps->h12_prev[gr])) / L;
1782
218k
                IM(deltaH21) = (IM(h21) - IM(ps->h21_prev[gr])) / L;
1783
218k
                IM(deltaH22) = (IM(h22) - IM(ps->h22_prev[gr])) / L;
1784
1785
218k
                IM(H11) = IM(ps->h11_prev[gr]);
1786
218k
                IM(H12) = IM(ps->h12_prev[gr]);
1787
218k
                IM(H21) = IM(ps->h21_prev[gr]);
1788
218k
                IM(H22) = IM(ps->h22_prev[gr]);
1789
1790
218k
                if ((NEGATE_IPD_MASK & ps->map_group2bk[gr]) != 0)
1791
31.2k
                {
1792
31.2k
                    IM(deltaH11) = -IM(deltaH11);
1793
31.2k
                    IM(deltaH12) = -IM(deltaH12);
1794
31.2k
                    IM(deltaH21) = -IM(deltaH21);
1795
31.2k
                    IM(deltaH22) = -IM(deltaH22);
1796
1797
31.2k
                    IM(H11) = -IM(H11);
1798
31.2k
                    IM(H12) = -IM(H12);
1799
31.2k
                    IM(H21) = -IM(H21);
1800
31.2k
                    IM(H22) = -IM(H22);
1801
31.2k
                }
1802
1803
218k
                IM(ps->h11_prev[gr]) = IM(h11);
1804
218k
                IM(ps->h12_prev[gr]) = IM(h12);
1805
218k
                IM(ps->h21_prev[gr]) = IM(h21);
1806
218k
                IM(ps->h22_prev[gr]) = IM(h22);
1807
218k
            }
1808
1809
            /* apply H_xy to the current envelope band of the decorrelated subband */
1810
22.4M
            for (n = ps->border_position[env]; n < ps->border_position[env + 1]; n++)
1811
20.9M
            {
1812
                /* addition finalises the interpolation over every n */
1813
20.9M
                RE(H11) += RE(deltaH11);
1814
20.9M
                RE(H12) += RE(deltaH12);
1815
20.9M
                RE(H21) += RE(deltaH21);
1816
20.9M
                RE(H22) += RE(deltaH22);
1817
20.9M
                if ((ps->enable_ipdopd) && (bk < nr_ipdopd_par))
1818
2.31M
                {
1819
2.31M
                    IM(H11) += IM(deltaH11);
1820
2.31M
                    IM(H12) += IM(deltaH12);
1821
2.31M
                    IM(H21) += IM(deltaH21);
1822
2.31M
                    IM(H22) += IM(deltaH22);
1823
2.31M
                }
1824
1825
                /* channel is an alias to the subband */
1826
72.2M
                for (sb = ps->group_border[gr]; sb < maxsb; sb++)
1827
51.3M
                {
1828
51.3M
                    complex_t inLeft, inRight;  // precision_of in(Left|Right) == precision_of X_(left|right)
1829
1830
                    /* load decorrelated samples */
1831
51.3M
                    if (gr < ps->num_hybrid_groups)
1832
11.6M
                    {
1833
11.6M
                        RE(inLeft) =  RE(X_hybrid_left[n][sb]);
1834
11.6M
                        IM(inLeft) =  IM(X_hybrid_left[n][sb]);
1835
11.6M
                        RE(inRight) = RE(X_hybrid_right[n][sb]);
1836
11.6M
                        IM(inRight) = IM(X_hybrid_right[n][sb]);
1837
39.6M
                    } else {
1838
39.6M
                        RE(inLeft) =  RE(X_left[n][sb]);
1839
39.6M
                        IM(inLeft) =  IM(X_left[n][sb]);
1840
39.6M
                        RE(inRight) = RE(X_right[n][sb]);
1841
39.6M
                        IM(inRight) = IM(X_right[n][sb]);
1842
39.6M
                    }
1843
1844
                    /* precision_of temp(Left|Right) == precision_of X_(left|right) */
1845
1846
                    /* apply mixing */
1847
51.3M
                    RE(tempLeft) =  MUL_C(RE(H11), RE(inLeft)) + MUL_C(RE(H21), RE(inRight));
1848
51.3M
                    IM(tempLeft) =  MUL_C(RE(H11), IM(inLeft)) + MUL_C(RE(H21), IM(inRight));
1849
51.3M
                    RE(tempRight) = MUL_C(RE(H12), RE(inLeft)) + MUL_C(RE(H22), RE(inRight));
1850
51.3M
                    IM(tempRight) = MUL_C(RE(H12), IM(inLeft)) + MUL_C(RE(H22), IM(inRight));
1851
1852
                    /* only perform imaginary operations when needed */
1853
51.3M
                    if ((ps->enable_ipdopd) && (bk < nr_ipdopd_par))
1854
2.31M
                    {
1855
                        /* apply rotation */
1856
2.31M
                        RE(tempLeft)  -= MUL_C(IM(H11), IM(inLeft)) + MUL_C(IM(H21), IM(inRight));
1857
2.31M
                        IM(tempLeft)  += MUL_C(IM(H11), RE(inLeft)) + MUL_C(IM(H21), RE(inRight));
1858
2.31M
                        RE(tempRight) -= MUL_C(IM(H12), IM(inLeft)) + MUL_C(IM(H22), IM(inRight));
1859
2.31M
                        IM(tempRight) += MUL_C(IM(H12), RE(inLeft)) + MUL_C(IM(H22), RE(inRight));
1860
2.31M
                    }
1861
1862
                    /* store final samples */
1863
51.3M
                    if (gr < ps->num_hybrid_groups)
1864
11.6M
                    {
1865
11.6M
                        RE(X_hybrid_left[n][sb])  = RE(tempLeft);
1866
11.6M
                        IM(X_hybrid_left[n][sb])  = IM(tempLeft);
1867
11.6M
                        RE(X_hybrid_right[n][sb]) = RE(tempRight);
1868
11.6M
                        IM(X_hybrid_right[n][sb]) = IM(tempRight);
1869
39.6M
                    } else {
1870
39.6M
                        RE(X_left[n][sb])  = RE(tempLeft);
1871
39.6M
                        IM(X_left[n][sb])  = IM(tempLeft);
1872
39.6M
                        RE(X_right[n][sb]) = RE(tempRight);
1873
39.6M
                        IM(X_right[n][sb]) = IM(tempRight);
1874
39.6M
                    }
1875
51.3M
                }
1876
20.9M
            }
1877
1878
            /* shift phase smoother's circular buffer index */
1879
1.55M
            ps->phase_hist++;
1880
1.55M
            if (ps->phase_hist == 2)
1881
776k
            {
1882
776k
                ps->phase_hist = 0;
1883
776k
            }
1884
1.55M
        }
1885
670k
    }
1886
21.0k
}
ps_dec.c:ps_mix_phase
Line
Count
Source
1458
9.10k
{
1459
9.10k
    uint8_t n;
1460
9.10k
    uint8_t gr;
1461
9.10k
    uint8_t bk = 0;
1462
9.10k
    uint8_t sb, maxsb;
1463
9.10k
    uint8_t env;
1464
9.10k
    uint8_t nr_ipdopd_par;
1465
9.10k
    complex_t h11, h12, h21, h22;  // COEF
1466
9.10k
    complex_t H11, H12, H21, H22;  // COEF
1467
9.10k
    complex_t deltaH11, deltaH12, deltaH21, deltaH22;  // COEF
1468
9.10k
    complex_t tempLeft, tempRight; // FRAC
1469
9.10k
    complex_t phaseLeft, phaseRight; // FRAC
1470
9.10k
    real_t L;
1471
9.10k
    const real_t *sf_iid;
1472
9.10k
    uint8_t no_iid_steps;
1473
1474
9.10k
    if (ps->iid_mode >= 3)
1475
3.63k
    {
1476
3.63k
        no_iid_steps = 15;
1477
3.63k
        sf_iid = sf_iid_fine;
1478
5.47k
    } else {
1479
5.47k
        no_iid_steps = 7;
1480
5.47k
        sf_iid = sf_iid_normal;
1481
5.47k
    }
1482
1483
9.10k
    if (ps->ipd_mode == 0 || ps->ipd_mode == 3)
1484
5.36k
    {
1485
5.36k
        nr_ipdopd_par = 11; /* resolution */
1486
5.36k
    } else {
1487
3.74k
        nr_ipdopd_par = ps->nr_ipdopd_par;
1488
3.74k
    }
1489
1490
295k
    for (gr = 0; gr < ps->num_groups; gr++)
1491
286k
    {
1492
286k
        bk = (~NEGATE_IPD_MASK) & ps->map_group2bk[gr];
1493
1494
        /* use one channel per group in the subqmf domain */
1495
286k
        maxsb = (gr < ps->num_hybrid_groups) ? ps->group_border[gr] + 1 : ps->group_border[gr + 1];
1496
1497
968k
        for (env = 0; env < ps->num_env; env++)
1498
681k
        {
1499
681k
            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
681k
            if (ps->iid_index[env][bk] < -no_iid_steps) {
1505
88
                fprintf(stderr, "Warning: invalid iid_index: %d < %d\n", ps->iid_index[env][bk],
1506
88
                    -no_iid_steps);
1507
88
                ps->iid_index[env][bk] = -no_iid_steps;
1508
88
                abs_iid = no_iid_steps;
1509
681k
            } else if (ps->iid_index[env][bk] > no_iid_steps) {
1510
52
                fprintf(stderr, "Warning: invalid iid_index: %d > %d\n", ps->iid_index[env][bk],
1511
52
                    no_iid_steps);
1512
52
                ps->iid_index[env][bk] = no_iid_steps;
1513
52
                abs_iid = no_iid_steps;
1514
52
            }
1515
681k
            if (ps->icc_index[env][bk] < 0) {
1516
105
                fprintf(stderr, "Warning: invalid icc_index: %d < 0\n", ps->icc_index[env][bk]);
1517
105
                ps->icc_index[env][bk] = 0;
1518
681k
            } 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
681k
            if (ps->icc_mode < 3)
1524
313k
            {
1525
                /* type 'A' mixing as described in 8.6.4.6.2.1 */
1526
313k
                real_t c_1, c_2;  // COEF
1527
313k
                real_t cosa, sina;  // COEF
1528
313k
                real_t cosb, sinb;  // COEF
1529
313k
                real_t ab1, ab2;  // COEF
1530
313k
                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
313k
                c_1 = sf_iid[no_iid_steps + ps->iid_index[env][bk]];
1543
313k
                c_2 = sf_iid[no_iid_steps - ps->iid_index[env][bk]];
1544
1545
                /* calculate alpha and beta using the ICC parameters */
1546
313k
                cosa = cos_alphas[ps->icc_index[env][bk]];
1547
313k
                sina = sin_alphas[ps->icc_index[env][bk]];
1548
1549
313k
                if (ps->iid_mode >= 3)
1550
61.1k
                {
1551
61.1k
                    cosb = cos_betas_fine[abs_iid][ps->icc_index[env][bk]];
1552
61.1k
                    sinb = sin_betas_fine[abs_iid][ps->icc_index[env][bk]];
1553
252k
                } else {
1554
252k
                    cosb = cos_betas_normal[abs_iid][ps->icc_index[env][bk]];
1555
252k
                    sinb = sin_betas_normal[abs_iid][ps->icc_index[env][bk]];
1556
252k
                }
1557
1558
313k
                ab1 = MUL_C(cosb, cosa);
1559
313k
                ab2 = MUL_C(sinb, sina);
1560
313k
                ab3 = MUL_C(sinb, cosa);
1561
313k
                ab4 = MUL_C(cosb, sina);
1562
1563
                /* h_xy: COEF */
1564
313k
                RE(h11) = MUL_C(c_2, (ab1 - ab2));
1565
313k
                RE(h12) = MUL_C(c_1, (ab1 + ab2));
1566
313k
                RE(h21) = MUL_C(c_2, (ab3 + ab4));
1567
313k
                RE(h22) = MUL_C(c_1, (ab3 - ab4));
1568
367k
            } else {
1569
                /* type 'B' mixing as described in 8.6.4.6.2.2 */
1570
367k
                real_t sina, cosa;  // COEF
1571
367k
                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
367k
                if (ps->iid_mode >= 3)
1607
233k
                {
1608
233k
                    cosa = sincos_alphas_B_fine[no_iid_steps + ps->iid_index[env][bk]][ps->icc_index[env][bk]];
1609
233k
                    sina = sincos_alphas_B_fine[30 - (no_iid_steps + ps->iid_index[env][bk])][ps->icc_index[env][bk]];
1610
233k
                    cosg = cos_gammas_fine[abs_iid][ps->icc_index[env][bk]];
1611
233k
                    sing = sin_gammas_fine[abs_iid][ps->icc_index[env][bk]];
1612
233k
                } 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
367k
                RE(h11) = MUL_C(COEF_SQRT2, MUL_C(cosa, cosg));
1620
367k
                RE(h12) = MUL_C(COEF_SQRT2, MUL_C(sina, cosg));
1621
367k
                RE(h21) = MUL_C(COEF_SQRT2, MUL_C(-cosa, sing));
1622
367k
                RE(h22) = MUL_C(COEF_SQRT2, MUL_C(sina, sing));
1623
367k
            }
1624
681k
            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
681k
            if ((ps->enable_ipdopd) && (bk < nr_ipdopd_par))
1631
111k
            {
1632
111k
                int8_t i;
1633
111k
                real_t xy, pq, xypq;  // FRAC
1634
1635
                /* ringbuffer index */
1636
111k
                i = ps->phase_hist;
1637
1638
                /* previous value */
1639
111k
#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
111k
                RE(tempLeft)  = RE(ps->ipd_prev[bk][i]) >> 3;
1643
111k
                IM(tempLeft)  = IM(ps->ipd_prev[bk][i]) >> 3;
1644
111k
                RE(tempRight) = RE(ps->opd_prev[bk][i]) >> 3;
1645
111k
                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
111k
                RE(ps->ipd_prev[bk][i]) = ipdopd_cos_tab[abs(ps->ipd_index[env][bk])];
1655
111k
                IM(ps->ipd_prev[bk][i]) = ipdopd_sin_tab[abs(ps->ipd_index[env][bk])];
1656
111k
                RE(ps->opd_prev[bk][i]) = ipdopd_cos_tab[abs(ps->opd_index[env][bk])];
1657
111k
                IM(ps->opd_prev[bk][i]) = ipdopd_sin_tab[abs(ps->opd_index[env][bk])];
1658
1659
                /* add current value */
1660
111k
#ifdef FIXED_POINT
1661
                /* extra halving to avoid overflows */
1662
111k
                RE(tempLeft)  += RE(ps->ipd_prev[bk][i]) >> 1;
1663
111k
                IM(tempLeft)  += IM(ps->ipd_prev[bk][i]) >> 1;
1664
111k
                RE(tempRight) += RE(ps->opd_prev[bk][i]) >> 1;
1665
111k
                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
111k
                if (i == 0)
1675
56.3k
                {
1676
56.3k
                    i = 2;
1677
56.3k
                }
1678
111k
                i--;
1679
1680
                /* get value before previous */
1681
111k
#ifdef FIXED_POINT
1682
                /* dividing by 2*2, shift right 2 bits; extra halving to avoid overflows */
1683
111k
                RE(tempLeft)  += (RE(ps->ipd_prev[bk][i]) >> 2);
1684
111k
                IM(tempLeft)  += (IM(ps->ipd_prev[bk][i]) >> 2);
1685
111k
                RE(tempRight) += (RE(ps->opd_prev[bk][i]) >> 2);
1686
111k
                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
111k
                xy = magnitude_c(tempRight);
1716
111k
                pq = magnitude_c(tempLeft);
1717
1718
111k
                if (xy != 0)
1719
111k
                {
1720
111k
                    RE(phaseLeft) = DIV_F(RE(tempRight), xy);
1721
111k
                    IM(phaseLeft) = DIV_F(IM(tempRight), xy);
1722
111k
                } else {
1723
0
                    RE(phaseLeft) = 0;
1724
0
                    IM(phaseLeft) = 0;
1725
0
                }
1726
1727
111k
                xypq = MUL_F(xy, pq);
1728
1729
111k
                if (xypq != 0)
1730
111k
                {
1731
111k
                    real_t tmp1 = MUL_F(RE(tempRight), RE(tempLeft)) + MUL_F(IM(tempRight), IM(tempLeft));
1732
111k
                    real_t tmp2 = MUL_F(IM(tempRight), RE(tempLeft)) - MUL_F(RE(tempRight), IM(tempLeft));
1733
1734
111k
                    RE(phaseRight) = DIV_F(tmp1, xypq);
1735
111k
                    IM(phaseRight) = DIV_F(tmp2, xypq);
1736
111k
                } else {
1737
0
                    RE(phaseRight) = 0;
1738
0
                    IM(phaseRight) = 0;
1739
0
                }
1740
1741
111k
#endif
1742
1743
                /* MUL_F(COEF, REAL) = COEF */
1744
111k
                IM(h11) = MUL_F(RE(h11), IM(phaseLeft));
1745
111k
                IM(h12) = MUL_F(RE(h12), IM(phaseRight));
1746
111k
                IM(h21) = MUL_F(RE(h21), IM(phaseLeft));
1747
111k
                IM(h22) = MUL_F(RE(h22), IM(phaseRight));
1748
1749
111k
                RE(h11) = MUL_F(RE(h11), RE(phaseLeft));
1750
111k
                RE(h12) = MUL_F(RE(h12), RE(phaseRight));
1751
111k
                RE(h21) = MUL_F(RE(h21), RE(phaseLeft));
1752
111k
                RE(h22) = MUL_F(RE(h22), RE(phaseRight));
1753
111k
            }
1754
1755
            /* length of the envelope n_e+1 - n_e (in time samples) */
1756
            /* 0 < L <= 32: integer */
1757
681k
            L = (real_t)(ps->border_position[env + 1] - ps->border_position[env]);
1758
1759
            /* obtain final H_xy by means of linear interpolation */
1760
681k
            RE(deltaH11) = (RE(h11) - RE(ps->h11_prev[gr])) / L;
1761
681k
            RE(deltaH12) = (RE(h12) - RE(ps->h12_prev[gr])) / L;
1762
681k
            RE(deltaH21) = (RE(h21) - RE(ps->h21_prev[gr])) / L;
1763
681k
            RE(deltaH22) = (RE(h22) - RE(ps->h22_prev[gr])) / L;
1764
1765
681k
            RE(H11) = RE(ps->h11_prev[gr]);
1766
681k
            RE(H12) = RE(ps->h12_prev[gr]);
1767
681k
            RE(H21) = RE(ps->h21_prev[gr]);
1768
681k
            RE(H22) = RE(ps->h22_prev[gr]);
1769
681k
            IM(H11) = IM(H12) = IM(H21) = IM(H22) = 0;
1770
1771
681k
            RE(ps->h11_prev[gr]) = RE(h11);
1772
681k
            RE(ps->h12_prev[gr]) = RE(h12);
1773
681k
            RE(ps->h21_prev[gr]) = RE(h21);
1774
681k
            RE(ps->h22_prev[gr]) = RE(h22);
1775
1776
            /* only calculate imaginary part when needed */
1777
681k
            if ((ps->enable_ipdopd) && (bk < nr_ipdopd_par))
1778
111k
            {
1779
                /* obtain final H_xy by means of linear interpolation */
1780
111k
                IM(deltaH11) = (IM(h11) - IM(ps->h11_prev[gr])) / L;
1781
111k
                IM(deltaH12) = (IM(h12) - IM(ps->h12_prev[gr])) / L;
1782
111k
                IM(deltaH21) = (IM(h21) - IM(ps->h21_prev[gr])) / L;
1783
111k
                IM(deltaH22) = (IM(h22) - IM(ps->h22_prev[gr])) / L;
1784
1785
111k
                IM(H11) = IM(ps->h11_prev[gr]);
1786
111k
                IM(H12) = IM(ps->h12_prev[gr]);
1787
111k
                IM(H21) = IM(ps->h21_prev[gr]);
1788
111k
                IM(H22) = IM(ps->h22_prev[gr]);
1789
1790
111k
                if ((NEGATE_IPD_MASK & ps->map_group2bk[gr]) != 0)
1791
16.2k
                {
1792
16.2k
                    IM(deltaH11) = -IM(deltaH11);
1793
16.2k
                    IM(deltaH12) = -IM(deltaH12);
1794
16.2k
                    IM(deltaH21) = -IM(deltaH21);
1795
16.2k
                    IM(deltaH22) = -IM(deltaH22);
1796
1797
16.2k
                    IM(H11) = -IM(H11);
1798
16.2k
                    IM(H12) = -IM(H12);
1799
16.2k
                    IM(H21) = -IM(H21);
1800
16.2k
                    IM(H22) = -IM(H22);
1801
16.2k
                }
1802
1803
111k
                IM(ps->h11_prev[gr]) = IM(h11);
1804
111k
                IM(ps->h12_prev[gr]) = IM(h12);
1805
111k
                IM(ps->h21_prev[gr]) = IM(h21);
1806
111k
                IM(ps->h22_prev[gr]) = IM(h22);
1807
111k
            }
1808
1809
            /* apply H_xy to the current envelope band of the decorrelated subband */
1810
9.61M
            for (n = ps->border_position[env]; n < ps->border_position[env + 1]; n++)
1811
8.93M
            {
1812
                /* addition finalises the interpolation over every n */
1813
8.93M
                RE(H11) += RE(deltaH11);
1814
8.93M
                RE(H12) += RE(deltaH12);
1815
8.93M
                RE(H21) += RE(deltaH21);
1816
8.93M
                RE(H22) += RE(deltaH22);
1817
8.93M
                if ((ps->enable_ipdopd) && (bk < nr_ipdopd_par))
1818
1.21M
                {
1819
1.21M
                    IM(H11) += IM(deltaH11);
1820
1.21M
                    IM(H12) += IM(deltaH12);
1821
1.21M
                    IM(H21) += IM(deltaH21);
1822
1.21M
                    IM(H22) += IM(deltaH22);
1823
1.21M
                }
1824
1825
                /* channel is an alias to the subband */
1826
31.0M
                for (sb = ps->group_border[gr]; sb < maxsb; sb++)
1827
22.1M
                {
1828
22.1M
                    complex_t inLeft, inRight;  // precision_of in(Left|Right) == precision_of X_(left|right)
1829
1830
                    /* load decorrelated samples */
1831
22.1M
                    if (gr < ps->num_hybrid_groups)
1832
4.94M
                    {
1833
4.94M
                        RE(inLeft) =  RE(X_hybrid_left[n][sb]);
1834
4.94M
                        IM(inLeft) =  IM(X_hybrid_left[n][sb]);
1835
4.94M
                        RE(inRight) = RE(X_hybrid_right[n][sb]);
1836
4.94M
                        IM(inRight) = IM(X_hybrid_right[n][sb]);
1837
17.1M
                    } else {
1838
17.1M
                        RE(inLeft) =  RE(X_left[n][sb]);
1839
17.1M
                        IM(inLeft) =  IM(X_left[n][sb]);
1840
17.1M
                        RE(inRight) = RE(X_right[n][sb]);
1841
17.1M
                        IM(inRight) = IM(X_right[n][sb]);
1842
17.1M
                    }
1843
1844
                    /* precision_of temp(Left|Right) == precision_of X_(left|right) */
1845
1846
                    /* apply mixing */
1847
22.1M
                    RE(tempLeft) =  MUL_C(RE(H11), RE(inLeft)) + MUL_C(RE(H21), RE(inRight));
1848
22.1M
                    IM(tempLeft) =  MUL_C(RE(H11), IM(inLeft)) + MUL_C(RE(H21), IM(inRight));
1849
22.1M
                    RE(tempRight) = MUL_C(RE(H12), RE(inLeft)) + MUL_C(RE(H22), RE(inRight));
1850
22.1M
                    IM(tempRight) = MUL_C(RE(H12), IM(inLeft)) + MUL_C(RE(H22), IM(inRight));
1851
1852
                    /* only perform imaginary operations when needed */
1853
22.1M
                    if ((ps->enable_ipdopd) && (bk < nr_ipdopd_par))
1854
1.21M
                    {
1855
                        /* apply rotation */
1856
1.21M
                        RE(tempLeft)  -= MUL_C(IM(H11), IM(inLeft)) + MUL_C(IM(H21), IM(inRight));
1857
1.21M
                        IM(tempLeft)  += MUL_C(IM(H11), RE(inLeft)) + MUL_C(IM(H21), RE(inRight));
1858
1.21M
                        RE(tempRight) -= MUL_C(IM(H12), IM(inLeft)) + MUL_C(IM(H22), IM(inRight));
1859
1.21M
                        IM(tempRight) += MUL_C(IM(H12), RE(inLeft)) + MUL_C(IM(H22), RE(inRight));
1860
1.21M
                    }
1861
1862
                    /* store final samples */
1863
22.1M
                    if (gr < ps->num_hybrid_groups)
1864
4.94M
                    {
1865
4.94M
                        RE(X_hybrid_left[n][sb])  = RE(tempLeft);
1866
4.94M
                        IM(X_hybrid_left[n][sb])  = IM(tempLeft);
1867
4.94M
                        RE(X_hybrid_right[n][sb]) = RE(tempRight);
1868
4.94M
                        IM(X_hybrid_right[n][sb]) = IM(tempRight);
1869
17.1M
                    } else {
1870
17.1M
                        RE(X_left[n][sb])  = RE(tempLeft);
1871
17.1M
                        IM(X_left[n][sb])  = IM(tempLeft);
1872
17.1M
                        RE(X_right[n][sb]) = RE(tempRight);
1873
17.1M
                        IM(X_right[n][sb]) = IM(tempRight);
1874
17.1M
                    }
1875
22.1M
                }
1876
8.93M
            }
1877
1878
            /* shift phase smoother's circular buffer index */
1879
681k
            ps->phase_hist++;
1880
681k
            if (ps->phase_hist == 2)
1881
340k
            {
1882
340k
                ps->phase_hist = 0;
1883
340k
            }
1884
681k
        }
1885
286k
    }
1886
9.10k
}
ps_dec.c:ps_mix_phase
Line
Count
Source
1458
11.9k
{
1459
11.9k
    uint8_t n;
1460
11.9k
    uint8_t gr;
1461
11.9k
    uint8_t bk = 0;
1462
11.9k
    uint8_t sb, maxsb;
1463
11.9k
    uint8_t env;
1464
11.9k
    uint8_t nr_ipdopd_par;
1465
11.9k
    complex_t h11, h12, h21, h22;  // COEF
1466
11.9k
    complex_t H11, H12, H21, H22;  // COEF
1467
11.9k
    complex_t deltaH11, deltaH12, deltaH21, deltaH22;  // COEF
1468
11.9k
    complex_t tempLeft, tempRight; // FRAC
1469
11.9k
    complex_t phaseLeft, phaseRight; // FRAC
1470
11.9k
    real_t L;
1471
11.9k
    const real_t *sf_iid;
1472
11.9k
    uint8_t no_iid_steps;
1473
1474
11.9k
    if (ps->iid_mode >= 3)
1475
4.78k
    {
1476
4.78k
        no_iid_steps = 15;
1477
4.78k
        sf_iid = sf_iid_fine;
1478
7.15k
    } else {
1479
7.15k
        no_iid_steps = 7;
1480
7.15k
        sf_iid = sf_iid_normal;
1481
7.15k
    }
1482
1483
11.9k
    if (ps->ipd_mode == 0 || ps->ipd_mode == 3)
1484
7.17k
    {
1485
7.17k
        nr_ipdopd_par = 11; /* resolution */
1486
7.17k
    } else {
1487
4.75k
        nr_ipdopd_par = ps->nr_ipdopd_par;
1488
4.75k
    }
1489
1490
396k
    for (gr = 0; gr < ps->num_groups; gr++)
1491
384k
    {
1492
384k
        bk = (~NEGATE_IPD_MASK) & ps->map_group2bk[gr];
1493
1494
        /* use one channel per group in the subqmf domain */
1495
384k
        maxsb = (gr < ps->num_hybrid_groups) ? ps->group_border[gr] + 1 : ps->group_border[gr + 1];
1496
1497
1.25M
        for (env = 0; env < ps->num_env; env++)
1498
870k
        {
1499
870k
            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
870k
            if (ps->iid_index[env][bk] < -no_iid_steps) {
1505
335
                fprintf(stderr, "Warning: invalid iid_index: %d < %d\n", ps->iid_index[env][bk],
1506
335
                    -no_iid_steps);
1507
335
                ps->iid_index[env][bk] = -no_iid_steps;
1508
335
                abs_iid = no_iid_steps;
1509
870k
            } else if (ps->iid_index[env][bk] > no_iid_steps) {
1510
158
                fprintf(stderr, "Warning: invalid iid_index: %d > %d\n", ps->iid_index[env][bk],
1511
158
                    no_iid_steps);
1512
158
                ps->iid_index[env][bk] = no_iid_steps;
1513
158
                abs_iid = no_iid_steps;
1514
158
            }
1515
870k
            if (ps->icc_index[env][bk] < 0) {
1516
338
                fprintf(stderr, "Warning: invalid icc_index: %d < 0\n", ps->icc_index[env][bk]);
1517
338
                ps->icc_index[env][bk] = 0;
1518
870k
            } 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
870k
            if (ps->icc_mode < 3)
1524
521k
            {
1525
                /* type 'A' mixing as described in 8.6.4.6.2.1 */
1526
521k
                real_t c_1, c_2;  // COEF
1527
521k
                real_t cosa, sina;  // COEF
1528
521k
                real_t cosb, sinb;  // COEF
1529
521k
                real_t ab1, ab2;  // COEF
1530
521k
                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
521k
                c_1 = sf_iid[no_iid_steps + ps->iid_index[env][bk]];
1543
521k
                c_2 = sf_iid[no_iid_steps - ps->iid_index[env][bk]];
1544
1545
                /* calculate alpha and beta using the ICC parameters */
1546
521k
                cosa = cos_alphas[ps->icc_index[env][bk]];
1547
521k
                sina = sin_alphas[ps->icc_index[env][bk]];
1548
1549
521k
                if (ps->iid_mode >= 3)
1550
194k
                {
1551
194k
                    cosb = cos_betas_fine[abs_iid][ps->icc_index[env][bk]];
1552
194k
                    sinb = sin_betas_fine[abs_iid][ps->icc_index[env][bk]];
1553
327k
                } else {
1554
327k
                    cosb = cos_betas_normal[abs_iid][ps->icc_index[env][bk]];
1555
327k
                    sinb = sin_betas_normal[abs_iid][ps->icc_index[env][bk]];
1556
327k
                }
1557
1558
521k
                ab1 = MUL_C(cosb, cosa);
1559
521k
                ab2 = MUL_C(sinb, sina);
1560
521k
                ab3 = MUL_C(sinb, cosa);
1561
521k
                ab4 = MUL_C(cosb, sina);
1562
1563
                /* h_xy: COEF */
1564
521k
                RE(h11) = MUL_C(c_2, (ab1 - ab2));
1565
521k
                RE(h12) = MUL_C(c_1, (ab1 + ab2));
1566
521k
                RE(h21) = MUL_C(c_2, (ab3 + ab4));
1567
521k
                RE(h22) = MUL_C(c_1, (ab3 - ab4));
1568
521k
            } else {
1569
                /* type 'B' mixing as described in 8.6.4.6.2.2 */
1570
349k
                real_t sina, cosa;  // COEF
1571
349k
                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
349k
                if (ps->iid_mode >= 3)
1607
209k
                {
1608
209k
                    cosa = sincos_alphas_B_fine[no_iid_steps + ps->iid_index[env][bk]][ps->icc_index[env][bk]];
1609
209k
                    sina = sincos_alphas_B_fine[30 - (no_iid_steps + ps->iid_index[env][bk])][ps->icc_index[env][bk]];
1610
209k
                    cosg = cos_gammas_fine[abs_iid][ps->icc_index[env][bk]];
1611
209k
                    sing = sin_gammas_fine[abs_iid][ps->icc_index[env][bk]];
1612
209k
                } else {
1613
139k
                    cosa = sincos_alphas_B_normal[no_iid_steps + ps->iid_index[env][bk]][ps->icc_index[env][bk]];
1614
139k
                    sina = sincos_alphas_B_normal[14 - (no_iid_steps + ps->iid_index[env][bk])][ps->icc_index[env][bk]];
1615
139k
                    cosg = cos_gammas_normal[abs_iid][ps->icc_index[env][bk]];
1616
139k
                    sing = sin_gammas_normal[abs_iid][ps->icc_index[env][bk]];
1617
139k
                }
1618
1619
349k
                RE(h11) = MUL_C(COEF_SQRT2, MUL_C(cosa, cosg));
1620
349k
                RE(h12) = MUL_C(COEF_SQRT2, MUL_C(sina, cosg));
1621
349k
                RE(h21) = MUL_C(COEF_SQRT2, MUL_C(-cosa, sing));
1622
349k
                RE(h22) = MUL_C(COEF_SQRT2, MUL_C(sina, sing));
1623
349k
            }
1624
870k
            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
870k
            if ((ps->enable_ipdopd) && (bk < nr_ipdopd_par))
1631
107k
            {
1632
107k
                int8_t i;
1633
107k
                real_t xy, pq, xypq;  // FRAC
1634
1635
                /* ringbuffer index */
1636
107k
                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
107k
                RE(tempLeft)  = MUL_F(RE(ps->ipd_prev[bk][i]), FRAC_CONST(0.25));
1648
107k
                IM(tempLeft)  = MUL_F(IM(ps->ipd_prev[bk][i]), FRAC_CONST(0.25));
1649
107k
                RE(tempRight) = MUL_F(RE(ps->opd_prev[bk][i]), FRAC_CONST(0.25));
1650
107k
                IM(tempRight) = MUL_F(IM(ps->opd_prev[bk][i]), FRAC_CONST(0.25));
1651
107k
#endif
1652
1653
                /* save current value */
1654
107k
                RE(ps->ipd_prev[bk][i]) = ipdopd_cos_tab[abs(ps->ipd_index[env][bk])];
1655
107k
                IM(ps->ipd_prev[bk][i]) = ipdopd_sin_tab[abs(ps->ipd_index[env][bk])];
1656
107k
                RE(ps->opd_prev[bk][i]) = ipdopd_cos_tab[abs(ps->opd_index[env][bk])];
1657
107k
                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
107k
                RE(tempLeft)  += RE(ps->ipd_prev[bk][i]);
1668
107k
                IM(tempLeft)  += IM(ps->ipd_prev[bk][i]);
1669
107k
                RE(tempRight) += RE(ps->opd_prev[bk][i]);
1670
107k
                IM(tempRight) += IM(ps->opd_prev[bk][i]);
1671
107k
#endif
1672
1673
                /* ringbuffer index */
1674
107k
                if (i == 0)
1675
54.0k
                {
1676
54.0k
                    i = 2;
1677
54.0k
                }
1678
107k
                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
107k
                RE(tempLeft)  += MUL_F(RE(ps->ipd_prev[bk][i]), FRAC_CONST(0.5));
1689
107k
                IM(tempLeft)  += MUL_F(IM(ps->ipd_prev[bk][i]), FRAC_CONST(0.5));
1690
107k
                RE(tempRight) += MUL_F(RE(ps->opd_prev[bk][i]), FRAC_CONST(0.5));
1691
107k
                IM(tempRight) += MUL_F(IM(ps->opd_prev[bk][i]), FRAC_CONST(0.5));
1692
107k
#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
107k
                xy = magnitude_c(tempRight);
1716
107k
                pq = magnitude_c(tempLeft);
1717
1718
107k
                if (xy != 0)
1719
107k
                {
1720
107k
                    RE(phaseLeft) = DIV_F(RE(tempRight), xy);
1721
107k
                    IM(phaseLeft) = DIV_F(IM(tempRight), xy);
1722
107k
                } else {
1723
0
                    RE(phaseLeft) = 0;
1724
0
                    IM(phaseLeft) = 0;
1725
0
                }
1726
1727
107k
                xypq = MUL_F(xy, pq);
1728
1729
107k
                if (xypq != 0)
1730
107k
                {
1731
107k
                    real_t tmp1 = MUL_F(RE(tempRight), RE(tempLeft)) + MUL_F(IM(tempRight), IM(tempLeft));
1732
107k
                    real_t tmp2 = MUL_F(IM(tempRight), RE(tempLeft)) - MUL_F(RE(tempRight), IM(tempLeft));
1733
1734
107k
                    RE(phaseRight) = DIV_F(tmp1, xypq);
1735
107k
                    IM(phaseRight) = DIV_F(tmp2, xypq);
1736
107k
                } else {
1737
0
                    RE(phaseRight) = 0;
1738
0
                    IM(phaseRight) = 0;
1739
0
                }
1740
1741
107k
#endif
1742
1743
                /* MUL_F(COEF, REAL) = COEF */
1744
107k
                IM(h11) = MUL_F(RE(h11), IM(phaseLeft));
1745
107k
                IM(h12) = MUL_F(RE(h12), IM(phaseRight));
1746
107k
                IM(h21) = MUL_F(RE(h21), IM(phaseLeft));
1747
107k
                IM(h22) = MUL_F(RE(h22), IM(phaseRight));
1748
1749
107k
                RE(h11) = MUL_F(RE(h11), RE(phaseLeft));
1750
107k
                RE(h12) = MUL_F(RE(h12), RE(phaseRight));
1751
107k
                RE(h21) = MUL_F(RE(h21), RE(phaseLeft));
1752
107k
                RE(h22) = MUL_F(RE(h22), RE(phaseRight));
1753
107k
            }
1754
1755
            /* length of the envelope n_e+1 - n_e (in time samples) */
1756
            /* 0 < L <= 32: integer */
1757
870k
            L = (real_t)(ps->border_position[env + 1] - ps->border_position[env]);
1758
1759
            /* obtain final H_xy by means of linear interpolation */
1760
870k
            RE(deltaH11) = (RE(h11) - RE(ps->h11_prev[gr])) / L;
1761
870k
            RE(deltaH12) = (RE(h12) - RE(ps->h12_prev[gr])) / L;
1762
870k
            RE(deltaH21) = (RE(h21) - RE(ps->h21_prev[gr])) / L;
1763
870k
            RE(deltaH22) = (RE(h22) - RE(ps->h22_prev[gr])) / L;
1764
1765
870k
            RE(H11) = RE(ps->h11_prev[gr]);
1766
870k
            RE(H12) = RE(ps->h12_prev[gr]);
1767
870k
            RE(H21) = RE(ps->h21_prev[gr]);
1768
870k
            RE(H22) = RE(ps->h22_prev[gr]);
1769
870k
            IM(H11) = IM(H12) = IM(H21) = IM(H22) = 0;
1770
1771
870k
            RE(ps->h11_prev[gr]) = RE(h11);
1772
870k
            RE(ps->h12_prev[gr]) = RE(h12);
1773
870k
            RE(ps->h21_prev[gr]) = RE(h21);
1774
870k
            RE(ps->h22_prev[gr]) = RE(h22);
1775
1776
            /* only calculate imaginary part when needed */
1777
870k
            if ((ps->enable_ipdopd) && (bk < nr_ipdopd_par))
1778
107k
            {
1779
                /* obtain final H_xy by means of linear interpolation */
1780
107k
                IM(deltaH11) = (IM(h11) - IM(ps->h11_prev[gr])) / L;
1781
107k
                IM(deltaH12) = (IM(h12) - IM(ps->h12_prev[gr])) / L;
1782
107k
                IM(deltaH21) = (IM(h21) - IM(ps->h21_prev[gr])) / L;
1783
107k
                IM(deltaH22) = (IM(h22) - IM(ps->h22_prev[gr])) / L;
1784
1785
107k
                IM(H11) = IM(ps->h11_prev[gr]);
1786
107k
                IM(H12) = IM(ps->h12_prev[gr]);
1787
107k
                IM(H21) = IM(ps->h21_prev[gr]);
1788
107k
                IM(H22) = IM(ps->h22_prev[gr]);
1789
1790
107k
                if ((NEGATE_IPD_MASK & ps->map_group2bk[gr]) != 0)
1791
15.0k
                {
1792
15.0k
                    IM(deltaH11) = -IM(deltaH11);
1793
15.0k
                    IM(deltaH12) = -IM(deltaH12);
1794
15.0k
                    IM(deltaH21) = -IM(deltaH21);
1795
15.0k
                    IM(deltaH22) = -IM(deltaH22);
1796
1797
15.0k
                    IM(H11) = -IM(H11);
1798
15.0k
                    IM(H12) = -IM(H12);
1799
15.0k
                    IM(H21) = -IM(H21);
1800
15.0k
                    IM(H22) = -IM(H22);
1801
15.0k
                }
1802
1803
107k
                IM(ps->h11_prev[gr]) = IM(h11);
1804
107k
                IM(ps->h12_prev[gr]) = IM(h12);
1805
107k
                IM(ps->h21_prev[gr]) = IM(h21);
1806
107k
                IM(ps->h22_prev[gr]) = IM(h22);
1807
107k
            }
1808
1809
            /* apply H_xy to the current envelope band of the decorrelated subband */
1810
12.8M
            for (n = ps->border_position[env]; n < ps->border_position[env + 1]; n++)
1811
11.9M
            {
1812
                /* addition finalises the interpolation over every n */
1813
11.9M
                RE(H11) += RE(deltaH11);
1814
11.9M
                RE(H12) += RE(deltaH12);
1815
11.9M
                RE(H21) += RE(deltaH21);
1816
11.9M
                RE(H22) += RE(deltaH22);
1817
11.9M
                if ((ps->enable_ipdopd) && (bk < nr_ipdopd_par))
1818
1.09M
                {
1819
1.09M
                    IM(H11) += IM(deltaH11);
1820
1.09M
                    IM(H12) += IM(deltaH12);
1821
1.09M
                    IM(H21) += IM(deltaH21);
1822
1.09M
                    IM(H22) += IM(deltaH22);
1823
1.09M
                }
1824
1825
                /* channel is an alias to the subband */
1826
41.1M
                for (sb = ps->group_border[gr]; sb < maxsb; sb++)
1827
29.1M
                {
1828
29.1M
                    complex_t inLeft, inRight;  // precision_of in(Left|Right) == precision_of X_(left|right)
1829
1830
                    /* load decorrelated samples */
1831
29.1M
                    if (gr < ps->num_hybrid_groups)
1832
6.68M
                    {
1833
6.68M
                        RE(inLeft) =  RE(X_hybrid_left[n][sb]);
1834
6.68M
                        IM(inLeft) =  IM(X_hybrid_left[n][sb]);
1835
6.68M
                        RE(inRight) = RE(X_hybrid_right[n][sb]);
1836
6.68M
                        IM(inRight) = IM(X_hybrid_right[n][sb]);
1837
22.5M
                    } else {
1838
22.5M
                        RE(inLeft) =  RE(X_left[n][sb]);
1839
22.5M
                        IM(inLeft) =  IM(X_left[n][sb]);
1840
22.5M
                        RE(inRight) = RE(X_right[n][sb]);
1841
22.5M
                        IM(inRight) = IM(X_right[n][sb]);
1842
22.5M
                    }
1843
1844
                    /* precision_of temp(Left|Right) == precision_of X_(left|right) */
1845
1846
                    /* apply mixing */
1847
29.1M
                    RE(tempLeft) =  MUL_C(RE(H11), RE(inLeft)) + MUL_C(RE(H21), RE(inRight));
1848
29.1M
                    IM(tempLeft) =  MUL_C(RE(H11), IM(inLeft)) + MUL_C(RE(H21), IM(inRight));
1849
29.1M
                    RE(tempRight) = MUL_C(RE(H12), RE(inLeft)) + MUL_C(RE(H22), RE(inRight));
1850
29.1M
                    IM(tempRight) = MUL_C(RE(H12), IM(inLeft)) + MUL_C(RE(H22), IM(inRight));
1851
1852
                    /* only perform imaginary operations when needed */
1853
29.1M
                    if ((ps->enable_ipdopd) && (bk < nr_ipdopd_par))
1854
1.09M
                    {
1855
                        /* apply rotation */
1856
1.09M
                        RE(tempLeft)  -= MUL_C(IM(H11), IM(inLeft)) + MUL_C(IM(H21), IM(inRight));
1857
1.09M
                        IM(tempLeft)  += MUL_C(IM(H11), RE(inLeft)) + MUL_C(IM(H21), RE(inRight));
1858
1.09M
                        RE(tempRight) -= MUL_C(IM(H12), IM(inLeft)) + MUL_C(IM(H22), IM(inRight));
1859
1.09M
                        IM(tempRight) += MUL_C(IM(H12), RE(inLeft)) + MUL_C(IM(H22), RE(inRight));
1860
1.09M
                    }
1861
1862
                    /* store final samples */
1863
29.1M
                    if (gr < ps->num_hybrid_groups)
1864
6.68M
                    {
1865
6.68M
                        RE(X_hybrid_left[n][sb])  = RE(tempLeft);
1866
6.68M
                        IM(X_hybrid_left[n][sb])  = IM(tempLeft);
1867
6.68M
                        RE(X_hybrid_right[n][sb]) = RE(tempRight);
1868
6.68M
                        IM(X_hybrid_right[n][sb]) = IM(tempRight);
1869
22.5M
                    } else {
1870
22.5M
                        RE(X_left[n][sb])  = RE(tempLeft);
1871
22.5M
                        IM(X_left[n][sb])  = IM(tempLeft);
1872
22.5M
                        RE(X_right[n][sb]) = RE(tempRight);
1873
22.5M
                        IM(X_right[n][sb]) = IM(tempRight);
1874
22.5M
                    }
1875
29.1M
                }
1876
11.9M
            }
1877
1878
            /* shift phase smoother's circular buffer index */
1879
870k
            ps->phase_hist++;
1880
870k
            if (ps->phase_hist == 2)
1881
435k
            {
1882
435k
                ps->phase_hist = 0;
1883
435k
            }
1884
870k
        }
1885
384k
    }
1886
11.9k
}
1887
1888
void ps_free(ps_info *ps)
1889
31.6k
{
1890
    /* free hybrid filterbank structures */
1891
31.6k
    hybrid_free(ps->hyb);
1892
1893
31.6k
    faad_free(ps);
1894
31.6k
}
1895
1896
ps_info *ps_init(uint8_t sr_index, uint8_t numTimeSlotsRate)
1897
31.6k
{
1898
31.6k
    uint8_t i;
1899
31.6k
    uint8_t short_delay_band;
1900
1901
31.6k
    ps_info *ps = (ps_info*)faad_malloc(sizeof(ps_info));
1902
31.6k
    memset(ps, 0, sizeof(ps_info));
1903
1904
31.6k
    ps->hyb = hybrid_init(numTimeSlotsRate);
1905
31.6k
    ps->numTimeSlotsRate = numTimeSlotsRate;
1906
1907
31.6k
    ps->ps_data_available = 0;
1908
1909
    /* delay stuff*/
1910
31.6k
    ps->saved_delay = 0;
1911
1912
2.05M
    for (i = 0; i < 64; i++)
1913
2.02M
    {
1914
2.02M
        ps->delay_buf_index_delay[i] = 0;
1915
2.02M
    }
1916
1917
126k
    for (i = 0; i < NO_ALLPASS_LINKS; i++)
1918
94.8k
    {
1919
94.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
94.8k
        (void)sr_index;
1929
        /* THESE ARE CONSTANTS NOW */
1930
94.8k
        ps->num_sample_delay_ser[i] = delay_length_d[i];
1931
94.8k
#endif
1932
94.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
31.6k
    short_delay_band = 35;
1950
31.6k
    ps->nr_allpass_bands = 22;
1951
31.6k
    ps->alpha_decay = FRAC_CONST(0.76592833836465);
1952
31.6k
    ps->alpha_smooth = FRAC_CONST(0.25);
1953
31.6k
#endif
1954
1955
    /* THESE ARE CONSTANT NOW IF PS IS INDEPENDANT OF SAMPLERATE */
1956
1.13M
    for (i = 0; i < short_delay_band; i++)
1957
1.10M
    {
1958
1.10M
        ps->delay_D[i] = 14;
1959
1.10M
    }
1960
948k
    for (i = short_delay_band; i < 64; i++)
1961
916k
    {
1962
916k
        ps->delay_D[i] = 1;
1963
916k
    }
1964
1965
    /* mixing and phase */
1966
1.61M
    for (i = 0; i < 50; i++)
1967
1.58M
    {
1968
1.58M
        RE(ps->h11_prev[i]) = 1;
1969
1.58M
        IM(ps->h11_prev[i]) = 1;
1970
1.58M
        RE(ps->h12_prev[i]) = 1;
1971
1.58M
        IM(ps->h12_prev[i]) = 1;
1972
1.58M
    }
1973
1974
31.6k
    ps->phase_hist = 0;
1975
1976
663k
    for (i = 0; i < 20; i++)
1977
632k
    {
1978
632k
        RE(ps->ipd_prev[i][0]) = 0;
1979
632k
        IM(ps->ipd_prev[i][0]) = 0;
1980
632k
        RE(ps->ipd_prev[i][1]) = 0;
1981
632k
        IM(ps->ipd_prev[i][1]) = 0;
1982
632k
        RE(ps->opd_prev[i][0]) = 0;
1983
632k
        IM(ps->opd_prev[i][0]) = 0;
1984
632k
        RE(ps->opd_prev[i][1]) = 0;
1985
632k
        IM(ps->opd_prev[i][1]) = 0;
1986
632k
    }
1987
1988
31.6k
    return ps;
1989
31.6k
}
ps_init
Line
Count
Source
1897
13.5k
{
1898
13.5k
    uint8_t i;
1899
13.5k
    uint8_t short_delay_band;
1900
1901
13.5k
    ps_info *ps = (ps_info*)faad_malloc(sizeof(ps_info));
1902
13.5k
    memset(ps, 0, sizeof(ps_info));
1903
1904
13.5k
    ps->hyb = hybrid_init(numTimeSlotsRate);
1905
13.5k
    ps->numTimeSlotsRate = numTimeSlotsRate;
1906
1907
13.5k
    ps->ps_data_available = 0;
1908
1909
    /* delay stuff*/
1910
13.5k
    ps->saved_delay = 0;
1911
1912
878k
    for (i = 0; i < 64; i++)
1913
865k
    {
1914
865k
        ps->delay_buf_index_delay[i] = 0;
1915
865k
    }
1916
1917
54.0k
    for (i = 0; i < NO_ALLPASS_LINKS; i++)
1918
40.5k
    {
1919
40.5k
        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
40.5k
        (void)sr_index;
1929
        /* THESE ARE CONSTANTS NOW */
1930
40.5k
        ps->num_sample_delay_ser[i] = delay_length_d[i];
1931
40.5k
#endif
1932
40.5k
    }
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
13.5k
    short_delay_band = 35;
1950
13.5k
    ps->nr_allpass_bands = 22;
1951
13.5k
    ps->alpha_decay = FRAC_CONST(0.76592833836465);
1952
13.5k
    ps->alpha_smooth = FRAC_CONST(0.25);
1953
13.5k
#endif
1954
1955
    /* THESE ARE CONSTANT NOW IF PS IS INDEPENDANT OF SAMPLERATE */
1956
486k
    for (i = 0; i < short_delay_band; i++)
1957
473k
    {
1958
473k
        ps->delay_D[i] = 14;
1959
473k
    }
1960
405k
    for (i = short_delay_band; i < 64; i++)
1961
391k
    {
1962
391k
        ps->delay_D[i] = 1;
1963
391k
    }
1964
1965
    /* mixing and phase */
1966
689k
    for (i = 0; i < 50; i++)
1967
675k
    {
1968
675k
        RE(ps->h11_prev[i]) = 1;
1969
675k
        IM(ps->h11_prev[i]) = 1;
1970
675k
        RE(ps->h12_prev[i]) = 1;
1971
675k
        IM(ps->h12_prev[i]) = 1;
1972
675k
    }
1973
1974
13.5k
    ps->phase_hist = 0;
1975
1976
283k
    for (i = 0; i < 20; i++)
1977
270k
    {
1978
270k
        RE(ps->ipd_prev[i][0]) = 0;
1979
270k
        IM(ps->ipd_prev[i][0]) = 0;
1980
270k
        RE(ps->ipd_prev[i][1]) = 0;
1981
270k
        IM(ps->ipd_prev[i][1]) = 0;
1982
270k
        RE(ps->opd_prev[i][0]) = 0;
1983
270k
        IM(ps->opd_prev[i][0]) = 0;
1984
270k
        RE(ps->opd_prev[i][1]) = 0;
1985
270k
        IM(ps->opd_prev[i][1]) = 0;
1986
270k
    }
1987
1988
13.5k
    return ps;
1989
13.5k
}
ps_init
Line
Count
Source
1897
18.0k
{
1898
18.0k
    uint8_t i;
1899
18.0k
    uint8_t short_delay_band;
1900
1901
18.0k
    ps_info *ps = (ps_info*)faad_malloc(sizeof(ps_info));
1902
18.0k
    memset(ps, 0, sizeof(ps_info));
1903
1904
18.0k
    ps->hyb = hybrid_init(numTimeSlotsRate);
1905
18.0k
    ps->numTimeSlotsRate = numTimeSlotsRate;
1906
1907
18.0k
    ps->ps_data_available = 0;
1908
1909
    /* delay stuff*/
1910
18.0k
    ps->saved_delay = 0;
1911
1912
1.17M
    for (i = 0; i < 64; i++)
1913
1.15M
    {
1914
1.15M
        ps->delay_buf_index_delay[i] = 0;
1915
1.15M
    }
1916
1917
72.3k
    for (i = 0; i < NO_ALLPASS_LINKS; i++)
1918
54.2k
    {
1919
54.2k
        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
54.2k
        (void)sr_index;
1929
        /* THESE ARE CONSTANTS NOW */
1930
54.2k
        ps->num_sample_delay_ser[i] = delay_length_d[i];
1931
54.2k
#endif
1932
54.2k
    }
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
18.0k
    short_delay_band = 35;
1950
18.0k
    ps->nr_allpass_bands = 22;
1951
18.0k
    ps->alpha_decay = FRAC_CONST(0.76592833836465);
1952
18.0k
    ps->alpha_smooth = FRAC_CONST(0.25);
1953
18.0k
#endif
1954
1955
    /* THESE ARE CONSTANT NOW IF PS IS INDEPENDANT OF SAMPLERATE */
1956
651k
    for (i = 0; i < short_delay_band; i++)
1957
633k
    {
1958
633k
        ps->delay_D[i] = 14;
1959
633k
    }
1960
542k
    for (i = short_delay_band; i < 64; i++)
1961
524k
    {
1962
524k
        ps->delay_D[i] = 1;
1963
524k
    }
1964
1965
    /* mixing and phase */
1966
922k
    for (i = 0; i < 50; i++)
1967
904k
    {
1968
904k
        RE(ps->h11_prev[i]) = 1;
1969
904k
        IM(ps->h11_prev[i]) = 1;
1970
904k
        RE(ps->h12_prev[i]) = 1;
1971
904k
        IM(ps->h12_prev[i]) = 1;
1972
904k
    }
1973
1974
18.0k
    ps->phase_hist = 0;
1975
1976
379k
    for (i = 0; i < 20; i++)
1977
361k
    {
1978
361k
        RE(ps->ipd_prev[i][0]) = 0;
1979
361k
        IM(ps->ipd_prev[i][0]) = 0;
1980
361k
        RE(ps->ipd_prev[i][1]) = 0;
1981
361k
        IM(ps->ipd_prev[i][1]) = 0;
1982
361k
        RE(ps->opd_prev[i][0]) = 0;
1983
361k
        IM(ps->opd_prev[i][0]) = 0;
1984
361k
        RE(ps->opd_prev[i][1]) = 0;
1985
361k
        IM(ps->opd_prev[i][1]) = 0;
1986
361k
    }
1987
1988
18.0k
    return ps;
1989
18.0k
}
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
21.0k
{
1994
21.0k
    qmf_t X_hybrid_left[32][32] = {{{0}}};
1995
21.0k
    qmf_t X_hybrid_right[32][32] = {{{0}}};
1996
1997
    /* delta decoding of the bitstream data */
1998
21.0k
    ps_data_decode(ps);
1999
2000
    /* set up some parameters depending on filterbank type */
2001
21.0k
    if (ps->use34hybrid_bands)
2002
7.42k
    {
2003
7.42k
        ps->group_border = (uint8_t*)group_border34;
2004
7.42k
        ps->map_group2bk = (uint16_t*)map_group2bk34;
2005
7.42k
        ps->num_groups = 32+18;
2006
7.42k
        ps->num_hybrid_groups = 32;
2007
7.42k
        ps->nr_par_bands = 34;
2008
7.42k
        ps->decay_cutoff = 5;
2009
13.6k
    } else {
2010
13.6k
        ps->group_border = (uint8_t*)group_border20;
2011
13.6k
        ps->map_group2bk = (uint16_t*)map_group2bk20;
2012
13.6k
        ps->num_groups = 10+12;
2013
13.6k
        ps->num_hybrid_groups = 10;
2014
13.6k
        ps->nr_par_bands = 20;
2015
13.6k
        ps->decay_cutoff = 3;
2016
13.6k
    }
2017
2018
    /* Perform further analysis on the lowest subbands to get a higher
2019
     * frequency resolution
2020
     */
2021
21.0k
    hybrid_analysis((hyb_info*)ps->hyb, X_left, X_hybrid_left,
2022
21.0k
        ps->use34hybrid_bands, ps->numTimeSlotsRate);
2023
2024
    /* decorrelate mono signal */
2025
21.0k
    ps_decorrelate(ps, X_left, X_right, X_hybrid_left, X_hybrid_right);
2026
2027
    /* apply mixing and phase parameters */
2028
21.0k
    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
21.0k
    hybrid_synthesis((hyb_info*)ps->hyb, X_left, X_hybrid_left,
2032
21.0k
        ps->use34hybrid_bands, ps->numTimeSlotsRate);
2033
2034
21.0k
    hybrid_synthesis((hyb_info*)ps->hyb, X_right, X_hybrid_right,
2035
21.0k
        ps->use34hybrid_bands, ps->numTimeSlotsRate);
2036
2037
21.0k
    return 0;
2038
21.0k
}
2039
2040
#endif