56 int k, previous, present;
59 base =
powf((
float)stop / start, 1.0
f / num_bands);
63 for (k = 0; k < num_bands-1; k++) {
66 bands[k] = present - previous;
69 bands[num_bands-1] = stop - previous;
77 static const double exp2_tab[2] = {1,
M_SQRT2};
82 float temp1, temp2, fac;
97 fac = temp1 / (1.0f + temp2);
103 for (k = 0; k < sbr->
n_q; k++) {
108 fac = temp1 / (1.0f + temp2);
114 for (ch = 0; ch < (id_aac ==
TYPE_CPE) + 1; ch++) {
129 for (k = 0; k < sbr->
n_q; k++)
141 float (*alpha0)[2],
float (*alpha1)[2],
142 const float X_low[32][40][2],
int k0)
145 for (k = 0; k < k0; k++) {
151 dk = phi[2][1][0] * phi[1][0][0] -
152 (phi[1][1][0] * phi[1][1][0] + phi[1][1][1] * phi[1][1][1]) / 1.000001
f;
158 float temp_real, temp_im;
159 temp_real = phi[0][0][0] * phi[1][1][0] -
160 phi[0][0][1] * phi[1][1][1] -
161 phi[0][1][0] * phi[1][0][0];
162 temp_im = phi[0][0][0] * phi[1][1][1] +
163 phi[0][0][1] * phi[1][1][0] -
164 phi[0][1][1] * phi[1][0][0];
166 alpha1[k][0] = temp_real / dk;
167 alpha1[k][1] = temp_im / dk;
174 float temp_real, temp_im;
175 temp_real = phi[0][0][0] + alpha1[k][0] * phi[1][1][0] +
176 alpha1[k][1] * phi[1][1][1];
177 temp_im = phi[0][0][1] + alpha1[k][1] * phi[1][1][0] -
178 alpha1[k][0] * phi[1][1][1];
180 alpha0[k][0] = -temp_real / phi[1][0][0];
181 alpha0[k][1] = -temp_im / phi[1][0][0];
184 if (alpha1[k][0] * alpha1[k][0] + alpha1[k][1] * alpha1[k][1] >= 16.0
f ||
185 alpha0[k][0] * alpha0[k][0] + alpha0[k][1] * alpha0[k][1] >= 16.0
f) {
199 static const float bw_tab[] = { 0.0f, 0.75f, 0.9f, 0.98f };
201 for (
i = 0;
i < sbr->
n_q;
i++) {
207 if (new_bw < ch_data->bw_array[
i]) {
208 new_bw = 0.75f * new_bw + 0.25f * ch_data->
bw_array[
i];
210 new_bw = 0.90625f * new_bw + 0.09375f * ch_data->
bw_array[
i];
211 ch_data->
bw_array[
i] = new_bw < 0.015625f ? 0.0f : new_bw;
220 SBRData *ch_data,
const int e_a[2])
224 static const float limgain[4] = { 0.70795, 1.0, 1.41254, 10000000000 };
227 int delta = !((e == e_a[1]) || (e == e_a[0]));
228 for (k = 0; k < sbr->
n_lim; k++) {
229 float gain_boost, gain_max;
230 float sum[2] = { 0.0f, 0.0f };
231 for (m = sbr->
f_tablelim[k] - sbr->
kx[1]; m < sbr->f_tablelim[k + 1] - sbr->
kx[1]; m++) {
237 ((1.0f + sbr->
e_curr[e][m]) *
241 ((1.0f + sbr->
e_curr[e][m]) *
244 sbr->
gain[e][m] += FLT_MIN;
246 for (m = sbr->
f_tablelim[k] - sbr->
kx[1]; m < sbr->f_tablelim[k + 1] - sbr->
kx[1]; m++) {
248 sum[1] += sbr->
e_curr[e][m];
251 gain_max =
FFMIN(100000.
f, gain_max);
252 for (m = sbr->
f_tablelim[k] - sbr->
kx[1]; m < sbr->f_tablelim[k + 1] - sbr->
kx[1]; m++) {
253 float q_m_max = sbr->
q_m[e][m] * gain_max / sbr->
gain[e][m];
257 sum[0] = sum[1] = 0.0f;
258 for (m = sbr->
f_tablelim[k] - sbr->
kx[1]; m < sbr->f_tablelim[k + 1] - sbr->
kx[1]; m++) {
261 + sbr->
s_m[e][m] * sbr->
s_m[e][m]
264 gain_boost =
sqrtf((FLT_EPSILON + sum[0]) / (FLT_EPSILON + sum[1]));
265 gain_boost =
FFMIN(1.584893192
f, gain_boost);
266 for (m = sbr->
f_tablelim[k] - sbr->
kx[1]; m < sbr->f_tablelim[k + 1] - sbr->
kx[1]; m++) {
267 sbr->
gain[e][m] *= gain_boost;
268 sbr->
q_m[e][m] *= gain_boost;
269 sbr->
s_m[e][m] *= gain_boost;
277 const float X_high[64][40][2],
283 const int kx = sbr->
kx[1];
284 const int m_max = sbr->
m[1];
285 static const float h_smooth[5] = {
297 for (
i = 0;
i < h_SL;
i++) {
298 memcpy(g_temp[
i + 2*ch_data->
t_env[0]], sbr->
gain[0], m_max *
sizeof(sbr->
gain[0][0]));
299 memcpy(q_temp[
i + 2*ch_data->
t_env[0]], sbr->
q_m[0], m_max *
sizeof(sbr->
q_m[0][0]));
302 for (
i = 0;
i < 4;
i++) {
303 memcpy(g_temp[
i + 2 * ch_data->
t_env[0]],
306 memcpy(q_temp[
i + 2 * ch_data->
t_env[0]],
313 for (
i = 2 * ch_data->
t_env[e]; i < 2 * ch_data->t_env[e + 1];
i++) {
314 memcpy(g_temp[h_SL +
i], sbr->
gain[e], m_max *
sizeof(sbr->
gain[0][0]));
315 memcpy(q_temp[h_SL +
i], sbr->
q_m[e], m_max *
sizeof(sbr->
q_m[0][0]));
320 for (
i = 2 * ch_data->
t_env[e]; i < 2 * ch_data->t_env[e + 1];
i++) {
323 float *g_filt, *q_filt;
325 if (h_SL && e != e_a[0] && e != e_a[1]) {
328 for (m = 0; m < m_max; m++) {
329 const int idx1 =
i + h_SL;
332 for (j = 0; j <= h_SL; j++) {
333 g_filt[m] += g_temp[idx1 - j][m] * h_smooth[j];
334 q_filt[m] += q_temp[idx1 - j][m] * h_smooth[j];
338 g_filt = g_temp[
i + h_SL];
345 if (e != e_a[0] && e != e_a[1]) {
350 int idx = indexsine&1;
351 int A = (1-((indexsine+(kx & 1))&2));
352 int B = (
A^(-idx)) + idx;
353 float *
out = &Y1[
i][kx][idx];
354 float *in = sbr->
s_m[e];
355 for (m = 0; m+1 < m_max; m+=2) {
356 out[2*m ] += in[m ] *
A;
357 out[2*m+2] += in[m+1] *
B;
360 out[2*m ] += in[m ] *
A;
362 indexnoise = (indexnoise + m_max) & 0x1ff;
363 indexsine = (indexsine + 1) & 3;