Coverage Report

Created: 2026-02-14 07:13

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