Coverage Report

Created: 2025-07-23 06:30

/proc/self/cwd/libfaad/sbr_hfgen.c
Line
Count
Source (jump to first uncovered line)
1
/*
2
** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding
3
** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com
4
**
5
** This program is free software; you can redistribute it and/or modify
6
** it under the terms of the GNU General Public License as published by
7
** the Free Software Foundation; either version 2 of the License, or
8
** (at your option) any later version.
9
**
10
** This program is distributed in the hope that it will be useful,
11
** but WITHOUT ANY WARRANTY; without even the implied warranty of
12
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13
** GNU General Public License for more details.
14
**
15
** You should have received a copy of the GNU General Public License
16
** along with this program; if not, write to the Free Software
17
** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
18
**
19
** Any non-GPL usage of this software or parts of this software is strictly
20
** forbidden.
21
**
22
** The "appropriate copyright message" mentioned in section 2c of the GPLv2
23
** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com"
24
**
25
** Commercial non-GPL licensing of this software is possible.
26
** For more info contact Nero AG through Mpeg4AAClicense@nero.com.
27
**
28
** $Id: 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.7k
{
62
55.7k
    uint8_t l, i, x;
63
55.7k
    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.7k
    uint8_t offset = sbr->tHFAdj;
69
55.7k
    uint8_t first = sbr->t_E[ch][0];
70
55.7k
    uint8_t last = sbr->t_E[ch][sbr->L_E[ch]];
71
72
55.7k
    calc_chirp_factors(sbr, ch);
73
74
#ifdef SBR_LOW_POWER
75
    memset(deg, 0, 64*sizeof(real_t));
76
#endif
77
78
55.7k
    if ((ch == 0) && (sbr->Reset))
79
43.8k
        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
173k
    for (i = 0; i < sbr->noPatches; i++)
89
118k
    {
90
825k
        for (x = 0; x < sbr->patchNoSubbands[i]; x++)
91
707k
        {
92
707k
            real_t a0_r, a0_i, a1_r, a1_i;
93
707k
            real_t bw, bw2;
94
707k
            uint8_t q, p, k, g;
95
96
            /* find the low and high band for patching */
97
707k
            k = sbr->kx + x;
98
1.36M
            for (q = 0; q < i; q++)
99
652k
            {
100
652k
                k += sbr->patchNoSubbands[q];
101
652k
            }
102
707k
            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
707k
            g = sbr->table_map_k_to_g[k];
112
113
707k
            bw = sbr->bwArray[ch][g];
114
707k
            bw2 = MUL_C(bw, bw);
115
116
            /* do the patching */
117
            /* with or without filtering */
118
707k
            if (bw2 > 0)
119
355k
            {
120
355k
                real_t temp1_r, temp2_r, temp3_r;
121
355k
#ifndef SBR_LOW_POWER
122
355k
                real_t temp1_i, temp2_i, temp3_i;
123
355k
                calc_prediction_coef(sbr, Xlow, alpha_0, alpha_1, p);
124
355k
#endif
125
126
355k
                a0_r = MUL_C(RE(alpha_0[p]), bw);
127
355k
                a1_r = MUL_C(RE(alpha_1[p]), bw2);
128
355k
#ifndef SBR_LOW_POWER
129
355k
                a0_i = MUL_C(IM(alpha_0[p]), bw);
130
355k
                a1_i = MUL_C(IM(alpha_1[p]), bw2);
131
355k
#endif
132
133
355k
              temp2_r = QMF_RE(Xlow[first - 2 + offset][p]);
134
355k
              temp3_r = QMF_RE(Xlow[first - 1 + offset][p]);
135
355k
#ifndef SBR_LOW_POWER
136
355k
              temp2_i = QMF_IM(Xlow[first - 2 + offset][p]);
137
355k
              temp3_i = QMF_IM(Xlow[first - 1 + offset][p]);
138
355k
#endif
139
11.6M
        for (l = first; l < last; l++)
140
11.3M
                {
141
11.3M
                  temp1_r = temp2_r;
142
11.3M
                  temp2_r = temp3_r;
143
11.3M
                  temp3_r = QMF_RE(Xlow[l + offset][p]);
144
11.3M
#ifndef SBR_LOW_POWER
145
11.3M
                  temp1_i = temp2_i;
146
11.3M
                  temp2_i = temp3_i;
147
11.3M
                    temp3_i = QMF_IM(Xlow[l + offset][p]);
148
11.3M
#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.3M
                    QMF_RE(Xhigh[l + offset][k]) =
157
11.3M
                        temp3_r
158
11.3M
                      +(MUL_R(a0_r, temp2_r) -
159
11.3M
                        MUL_R(a0_i, temp2_i) +
160
11.3M
                        MUL_R(a1_r, temp1_r) -
161
11.3M
                        MUL_R(a1_i, temp1_i));
162
11.3M
                    QMF_IM(Xhigh[l + offset][k]) =
163
11.3M
                        temp3_i
164
11.3M
                      +(MUL_R(a0_i, temp2_r) +
165
11.3M
                        MUL_R(a0_r, temp2_i) +
166
11.3M
                        MUL_R(a1_i, temp1_r) +
167
11.3M
                        MUL_R(a1_r, temp1_i));
168
11.3M
#endif
169
11.3M
                }
170
355k
            } else {
171
11.4M
                for (l = first; l < last; l++)
172
11.1M
                {
173
11.1M
                    QMF_RE(Xhigh[l + offset][k]) = QMF_RE(Xlow[l + offset][p]);
174
11.1M
#ifndef SBR_LOW_POWER
175
11.1M
                    QMF_IM(Xhigh[l + offset][k]) = QMF_IM(Xlow[l + offset][p]);
176
11.1M
#endif
177
11.1M
                }
178
352k
            }
179
707k
        }
180
118k
    }
181
182
55.7k
    if (sbr->Reset)
183
54.1k
    {
184
54.1k
        limiter_frequency_table(sbr);
185
54.1k
    }
