Coverage Report

Created: 2026-04-01 06:58

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/proc/self/cwd/libfaad/sbr_hfgen.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: sbr_hfgen.c,v 1.26 2007/11/01 12:33:35 menno Exp $
29
**/
30
31
/* High Frequency generation */
32
33
#include "common.h"
34
#include "structs.h"
35
36
#ifdef SBR_DEC
37
38
#include "sbr_syntax.h"
39
#include "sbr_hfgen.h"
40
#include "sbr_fbt.h"
41
42
/* static function declarations */
43
#ifdef SBR_LOW_POWER
44
static void calc_prediction_coef_lp(sbr_info *sbr, qmf_t Xlow[MAX_NTSRHFG][64],
45
                                    complex_t *alpha_0, complex_t *alpha_1, real_t *rxx);
46
static void calc_aliasing_degree(sbr_info *sbr, real_t *rxx, real_t *deg);
47
#else
48
static void calc_prediction_coef(sbr_info *sbr, qmf_t Xlow[MAX_NTSRHFG][64],
49
                                 complex_t *alpha_0, complex_t *alpha_1, uint8_t k);
50
#endif
51
static void calc_chirp_factors(sbr_info *sbr, uint8_t ch);
52
static void patch_construction(sbr_info *sbr);
53
54
55
void hf_generation(sbr_info *sbr, qmf_t Xlow[MAX_NTSRHFG][64],
56
                   qmf_t Xhigh[MAX_NTSRHFG][64]
57
#ifdef SBR_LOW_POWER
58
                   ,real_t *deg
59
#endif
60
                   ,uint8_t ch)
