Coverage Report

Created: 2025-07-11 06:40

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