186
55.7k
}
hf_generation
Line
Count
Source
61
27.8k
{
62
27.8k
    uint8_t l, i, x;
63
27.8k
    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.8k
    uint8_t offset = sbr->tHFAdj;
69
27.8k
    uint8_t first = sbr->t_E[ch][0];
70
27.8k
    uint8_t last = sbr->t_E[ch][sbr->L_E[ch]];
71
72
27.8k
    calc_chirp_factors(sbr, ch);
73
74
#ifdef SBR_LOW_POWER
75
    memset(deg, 0, 64*sizeof(real_t));
76
#endif
77
78
27.8k
    if ((ch == 0) && (sbr->Reset))
79
21.9k
        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
86.9k
    for (i = 0; i < sbr->noPatches; i++)
89
59.0k
    {
90
412k
        for (x = 0; x < sbr->patchNoSubbands[i]; x++)
91
353k
        {
92
353k
            real_t a0_r, a0_i, a1_r, a1_i;
93
353k
            real_t bw, bw2;
94
353k
            uint8_t q, p, k, g;
95
96
            /* find the low and high band for patching */
97
353k
            k = sbr->kx + x;
98
680k
            for (q = 0; q < i; q++)
99
326k
            {
100
326k
                k += sbr->patchNoSubbands[q];
101
326k
            }
102
353k
            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
353k
            g = sbr->table_map_k_to_g[k];
112
113
353k
            bw = sbr->bwArray[ch][g];
114
353k
            bw2 = MUL_C(bw, bw);
115
116
            /* do the patching */
117
            /* with or without filtering */
118
353k
            if (bw2 > 0)
119
177k
            {
120
177k
                real_t temp1_r, temp2_r, temp3_r;
121
177k
#ifndef SBR_LOW_POWER
122
177k
                real_t temp1_i, temp2_i, temp3_i;
123
177k
                calc_prediction_coef(sbr, Xlow, alpha_0, alpha_1, p);
124
177k
#endif
125
126
177k
                a0_r = MUL_C(RE(alpha_0[p]), bw);
127
177k
                a1_r = MUL_C(RE(alpha_1[p]), bw2);
128
177k
#ifndef SBR_LOW_POWER
129
177k
                a0_i = MUL_C(IM(alpha_0[p]), bw);
130
177k
                a1_i = MUL_C(IM(alpha_1[p]), bw2);
131
177k
#endif
132
133
177k
              temp2_r = QMF_RE(Xlow[first - 2 + offset][p]);
134
177k
              temp3_r = QMF_RE(Xlow[first - 1 + offset][p]);
135
177k
#ifndef SBR_LOW_POWER
136
177k
              temp2_i = QMF_IM(Xlow[first - 2 + offset][p]);
137
177k
              temp3_i = QMF_IM(Xlow[first - 1 + offset][p]);
138
177k
#endif
139
5.84M
        for (l = first; l < last; l++)
140
5.66M
                {
141
5.66M
                  temp1_r = temp2_r;
142
5.66M
                  temp2_r = temp3_r;
143
5.66M
                  temp3_r = QMF_RE(Xlow[l + offset][p]);
144
5.66M
#ifndef SBR_LOW_POWER
145
5.66M
                  temp1_i = temp2_i;
146
5.66M
                  temp2_i = temp3_i;
147
5.66M
                    temp3_i = QMF_IM(Xlow[l + offset][p]);
148
5.66M
#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.66M
                    QMF_RE(Xhigh[l + offset][k]) =
157
5.66M
                        temp3_r
158
5.66M
                      +(MUL_R(a0_r, temp2_r) -
159
5.66M
                        MUL_R(a0_i, temp2_i) +
160
5.66M
                        MUL_R(a1_r, temp1_r) -
161
5.66M
                        MUL_R(a1_i, temp1_i));
162
5.66M
                    QMF_IM(Xhigh[l + offset][k]) =
163
5.66M
                        temp3_i
164
5.66M
                      +(MUL_R(a0_i, temp2_r) +
165
5.66M
                        MUL_R(a0_r, temp2_i) +
166
5.66M
                        MUL_R(a1_i, temp1_r) +
167
5.66M
                        MUL_R(a1_r, temp1_i));
168
5.66M
#endif
169
5.66M
                }
170
177k
            } else {
171
5.74M
                for (l = first; l < last; l++)
172
5.56M
                {
173
5.56M
                    QMF_RE(Xhigh[l + offset][k]) = QMF_RE(Xlow[l + offset][p]);
174
5.56M
#ifndef SBR_LOW_POWER
175
5.56M
                    QMF_IM(Xhigh[l + offset][k]) = QMF_IM(Xlow[l + offset][p]);
176
5.56M
#endif
177
5.56M
                }
178
176k
            }
179
353k
        }
180
59.0k
    }
181
182
27.8k
    if (sbr->Reset)
183
27.0k
    {
184
27.0k
        limiter_frequency_table(sbr);
185
27.0k
    }
186
27.8k
}
hf_generation
Line
Count
Source
61
27.8k
{
62
27.8k
    uint8_t l, i, x;
63
27.8k
    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.8k
    uint8_t offset = sbr->tHFAdj;
69
27.8k
    uint8_t first = sbr->t_E[ch][0];
70
27.8k
    uint8_t last = sbr->t_E[ch][sbr->L_E[ch]];
71
72
27.8k
    calc_chirp_factors(sbr, ch);
73
74
#ifdef SBR_LOW_POWER
75
    memset(deg, 0, 64*sizeof(real_t));
76
#endif
77
78
27.8k
    if ((ch == 0) && (sbr->Reset))
79
21.9k
        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
86.9k
    for (i = 0; i < sbr->noPatches; i++)
89
59.0k
    {
90
412k
        for (x = 0; x < sbr->patchNoSubbands[i]; x++)
91
353k
        {
92
353k
            real_t a0_r, a0_i, a1_r, a1_i;
93
353k
            real_t bw, bw2;
94
353k
            uint8_t q, p, k, g;
95
96
            /* find the low and high band for patching */
97
353k
            k = sbr->kx + x;
98
680k
            for (q = 0; q < i; q++)
99
326k
            {
100
326k
                k += sbr->patchNoSubbands[q];
101
326k
            }
102
353k
            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
353k
            g = sbr->table_map_k_to_g[k];
112
113
353k
            bw = sbr->bwArray[ch][g];
114
353k
            bw2 = MUL_C(bw, bw);
115
116
            /* do the patching */
117
            /* with or without filtering */
118
353k
            if (bw2 > 0)
119
177k
            {
120
177k
                real_t temp1_r, temp2_r, temp3_r;
121
177k
#ifndef SBR_LOW_POWER
122
177k
                real_t temp1_i, temp2_i, temp3_i;
123
177k
                calc_prediction_coef(sbr, Xlow, alpha_0, alpha_1, p);
124
177k
#endif
125
126
177k
                a0_r = MUL_C(RE(alpha_0[p]), bw);
127
177k
                a1_r = MUL_C(RE(alpha_1[p]), bw2);
128
177k
#ifndef SBR_LOW_POWER
129
177k
                a0_i = MUL_C(IM(alpha_0[p]), bw);
130
177k
                a1_i = MUL_C(IM(alpha_1[p]), bw2);
131
177k
#endif
132
133
177k
              temp2_r = QMF_RE(Xlow[first - 2 + offset][p]);
134
177k
              temp3_r = QMF_RE(Xlow[first - 1 + offset][p]);
135
177k
#ifndef SBR_LOW_POWER
136
177k
              temp2_i = QMF_IM(Xlow[first - 2 + offset][p]);
137
177k
              temp3_i = QMF_IM(Xlow[first - 1 + offset][p]);
138
177k
#endif
139
5.84M
        for (l = first; l < last; l++)
140
5.66M
                {
141
5.66M
                  temp1_r = temp2_r;
142
5.66M
                  temp2_r = temp3_r;
143
5.66M
                  temp3_r = QMF_RE(Xlow[l + offset][p]);
144
5.66M
#ifndef SBR_LOW_POWER
145
5.66M
                  temp1_i = temp2_i;
146
5.66M
                  temp2_i = temp3_i;
147
5.66M
                    temp3_i = QMF_IM(Xlow[l + offset][p]);
148
5.66M
#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.66M
                    QMF_RE(Xhigh[l + offset][k]) =
157
5.66M
                        temp3_r
158
5.66M
                      +(MUL_R(a0_r, temp2_r) -
159
5.66M
                        MUL_R(a0_i, temp2_i) +
160
5.66M
                        MUL_R(a1_r, temp1_r) -
161
5.66M
                        MUL_R(a1_i, temp1_i));
162
5.66M
                    QMF_IM(Xhigh[l + offset][k]) =
163
5.66M
                        temp3_i
164
5.66M
                      +(MUL_R(a0_i, temp2_r) +
165
5.66M
                        MUL_R(a0_r, temp2_i) +
166
5.66M
                        MUL_R(a1_i, temp1_r) +
167
5.66M
                        MUL_R(a1_r, temp1_i));
168
5.66M
#endif
169
5.66M
                }
170
177k
            } else {
171
5.74M
                for (l = first; l < last; l++)
172
5.56M
                {
173
5.56M
                    QMF_RE(Xhigh[l + offset][k]) = QMF_RE(Xlow[l + offset][p]);
174
5.56M
#ifndef SBR_LOW_POWER
175
5.56M
                    QMF_IM(Xhigh[l + offset][k]) = QMF_IM(Xlow[l + offset][p]);
176
5.56M
#endif
177
5.56M
                }
178
176k
            }
179
353k
        }
180
59.0k
    }
181
182
27.8k
    if (sbr->Reset)
183
27.0k
    {
184
27.0k
        limiter_frequency_table(sbr);
185
27.0k
    }
186
27.8k
}
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
177k
{
272
177k
    real_t r01r = 0, r01i = 0, r02r = 0, r02i = 0, r11r = 0;
273
177k
    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
95.2k
    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
177k
    int8_t j;
282
177k
    uint8_t offset = sbr->tHFAdj;
283
284
#ifdef FIXED_POINT
285
    mask = 0;
286
287
3.87M
    for (j = (offset-2); j < (len + offset); j++)
288
3.78M
    {
289
3.78M
        real_t x;
290
3.78M
        x = QMF_RE(buffer[j][bd])>>REAL_BITS;
291
3.78M
        mask |= x ^ (x >> 31);
292
3.78M
        x = QMF_IM(buffer[j][bd])>>REAL_BITS;
293
3.78M
        mask |= x ^ (x >> 31);
294
3.78M
    }
295
296
    exp = wl_min_lzc(mask);
297
298
    /* All-zero input. */
299
95.2k
    if (exp == 0) {
300
90.3k
        RE(ac->r01) = 0;
301
90.3k
        IM(ac->r01) = 0;
302
90.3k
        RE(ac->r02) = 0;
303
90.3k
        IM(ac->r02) = 0;
304
90.3k
        RE(ac->r11) = 0;
305
        // IM(ac->r11) = 0; // unused
306
90.3k
        RE(ac->r12) = 0;
307
90.3k
        IM(ac->r12) = 0;
308
90.3k
        RE(ac->r22) = 0;
309
        // IM(ac->r22) = 0; // unused
310
90.3k
        ac->det = 0;
311
90.3k
        return;
312
90.3k
    }
313
    /* Otherwise exp > 0. */
314
    /* improves accuracy */
315
4.92k
    exp -= 1;
316
    /* Now exp is 0..31 */
317
4.92k
    half = (1 << exp) >> 1;
318
319
4.92k
    temp2_r = (QMF_RE(buffer[offset-2][bd]) + half) >> exp;
320
4.92k
    temp2_i = (QMF_IM(buffer[offset-2][bd]) + half) >> exp;
321
4.92k
    temp3_r = (QMF_RE(buffer[offset-1][bd]) + half) >> exp;
322
4.92k
    temp3_i = (QMF_IM(buffer[offset-1][bd]) + half) >> exp;
323
    // Save these because they are needed after loop
324
4.92k
    temp4_r = temp2_r;
325
4.92k
    temp4_i = temp2_i;
326
4.92k
    temp5_r = temp3_r;
327
4.92k
    temp5_i = temp3_i;
328
329
188k
    for (j = offset; j < len + offset; j++)
330
183k
    {
331
183k
        temp1_r = temp2_r; // temp1_r = (QMF_RE(buffer[offset-2][bd] + (1<<(exp-1))) >> exp;
332
183k
        temp1_i = temp2_i; // temp1_i = (QMF_IM(buffer[offset-2][bd] + (1<<(exp-1))) >> exp;
333
183k
        temp2_r = temp3_r; // temp2_r = (QMF_RE(buffer[offset-1][bd] + (1<<(exp-1))) >> exp;
334
183k
        temp2_i = temp3_i; // temp2_i = (QMF_IM(buffer[offset-1][bd] + (1<<(exp-1))) >> exp;
335
183k
        temp3_r = (QMF_RE(buffer[j][bd]) + half) >> exp;
336
183k
        temp3_i = (QMF_IM(buffer[j][bd]) + half) >> exp;
337
183k
        r01r += MUL_R(temp3_r, temp2_r) + MUL_R(temp3_i, temp2_i);
338
183k
        r01i += MUL_R(temp3_i, temp2_r) - MUL_R(temp3_r, temp2_i);
339
183k
        r02r += MUL_R(temp3_r, temp1_r) + MUL_R(temp3_i, temp1_i);
340
183k
        r02i += MUL_R(temp3_i, temp1_r) - MUL_R(temp3_r, temp1_i);
341
183k
        r11r += MUL_R(temp2_r, temp2_r) + MUL_R(temp2_i, temp2_i);
342
183k
    }
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
4.92k
    RE(ac->r12) = r01r -
357
4.92k
        (MUL_R(temp3_r, temp2_r) + MUL_R(temp3_i, temp2_i)) +
358
4.92k
        (MUL_R(temp5_r, temp4_r) + MUL_R(temp5_i, temp4_i));
359
4.92k
    IM(ac->r12) = r01i -
360
4.92k
        (MUL_R(temp3_i, temp2_r) - MUL_R(temp3_r, temp2_i)) +
361
4.92k
        (MUL_R(temp5_i, temp4_r) - MUL_R(temp5_r, temp4_i));
362
4.92k
    RE(ac->r22) = r11r -
363
4.92k
        (MUL_R(temp2_r, temp2_r) + MUL_R(temp2_i, temp2_i)) +
364
4.92k
        (MUL_R(temp4_r, temp4_r) + MUL_R(temp4_i, temp4_i));
365
366
#else
367
368
82.5k
    temp2_r = QMF_RE(buffer[offset-2][bd]);
369
82.5k
    temp2_i = QMF_IM(buffer[offset-2][bd]);
370
82.5k
    temp3_r = QMF_RE(buffer[offset-1][bd]);
371
82.5k
    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.18M
    for (j = offset; j < len + offset; j++)
379
3.10M
    {
380
3.10M
      temp1_r = temp2_r; // temp1_r = QMF_RE(buffer[j-2][bd];
381
3.10M
      temp1_i = temp2_i; // temp1_i = QMF_IM(buffer[j-2][bd];
382
3.10M
      temp2_r = temp3_r; // temp2_r = QMF_RE(buffer[j-1][bd];
383
3.10M
      temp2_i = temp3_i; // temp2_i = QMF_IM(buffer[j-1][bd];
384
3.10M
        temp3_r = QMF_RE(buffer[j][bd]);
385
3.10M
        temp3_i = QMF_IM(buffer[j][bd]);
386
3.10M
        r01r += temp3_r * temp2_r + temp3_i * temp2_i;
387
3.10M
        r01i += temp3_i * temp2_r - temp3_r * temp2_i;
388
3.10M
        r02r += temp3_r * temp1_r + temp3_i * temp1_i;
389
3.10M
        r02i += temp3_i * temp1_r - temp3_r * temp1_i;
390
3.10M
        r11r += temp2_r * temp2_r + temp2_i * temp2_i;
391
3.10M
    }
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
82.5k
    RE(ac->r12) = r01r -
406
        (temp3_r * temp2_r + temp3_i * temp2_i) +
407
        (temp5_r * temp4_r + temp5_i * temp4_i);
408
82.5k
    IM(ac->r12) = r01i -
409
        (temp3_i * temp2_r - temp3_r * temp2_i) +
410
        (temp5_i * temp4_r - temp5_r * temp4_i);
411
82.5k
    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
87.5k
    RE(ac->r01) = r01r;
418
87.5k
    IM(ac->r01) = r01i;
419
87.5k
    RE(ac->r02) = r02r;
420
87.5k
    IM(ac->r02) = r02i;
421
87.5k
    RE(ac->r11) = r11r;
422
423
87.5k
    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
4.92k
}
sbr_hfgen.c:auto_correlation
Line
Count
Source
271
95.2k
{
272
95.2k
    real_t r01r = 0, r01i = 0, r02r = 0, r02i = 0, r11r = 0;
273
95.2k
    real_t temp1_r, temp1_i, temp2_r, temp2_i, temp3_r, temp3_i, temp4_r, temp4_i, temp5_r, temp5_i;
274
95.2k
#ifdef FIXED_POINT
275
95.2k
    const real_t rel = FRAC_CONST(0.999999); // 1 / (1 + 1e-6f);
276
95.2k
    uint32_t mask, exp;
277
95.2k
    real_t half;
278
#else
279
    const real_t rel = 1 / (1 + 1e-6f);
280
#endif
281
95.2k
    int8_t j;
282
95.2k
    uint8_t offset = sbr->tHFAdj;
283
284
95.2k
#ifdef FIXED_POINT
285
95.2k
    mask = 0;
286
287
3.87M
    for (j = (offset-2); j < (len + offset); j++)
288
3.78M
    {
289
3.78M
        real_t x;
290
3.78M
        x = QMF_RE(buffer[j][bd])>>REAL_BITS;
291
3.78M
        mask |= x ^ (x >> 31);
292
3.78M
        x = QMF_IM(buffer[j][bd])>>REAL_BITS;
293
3.78M
        mask |= x ^ (x >> 31);
294
3.78M
    }
295
296
95.2k
    exp = wl_min_lzc(mask);
297
298
    /* All-zero input. */
299
95.2k
    if (exp == 0) {
300
90.3k
        RE(ac->r01) = 0;
301
90.3k
        IM(ac->r01) = 0;
302
90.3k
        RE(ac->r02) = 0;
303
90.3k
        IM(ac->r02) = 0;
304
90.3k
        RE(ac->r11) = 0;
305
        // IM(ac->r11) = 0; // unused
306
90.3k
        RE(ac->r12) = 0;
307
90.3k
        IM(ac->r12) = 0;
308
90.3k
        RE(ac->r22) = 0;
309
        // IM(ac->r22) = 0; // unused
310
90.3k
        ac->det = 0;
311
90.3k
        return;
312
90.3k
    }
313
    /* Otherwise exp > 0. */
314
    /* improves accuracy */
315
4.92k
    exp -= 1;
316
    /* Now exp is 0..31 */
317
4.92k
    half = (1 << exp) >> 1;
318
319
4.92k
    temp2_r = (QMF_RE(buffer[offset-2][bd]) + half) >> exp;
320
4.92k
    temp2_i = (QMF_IM(buffer[offset-2][bd]) + half) >> exp;
321
4.92k
    temp3_r = (QMF_RE(buffer[offset-1][bd]) + half) >> exp;
322
4.92k
    temp3_i = (QMF_IM(buffer[offset-1][bd]) + half) >> exp;
323
    // Save these because they are needed after loop
324
4.92k
    temp4_r = temp2_r;
325
4.92k
    temp4_i = temp2_i;
326
4.92k
    temp5_r = temp3_r;
327
4.92k
    temp5_i = temp3_i;
328
329
188k
    for (j = offset; j < len + offset; j++)
330
183k
    {
331
183k
        temp1_r = temp2_r; // temp1_r = (QMF_RE(buffer[offset-2][bd] + (1<<(exp-1))) >> exp;
332
183k
        temp1_i = temp2_i; // temp1_i = (QMF_IM(buffer[offset-2][bd] + (1<<(exp-1))) >> exp;
333
183k
        temp2_r = temp3_r; // temp2_r = (QMF_RE(buffer[offset-1][bd] + (1<<(exp-1))) >> exp;
334
183k
        temp2_i = temp3_i; // temp2_i = (QMF_IM(buffer[offset-1][bd] + (1<<(exp-1))) >> exp;
335
183k
        temp3_r = (QMF_RE(buffer[j][bd]) + half) >> exp;
336
183k
        temp3_i = (QMF_IM(buffer[j][bd]) + half) >> exp;
337
183k
        r01r += MUL_R(temp3_r, temp2_r) + MUL_R(temp3_i, temp2_i);
338
183k
        r01i += MUL_R(temp3_i, temp2_r) - MUL_R(temp3_r, temp2_i);
339
183k
        r02r += MUL_R(temp3_r, temp1_r) + MUL_R(temp3_i, temp1_i);
340
183k
        r02i += MUL_R(temp3_i, temp1_r) - MUL_R(temp3_r, temp1_i);
341
183k
        r11r += MUL_R(temp2_r, temp2_r) + MUL_R(temp2_i, temp2_i);
342
183k
    }
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
4.92k
    RE(ac->r12) = r01r -
357
4.92k
        (MUL_R(temp3_r, temp2_r) + MUL_R(temp3_i, temp2_i)) +
358
4.92k
        (MUL_R(temp5_r, temp4_r) + MUL_R(temp5_i, temp4_i));
359
4.92k
    IM(ac->r12) = r01i -
360
4.92k
        (MUL_R(temp3_i, temp2_r) - MUL_R(temp3_r, temp2_i)) +
361
4.92k
        (MUL_R(temp5_i, temp4_r) - MUL_R(temp5_r, temp4_i));
362
4.92k
    RE(ac->r22) = r11r -
363
4.92k
        (MUL_R(temp2_r, temp2_r) + MUL_R(temp2_i, temp2_i)) +
364
4.92k
        (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
4.92k
    RE(ac->r01) = r01r;
418
4.92k
    IM(ac->r01) = r01i;
419
4.92k
    RE(ac->r02) = r02r;
420
4.92k
    IM(ac->r02) = r02i;
421
4.92k
    RE(ac->r11) = r11r;
422
423
4.92k
    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
4.92k
}
sbr_hfgen.c:auto_correlation
Line
Count
Source
271
82.5k
{
272
82.5k
    real_t r01r = 0, r01i = 0, r02r = 0, r02i = 0, r11r = 0;
273
82.5k
    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
82.5k
    const real_t rel = 1 / (1 + 1e-6f);
280
82.5k
#endif
281
82.5k
    int8_t j;
282
82.5k
    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
82.5k
    temp2_r = QMF_RE(buffer[offset-2][bd]);
369
82.5k
    temp2_i = QMF_IM(buffer[offset-2][bd]);
370
82.5k
    temp3_r = QMF_RE(buffer[offset-1][bd]);
371
82.5k
    temp3_i = QMF_IM(buffer[offset-1][bd]);
372
    // Save these because they are needed after loop
373
82.5k
    temp4_r = temp2_r;
374
82.5k
    temp4_i = temp2_i;
375
82.5k
    temp5_r = temp3_r;
376
82.5k
    temp5_i = temp3_i;
377
378
3.18M
    for (j = offset; j < len + offset; j++)
379
3.10M
    {
380
3.10M
      temp1_r = temp2_r; // temp1_r = QMF_RE(buffer[j-2][bd];
381
3.10M
      temp1_i = temp2_i; // temp1_i = QMF_IM(buffer[j-2][bd];
382
3.10M
      temp2_r = temp3_r; // temp2_r = QMF_RE(buffer[j-1][bd];
383
3.10M
      temp2_i = temp3_i; // temp2_i = QMF_IM(buffer[j-1][bd];
384
3.10M
        temp3_r = QMF_RE(buffer[j][bd]);
385
3.10M
        temp3_i = QMF_IM(buffer[j][bd]);
386
3.10M
        r01r += temp3_r * temp2_r + temp3_i * temp2_i;
387
3.10M
        r01i += temp3_i * temp2_r - temp3_r * temp2_i;
388
3.10M
        r02r += temp3_r * temp1_r + temp3_i * temp1_i;
389
3.10M
        r02i += temp3_i * temp1_r - temp3_r * temp1_i;
390
3.10M
        r11r += temp2_r * temp2_r + temp2_i * temp2_i;
391
3.10M
    }
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
82.5k
    RE(ac->r12) = r01r -
406
82.5k
        (temp3_r * temp2_r + temp3_i * temp2_i) +
407
82.5k
        (temp5_r * temp4_r + temp5_i * temp4_i);
408
82.5k
    IM(ac->r12) = r01i -
409
82.5k
        (temp3_i * temp2_r - temp3_r * temp2_i) +
410
82.5k
        (temp5_i * temp4_r - temp5_r * temp4_i);
411
82.5k
    RE(ac->r22) = r11r -
412
82.5k
        (temp2_r * temp2_r + temp2_i * temp2_i) +
413
82.5k
        (temp4_r * temp4_r + temp4_i * temp4_i);
414
415
82.5k
#endif
416
417
82.5k
    RE(ac->r01) = r01r;
418
82.5k
    IM(ac->r01) = r01i;
419
82.5k
    RE(ac->r02) = r02r;
420
82.5k
    IM(ac->r02) = r02i;
421
82.5k
    RE(ac->r11) = r11r;
422
423
82.5k
    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
82.5k
}
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
177k
{
432
177k
    real_t tmp;
433
177k
    acorr_coef ac;
434
435
177k
    auto_correlation(sbr, &ac, Xlow, k, sbr->numTimeSlotsRate + 6);
436
437
177k
    if (ac.det == 0)
438
169k
    {
439
169k
        RE(alpha_1[k]) = 0;
440
169k
        IM(alpha_1[k]) = 0;
441
169k
    } else {
442
#ifdef FIXED_POINT
443
4.74k
        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
4.74k
        RE(alpha_1[k]) = DIV_R(tmp, ac.det);
445
4.74k
        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
4.74k
        IM(alpha_1[k]) = DIV_R(tmp, ac.det);
447
#else
448
3.92k
        tmp = REAL_CONST(1.0) / ac.det;
449
3.92k
        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
3.92k
        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
8.67k
    }
453
454
177k
    if (RE(ac.r11) == 0)
455
163k
    {
456
163k
        RE(alpha_0[k]) = 0;
457
163k
        IM(alpha_0[k]) = 0;
458
163k
    } else {
459
#ifdef FIXED_POINT
460
4.92k
        tmp = -(RE(ac.r01) + MUL_R(RE(alpha_1[k]), RE(ac.r12)) + MUL_R(IM(alpha_1[k]), IM(ac.r12)));
461
4.92k
        RE(alpha_0[k]) = DIV_R(tmp, RE(ac.r11));
462
4.92k
        tmp = -(IM(ac.r01) + MUL_R(IM(alpha_1[k]), RE(ac.r12)) - MUL_R(RE(alpha_1[k]), IM(ac.r12)));
463
4.92k
        IM(alpha_0[k]) = DIV_R(tmp, RE(ac.r11));
464
#else
465
9.20k
        tmp = 1.0f / RE(ac.r11);
466
9.20k
        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
9.20k
        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
14.1k
    }
470
471
    /* Sanity check; important: use "yes" check to filter-out NaN values. */
472
177k
    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
177k
        (MUL_R(RE(alpha_1[k]),RE(alpha_1[k])) + MUL_R(IM(alpha_1[k]),IM(alpha_1[k])) <= REAL_CONST(16)))
474
174k
        return;
475
    /* Fallback */
476
3.18k
    RE(alpha_0[k]) = 0;
477
3.18k
    IM(alpha_0[k]) = 0;
478
3.18k
    RE(alpha_1[k]) = 0;
479
3.18k
    IM(alpha_1[k]) = 0;
480
3.18k
}
sbr_hfgen.c:calc_prediction_coef
Line
Count
Source
431
95.2k
{
432
95.2k
    real_t tmp;
433
95.2k
    acorr_coef ac;
434
435
95.2k
    auto_correlation(sbr, &ac, Xlow, k, sbr->numTimeSlotsRate + 6);
436
437
95.2k
    if (ac.det == 0)
438
90.4k
    {
439
90.4k
        RE(alpha_1[k]) = 0;
440
90.4k
        IM(alpha_1[k]) = 0;
441
90.4k
    } else {
442
4.74k
#ifdef FIXED_POINT
443
4.74k
        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
4.74k
        RE(alpha_1[k]) = DIV_R(tmp, ac.det);
445
4.74k
        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
4.74k
        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
4.74k
    }
453
454
95.2k
    if (RE(ac.r11) == 0)
455
90.3k
    {
456
90.3k
        RE(alpha_0[k]) = 0;
457
90.3k
        IM(alpha_0[k]) = 0;
458
90.3k
    } else {
459
4.92k
#ifdef FIXED_POINT
460
4.92k
        tmp = -(RE(ac.r01) + MUL_R(RE(alpha_1[k]), RE(ac.r12)) + MUL_R(IM(alpha_1[k]), IM(ac.r12)));
461
4.92k
        RE(alpha_0[k]) = DIV_R(tmp, RE(ac.r11));
462
4.92k
        tmp = -(IM(ac.r01) + MUL_R(IM(alpha_1[k]), RE(ac.r12)) - MUL_R(RE(alpha_1[k]), IM(ac.r12)));
463
4.92k
        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
4.92k
    }
470
471
    /* Sanity check; important: use "yes" check to filter-out NaN values. */
472
95.2k
    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
95.2k
        (MUL_R(RE(alpha_1[k]),RE(alpha_1[k])) + MUL_R(IM(alpha_1[k]),IM(alpha_1[k])) <= REAL_CONST(16)))