61
55.1k
{
62
55.1k
    uint8_t l, i, x;
63
55.1k
    ALIGN complex_t alpha_0[64], alpha_1[64];
64
#ifdef SBR_LOW_POWER
65
    ALIGN real_t rxx[64];
66
#endif
67
68
55.1k
    uint8_t offset = sbr->tHFAdj;
69
55.1k
    uint8_t first = sbr->t_E[ch][0];
70
55.1k
    uint8_t last = sbr->t_E[ch][sbr->L_E[ch]];
71
72
55.1k
    calc_chirp_factors(sbr, ch);
73
74
#ifdef SBR_LOW_POWER
75
    memset(deg, 0, 64*sizeof(real_t));
76
#endif
77
78
55.1k
    if ((ch == 0) && (sbr->Reset))
79
42.7k
        patch_construction(sbr);
80
81
    /* calculate the prediction coefficients */
82
#ifdef SBR_LOW_POWER
83
    calc_prediction_coef_lp(sbr, Xlow, alpha_0, alpha_1, rxx);
84
    calc_aliasing_degree(sbr, rxx, deg);
85
#endif
86
87
    /* actual HF generation */
88
174k
    for (i = 0; i < sbr->noPatches; i++)
89
118k
    {
90
815k
        for (x = 0; x < sbr->patchNoSubbands[i]; x++)
91
696k
        {
92
696k
            real_t a0_r, a0_i, a1_r, a1_i;
93
696k
            real_t bw, bw2;
94
696k
            uint8_t q, p, k, g;
95
96
            /* find the low and high band for patching */
97
696k
            k = sbr->kx + x;
98
1.34M
            for (q = 0; q < i; q++)
99
652k
            {
100
652k
                k += sbr->patchNoSubbands[q];
101
652k
            }
102
696k
            p = sbr->patchStartSubband[i] + x;
103
104
#ifdef SBR_LOW_POWER
105
            if (x != 0 /*x < sbr->patchNoSubbands[i]-1*/)
106
                deg[k] = deg[p];
107
            else
108
                deg[k] = 0;
109
#endif
110
111
696k
            g = sbr->table_map_k_to_g[k];
112
113
696k
            bw = sbr->bwArray[ch][g];
114
696k
            bw2 = MUL_C(bw, bw);
115
116
            /* do the patching */
117
            /* with or without filtering */
118
696k
            if (bw2 > 0)
119
369k
            {
120
369k
                real_t temp1_r, temp2_r, temp3_r;
121
369k
#ifndef SBR_LOW_POWER
122
369k
                real_t temp1_i, temp2_i, temp3_i;
123
369k
                calc_prediction_coef(sbr, Xlow, alpha_0, alpha_1, p);
124
369k
#endif
125
126
369k
                a0_r = MUL_C(RE(alpha_0[p]), bw);
127
369k
                a1_r = MUL_C(RE(alpha_1[p]), bw2);
128
369k
#ifndef SBR_LOW_POWER
129
369k
                a0_i = MUL_C(IM(alpha_0[p]), bw);
130
369k
                a1_i = MUL_C(IM(alpha_1[p]), bw2);
131
369k
#endif
132
133
369k
              temp2_r = QMF_RE(Xlow[first - 2 + offset][p]);
134
369k
              temp3_r = QMF_RE(Xlow[first - 1 + offset][p]);
135
369k
#ifndef SBR_LOW_POWER
136
369k
              temp2_i = QMF_IM(Xlow[first - 2 + offset][p]);
137
369k
              temp3_i = QMF_IM(Xlow[first - 1 + offset][p]);
138
369k
#endif
139
12.1M
        for (l = first; l < last; l++)
140
11.7M
                {
141
11.7M
                  temp1_r = temp2_r;
142
11.7M
                  temp2_r = temp3_r;
143
11.7M
                  temp3_r = QMF_RE(Xlow[l + offset][p]);
144
11.7M
#ifndef SBR_LOW_POWER
145
11.7M
                  temp1_i = temp2_i;
146
11.7M
                  temp2_i = temp3_i;
147
11.7M
                    temp3_i = QMF_IM(Xlow[l + offset][p]);
148
11.7M
#endif
149
150
#ifdef SBR_LOW_POWER
151
                    QMF_RE(Xhigh[l + offset][k]) =
152
                        temp3_r
153
                      +(MUL_R(a0_r, temp2_r) +
154
                        MUL_R(a1_r, temp1_r));
155
#else
156
11.7M
                    QMF_RE(Xhigh[l + offset][k]) =
157
11.7M
                        temp3_r
158
11.7M
                      +(MUL_R(a0_r, temp2_r) -
159
11.7M
                        MUL_R(a0_i, temp2_i) +
160
11.7M
                        MUL_R(a1_r, temp1_r) -
161
11.7M
                        MUL_R(a1_i, temp1_i));
162
11.7M
                    QMF_IM(Xhigh[l + offset][k]) =
163
11.7M
                        temp3_i
164
11.7M
                      +(MUL_R(a0_i, temp2_r) +
165
11.7M
                        MUL_R(a0_r, temp2_i) +
166
11.7M
                        MUL_R(a1_i, temp1_r) +
167
11.7M
                        MUL_R(a1_r, temp1_i));
168
11.7M
#endif
169
11.7M
                }
170
369k
            } else {
171
10.6M
                for (l = first; l < last; l++)
172
10.3M
                {
173
10.3M
                    QMF_RE(Xhigh[l + offset][k]) = QMF_RE(Xlow[l + offset][p]);
174
10.3M
#ifndef SBR_LOW_POWER
175
10.3M
                    QMF_IM(Xhigh[l + offset][k]) = QMF_IM(Xlow[l + offset][p]);
176
10.3M
#endif
177
10.3M
                }
178
327k
            }
179
696k
        }
180
118k
    }
181
182
55.1k
    if (sbr->Reset)
183
53.3k
    {
184
53.3k
        limiter_frequency_table(sbr);
185
53.3k
    }
186
55.1k
}
hf_generation
Line
Count
Source
61
27.5k
{
62
27.5k
    uint8_t l, i, x;
63
27.5k
    ALIGN complex_t alpha_0[64], alpha_1[64];
64
#ifdef SBR_LOW_POWER
65
    ALIGN real_t rxx[64];
66
#endif
67
68
27.5k
    uint8_t offset = sbr->tHFAdj;
69
27.5k
    uint8_t first = sbr->t_E[ch][0];
70
27.5k
    uint8_t last = sbr->t_E[ch][sbr->L_E[ch]];
71
72
27.5k
    calc_chirp_factors(sbr, ch);
73
74
#ifdef SBR_LOW_POWER
75
    memset(deg, 0, 64*sizeof(real_t));
76
#endif
77
78
27.5k
    if ((ch == 0) && (sbr->Reset))
79
21.3k
        patch_construction(sbr);
80
81
    /* calculate the prediction coefficients */
82
#ifdef SBR_LOW_POWER
83
    calc_prediction_coef_lp(sbr, Xlow, alpha_0, alpha_1, rxx);
84
    calc_aliasing_degree(sbr, rxx, deg);
85
#endif
86
87
    /* actual HF generation */
88
87.0k
    for (i = 0; i < sbr->noPatches; i++)
89
59.4k
    {
90
407k
        for (x = 0; x < sbr->patchNoSubbands[i]; x++)
91
348k
        {
92
348k
            real_t a0_r, a0_i, a1_r, a1_i;
93
348k
            real_t bw, bw2;
94
348k
            uint8_t q, p, k, g;
95
96
            /* find the low and high band for patching */
97
348k
            k = sbr->kx + x;
98
674k
            for (q = 0; q < i; q++)
99
326k
            {
100
326k
                k += sbr->patchNoSubbands[q];
101
326k
            }
102
348k
            p = sbr->patchStartSubband[i] + x;
103
104
#ifdef SBR_LOW_POWER
105
            if (x != 0 /*x < sbr->patchNoSubbands[i]-1*/)
106
                deg[k] = deg[p];
107
            else
108
                deg[k] = 0;
109
#endif
110
111
348k
            g = sbr->table_map_k_to_g[k];
112
113
348k
            bw = sbr->bwArray[ch][g];
114
348k
            bw2 = MUL_C(bw, bw);
115
116
            /* do the patching */
117
            /* with or without filtering */
118
348k
            if (bw2 > 0)
119
184k
            {
120
184k
                real_t temp1_r, temp2_r, temp3_r;
121
184k
#ifndef SBR_LOW_POWER
122
184k
                real_t temp1_i, temp2_i, temp3_i;
123
184k
                calc_prediction_coef(sbr, Xlow, alpha_0, alpha_1, p);
124
184k
#endif
125
126
184k
                a0_r = MUL_C(RE(alpha_0[p]), bw);
127
184k
                a1_r = MUL_C(RE(alpha_1[p]), bw2);
128
184k
#ifndef SBR_LOW_POWER
129
184k
                a0_i = MUL_C(IM(alpha_0[p]), bw);
130
184k
                a1_i = MUL_C(IM(alpha_1[p]), bw2);
131
184k
#endif
132
133
184k
              temp2_r = QMF_RE(Xlow[first - 2 + offset][p]);
134
184k
              temp3_r = QMF_RE(Xlow[first - 1 + offset][p]);
135
184k
#ifndef SBR_LOW_POWER
136
184k
              temp2_i = QMF_IM(Xlow[first - 2 + offset][p]);
137
184k
              temp3_i = QMF_IM(Xlow[first - 1 + offset][p]);
138
184k
#endif
139
6.05M
        for (l = first; l < last; l++)
140
5.87M
                {
141
5.87M
                  temp1_r = temp2_r;
142
5.87M
                  temp2_r = temp3_r;
143
5.87M
                  temp3_r = QMF_RE(Xlow[l + offset][p]);
144
5.87M
#ifndef SBR_LOW_POWER
145
5.87M
                  temp1_i = temp2_i;
146
5.87M
                  temp2_i = temp3_i;
147
5.87M
                    temp3_i = QMF_IM(Xlow[l + offset][p]);
148
5.87M
#endif
149
150
#ifdef SBR_LOW_POWER
151
                    QMF_RE(Xhigh[l + offset][k]) =
152
                        temp3_r
153
                      +(MUL_R(a0_r, temp2_r) +
154
                        MUL_R(a1_r, temp1_r));
155
#else
156
5.87M
                    QMF_RE(Xhigh[l + offset][k]) =
157
5.87M
                        temp3_r
158
5.87M
                      +(MUL_R(a0_r, temp2_r) -
159
5.87M
                        MUL_R(a0_i, temp2_i) +
160
5.87M
                        MUL_R(a1_r, temp1_r) -
161
5.87M
                        MUL_R(a1_i, temp1_i));
162
5.87M
                    QMF_IM(Xhigh[l + offset][k]) =
163
5.87M
                        temp3_i
164
5.87M
                      +(MUL_R(a0_i, temp2_r) +
165
5.87M
                        MUL_R(a0_r, temp2_i) +
166
5.87M
                        MUL_R(a1_i, temp1_r) +
167
5.87M
                        MUL_R(a1_r, temp1_i));
168
5.87M
#endif
169
5.87M
                }
170
184k
            } else {
171
5.33M
                for (l = first; l < last; l++)
172
5.17M
                {
173
5.17M
                    QMF_RE(Xhigh[l + offset][k]) = QMF_RE(Xlow[l + offset][p]);
174
5.17M
#ifndef SBR_LOW_POWER
175
5.17M
                    QMF_IM(Xhigh[l + offset][k]) = QMF_IM(Xlow[l + offset][p]);
176
5.17M
#endif
177
5.17M
                }
178
163k
            }
179
348k
        }
180
59.4k
    }
181
182
27.5k
    if (sbr->Reset)
183
26.6k
    {
184
26.6k
        limiter_frequency_table(sbr);
185
26.6k
    }
186
27.5k
}
hf_generation
Line
Count
Source
61
27.5k
{
62
27.5k
    uint8_t l, i, x;
63
27.5k
    ALIGN complex_t alpha_0[64], alpha_1[64];
64
#ifdef SBR_LOW_POWER
65
    ALIGN real_t rxx[64];
66
#endif
67
68
27.5k
    uint8_t offset = sbr->tHFAdj;
69
27.5k
    uint8_t first = sbr->t_E[ch][0];
70
27.5k
    uint8_t last = sbr->t_E[ch][sbr->L_E[ch]];
71
72
27.5k
    calc_chirp_factors(sbr, ch);
73
74
#ifdef SBR_LOW_POWER
75
    memset(deg, 0, 64*sizeof(real_t));
76
#endif
77
78
27.5k
    if ((ch == 0) && (sbr->Reset))
79
21.3k
        patch_construction(sbr);
80
81
    /* calculate the prediction coefficients */
82
#ifdef SBR_LOW_POWER
83
    calc_prediction_coef_lp(sbr, Xlow, alpha_0, alpha_1, rxx);
84
    calc_aliasing_degree(sbr, rxx, deg);
85
#endif
86
87
    /* actual HF generation */
88
87.0k
    for (i = 0; i < sbr->noPatches; i++)
89
59.4k
    {
90
407k
        for (x = 0; x < sbr->patchNoSubbands[i]; x++)
91
348k
        {
92
348k
            real_t a0_r, a0_i, a1_r, a1_i;
93
348k
            real_t bw, bw2;
94
348k
            uint8_t q, p, k, g;
95
96
            /* find the low and high band for patching */
97
348k
            k = sbr->kx + x;
98
674k
            for (q = 0; q < i; q++)
99
326k
            {
100
326k
                k += sbr->patchNoSubbands[q];
101
326k
            }
102
348k
            p = sbr->patchStartSubband[i] + x;
103
104
#ifdef SBR_LOW_POWER
105
            if (x != 0 /*x < sbr->patchNoSubbands[i]-1*/)
106
                deg[k] = deg[p];
107
            else
108
                deg[k] = 0;
109
#endif
110
111
348k
            g = sbr->table_map_k_to_g[k];
112
113
348k
            bw = sbr->bwArray[ch][g];
114
348k
            bw2 = MUL_C(bw, bw);
115
116
            /* do the patching */
117
            /* with or without filtering */
118
348k
            if (bw2 > 0)
119
184k
            {
120
184k
                real_t temp1_r, temp2_r, temp3_r;
121
184k
#ifndef SBR_LOW_POWER
122
184k
                real_t temp1_i, temp2_i, temp3_i;
123
184k
                calc_prediction_coef(sbr, Xlow, alpha_0, alpha_1, p);
124
184k
#endif
125
126
184k
                a0_r = MUL_C(RE(alpha_0[p]), bw);
127
184k
                a1_r = MUL_C(RE(alpha_1[p]), bw2);
128
184k
#ifndef SBR_LOW_POWER
129
184k
                a0_i = MUL_C(IM(alpha_0[p]), bw);
130
184k
                a1_i = MUL_C(IM(alpha_1[p]), bw2);
131
184k
#endif
132
133
184k
              temp2_r = QMF_RE(Xlow[first - 2 + offset][p]);
134
184k
              temp3_r = QMF_RE(Xlow[first - 1 + offset][p]);
135
184k
#ifndef SBR_LOW_POWER
136
184k
              temp2_i = QMF_IM(Xlow[first - 2 + offset][p]);
137
184k
              temp3_i = QMF_IM(Xlow[first - 1 + offset][p]);
138
184k
#endif
139
6.05M
        for (l = first; l < last; l++)
140
5.87M
                {
141
5.87M
                  temp1_r = temp2_r;
142
5.87M
                  temp2_r = temp3_r;
143
5.87M
                  temp3_r = QMF_RE(Xlow[l + offset][p]);
144
5.87M
#ifndef SBR_LOW_POWER
145
5.87M
                  temp1_i = temp2_i;
146
5.87M
                  temp2_i = temp3_i;
147
5.87M
                    temp3_i = QMF_IM(Xlow[l + offset][p]);
148
5.87M
#endif
149
150
#ifdef SBR_LOW_POWER
151
                    QMF_RE(Xhigh[l + offset][k]) =
152
                        temp3_r
153
                      +(MUL_R(a0_r, temp2_r) +
154
                        MUL_R(a1_r, temp1_r));
155
#else
156
5.87M
                    QMF_RE(Xhigh[l + offset][k]) =
157
5.87M
                        temp3_r
158
5.87M
                      +(MUL_R(a0_r, temp2_r) -
159
5.87M
                        MUL_R(a0_i, temp2_i) +
160
5.87M
                        MUL_R(a1_r, temp1_r) -
161
5.87M
                        MUL_R(a1_i, temp1_i));
162
5.87M
                    QMF_IM(Xhigh[l + offset][k]) =
163
5.87M
                        temp3_i
164
5.87M
                      +(MUL_R(a0_i, temp2_r) +
165
5.87M
                        MUL_R(a0_r, temp2_i) +
166
5.87M
                        MUL_R(a1_i, temp1_r) +
167
5.87M
                        MUL_R(a1_r, temp1_i));
168
5.87M
#endif
169
5.87M
                }
170
184k
            } else {
171
5.33M
                for (l = first; l < last; l++)
172
5.17M
                {
173
5.17M
                    QMF_RE(Xhigh[l + offset][k]) = QMF_RE(Xlow[l + offset][p]);
174
5.17M
#ifndef SBR_LOW_POWER
175
5.17M
                    QMF_IM(Xhigh[l + offset][k]) = QMF_IM(Xlow[l + offset][p]);
176
5.17M
#endif
177
5.17M
                }
178
163k
            }
179
348k
        }
180
59.4k
    }
181
182
27.5k
    if (sbr->Reset)
183
26.6k
    {
184
26.6k
        limiter_frequency_table(sbr);
185
26.6k
    }
186
27.5k
}
187
188
typedef struct
189
{
190
    complex_t r01;
191
    complex_t r02;
192
    complex_t r11;
193
    complex_t r12;
194
    complex_t r22;
195
    real_t det;
196
} acorr_coef;
197
198
#ifdef SBR_LOW_POWER
199
static void auto_correlation(sbr_info *sbr, acorr_coef *ac,
200
                             qmf_t buffer[MAX_NTSRHFG][64],
201
                             uint8_t bd, uint8_t len)
