52 if (-126 <= x && x <= 128)
69 int k, previous, present;
72 base =
powf((
float)stop / start, 1.0f / num_bands);
76 for (k = 0; k < num_bands-1; k++) {
79 bands[k] = present - previous;
82 bands[num_bands-1] = stop - previous;
90 static const double exp2_tab[2] = {1,
M_SQRT2};
95 float temp1, temp2, fac;
110 fac = temp1 / (1.0f + temp2);
116 for (k = 0; k < sbr->
n_q; k++) {
121 fac = temp1 / (1.0f + temp2);
127 for (ch = 0; ch < (id_aac ==
TYPE_CPE) + 1; ch++) {
142 for (k = 0; k < sbr->
n_q; k++)
154 float (*alpha0)[2],
float (*alpha1)[2],
155 const float X_low[32][40][2],
int k0)
158 for (k = 0; k < k0; k++) {
164 dk = phi[2][1][0] * phi[1][0][0] -
165 (phi[1][1][0] * phi[1][1][0] + phi[1][1][1] * phi[1][1][1]) / 1.000001f;
171 float temp_real, temp_im;
172 temp_real = phi[0][0][0] * phi[1][1][0] -
173 phi[0][0][1] * phi[1][1][1] -
174 phi[0][1][0] * phi[1][0][0];
175 temp_im = phi[0][0][0] * phi[1][1][1] +
176 phi[0][0][1] * phi[1][1][0] -
177 phi[0][1][1] * phi[1][0][0];
179 alpha1[k][0] = temp_real / dk;
180 alpha1[k][1] = temp_im / dk;
187 float temp_real, temp_im;
188 temp_real = phi[0][0][0] + alpha1[k][0] * phi[1][1][0] +
189 alpha1[k][1] * phi[1][1][1];
190 temp_im = phi[0][0][1] + alpha1[k][1] * phi[1][1][0] -
191 alpha1[k][0] * phi[1][1][1];
193 alpha0[k][0] = -temp_real / phi[1][0][0];
194 alpha0[k][1] = -temp_im / phi[1][0][0];
197 if (alpha1[k][0] * alpha1[k][0] + alpha1[k][1] * alpha1[k][1] >= 16.0f ||
198 alpha0[k][0] * alpha0[k][0] + alpha0[k][1] * alpha0[k][1] >= 16.0f) {
212 static const float bw_tab[] = { 0.0f, 0.75f, 0.9f, 0.98f };
214 for (
i = 0;
i < sbr->
n_q;
i++) {
220 if (new_bw < ch_data->bw_array[
i]) {
221 new_bw = 0.75f * new_bw + 0.25f * ch_data->
bw_array[
i];
223 new_bw = 0.90625f * new_bw + 0.09375f * ch_data->
bw_array[
i];
224 ch_data->
bw_array[
i] = new_bw < 0.015625f ? 0.0f : new_bw;
233 SBRData *ch_data,
const int e_a[2])
237 static const float limgain[4] = { 0.70795, 1.0, 1.41254, 10000000000 };
240 int delta = !((e == e_a[1]) || (e == e_a[0]));
241 for (k = 0; k < sbr->
n_lim; k++) {
242 float gain_boost, gain_max;
243 float sum[2] = { 0.0f, 0.0f };
244 for (m = sbr->
f_tablelim[k] - sbr->
kx[1]; m < sbr->f_tablelim[k + 1] - sbr->
kx[1]; m++) {
250 ((1.0f + sbr->
e_curr[e][m]) *
254 ((1.0f + sbr->
e_curr[e][m]) *
257 sbr->
gain[e][m] += FLT_MIN;
259 for (m = sbr->
f_tablelim[k] - sbr->
kx[1]; m < sbr->f_tablelim[k + 1] - sbr->
kx[1]; m++) {
261 sum[1] += sbr->
e_curr[e][m];
264 gain_max =
FFMIN(100000.f, gain_max);
265 for (m = sbr->
f_tablelim[k] - sbr->
kx[1]; m < sbr->f_tablelim[k + 1] - sbr->
kx[1]; m++) {
266 float q_m_max = sbr->
q_m[e][m] * gain_max / sbr->
gain[e][m];
270 sum[0] = sum[1] = 0.0f;
271 for (m = sbr->
f_tablelim[k] - sbr->
kx[1]; m < sbr->f_tablelim[k + 1] - sbr->
kx[1]; m++) {
274 + sbr->
s_m[e][m] * sbr->
s_m[e][m]
277 gain_boost =
sqrtf((FLT_EPSILON + sum[0]) / (FLT_EPSILON + sum[1]));
278 gain_boost =
FFMIN(1.584893192f, gain_boost);
279 for (m = sbr->
f_tablelim[k] - sbr->
kx[1]; m < sbr->f_tablelim[k + 1] - sbr->
kx[1]; m++) {
280 sbr->
gain[e][m] *= gain_boost;
281 sbr->
q_m[e][m] *= gain_boost;
282 sbr->
s_m[e][m] *= gain_boost;
290 const float X_high[64][40][2],
296 const int kx = sbr->
kx[1];
297 const int m_max = sbr->
m[1];
298 static const float h_smooth[5] = {
310 for (
i = 0;
i < h_SL;
i++) {
311 memcpy(g_temp[
i + 2*ch_data->
t_env[0]], sbr->
gain[0], m_max *
sizeof(sbr->
gain[0][0]));
312 memcpy(q_temp[
i + 2*ch_data->
t_env[0]], sbr->
q_m[0], m_max *
sizeof(sbr->
q_m[0][0]));
315 for (
i = 0;
i < 4;
i++) {
316 memcpy(g_temp[
i + 2 * ch_data->
t_env[0]],
319 memcpy(q_temp[
i + 2 * ch_data->
t_env[0]],
327 memcpy(g_temp[h_SL +
i], sbr->
gain[e], m_max *
sizeof(sbr->
gain[0][0]));
328 memcpy(q_temp[h_SL +
i], sbr->
q_m[e], m_max *
sizeof(sbr->
q_m[0][0]));
336 float *g_filt, *q_filt;
338 if (h_SL && e != e_a[0] && e != e_a[1]) {
341 for (m = 0; m < m_max; m++) {
342 const int idx1 =
i + h_SL;
345 for (j = 0; j <= h_SL; j++) {
346 g_filt[m] += g_temp[idx1 - j][m] * h_smooth[j];
347 q_filt[m] += q_temp[idx1 - j][m] * h_smooth[j];
351 g_filt = g_temp[
i + h_SL];
358 if (e != e_a[0] && e != e_a[1]) {
363 int idx = indexsine&1;
364 int A = (1-((indexsine+(kx & 1))&2));
365 int B = (
A^(-idx)) + idx;
366 float *
out = &Y1[
i][kx][idx];
367 float *in = sbr->
s_m[e];
368 for (m = 0; m+1 < m_max; m+=2) {
369 out[2*m ] += in[m ] *
A;
370 out[2*m+2] += in[m+1] *
B;
373 out[2*m ] += in[m ] *
A;
375 indexnoise = (indexnoise + m_max) & 0x1ff;
376 indexsine = (indexsine + 1) & 3;
AAC definitions and structures.
static void sbr_hf_assemble(float Y1[38][64][2], const float X_high[64][40][2], SpectralBandReplication *sbr, SBRData *ch_data, const int e_a[2])
Assembling HF Signals (14496-3 sp04 p220)
static void aacsbr_func_ptr_init(AACSBRContext *c)
static void sbr_hf_inverse_filter(SBRDSPContext *dsp, float(*alpha0)[2], float(*alpha1)[2], const float X_low[32][40][2], int k0)
High Frequency Generation (14496-3 sp04 p214+) and Inverse Filtering (14496-3 sp04 p214) Warning: Thi...
static void sbr_gain_calc(SpectralBandReplication *sbr, SBRData *ch_data, const int e_a[2])
Calculation of levels of additional HF signal components (14496-3 sp04 p219) and Calculation of gain ...
static av_always_inline float exp2fi(int x)
2^(x) for integer x
static void make_bands(int16_t *bands, int start, int stop, int num_bands)
static void sbr_dequant(SpectralBandReplication *sbr, int id_aac)
Dequantization and stereo decoding (14496-3 sp04 p203)
static void sbr_chirp(SpectralBandReplication *sbr, SBRData *ch_data)
Chirp Factors (14496-3 sp04 p214)
AAC Spectral Band Replication function declarations.
#define ENVELOPE_ADJUSTMENT_OFFSET
#define NOISE_FLOOR_OFFSET
AAC Spectral Band Replication decoding functions.
AAC Spectral Band Replication decoding data.
static const float bands[]
simple assert() macros that are a bit more flexible than ISO C assert().
#define av_assert0(cond)
assert() equivalent, that is always enabled.
#define i(width, name, range_min, range_max)
static __device__ float sqrtf(float a)
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
static av_always_inline float av_int2float(uint32_t i)
Reinterpret a 32-bit integer as a float.
common internal API header
Replacements for frequently missing libm functions.
#define LOCAL_ALIGNED_16(t, v,...)
Spectral Band Replication definitions and structures.
aacsbr functions pointers
void(* hf_apply_noise[4])(INTFLOAT(*Y)[2], const AAC_FLOAT *s_m, const AAC_FLOAT *q_filt, int noise, int kx, int m_max)
void(* autocorrelate)(const INTFLOAT x[40][2], AAC_FLOAT phi[3][2][2])
void(* hf_g_filt)(INTFLOAT(*Y)[2], const INTFLOAT(*X_high)[40][2], const AAC_FLOAT *g_filt, int m_max, intptr_t ixh)
Spectral Band Replication per channel data.
AAC_FLOAT env_facs[9][48]
INTFLOAT bw_array[5]
Chirp factors.
uint8_t s_indexmapped[9][48]
uint8_t noise_facs_q[3][5]
Noise scalefactors.
uint8_t t_env_num_env_old
Envelope time border of the last envelope of the previous frame.
uint8_t env_facs_q[9][48]
Envelope scalefactors.
uint8_t bs_invf_mode[2][5]
AAC_FLOAT noise_facs[3][5]
uint8_t t_env[9]
Envelope time borders.
Spectral Band Replication.
AAC_SIGNE m[2]
M' and M respectively, M is the number of QMF subbands that use SBR.
AAC_FLOAT s_m[8][48]
Sinusoidal levels.
unsigned bs_smoothing_mode
unsigned bs_limiter_gains
AAC_SIGNE kx[2]
kx', and kx respectively, kx is the first QMF subband where SBR is used.
uint8_t s_mapped[8][48]
Sinusoidal presence, remapped.
AAC_FLOAT e_origmapped[8][48]
Dequantized envelope scalefactors, remapped.
AAC_SIGNE n_q
Number of noise floor bands.
AAC_FLOAT q_m[8][48]
Amplitude adjusted noise scalefactors.
AAC_SIGNE n_lim
Number of limiter bands.
uint16_t f_tablelim[30]
Frequency borders for the limiter.
AAC_FLOAT q_mapped[8][48]
Dequantized noise scalefactors, remapped.
AAC_FLOAT e_curr[8][48]
Estimated envelope.
AAC_SIGNE n[2]
N_Low and N_High respectively, the number of frequency bands for low and high resolution.