474
94.2k
        return;
475
    /* Fallback */
476
948
    RE(alpha_0[k]) = 0;
477
948
    IM(alpha_0[k]) = 0;
478
948
    RE(alpha_1[k]) = 0;
479
948
    IM(alpha_1[k]) = 0;
480
948
}
sbr_hfgen.c:calc_prediction_coef
Line
Count
Source
431
82.5k
{
432
82.5k
    real_t tmp;
433
82.5k
    acorr_coef ac;
434
435
82.5k
    auto_correlation(sbr, &ac, Xlow, k, sbr->numTimeSlotsRate + 6);
436
437
82.5k
    if (ac.det == 0)
438
78.6k
    {
439
78.6k
        RE(alpha_1[k]) = 0;
440
78.6k
        IM(alpha_1[k]) = 0;
441
78.6k
    } 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
3.92k
        tmp = REAL_CONST(1.0) / ac.det;
449
3.92k
        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
3.92k
        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
3.92k
#endif
452
3.92k
    }
453
454
82.5k
    if (RE(ac.r11) == 0)
455
73.3k
    {
456
73.3k
        RE(alpha_0[k]) = 0;
457
73.3k
        IM(alpha_0[k]) = 0;
458
73.3k
    } 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
9.20k
        tmp = 1.0f / RE(ac.r11);