202
{
203
    real_t r01 = 0, r02 = 0, r11 = 0;
204
    int8_t j;
205
    uint8_t offset = sbr->tHFAdj;
206
#ifdef FIXED_POINT
207
    const real_t rel = FRAC_CONST(0.999999); // 1 / (1 + 1e-6f);
208
    uint32_t maxi = 0;
209
    uint32_t pow2, exp;
210
#else
211
    const real_t rel = 1 / (1 + 1e-6f);
212
#endif
213
214
215
#ifdef FIXED_POINT
216
    mask = 0;
217
218
    for (j = (offset-2); j < (len + offset); j++)
219
    {
220
        real_t x;
221
        x = QMF_RE(buffer[j][bd])>>REAL_BITS;
222
        mask |= x ^ (x >> 31);
223
    }
224
225
    exp = wl_min_lzc(mask);
226
227
    /* improves accuracy */
228
    if (exp > 0)
229
        exp -= 1;
230
231
    for (j = offset; j < len + offset; j++)
232
    {
233
        real_t buf_j = ((QMF_RE(buffer[j][bd])+(1<<(exp-1)))>>exp);
234
        real_t buf_j_1 = ((QMF_RE(buffer[j-1][bd])+(1<<(exp-1)))>>exp);
235
        real_t buf_j_2 = ((QMF_RE(buffer[j-2][bd])+(1<<(exp-1)))>>exp);
236
237
        /* normalisation with rounding */
238
        r01 += MUL_R(buf_j, buf_j_1);
239
        r02 += MUL_R(buf_j, buf_j_2);
240
        r11 += MUL_R(buf_j_1, buf_j_1);
241
    }
242
    RE(ac->r12) = r01 -
243
        MUL_R(((QMF_RE(buffer[len+offset-1][bd])+(1<<(exp-1)))>>exp), ((QMF_RE(buffer[len+offset-2][bd])+(1<<(exp-1)))>>exp)) +
244
        MUL_R(((QMF_RE(buffer[offset-1][bd])+(1<<(exp-1)))>>exp), ((QMF_RE(buffer[offset-2][bd])+(1<<(exp-1)))>>exp));
245
    RE(ac->r22) = r11 -
246
        MUL_R(((QMF_RE(buffer[len+offset-2][bd])+(1<<(exp-1)))>>exp), ((QMF_RE(buffer[len+offset-2][bd])+(1<<(exp-1)))>>exp)) +
247
        MUL_R(((QMF_RE(buffer[offset-2][bd])+(1<<(exp-1)))>>exp), ((QMF_RE(buffer[offset-2][bd])+(1<<(exp-1)))>>exp));
248
#else
249
    for (j = offset; j < len + offset; j++)
250
    {
251
        r01 += QMF_RE(buffer[j][bd]) * QMF_RE(buffer[j-1][bd]);
252
        r02 += QMF_RE(buffer[j][bd]) * QMF_RE(buffer[j-2][bd]);
253
        r11 += QMF_RE(buffer[j-1][bd]) * QMF_RE(buffer[j-1][bd]);
254
    }
255
    RE(ac->r12) = r01 -
256
        QMF_RE(buffer[len+offset-1][bd]) * QMF_RE(buffer[len+offset-2][bd]) +
257
        QMF_RE(buffer[offset-1][bd]) * QMF_RE(buffer[offset-2][bd]);
258
    RE(ac->r22) = r11 -
259
        QMF_RE(buffer[len+offset-2][bd]) * QMF_RE(buffer[len+offset-2][bd]) +
260
        QMF_RE(buffer[offset-2][bd]) * QMF_RE(buffer[offset-2][bd]);
261
#endif
262
    RE(ac->r01) = r01;
263
    RE(ac->r02) = r02;
264
    RE(ac->r11) = r11;
265
266
    ac->det = MUL_R(RE(ac->r11), RE(ac->r22)) - MUL_F(MUL_R(RE(ac->r12), RE(ac->r12)), rel);
267
}
268
#else
269
static void auto_correlation(sbr_info *sbr, acorr_coef *ac, qmf_t buffer[MAX_NTSRHFG][64],
270
                             uint8_t bd, uint8_t len)
