55 int k, previous, present;
58 base =
powf((
float)stop / start, 1.0
f / num_bands);
62 for (k = 0; k < num_bands-1; k++) {
65 bands[k] = present - previous;
68 bands[num_bands-1] = stop - previous;
76 static const double exp2_tab[2] = {1,
M_SQRT2};
81 float temp1, temp2, fac;
96 fac = temp1 / (1.0f + temp2);
102 for (k = 0; k < sbr->
n_q; k++) {
107 fac = temp1 / (1.0f + temp2);
113 for (ch = 0; ch < (id_aac ==
TYPE_CPE) + 1; ch++) {
128 for (k = 0; k < sbr->
n_q; k++)
140 float (*alpha0)[2],
float (*alpha1)[2],
141 const float X_low[32][40][2],
int k0)
144 for (k = 0; k < k0; k++) {
150 dk = phi[2][1][0] * phi[1][0][0] -
151 (phi[1][1][0] * phi[1][1][0] + phi[1][1][1] * phi[1][1][1]) / 1.000001
f;
157 float temp_real, temp_im;
158 temp_real = phi[0][0][0] * phi[1][1][0] -
159 phi[0][0][1] * phi[1][1][1] -
160 phi[0][1][0] * phi[1][0][0];
161 temp_im = phi[0][0][0] * phi[1][1][1] +
162 phi[0][0][1] * phi[1][1][0] -
163 phi[0][1][1] * phi[1][0][0];
165 alpha1[k][0] = temp_real / dk;
166 alpha1[k][1] = temp_im / dk;
173 float temp_real, temp_im;
174 temp_real = phi[0][0][0] + alpha1[k][0] * phi[1][1][0] +
175 alpha1[k][1] * phi[1][1][1];
176 temp_im = phi[0][0][1] + alpha1[k][1] * phi[1][1][0] -
177 alpha1[k][0] * phi[1][1][1];
179 alpha0[k][0] = -temp_real / phi[1][0][0];
180 alpha0[k][1] = -temp_im / phi[1][0][0];
183 if (alpha1[k][0] * alpha1[k][0] + alpha1[k][1] * alpha1[k][1] >= 16.0
f ||
184 alpha0[k][0] * alpha0[k][0] + alpha0[k][1] * alpha0[k][1] >= 16.0
f) {
198 static const float bw_tab[] = { 0.0f, 0.75f, 0.9f, 0.98f };
200 for (
i = 0;
i < sbr->
n_q;
i++) {
206 if (new_bw < ch_data->bw_array[
i]) {
207 new_bw = 0.75f * new_bw + 0.25f * ch_data->
bw_array[
i];
209 new_bw = 0.90625f * new_bw + 0.09375f * ch_data->
bw_array[
i];
210 ch_data->
bw_array[
i] = new_bw < 0.015625f ? 0.0f : new_bw;
219 SBRData *ch_data,
const int e_a[2])
223 static const float limgain[4] = { 0.70795, 1.0, 1.41254, 10000000000 };
226 int delta = !((e == e_a[1]) || (e == e_a[0]));
227 for (k = 0; k < sbr->
n_lim; k++) {
228 float gain_boost, gain_max;
229 float sum[2] = { 0.0f, 0.0f };
230 for (m = sbr->
f_tablelim[k] - sbr->
kx[1]; m < sbr->f_tablelim[k + 1] - sbr->
kx[1]; m++) {
236 ((1.0f + sbr->
e_curr[e][m]) *
240 ((1.0f + sbr->
e_curr[e][m]) *
243 sbr->
gain[e][m] += FLT_MIN;
245 for (m = sbr->
f_tablelim[k] - sbr->
kx[1]; m < sbr->f_tablelim[k + 1] - sbr->
kx[1]; m++) {
247 sum[1] += sbr->
e_curr[e][m];
250 gain_max =
FFMIN(100000.
f, gain_max);
251 for (m = sbr->
f_tablelim[k] - sbr->
kx[1]; m < sbr->f_tablelim[k + 1] - sbr->
kx[1]; m++) {
252 float q_m_max = sbr->
q_m[e][m] * gain_max / sbr->
gain[e][m];
256 sum[0] = sum[1] = 0.0f;
257 for (m = sbr->
f_tablelim[k] - sbr->
kx[1]; m < sbr->f_tablelim[k + 1] - sbr->
kx[1]; m++) {
260 + sbr->
s_m[e][m] * sbr->
s_m[e][m]
263 gain_boost =
sqrtf((FLT_EPSILON + sum[0]) / (FLT_EPSILON + sum[1]));
264 gain_boost =
FFMIN(1.584893192
f, gain_boost);
265 for (m = sbr->
f_tablelim[k] - sbr->
kx[1]; m < sbr->f_tablelim[k + 1] - sbr->
kx[1]; m++) {
266 sbr->
gain[e][m] *= gain_boost;
267 sbr->
q_m[e][m] *= gain_boost;
268 sbr->
s_m[e][m] *= gain_boost;
276 const float X_high[64][40][2],
282 const int kx = sbr->
kx[1];
283 const int m_max = sbr->
m[1];
284 static const float h_smooth[5] = {
296 for (
i = 0;
i < h_SL;
i++) {
297 memcpy(g_temp[
i + 2*ch_data->
t_env[0]], sbr->
gain[0], m_max *
sizeof(sbr->
gain[0][0]));
298 memcpy(q_temp[
i + 2*ch_data->
t_env[0]], sbr->
q_m[0], m_max *
sizeof(sbr->
q_m[0][0]));
301 for (
i = 0;
i < 4;
i++) {
302 memcpy(g_temp[
i + 2 * ch_data->
t_env[0]],
305 memcpy(q_temp[
i + 2 * ch_data->
t_env[0]],
312 for (
i = 2 * ch_data->
t_env[e]; i < 2 * ch_data->t_env[e + 1];
i++) {
313 memcpy(g_temp[h_SL +
i], sbr->
gain[e], m_max *
sizeof(sbr->
gain[0][0]));
314 memcpy(q_temp[h_SL +
i], sbr->
q_m[e], m_max *
sizeof(sbr->
q_m[0][0]));
319 for (
i = 2 * ch_data->
t_env[e]; i < 2 * ch_data->t_env[e + 1];
i++) {
322 float *g_filt, *q_filt;
324 if (h_SL && e != e_a[0] && e != e_a[1]) {
327 for (m = 0; m < m_max; m++) {
328 const int idx1 =
i + h_SL;
331 for (j = 0; j <= h_SL; j++) {
332 g_filt[m] += g_temp[idx1 - j][m] * h_smooth[j];
333 q_filt[m] += q_temp[idx1 - j][m] * h_smooth[j];
337 g_filt = g_temp[
i + h_SL];
344 if (e != e_a[0] && e != e_a[1]) {
349 int idx = indexsine&1;
350 int A = (1-((indexsine+(kx & 1))&2));
351 int B = (
A^(-idx)) + idx;
352 float *
out = &Y1[
i][kx][idx];
353 float *in = sbr->
s_m[e];
354 for (m = 0; m+1 < m_max; m+=2) {
355 out[2*m ] += in[m ] *
A;
356 out[2*m+2] += in[m+1] *
B;
359 out[2*m ] += in[m ] *
A;
361 indexnoise = (indexnoise + m_max) & 0x1ff;
362 indexsine = (indexsine + 1) & 3;