466
9.20k
        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
9.20k
        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
9.20k
#endif
469
9.20k
    }
470
471
    /* Sanity check; important: use "yes" check to filter-out NaN values. */
472
82.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
82.5k
        (MUL_R(RE(alpha_1[k]),RE(alpha_1[k])) + MUL_R(IM(alpha_1[k]),IM(alpha_1[k])) <= REAL_CONST(16)))
474
80.3k
        return;
475
    /* Fallback */
476
2.23k
    RE(alpha_0[k]) = 0;
477
2.23k
    IM(alpha_0[k]) = 0;
478
2.23k
    RE(alpha_1[k]) = 0;
479
2.23k
    IM(alpha_1[k]) = 0;
480
2.23k
}
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.5k
{
571
53.5k
    switch (invf_mode)
572
53.5k
    {
573
8.31k
    case 1: /* LOW */
574
8.31k
        if (invf_mode_prev == 0) /* NONE */
575
6.83k
            return COEF_CONST(0.6);
576
1.48k
        else
577
1.48k
            return COEF_CONST(0.75);
578
579
7.49k
    case 2: /* MID */
580
7.49k
        return COEF_CONST(0.9);
581
582
11.8k
    case 3: /* HIGH */
583
11.8k
        return COEF_CONST(0.98);
584
585
25.8k
    default: /* NONE */
586
25.8k
        if (invf_mode_prev == 1) /* LOW */
587
340
            return COEF_CONST(0.6);
588
25.5k
        else
589
25.5k
            return COEF_CONST(0.0);
590
53.5k
    }
591
53.5k
}
sbr_hfgen.c:mapNewBw
Line
Count
Source
570
27.6k
{
571
27.6k
    switch (invf_mode)
572
27.6k
    {
573
4.34k
    case 1: /* LOW */
574
4.34k
        if (invf_mode_prev == 0) /* NONE */
575
3.65k
            return COEF_CONST(0.6);
576
693
        else
577
693
            return COEF_CONST(0.75);
578
579
3.60k
    case 2: /* MID */
580
3.60k
        return COEF_CONST(0.9);
581
582
6.89k
    case 3: /* HIGH */
583
6.89k
        return COEF_CONST(0.98);
584
585
12.8k
    default: /* NONE */
586
12.8k
        if (invf_mode_prev == 1) /* LOW */
587
143
            return COEF_CONST(0.6);
588
12.6k
        else
589
12.6k
            return COEF_CONST(0.0);
590
27.6k
    }
591
27.6k
}
sbr_hfgen.c:mapNewBw
Line
Count
Source
570
25.8k
{
571
25.8k
    switch (invf_mode)
572
25.8k
    {
573
3.96k
    case 1: /* LOW */
574
3.96k
        if (invf_mode_prev == 0) /* NONE */
575
3.17k
            return COEF_CONST(0.6);
576
787
        else
577
787
            return COEF_CONST(0.75);
578
579
3.88k
    case 2: /* MID */
580
3.88k
        return COEF_CONST(0.9);
581
582
4.98k
    case 3: /* HIGH */
583
4.98k
        return COEF_CONST(0.98);
584
585
13.0k
    default: /* NONE */
586
13.0k
        if (invf_mode_prev == 1) /* LOW */
587
197
            return COEF_CONST(0.6);
588
12.8k
        else
589
12.8k
            return COEF_CONST(0.0);
590
25.8k
    }
591
25.8k
}
592
593
/* FIXED POINT: bwArray = COEF */
594
static void calc_chirp_factors(sbr_info *sbr, uint8_t ch)
595
27.8k
{
596
27.8k
    uint8_t i;
597
598
81.3k
    for (i = 0; i < sbr->N_Q; i++)
599
53.5k
    {
600
53.5k
        sbr->bwArray[ch][i] = mapNewBw(sbr->bs_invf_mode[ch][i], sbr->bs_invf_mode_prev[ch][i]);
601
602
53.5k
        if (sbr->bwArray[ch][i] < sbr->bwArray_prev[ch][i])
603
1.02k
            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
52.5k
        else
605
52.5k
            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.5k
        if (sbr->bwArray[ch][i] < COEF_CONST(0.015625))
608
24.7k
            sbr->bwArray[ch][i] = COEF_CONST(0.0);
609
610
53.5k
        if (sbr->bwArray[ch][i] >= COEF_CONST(0.99609375))
611
0
            sbr->bwArray[ch][i] = COEF_CONST(0.99609375);
612
613
53.5k
        sbr->bwArray_prev[ch][i] = sbr->bwArray[ch][i];
614
53.5k
        sbr->bs_invf_mode_prev[ch][i] = sbr->bs_invf_mode[ch][i];
615
53.5k
    }
616
27.8k
}
sbr_hfgen.c:calc_chirp_factors
Line
Count
Source
595
13.5k
{
596
13.5k
    uint8_t i;
597
598
41.1k
    for (i = 0; i < sbr->N_Q; i++)
599
27.6k
    {
600
27.6k
        sbr->bwArray[ch][i] = mapNewBw(sbr->bs_invf_mode[ch][i], sbr->bs_invf_mode_prev[ch][i]);
601
602
27.6k
        if (sbr->bwArray[ch][i] < sbr->bwArray_prev[ch][i])
603
575
            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
27.0k
        else
605
27.0k
            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
27.6k
        if (sbr->bwArray[ch][i] < COEF_CONST(0.015625))
608
12.2k
            sbr->bwArray[ch][i] = COEF_CONST(0.0);
609
610
27.6k
        if (sbr->bwArray[ch][i] >= COEF_CONST(0.99609375))
611
0
            sbr->bwArray[ch][i] = COEF_CONST(0.99609375);
612
613
27.6k
        sbr->bwArray_prev[ch][i] = sbr->bwArray[ch][i];
614
27.6k
        sbr->bs_invf_mode_prev[ch][i] = sbr->bs_invf_mode[ch][i];
615
27.6k
    }
616
13.5k
}
sbr_hfgen.c:calc_chirp_factors
Line
Count
Source
595
14.3k
{
596
14.3k
    uint8_t i;
597
598
40.1k
    for (i = 0; i < sbr->N_Q; i++)
599
25.8k
    {
600
25.8k
        sbr->bwArray[ch][i] = mapNewBw(sbr->bs_invf_mode[ch][i], sbr->bs_invf_mode_prev[ch][i]);
601
602
25.8k
        if (sbr->bwArray[ch][i] < sbr->bwArray_prev[ch][i])
603
445
            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
25.4k
        else
605
25.4k
            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
25.8k
        if (sbr->bwArray[ch][i] < COEF_CONST(0.015625))
608
12.5k
            sbr->bwArray[ch][i] = COEF_CONST(0.0);
609
610
25.8k
        if (sbr->bwArray[ch][i] >= COEF_CONST(0.99609375))
611
0
            sbr->bwArray[ch][i] = COEF_CONST(0.99609375);
612
613
25.8k
        sbr->bwArray_prev[ch][i] = sbr->bwArray[ch][i];
614
25.8k
        sbr->bs_invf_mode_prev[ch][i] = sbr->bs_invf_mode[ch][i];
615
25.8k
    }
616
14.3k
}
617
618
static void patch_construction(sbr_info *sbr)
619
21.9k
{
620
21.9k
    uint8_t i, k;
621
21.9k
    uint8_t odd, sb;
622
21.9k
    uint8_t msb = sbr->k0;
623
21.9k
    uint8_t usb = sbr->kx;
624
21.9k
    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.9k
    uint8_t goalSb = goalSbTab[get_sr_index(sbr->sample_rate)];
627
628
21.9k
    sbr->noPatches = 0;
629
630
21.9k
    if (goalSb < (sbr->kx + sbr->M))
631
7.73k
    {
632
75.5k
        for (i = 0, k = 0; sbr->f_master[i] < goalSb; i++)
633
67.8k
            k = i+1;
634
14.1k
    } else {
635
14.1k
        k = sbr->N_master;
636
14.1k
    }
637
638
21.9k
    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.9k
    do
648
51.9k
    {
649
51.9k
        uint8_t j = k + 1;
650
651
51.9k
        do
652
152k
        {
653
152k
            j--;
654
655
152k
            sb = sbr->f_master[j];
656
152k
            odd = (sb - 2 + sbr->k0) % 2;
657
152k
        } while (sb > (sbr->k0 - 1 + msb - odd));
658
659
51.9k
        sbr->patchNoSubbands[sbr->noPatches] = max(sb - usb, 0);
660
51.9k
        sbr->patchStartSubband[sbr->noPatches] = sbr->k0 - odd -
661
51.9k
            sbr->patchNoSubbands[sbr->noPatches];
662
663
51.9k
        if (sbr->patchNoSubbands[sbr->noPatches] > 0)
664
48.3k
        {
665
48.3k
            usb = sb;
666
48.3k
            msb = sb;
667
48.3k
            sbr->noPatches++;
668
48.3k
        } else {
669
3.57k
            msb = sbr->kx;
670
3.57k
        }
671
672
51.9k
        if (sbr->f_master[k] - sb < 3)
673
32.5k
            k = sbr->N_master;
674
51.9k
    } while (sb != (sbr->kx + sbr->M));
675
676
21.9k
    if ((sbr->patchNoSubbands[sbr->noPatches-1] < 3) && (sbr->noPatches > 1))
677
3.42k
    {
678
3.42k
        sbr->noPatches--;
679
3.42k
    }
680
681
21.9k
    sbr->noPatches = min(sbr->noPatches, 5);
682
21.9k
}
683
684
#endif