271
184k
{
272
184k
    real_t r01r = 0, r01i = 0, r02r = 0, r02i = 0, r11r = 0;
273
184k
    real_t temp1_r, temp1_i, temp2_r, temp2_i, temp3_r, temp3_i, temp4_r, temp4_i, temp5_r, temp5_i;
274
#ifdef FIXED_POINT
275
83.5k
    const real_t rel = FRAC_CONST(0.999999); // 1 / (1 + 1e-6f);
276
    uint32_t mask, exp;
277
    real_t half;
278
#else
279
    const real_t rel = 1 / (1 + 1e-6f);
280
#endif
281
184k
    int8_t j;
282
184k
    uint8_t offset = sbr->tHFAdj;
283
284
#ifdef FIXED_POINT
285
    mask = 0;
286
287
3.39M
    for (j = (offset-2); j < (len + offset); j++)
288
3.31M
    {
289
3.31M
        real_t x;
290
3.31M
        x = QMF_RE(buffer[j][bd])>>REAL_BITS;
291
3.31M
        mask |= x ^ (x >> 31);
292
3.31M
        x = QMF_IM(buffer[j][bd])>>REAL_BITS;
293
3.31M
        mask |= x ^ (x >> 31);
294
3.31M
    }
295
296
    exp = wl_min_lzc(mask);
297
298
    /* All-zero input. */
299
83.5k
    if (exp == 0) {
300
78.1k
        RE(ac->r01) = 0;
301
78.1k
        IM(ac->r01) = 0;
302
78.1k
        RE(ac->r02) = 0;
303
78.1k
        IM(ac->r02) = 0;
304
78.1k
        RE(ac->r11) = 0;
305
        // IM(ac->r11) = 0; // unused
306
78.1k
        RE(ac->r12) = 0;
307
78.1k
        IM(ac->r12) = 0;
308
78.1k
        RE(ac->r22) = 0;
309
        // IM(ac->r22) = 0; // unused
310
78.1k
        ac->det = 0;
311
78.1k
        return;
312
78.1k
    }
313
    /* Otherwise exp > 0. */
314
    /* improves accuracy */
315
5.41k
    exp -= 1;
316
    /* Now exp is 0..31 */
317
5.41k
    half = (1 << exp) >> 1;
318
319
5.41k
    temp2_r = (QMF_RE(buffer[offset-2][bd]) + half) >> exp;
320
5.41k
    temp2_i = (QMF_IM(buffer[offset-2][bd]) + half) >> exp;
321
5.41k
    temp3_r = (QMF_RE(buffer[offset-1][bd]) + half) >> exp;
322
5.41k
    temp3_i = (QMF_IM(buffer[offset-1][bd]) + half) >> exp;
323
    // Save these because they are needed after loop
324
5.41k
    temp4_r = temp2_r;
325
5.41k
    temp4_i = temp2_i;
326
5.41k
    temp5_r = temp3_r;
327
5.41k
    temp5_i = temp3_i;
328
329
207k
    for (j = offset; j < len + offset; j++)
330
201k
    {
331
201k
        temp1_r = temp2_r; // temp1_r = (QMF_RE(buffer[offset-2][bd] + (1<<(exp-1))) >> exp;
332
201k
        temp1_i = temp2_i; // temp1_i = (QMF_IM(buffer[offset-2][bd] + (1<<(exp-1))) >> exp;
333
201k
        temp2_r = temp3_r; // temp2_r = (QMF_RE(buffer[offset-1][bd] + (1<<(exp-1))) >> exp;
334
201k
        temp2_i = temp3_i; // temp2_i = (QMF_IM(buffer[offset-1][bd] + (1<<(exp-1))) >> exp;
335
201k
        temp3_r = (QMF_RE(buffer[j][bd]) + half) >> exp;
336
201k
        temp3_i = (QMF_IM(buffer[j][bd]) + half) >> exp;
337
201k
        r01r += MUL_R(temp3_r, temp2_r) + MUL_R(temp3_i, temp2_i);
338
201k
        r01i += MUL_R(temp3_i, temp2_r) - MUL_R(temp3_r, temp2_i);
339
201k
        r02r += MUL_R(temp3_r, temp1_r) + MUL_R(temp3_i, temp1_i);
340
201k
        r02i += MUL_R(temp3_i, temp1_r) - MUL_R(temp3_r, temp1_i);
341
201k
        r11r += MUL_R(temp2_r, temp2_r) + MUL_R(temp2_i, temp2_i);
342
201k
    }
343
344
    // These are actual values in temporary variable at this point
345
    // temp1_r = (QMF_RE(buffer[len+offset-1-2][bd] + (1<<(exp-1))) >> exp;
346
    // temp1_i = (QMF_IM(buffer[len+offset-1-2][bd] + (1<<(exp-1))) >> exp;
347
    // temp2_r = (QMF_RE(buffer[len+offset-1-1][bd] + (1<<(exp-1))) >> exp;
348
    // temp2_i = (QMF_IM(buffer[len+offset-1-1][bd] + (1<<(exp-1))) >> exp;
349
    // temp3_r = (QMF_RE(buffer[len+offset-1][bd]) + (1<<(exp-1))) >> exp;
350
    // temp3_i = (QMF_IM(buffer[len+offset-1][bd]) + (1<<(exp-1))) >> exp;
351
    // temp4_r = (QMF_RE(buffer[offset-2][bd]) + (1<<(exp-1))) >> exp;
352
    // temp4_i = (QMF_IM(buffer[offset-2][bd]) + (1<<(exp-1))) >> exp;
353
    // temp5_r = (QMF_RE(buffer[offset-1][bd]) + (1<<(exp-1))) >> exp;
354
    // temp5_i = (QMF_IM(buffer[offset-1][bd]) + (1<<(exp-1))) >> exp;
355
356
5.41k
    RE(ac->r12) = r01r -
357
5.41k
        (MUL_R(temp3_r, temp2_r) + MUL_R(temp3_i, temp2_i)) +
358
5.41k
        (MUL_R(temp5_r, temp4_r) + MUL_R(temp5_i, temp4_i));
359
5.41k
    IM(ac->r12) = r01i -
360
5.41k
        (MUL_R(temp3_i, temp2_r) - MUL_R(temp3_r, temp2_i)) +
361
5.41k
        (MUL_R(temp5_i, temp4_r) - MUL_R(temp5_r, temp4_i));
362
5.41k
    RE(ac->r22) = r11r -
363
5.41k
        (MUL_R(temp2_r, temp2_r) + MUL_R(temp2_i, temp2_i)) +
364
5.41k
        (MUL_R(temp4_r, temp4_r) + MUL_R(temp4_i, temp4_i));
365
366
#else
367
368
101k
    temp2_r = QMF_RE(buffer[offset-2][bd]);
369
101k
    temp2_i = QMF_IM(buffer[offset-2][bd]);
370
101k
    temp3_r = QMF_RE(buffer[offset-1][bd]);
371
101k
    temp3_i = QMF_IM(buffer[offset-1][bd]);
372
    // Save these because they are needed after loop
373
    temp4_r = temp2_r;
374
    temp4_i = temp2_i;
375
    temp5_r = temp3_r;
376
    temp5_i = temp3_i;
377
378
3.89M
    for (j = offset; j < len + offset; j++)
379
3.79M
    {
380
3.79M
      temp1_r = temp2_r; // temp1_r = QMF_RE(buffer[j-2][bd];
381
3.79M
      temp1_i = temp2_i; // temp1_i = QMF_IM(buffer[j-2][bd];
382
3.79M
      temp2_r = temp3_r; // temp2_r = QMF_RE(buffer[j-1][bd];
383
3.79M
      temp2_i = temp3_i; // temp2_i = QMF_IM(buffer[j-1][bd];
384
3.79M
        temp3_r = QMF_RE(buffer[j][bd]);
385
3.79M
        temp3_i = QMF_IM(buffer[j][bd]);
386
3.79M
        r01r += temp3_r * temp2_r + temp3_i * temp2_i;
387
3.79M
        r01i += temp3_i * temp2_r - temp3_r * temp2_i;
388
3.79M
        r02r += temp3_r * temp1_r + temp3_i * temp1_i;
389
3.79M
        r02i += temp3_i * temp1_r - temp3_r * temp1_i;
390
3.79M
        r11r += temp2_r * temp2_r + temp2_i * temp2_i;
391
3.79M
    }
392
393
    // These are actual values in temporary variable at this point
394
    // temp1_r = QMF_RE(buffer[len+offset-1-2][bd];
395
    // temp1_i = QMF_IM(buffer[len+offset-1-2][bd];
396
    // temp2_r = QMF_RE(buffer[len+offset-1-1][bd];
397
    // temp2_i = QMF_IM(buffer[len+offset-1-1][bd];
398
    // temp3_r = QMF_RE(buffer[len+offset-1][bd]);
399
    // temp3_i = QMF_IM(buffer[len+offset-1][bd]);
400
    // temp4_r = QMF_RE(buffer[offset-2][bd]);
401
    // temp4_i = QMF_IM(buffer[offset-2][bd]);
402
    // temp5_r = QMF_RE(buffer[offset-1][bd]);
403
    // temp5_i = QMF_IM(buffer[offset-1][bd]);
404
405
101k
    RE(ac->r12) = r01r -
406
        (temp3_r * temp2_r + temp3_i * temp2_i) +
407
        (temp5_r * temp4_r + temp5_i * temp4_i);
408
101k
    IM(ac->r12) = r01i -
409
        (temp3_i * temp2_r - temp3_r * temp2_i) +
410
        (temp5_i * temp4_r - temp5_r * temp4_i);
411
101k
    RE(ac->r22) = r11r -
412
        (temp2_r * temp2_r + temp2_i * temp2_i) +
413
        (temp4_r * temp4_r + temp4_i * temp4_i);
414
415
#endif
416
417
106k
    RE(ac->r01) = r01r;
418
106k
    IM(ac->r01) = r01i;
419
106k
    RE(ac->r02) = r02r;
420
106k
    IM(ac->r02) = r02i;
421
106k
    RE(ac->r11) = r11r;
422
423
106k
    ac->det = MUL_R(RE(ac->r11), RE(ac->r22)) - MUL_F(rel, (MUL_R(RE(ac->r12), RE(ac->r12)) + MUL_R(IM(ac->r12), IM(ac->r12))));
424
5.41k
}
sbr_hfgen.c:auto_correlation
Line
Count
Source
271
83.5k
{
272
83.5k
    real_t r01r = 0, r01i = 0, r02r = 0, r02i = 0, r11r = 0;
273
83.5k
    real_t temp1_r, temp1_i, temp2_r, temp2_i, temp3_r, temp3_i, temp4_r, temp4_i, temp5_r, temp5_i;
274
83.5k
#ifdef FIXED_POINT
275
83.5k
    const real_t rel = FRAC_CONST(0.999999); // 1 / (1 + 1e-6f);
276
83.5k
    uint32_t mask, exp;
277
83.5k
    real_t half;
278
#else
279
    const real_t rel = 1 / (1 + 1e-6f);
280
#endif
281
83.5k
    int8_t j;
282
83.5k
    uint8_t offset = sbr->tHFAdj;
283
284
83.5k
#ifdef FIXED_POINT
285
83.5k
    mask = 0;
286
287
3.39M
    for (j = (offset-2); j < (len + offset); j++)
288
3.31M
    {
289
3.31M
        real_t x;
290
3.31M
        x = QMF_RE(buffer[j][bd])>>REAL_BITS;
291
3.31M
        mask |= x ^ (x >> 31);
292
3.31M
        x = QMF_IM(buffer[j][bd])>>REAL_BITS;
293
3.31M
        mask |= x ^ (x >> 31);
294
3.31M
    }
295
296
83.5k
    exp = wl_min_lzc(mask);
297
298
    /* All-zero input. */
299
83.5k
    if (exp == 0) {
300
78.1k
        RE(ac->r01) = 0;
301
78.1k
        IM(ac->r01) = 0;
302
78.1k
        RE(ac->r02) = 0;
303
78.1k
        IM(ac->r02) = 0;
304
78.1k
        RE(ac->r11) = 0;
305
        // IM(ac->r11) = 0; // unused
306
78.1k
        RE(ac->r12) = 0;
307
78.1k
        IM(ac->r12) = 0;
308
78.1k
        RE(ac->r22) = 0;
309
        // IM(ac->r22) = 0; // unused
310
78.1k
        ac->det = 0;
311
78.1k
        return;
312
78.1k
    }
313
    /* Otherwise exp > 0. */
314
    /* improves accuracy */
315
5.41k
    exp -= 1;
316
    /* Now exp is 0..31 */
317
5.41k
    half = (1 << exp) >> 1;
318
319
5.41k
    temp2_r = (QMF_RE(buffer[offset-2][bd]) + half) >> exp;
320
5.41k
    temp2_i = (QMF_IM(buffer[offset-2][bd]) + half) >> exp;
321
5.41k
    temp3_r = (QMF_RE(buffer[offset-1][bd]) + half) >> exp;
322
5.41k
    temp3_i = (QMF_IM(buffer[offset-1][bd]) + half) >> exp;
323
    // Save these because they are needed after loop
324
5.41k
    temp4_r = temp2_r;
325
5.41k
    temp4_i = temp2_i;
326
5.41k
    temp5_r = temp3_r;
327
5.41k
    temp5_i = temp3_i;
328
329
207k
    for (j = offset; j < len + offset; j++)
330
201k
    {
331
201k
        temp1_r = temp2_r; // temp1_r = (QMF_RE(buffer[offset-2][bd] + (1<<(exp-1))) >> exp;
332
201k
        temp1_i = temp2_i; // temp1_i = (QMF_IM(buffer[offset-2][bd] + (1<<(exp-1))) >> exp;
333
201k
        temp2_r = temp3_r; // temp2_r = (QMF_RE(buffer[offset-1][bd] + (1<<(exp-1))) >> exp;
334
201k
        temp2_i = temp3_i; // temp2_i = (QMF_IM(buffer[offset-1][bd] + (1<<(exp-1))) >> exp;
335
201k
        temp3_r = (QMF_RE(buffer[j][bd]) + half) >> exp;
336
201k
        temp3_i = (QMF_IM(buffer[j][bd]) + half) >> exp;
337
201k
        r01r += MUL_R(temp3_r, temp2_r) + MUL_R(temp3_i, temp2_i);
338
201k
        r01i += MUL_R(temp3_i, temp2_r) - MUL_R(temp3_r, temp2_i);
339
201k
        r02r += MUL_R(temp3_r, temp1_r) + MUL_R(temp3_i, temp1_i);
340
201k
        r02i += MUL_R(temp3_i, temp1_r) - MUL_R(temp3_r, temp1_i);
341
201k
        r11r += MUL_R(temp2_r, temp2_r) + MUL_R(temp2_i, temp2_i);
342
201k
    }
343
344
    // These are actual values in temporary variable at this point
345
    // temp1_r = (QMF_RE(buffer[len+offset-1-2][bd] + (1<<(exp-1))) >> exp;
346
    // temp1_i = (QMF_IM(buffer[len+offset-1-2][bd] + (1<<(exp-1))) >> exp;
347
    // temp2_r = (QMF_RE(buffer[len+offset-1-1][bd] + (1<<(exp-1))) >> exp;
348
    // temp2_i = (QMF_IM(buffer[len+offset-1-1][bd] + (1<<(exp-1))) >> exp;
349
    // temp3_r = (QMF_RE(buffer[len+offset-1][bd]) + (1<<(exp-1))) >> exp;
350
    // temp3_i = (QMF_IM(buffer[len+offset-1][bd]) + (1<<(exp-1))) >> exp;
351
    // temp4_r = (QMF_RE(buffer[offset-2][bd]) + (1<<(exp-1))) >> exp;
352
    // temp4_i = (QMF_IM(buffer[offset-2][bd]) + (1<<(exp-1))) >> exp;
353
    // temp5_r = (QMF_RE(buffer[offset-1][bd]) + (1<<(exp-1))) >> exp;
354
    // temp5_i = (QMF_IM(buffer[offset-1][bd]) + (1<<(exp-1))) >> exp;
355
356
5.41k
    RE(ac->r12) = r01r -
357
5.41k
        (MUL_R(temp3_r, temp2_r) + MUL_R(temp3_i, temp2_i)) +
358
5.41k
        (MUL_R(temp5_r, temp4_r) + MUL_R(temp5_i, temp4_i));
359
5.41k
    IM(ac->r12) = r01i -
360
5.41k
        (MUL_R(temp3_i, temp2_r) - MUL_R(temp3_r, temp2_i)) +
361
5.41k
        (MUL_R(temp5_i, temp4_r) - MUL_R(temp5_r, temp4_i));
362
5.41k
    RE(ac->r22) = r11r -
363
5.41k
        (MUL_R(temp2_r, temp2_r) + MUL_R(temp2_i, temp2_i)) +
364
5.41k
        (MUL_R(temp4_r, temp4_r) + MUL_R(temp4_i, temp4_i));
365
366
#else
367
368
    temp2_r = QMF_RE(buffer[offset-2][bd]);
369
    temp2_i = QMF_IM(buffer[offset-2][bd]);
370
    temp3_r = QMF_RE(buffer[offset-1][bd]);
371
    temp3_i = QMF_IM(buffer[offset-1][bd]);
372
    // Save these because they are needed after loop
373
    temp4_r = temp2_r;
374
    temp4_i = temp2_i;
375
    temp5_r = temp3_r;
376
    temp5_i = temp3_i;
377
378
    for (j = offset; j < len + offset; j++)
379
    {
380
      temp1_r = temp2_r; // temp1_r = QMF_RE(buffer[j-2][bd];
381
      temp1_i = temp2_i; // temp1_i = QMF_IM(buffer[j-2][bd];
382
      temp2_r = temp3_r; // temp2_r = QMF_RE(buffer[j-1][bd];
383
      temp2_i = temp3_i; // temp2_i = QMF_IM(buffer[j-1][bd];
384
        temp3_r = QMF_RE(buffer[j][bd]);
385
        temp3_i = QMF_IM(buffer[j][bd]);
386
        r01r += temp3_r * temp2_r + temp3_i * temp2_i;
387
        r01i += temp3_i * temp2_r - temp3_r * temp2_i;
388
        r02r += temp3_r * temp1_r + temp3_i * temp1_i;
389
        r02i += temp3_i * temp1_r - temp3_r * temp1_i;
390
        r11r += temp2_r * temp2_r + temp2_i * temp2_i;
391
    }
392
393
    // These are actual values in temporary variable at this point
394
    // temp1_r = QMF_RE(buffer[len+offset-1-2][bd];
395
    // temp1_i = QMF_IM(buffer[len+offset-1-2][bd];
396
    // temp2_r = QMF_RE(buffer[len+offset-1-1][bd];
397
    // temp2_i = QMF_IM(buffer[len+offset-1-1][bd];
398
    // temp3_r = QMF_RE(buffer[len+offset-1][bd]);
399
    // temp3_i = QMF_IM(buffer[len+offset-1][bd]);
400
    // temp4_r = QMF_RE(buffer[offset-2][bd]);
401
    // temp4_i = QMF_IM(buffer[offset-2][bd]);
402
    // temp5_r = QMF_RE(buffer[offset-1][bd]);
403
    // temp5_i = QMF_IM(buffer[offset-1][bd]);
404
405
    RE(ac->r12) = r01r -
406
        (temp3_r * temp2_r + temp3_i * temp2_i) +
407
        (temp5_r * temp4_r + temp5_i * temp4_i);
408
    IM(ac->r12) = r01i -
409
        (temp3_i * temp2_r - temp3_r * temp2_i) +
410
        (temp5_i * temp4_r - temp5_r * temp4_i);
411
    RE(ac->r22) = r11r -
412
        (temp2_r * temp2_r + temp2_i * temp2_i) +
413
        (temp4_r * temp4_r + temp4_i * temp4_i);
414
415
#endif
416
417
5.41k
    RE(ac->r01) = r01r;
418
5.41k
    IM(ac->r01) = r01i;
419
5.41k
    RE(ac->r02) = r02r;
420
5.41k
    IM(ac->r02) = r02i;
421
5.41k
    RE(ac->r11) = r11r;
422
423
5.41k
    ac->det = MUL_R(RE(ac->r11), RE(ac->r22)) - MUL_F(rel, (MUL_R(RE(ac->r12), RE(ac->r12)) + MUL_R(IM(ac->r12), IM(ac->r12))));
424
5.41k
}
sbr_hfgen.c:auto_correlation
Line
Count
Source
271
101k
{
272
101k
    real_t r01r = 0, r01i = 0, r02r = 0, r02i = 0, r11r = 0;
273
101k
    real_t temp1_r, temp1_i, temp2_r, temp2_i, temp3_r, temp3_i, temp4_r, temp4_i, temp5_r, temp5_i;
274
#ifdef FIXED_POINT
275
    const real_t rel = FRAC_CONST(0.999999); // 1 / (1 + 1e-6f);
276
    uint32_t mask, exp;
277
    real_t half;
278
#else
279
101k
    const real_t rel = 1 / (1 + 1e-6f);
280
101k
#endif
281
101k
    int8_t j;
282
101k
    uint8_t offset = sbr->tHFAdj;
283
284
#ifdef FIXED_POINT
285
    mask = 0;
286
287
    for (j = (offset-2); j < (len + offset); j++)
288
    {
289
        real_t x;
290
        x = QMF_RE(buffer[j][bd])>>REAL_BITS;
291
        mask |= x ^ (x >> 31);
292
        x = QMF_IM(buffer[j][bd])>>REAL_BITS;
293
        mask |= x ^ (x >> 31);
294
    }
295
296
    exp = wl_min_lzc(mask);
297
298
    /* All-zero input. */
299
    if (exp == 0) {
300
        RE(ac->r01) = 0;
301
        IM(ac->r01) = 0;
302
        RE(ac->r02) = 0;
303
        IM(ac->r02) = 0;
304
        RE(ac->r11) = 0;
305
        // IM(ac->r11) = 0; // unused
306
        RE(ac->r12) = 0;
307
        IM(ac->r12) = 0;
308
        RE(ac->r22) = 0;
309
        // IM(ac->r22) = 0; // unused
310
        ac->det = 0;
311
        return;
312
    }
313
    /* Otherwise exp > 0. */
314
    /* improves accuracy */
315
    exp -= 1;
316
    /* Now exp is 0..31 */
317
    half = (1 << exp) >> 1;
318
319
    temp2_r = (QMF_RE(buffer[offset-2][bd]) + half) >> exp;
320
    temp2_i = (QMF_IM(buffer[offset-2][bd]) + half) >> exp;
321
    temp3_r = (QMF_RE(buffer[offset-1][bd]) + half) >> exp;
322
    temp3_i = (QMF_IM(buffer[offset-1][bd]) + half) >> exp;
323
    // Save these because they are needed after loop
324
    temp4_r = temp2_r;
325
    temp4_i = temp2_i;
326
    temp5_r = temp3_r;
327
    temp5_i = temp3_i;
328
329
    for (j = offset; j < len + offset; j++)
330
    {
331
        temp1_r = temp2_r; // temp1_r = (QMF_RE(buffer[offset-2][bd] + (1<<(exp-1))) >> exp;
332
        temp1_i = temp2_i; // temp1_i = (QMF_IM(buffer[offset-2][bd] + (1<<(exp-1))) >> exp;
333
        temp2_r = temp3_r; // temp2_r = (QMF_RE(buffer[offset-1][bd] + (1<<(exp-1))) >> exp;
334
        temp2_i = temp3_i; // temp2_i = (QMF_IM(buffer[offset-1][bd] + (1<<(exp-1))) >> exp;
335
        temp3_r = (QMF_RE(buffer[j][bd]) + half) >> exp;
336
        temp3_i = (QMF_IM(buffer[j][bd]) + half) >> exp;
337
        r01r += MUL_R(temp3_r, temp2_r) + MUL_R(temp3_i, temp2_i);
338
        r01i += MUL_R(temp3_i, temp2_r) - MUL_R(temp3_r, temp2_i);
339
        r02r += MUL_R(temp3_r, temp1_r) + MUL_R(temp3_i, temp1_i);
340
        r02i += MUL_R(temp3_i, temp1_r) - MUL_R(temp3_r, temp1_i);
341
        r11r += MUL_R(temp2_r, temp2_r) + MUL_R(temp2_i, temp2_i);
342
    }
343
344
    // These are actual values in temporary variable at this point
345
    // temp1_r = (QMF_RE(buffer[len+offset-1-2][bd] + (1<<(exp-1))) >> exp;
346
    // temp1_i = (QMF_IM(buffer[len+offset-1-2][bd] + (1<<(exp-1))) >> exp;
347
    // temp2_r = (QMF_RE(buffer[len+offset-1-1][bd] + (1<<(exp-1))) >> exp;
348
    // temp2_i = (QMF_IM(buffer[len+offset-1-1][bd] + (1<<(exp-1))) >> exp;
349
    // temp3_r = (QMF_RE(buffer[len+offset-1][bd]) + (1<<(exp-1))) >> exp;
350
    // temp3_i = (QMF_IM(buffer[len+offset-1][bd]) + (1<<(exp-1))) >> exp;
351
    // temp4_r = (QMF_RE(buffer[offset-2][bd]) + (1<<(exp-1))) >> exp;
352
    // temp4_i = (QMF_IM(buffer[offset-2][bd]) + (1<<(exp-1))) >> exp;
353
    // temp5_r = (QMF_RE(buffer[offset-1][bd]) + (1<<(exp-1))) >> exp;
354
    // temp5_i = (QMF_IM(buffer[offset-1][bd]) + (1<<(exp-1))) >> exp;
355
356
    RE(ac->r12) = r01r -
357
        (MUL_R(temp3_r, temp2_r) + MUL_R(temp3_i, temp2_i)) +
358
        (MUL_R(temp5_r, temp4_r) + MUL_R(temp5_i, temp4_i));
359
    IM(ac->r12) = r01i -
360
        (MUL_R(temp3_i, temp2_r) - MUL_R(temp3_r, temp2_i)) +
361
        (MUL_R(temp5_i, temp4_r) - MUL_R(temp5_r, temp4_i));
362
    RE(ac->r22) = r11r -
363
        (MUL_R(temp2_r, temp2_r) + MUL_R(temp2_i, temp2_i)) +
364
        (MUL_R(temp4_r, temp4_r) + MUL_R(temp4_i, temp4_i));
365
366
#else
367
368
101k
    temp2_r = QMF_RE(buffer[offset-2][bd]);
369
101k
    temp2_i = QMF_IM(buffer[offset-2][bd]);
370
101k
    temp3_r = QMF_RE(buffer[offset-1][bd]);
371
101k
    temp3_i = QMF_IM(buffer[offset-1][bd]);
372
    // Save these because they are needed after loop
373
101k
    temp4_r = temp2_r;
374
101k
    temp4_i = temp2_i;
375
101k
    temp5_r = temp3_r;
376
101k
    temp5_i = temp3_i;
377
378
3.89M
    for (j = offset; j < len + offset; j++)
379
3.79M
    {
380
3.79M
      temp1_r = temp2_r; // temp1_r = QMF_RE(buffer[j-2][bd];
381
3.79M
      temp1_i = temp2_i; // temp1_i = QMF_IM(buffer[j-2][bd];
382
3.79M
      temp2_r = temp3_r; // temp2_r = QMF_RE(buffer[j-1][bd];
383
3.79M
      temp2_i = temp3_i; // temp2_i = QMF_IM(buffer[j-1][bd];
384
3.79M
        temp3_r = QMF_RE(buffer[j][bd]);
385
3.79M
        temp3_i = QMF_IM(buffer[j][bd]);
386
3.79M
        r01r += temp3_r * temp2_r + temp3_i * temp2_i;
387
3.79M
        r01i += temp3_i * temp2_r - temp3_r * temp2_i;
388
3.79M
        r02r += temp3_r * temp1_r + temp3_i * temp1_i;
389
3.79M
        r02i += temp3_i * temp1_r - temp3_r * temp1_i;
390
3.79M
        r11r += temp2_r * temp2_r + temp2_i * temp2_i;
391
3.79M
    }
392
393
    // These are actual values in temporary variable at this point
394
    // temp1_r = QMF_RE(buffer[len+offset-1-2][bd];
395
    // temp1_i = QMF_IM(buffer[len+offset-1-2][bd];
396
    // temp2_r = QMF_RE(buffer[len+offset-1-1][bd];
397
    // temp2_i = QMF_IM(buffer[len+offset-1-1][bd];
398
    // temp3_r = QMF_RE(buffer[len+offset-1][bd]);
399
    // temp3_i = QMF_IM(buffer[len+offset-1][bd]);
400
    // temp4_r = QMF_RE(buffer[offset-2][bd]);
401
    // temp4_i = QMF_IM(buffer[offset-2][bd]);
402
    // temp5_r = QMF_RE(buffer[offset-1][bd]);
403
    // temp5_i = QMF_IM(buffer[offset-1][bd]);
404
405
101k
    RE(ac->r12) = r01r -
406
101k
        (temp3_r * temp2_r + temp3_i * temp2_i) +
407
101k
        (temp5_r * temp4_r + temp5_i * temp4_i);
408
101k
    IM(ac->r12) = r01i -
409
101k
        (temp3_i * temp2_r - temp3_r * temp2_i) +
410
101k
        (temp5_i * temp4_r - temp5_r * temp4_i);
411
101k
    RE(ac->r22) = r11r -
412
101k
        (temp2_r * temp2_r + temp2_i * temp2_i) +
413
101k
        (temp4_r * temp4_r + temp4_i * temp4_i);
414
415
101k
#endif
416
417
101k
    RE(ac->r01) = r01r;
418
101k
    IM(ac->r01) = r01i;
419
101k
    RE(ac->r02) = r02r;
420
101k
    IM(ac->r02) = r02i;
421
101k
    RE(ac->r11) = r11r;
422
423
101k
    ac->det = MUL_R(RE(ac->r11), RE(ac->r22)) - MUL_F(rel, (MUL_R(RE(ac->r12), RE(ac->r12)) + MUL_R(IM(ac->r12), IM(ac->r12))));
424
101k
}
425
#endif
426
427
/* calculate linear prediction coefficients using the covariance method */
428
#ifndef SBR_LOW_POWER
429
static void calc_prediction_coef(sbr_info *sbr, qmf_t Xlow[MAX_NTSRHFG][64],
430
                                 complex_t *alpha_0, complex_t *alpha_1, uint8_t k)
431
184k
{
432
184k
    real_t tmp;
433
184k
    acorr_coef ac;
434
435
184k
    auto_correlation(sbr, &ac, Xlow, k, sbr->numTimeSlotsRate + 6);
436
437
184k
    if (ac.det == 0)
438
175k
    {
439
175k
        RE(alpha_1[k]) = 0;
440
175k
        IM(alpha_1[k]) = 0;
441
175k
    } else {
442
#ifdef FIXED_POINT
443
5.19k
        tmp = (MUL_R(RE(ac.r01), RE(ac.r12)) - MUL_R(IM(ac.r01), IM(ac.r12)) - MUL_R(RE(ac.r02), RE(ac.r11)));
444
5.19k
        RE(alpha_1[k]) = DIV_R(tmp, ac.det);
445
5.19k
        tmp = (MUL_R(IM(ac.r01), RE(ac.r12)) + MUL_R(RE(ac.r01), IM(ac.r12)) - MUL_R(IM(ac.r02), RE(ac.r11)));
446
5.19k
        IM(alpha_1[k]) = DIV_R(tmp, ac.det);
447
#else
448
4.19k
        tmp = REAL_CONST(1.0) / ac.det;
449
4.19k
        RE(alpha_1[k]) = (MUL_R(RE(ac.r01), RE(ac.r12)) - MUL_R(IM(ac.r01), IM(ac.r12)) - MUL_R(RE(ac.r02), RE(ac.r11))) * tmp;
450
4.19k
        IM(alpha_1[k]) = (MUL_R(IM(ac.r01), RE(ac.r12)) + MUL_R(RE(ac.r01), IM(ac.r12)) - MUL_R(IM(ac.r02), RE(ac.r11))) * tmp;
451
#endif
452
9.38k
    }
453
454
184k
    if (RE(ac.r11) == 0)
455
171k
    {
456
171k
        RE(alpha_0[k]) = 0;
457
171k
        IM(alpha_0[k]) = 0;
458
171k
    } else {
459
#ifdef FIXED_POINT
460
5.41k
        tmp = -(RE(ac.r01) + MUL_R(RE(alpha_1[k]), RE(ac.r12)) + MUL_R(IM(alpha_1[k]), IM(ac.r12)));
461
5.41k
        RE(alpha_0[k]) = DIV_R(tmp, RE(ac.r11));
462
5.41k
        tmp = -(IM(ac.r01) + MUL_R(IM(alpha_1[k]), RE(ac.r12)) - MUL_R(RE(alpha_1[k]), IM(ac.r12)));
463
5.41k
        IM(alpha_0[k]) = DIV_R(tmp, RE(ac.r11));
464
#else
465
7.21k
        tmp = 1.0f / RE(ac.r11);
466
7.21k
        RE(alpha_0[k]) = -(RE(ac.r01) + MUL_R(RE(alpha_1[k]), RE(ac.r12)) + MUL_R(IM(alpha_1[k]), IM(ac.r12))) * tmp;
467
7.21k
        IM(alpha_0[k]) = -(IM(ac.r01) + MUL_R(IM(alpha_1[k]), RE(ac.r12)) - MUL_R(RE(alpha_1[k]), IM(ac.r12))) * tmp;
468
#endif
469
12.6k
    }
470
471
    /* Sanity check; important: use "yes" check to filter-out NaN values. */
472
184k
    if ((MUL_R(RE(alpha_0[k]),RE(alpha_0[k])) + MUL_R(IM(alpha_0[k]),IM(alpha_0[k])) <= REAL_CONST(16)) &&
473
182k
        (MUL_R(RE(alpha_1[k]),RE(alpha_1[k])) + MUL_R(IM(alpha_1[k]),IM(alpha_1[k])) <= REAL_CONST(16)))
474
181k
        return;
475
    /* Fallback */
476
2.89k
    RE(alpha_0[k]) = 0;
477
2.89k
    IM(alpha_0[k]) = 0;
478
2.89k
    RE(alpha_1[k]) = 0;
479
2.89k
    IM(alpha_1[k]) = 0;
480
2.89k
}
sbr_hfgen.c:calc_prediction_coef
Line
Count
Source
431
83.5k
{
432
83.5k
    real_t tmp;
433
83.5k
    acorr_coef ac;
434
435
83.5k
    auto_correlation(sbr, &ac, Xlow, k, sbr->numTimeSlotsRate + 6);
436
437
83.5k
    if (ac.det == 0)
438
78.3k
    {
439
78.3k
        RE(alpha_1[k]) = 0;
440
78.3k
        IM(alpha_1[k]) = 0;
441
78.3k
    } else {
442
5.19k
#ifdef FIXED_POINT
443
5.19k
        tmp = (MUL_R(RE(ac.r01), RE(ac.r12)) - MUL_R(IM(ac.r01), IM(ac.r12)) - MUL_R(RE(ac.r02), RE(ac.r11)));
444
5.19k
        RE(alpha_1[k]) = DIV_R(tmp, ac.det);
445
5.19k
        tmp = (MUL_R(IM(ac.r01), RE(ac.r12)) + MUL_R(RE(ac.r01), IM(ac.r12)) - MUL_R(IM(ac.r02), RE(ac.r11)));
446
5.19k
        IM(alpha_1[k]) = DIV_R(tmp, ac.det);
447
#else
448
        tmp = REAL_CONST(1.0) / ac.det;
449
        RE(alpha_1[k]) = (MUL_R(RE(ac.r01), RE(ac.r12)) - MUL_R(IM(ac.r01), IM(ac.r12)) - MUL_R(RE(ac.r02), RE(ac.r11))) * tmp;
450
        IM(alpha_1[k]) = (MUL_R(IM(ac.r01), RE(ac.r12)) + MUL_R(RE(ac.r01), IM(ac.r12)) - MUL_R(IM(ac.r02), RE(ac.r11))) * tmp;
451
#endif
452
5.19k
    }
453
454
83.5k
    if (RE(ac.r11) == 0)
455
78.1k
    {
456
78.1k
        RE(alpha_0[k]) = 0;
457
78.1k
        IM(alpha_0[k]) = 0;
458
78.1k
    } else {
459
5.41k
#ifdef FIXED_POINT
460
5.41k
        tmp = -(RE(ac.r01) + MUL_R(RE(alpha_1[k]), RE(ac.r12)) + MUL_R(IM(alpha_1[k]), IM(ac.r12)));
461
5.41k
        RE(alpha_0[k]) = DIV_R(tmp, RE(ac.r11));
462
5.41k
        tmp = -(IM(ac.r01) + MUL_R(IM(alpha_1[k]), RE(ac.r12)) - MUL_R(RE(alpha_1[k]), IM(ac.r12)));
463
5.41k
        IM(alpha_0[k]) = DIV_R(tmp, RE(ac.r11));
464
#else
465
        tmp = 1.0f / RE(ac.r11);
466
        RE(alpha_0[k]) = -(RE(ac.r01) + MUL_R(RE(alpha_1[k]), RE(ac.r12)) + MUL_R(IM(alpha_1[k]), IM(ac.r12))) * tmp;
467
        IM(alpha_0[k]) = -(IM(ac.r01) + MUL_R(IM(alpha_1[k]), RE(ac.r12)) - MUL_R(RE(alpha_1[k]), IM(ac.r12))) * tmp;
468
#endif
469
5.41k
    }
470
471
    /* Sanity check; important: use "yes" check to filter-out NaN values. */
472
83.5k
    if ((MUL_R(RE(alpha_0[k]),RE(alpha_0[k])) + MUL_R(IM(alpha_0[k]),IM(alpha_0[k])) <= REAL_CONST(16)) &&
473
83.0k
        (MUL_R(RE(alpha_1[k]),RE(alpha_1[k])) + MUL_R(IM(alpha_1[k]),IM(alpha_1[k])) <= REAL_CONST(16)))
474
82.7k
        return;
475
    /* Fallback */
476
814
    RE(alpha_0[k]) = 0;
477
814
    IM(alpha_0[k]) = 0;
478
814
    RE(alpha_1[k]) = 0;
479
814
    IM(alpha_1[k]) = 0;
480
814
}
sbr_hfgen.c:calc_prediction_coef
Line
Count
Source
431
101k
{
432
101k
    real_t tmp;
433
101k
    acorr_coef ac;
434
435
101k
    auto_correlation(sbr, &ac, Xlow, k, sbr->numTimeSlotsRate + 6);
436
437
101k
    if (ac.det == 0)
438
96.8k
    {
439
96.8k
        RE(alpha_1[k]) = 0;
440
96.8k
        IM(alpha_1[k]) = 0;
441
96.8k
    } else {
442
#ifdef FIXED_POINT
443
        tmp = (MUL_R(RE(ac.r01), RE(ac.r12)) - MUL_R(IM(ac.r01), IM(ac.r12)) - MUL_R(RE(ac.r02), RE(ac.r11)));
444
        RE(alpha_1[k]) = DIV_R(tmp, ac.det);
445
        tmp = (MUL_R(IM(ac.r01), RE(ac.r12)) + MUL_R(RE(ac.r01), IM(ac.r12)) - MUL_R(IM(ac.r02), RE(ac.r11)));
446
        IM(alpha_1[k]) = DIV_R(tmp, ac.det);
447
#else
448
4.19k
        tmp = REAL_CONST(1.0) / ac.det;
449
4.19k
        RE(alpha_1[k]) = (MUL_R(RE(ac.r01), RE(ac.r12)) - MUL_R(IM(ac.r01), IM(ac.r12)) - MUL_R(RE(ac.r02), RE(ac.r11))) * tmp;
450
4.19k
        IM(alpha_1[k]) = (MUL_R(IM(ac.r01), RE(ac.r12)) + MUL_R(RE(ac.r01), IM(ac.r12)) - MUL_R(IM(ac.r02), RE(ac.r11))) * tmp;
451
4.19k
#endif
452
4.19k
    }
453
454
101k
    if (RE(ac.r11) == 0)
455
93.8k
    {
456
93.8k
        RE(alpha_0[k]) = 0;
457
93.8k
        IM(alpha_0[k]) = 0;
458
93.8k
    } else {
459
#ifdef FIXED_POINT
460
        tmp = -(RE(ac.r01) + MUL_R(RE(alpha_1[k]), RE(ac.r12)) + MUL_R(IM(alpha_1[k]), IM(ac.r12)));
461
        RE(alpha_0[k]) = DIV_R(tmp, RE(ac.r11));
462
        tmp = -(IM(ac.r01) + MUL_R(IM(alpha_1[k]), RE(ac.r12)) - MUL_R(RE(alpha_1[k]), IM(ac.r12)));
463
        IM(alpha_0[k]) = DIV_R(tmp, RE(ac.r11));
464
#else
465
7.21k
        tmp = 1.0f / RE(ac.r11);
466
7.21k
        RE(alpha_0[k]) = -(RE(ac.r01) + MUL_R(RE(alpha_1[k]), RE(ac.r12)) + MUL_R(IM(alpha_1[k]), IM(ac.r12))) * tmp;
467
7.21k
        IM(alpha_0[k]) = -(IM(ac.r01) + MUL_R(IM(alpha_1[k]), RE(ac.r12)) - MUL_R(RE(alpha_1[k]), IM(ac.r12))) * tmp;
468
7.21k
#endif
469
7.21k
    }
470
471
    /* Sanity check; important: use "yes" check to filter-out NaN values. */
472
101k
    if ((MUL_R(RE(alpha_0[k]),RE(alpha_0[k])) + MUL_R(IM(alpha_0[k]),IM(alpha_0[k])) <= REAL_CONST(16)) &&
473
99.1k
        (MUL_R(RE(alpha_1[k]),RE(alpha_1[k])) + MUL_R(IM(alpha_1[k]),IM(alpha_1[k])) <= REAL_CONST(16)))
474
98.9k
        return;
475
    /* Fallback */
476
2.08k
    RE(alpha_0[k]) = 0;
477
2.08k
    IM(alpha_0[k]) = 0;
478
2.08k
    RE(alpha_1[k]) = 0;
479
2.08k
    IM(alpha_1[k]) = 0;
480
2.08k
}
481
#else
482
static void calc_prediction_coef_lp(sbr_info *sbr, qmf_t Xlow[MAX_NTSRHFG][64],
483
                                    complex_t *alpha_0, complex_t *alpha_1, real_t *rxx)
484
{
485
    uint8_t k;
486
    real_t tmp;
487
    acorr_coef ac;
488
489
    for (k = 1; k < sbr->f_master[0]; k++)
490
    {
491
        auto_correlation(sbr, &ac, Xlow, k, sbr->numTimeSlotsRate + 6);
492
493
        if (ac.det == 0)
494
        {
495
            RE(alpha_0[k]) = 0;
496
            RE(alpha_1[k]) = 0;
497
        } else {
498
            tmp = MUL_R(RE(ac.r01), RE(ac.r22)) - MUL_R(RE(ac.r12), RE(ac.r02));
499
            RE(alpha_0[k]) = DIV_R(tmp, (-ac.det));
500
501
            tmp = MUL_R(RE(ac.r01), RE(ac.r12)) - MUL_R(RE(ac.r02), RE(ac.r11));
502
            RE(alpha_1[k]) = DIV_R(tmp, ac.det);
503
        }
504
505
        if ((RE(alpha_0[k]) >= REAL_CONST(4)) || (RE(alpha_1[k]) >= REAL_CONST(4)))
506
        {
507
            RE(alpha_0[k]) = REAL_CONST(0);
508
            RE(alpha_1[k]) = REAL_CONST(0);
509
        }
510
511
        /* reflection coefficient */
512
        if (RE(ac.r11) == 0)
513
        {
514
            rxx[k] = COEF_CONST(0.0);
515
        } else {
516
            rxx[k] = DIV_C(RE(ac.r01), RE(ac.r11));
517
            rxx[k] = -rxx[k];
518
            if (rxx[k] > COEF_CONST(1.0)) rxx[k] = COEF_CONST(1.0);
519
            if (rxx[k] < COEF_CONST(-1.0)) rxx[k] = COEF_CONST(-1.0);
520
        }
521
    }
522
}
523
524
static void calc_aliasing_degree(sbr_info *sbr, real_t *rxx, real_t *deg)
525
{
526
    uint8_t k;
527
528
    rxx[0] = COEF_CONST(0.0);
529
    deg[1] = COEF_CONST(0.0);
530
531
    for (k = 2; k < sbr->k0; k++)
532
    {
533
        deg[k] = 0.0;
534
535
        if ((k % 2 == 0) && (rxx[k] < COEF_CONST(0.0)))
536
        {
537
            if (rxx[k-1] < 0.0)
538
            {
539
                deg[k] = COEF_CONST(1.0);
540
541
                if (rxx[k-2] > COEF_CONST(0.0))
542
                {
543
                    deg[k-1] = COEF_CONST(1.0) - MUL_C(rxx[k-1], rxx[k-1]);
544
                }
545
            } else if (rxx[k-2] > COEF_CONST(0.0)) {
546
                deg[k] = COEF_CONST(1.0) - MUL_C(rxx[k-1], rxx[k-1]);
547
            }
548
        }
549
550
        if ((k % 2 == 1) && (rxx[k] > COEF_CONST(0.0)))
551
        {
552
            if (rxx[k-1] > COEF_CONST(0.0))
553
            {
554
                deg[k] = COEF_CONST(1.0);
555
556
                if (rxx[k-2] < COEF_CONST(0.0))
557
                {
558
                    deg[k-1] = COEF_CONST(1.0) - MUL_C(rxx[k-1], rxx[k-1]);
559
                }
560
            } else if (rxx[k-2] < COEF_CONST(0.0)) {
561
                deg[k] = COEF_CONST(1.0) - MUL_C(rxx[k-1], rxx[k-1]);
562
            }
563
        }
564
    }
565
}
566
#endif
567
568
/* FIXED POINT: bwArray = COEF */
569
static real_t mapNewBw(uint8_t invf_mode, uint8_t invf_mode_prev)
570
53.9k
{
571
53.9k
    switch (invf_mode)
572
53.9k
    {
573
8.68k
    case 1: /* LOW */
574
8.68k
        if (invf_mode_prev == 0) /* NONE */
575
7.33k
            return COEF_CONST(0.6);
576
1.35k
        else
577
1.35k
            return COEF_CONST(0.75);
578
579
7.75k
    case 2: /* MID */
580
7.75k
        return COEF_CONST(0.9);
581
582
12.2k
    case 3: /* HIGH */
583
12.2k
        return COEF_CONST(0.98);
584
585
25.3k
    default: /* NONE */
586
25.3k
        if (invf_mode_prev == 1) /* LOW */
587
402
            return COEF_CONST(0.6);
588
24.9k
        else
589
24.9k
            return COEF_CONST(0.0);
590
53.9k
    }
591
53.9k
}
sbr_hfgen.c:mapNewBw
Line
Count
Source
570
24.2k
{
571
24.2k
    switch (invf_mode)
572
24.2k
    {
573
4.16k
    case 1: /* LOW */
574
4.16k
        if (invf_mode_prev == 0) /* NONE */
575
3.65k
            return COEF_CONST(0.6);
576
509
        else
577
509
            return COEF_CONST(0.75);
578
579
2.89k
    case 2: /* MID */
580
2.89k
        return COEF_CONST(0.9);
581
582
5.81k
    case 3: /* HIGH */
583
5.81k
        return COEF_CONST(0.98);
584
585
11.3k
    default: /* NONE */
586
11.3k
        if (invf_mode_prev == 1) /* LOW */
587
142
            return COEF_CONST(0.6);
588
11.2k
        else
589
11.2k
            return COEF_CONST(0.0);
590
24.2k
    }
591
24.2k
}
sbr_hfgen.c:mapNewBw
Line
Count
Source
570
29.7k
{
571
29.7k
    switch (invf_mode)
572
29.7k
    {
573
4.51k
    case 1: /* LOW */
574
4.51k
        if (invf_mode_prev == 0) /* NONE */
575
3.67k
            return COEF_CONST(0.6);
576
841
        else
577
841
            return COEF_CONST(0.75);
578
579
4.86k
    case 2: /* MID */
580
4.86k
        return COEF_CONST(0.9);
581
582
6.41k
    case 3: /* HIGH */
583
6.41k
        return COEF_CONST(0.98);
584
585
13.9k
    default: /* NONE */
586
13.9k
        if (invf_mode_prev == 1) /* LOW */
587
260
            return COEF_CONST(0.6);
588
13.6k
        else
589
13.6k
            return COEF_CONST(0.0);
590
29.7k
    }
591
29.7k
}
592
593
/* FIXED POINT: bwArray = COEF */
594
static void calc_chirp_factors(sbr_info *sbr, uint8_t ch)
595
27.5k
{
596
27.5k
    uint8_t i;
597
598
81.5k
    for (i = 0; i < sbr->N_Q; i++)
599
53.9k
    {
600
53.9k
        sbr->bwArray[ch][i] = mapNewBw(sbr->bs_invf_mode[ch][i], sbr->bs_invf_mode_prev[ch][i]);
601
602
53.9k
        if (sbr->bwArray[ch][i] < sbr->bwArray_prev[ch][i])
603
779
            sbr->bwArray[ch][i] = MUL_F(sbr->bwArray[ch][i], FRAC_CONST(0.75)) + MUL_F(sbr->bwArray_prev[ch][i], FRAC_CONST(0.25));
604
53.2k
        else
605
53.2k
            sbr->bwArray[ch][i] = MUL_F(sbr->bwArray[ch][i], FRAC_CONST(0.90625)) + MUL_F(sbr->bwArray_prev[ch][i], FRAC_CONST(0.09375));
606
607
53.9k
        if (sbr->bwArray[ch][i] < COEF_CONST(0.015625))
608
24.3k
            sbr->bwArray[ch][i] = COEF_CONST(0.0);
609
610
53.9k
        if (sbr->bwArray[ch][i] >= COEF_CONST(0.99609375))
611
0
            sbr->bwArray[ch][i] = COEF_CONST(0.99609375);
612
613
53.9k
        sbr->bwArray_prev[ch][i] = sbr->bwArray[ch][i];
614
53.9k
        sbr->bs_invf_mode_prev[ch][i] = sbr->bs_invf_mode[ch][i];
615
53.9k
    }
616
27.5k
}
sbr_hfgen.c:calc_chirp_factors
Line
Count
Source
595
11.8k
{
596
11.8k
    uint8_t i;
597
598
36.0k
    for (i = 0; i < sbr->N_Q; i++)
599
24.2k
    {
600
24.2k
        sbr->bwArray[ch][i] = mapNewBw(sbr->bs_invf_mode[ch][i], sbr->bs_invf_mode_prev[ch][i]);
601
602
24.2k
        if (sbr->bwArray[ch][i] < sbr->bwArray_prev[ch][i])
603
289
            sbr->bwArray[ch][i] = MUL_F(sbr->bwArray[ch][i], FRAC_CONST(0.75)) + MUL_F(sbr->bwArray_prev[ch][i], FRAC_CONST(0.25));
604
23.9k
        else
605
23.9k
            sbr->bwArray[ch][i] = MUL_F(sbr->bwArray[ch][i], FRAC_CONST(0.90625)) + MUL_F(sbr->bwArray_prev[ch][i], FRAC_CONST(0.09375));
606
607
24.2k
        if (sbr->bwArray[ch][i] < COEF_CONST(0.015625))
608
11.0k
            sbr->bwArray[ch][i] = COEF_CONST(0.0);
609
610
24.2k
        if (sbr->bwArray[ch][i] >= COEF_CONST(0.99609375))
611
0
            sbr->bwArray[ch][i] = COEF_CONST(0.99609375);
612
613
24.2k
        sbr->bwArray_prev[ch][i] = sbr->bwArray[ch][i];
614
24.2k
        sbr->bs_invf_mode_prev[ch][i] = sbr->bs_invf_mode[ch][i];
615
24.2k
    }
616
11.8k
}
sbr_hfgen.c:calc_chirp_factors
Line
Count
Source
595
15.7k
{
596
15.7k
    uint8_t i;
597
598
45.4k
    for (i = 0; i < sbr->N_Q; i++)
599
29.7k
    {
600
29.7k
        sbr->bwArray[ch][i] = mapNewBw(sbr->bs_invf_mode[ch][i], sbr->bs_invf_mode_prev[ch][i]);
601
602
29.7k
        if (sbr->bwArray[ch][i] < sbr->bwArray_prev[ch][i])
603
490
            sbr->bwArray[ch][i] = MUL_F(sbr->bwArray[ch][i], FRAC_CONST(0.75)) + MUL_F(sbr->bwArray_prev[ch][i], FRAC_CONST(0.25));
604
29.2k
        else
605
29.2k
            sbr->bwArray[ch][i] = MUL_F(sbr->bwArray[ch][i], FRAC_CONST(0.90625)) + MUL_F(sbr->bwArray_prev[ch][i], FRAC_CONST(0.09375));
606
607
29.7k
        if (sbr->bwArray[ch][i] < COEF_CONST(0.015625))
608
13.3k
            sbr->bwArray[ch][i] = COEF_CONST(0.0);
609
610
29.7k
        if (sbr->bwArray[ch][i] >= COEF_CONST(0.99609375))
611
0
            sbr->bwArray[ch][i] = COEF_CONST(0.99609375);
612
613
29.7k
        sbr->bwArray_prev[ch][i] = sbr->bwArray[ch][i];
614
29.7k
        sbr->bs_invf_mode_prev[ch][i] = sbr->bs_invf_mode[ch][i];
615
29.7k
    }
616
15.7k
}
617
618
static void patch_construction(sbr_info *sbr)
619
21.3k
{
620
21.3k
    uint8_t i, k;
621
21.3k
    uint8_t odd, sb;
622
21.3k
    uint8_t msb = sbr->k0;
623
21.3k
    uint8_t usb = sbr->kx;
624
21.3k
    uint8_t goalSbTab[] = { 21, 23, 32, 43, 46, 64, 85, 93, 128, 0, 0, 0 };
625
    /* (uint8_t)(2.048e6/sbr->sample_rate + 0.5); */
626
21.3k
    uint8_t goalSb = goalSbTab[get_sr_index(sbr->sample_rate)];
627
628
21.3k
    sbr->noPatches = 0;
629
630
21.3k
    if (goalSb < (sbr->kx + sbr->M))
631
8.84k
    {
632
83.7k
        for (i = 0, k = 0; sbr->f_master[i] < goalSb; i++)
633
74.9k
            k = i+1;
634
12.5k
    } else {
635
12.5k
        k = sbr->N_master;
636
12.5k
    }
637
638
21.3k
    if (sbr->N_master == 0)
639
0
    {
640
0
        sbr->noPatches = 0;
641
0
        sbr->patchNoSubbands[0] = 0;
642
0
        sbr->patchStartSubband[0] = 0;
643
644
0
        return;
645
0
    }
646
647
21.3k
    do
648
51.5k
    {
649
51.5k
        uint8_t j = k + 1;
650
651
51.5k
        do
652
148k
        {
653
148k
            j--;
654
655
148k
            sb = sbr->f_master[j];
656
148k
            odd = (sb - 2 + sbr->k0) % 2;
657
148k
        } while (sb > (sbr->k0 - 1 + msb - odd));
658
659
51.5k
        sbr->patchNoSubbands[sbr->noPatches] = max(sb - usb, 0);
660
51.5k
        sbr->patchStartSubband[sbr->noPatches] = sbr->k0 - odd -
661
51.5k
            sbr->patchNoSubbands[sbr->noPatches];
662
663
51.5k
        if (sbr->patchNoSubbands[sbr->noPatches] > 0)
664
47.0k
        {
665
47.0k
            usb = sb;
666
47.0k
            msb = sb;
667
47.0k
            sbr->noPatches++;
668
47.0k
        } else {
669
4.52k
            msb = sbr->kx;
670
4.52k
        }
671
672
51.5k
        if (sbr->f_master[k] - sb < 3)
673
32.7k
            k = sbr->N_master;
674
51.5k
    } while (sb != (sbr->kx + sbr->M));
675
676
21.3k
    if ((sbr->patchNoSubbands[sbr->noPatches-1] < 3) && (sbr->noPatches > 1))
677
3.01k
    {
678
3.01k
        sbr->noPatches--;
679
3.01k
    }
680
681
21.3k
    sbr->noPatches = min(sbr->noPatches, 5);
682
21.3k
}
683
684
#endif