Go to the documentation of this file.
52 if (-126 <= x && x <= 128)
69 int k, previous, present;
72 base =
powf((
float)stop / start, 1.0
f / 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.000001
f;
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.0
f ||
198 alpha0[k][0] * alpha0[k][0] + alpha0[k][1] * alpha0[k][1] >= 16.0
f) {
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.584893192
f, 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]],
326 for (
i = 2 * ch_data->
t_env[e]; i < 2 * ch_data->t_env[e + 1];
i++) {
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]));
333 for (
i = 2 * ch_data->
t_env[e]; i < 2 * ch_data->t_env[e + 1];
i++) {
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;
unsigned bs_limiter_gains
static void sbr_chirp(SpectralBandReplication *sbr, SBRData *ch_data)
Chirp Factors (14496-3 sp04 p214)
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...
AAC_SIGNE m[2]
M' and M respectively, M is the number of QMF subbands that use SBR.
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 s_mapped[8][48]
Sinusoidal presence, remapped.
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 ...
uint8_t t_env[9]
Envelope time borders.
static av_always_inline float av_int2float(uint32_t i)
Reinterpret a 32-bit integer as a float.
AAC_FLOAT noise_facs[3][5]
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)
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
AAC_FLOAT env_facs[9][48]
#define LOCAL_ALIGNED_16(t, v,...)
#define av_assert0(cond)
assert() equivalent, that is always enabled.
#define NOISE_FLOOR_OFFSET
void(* autocorrelate)(const INTFLOAT x[40][2], AAC_FLOAT phi[3][2][2])
AAC_FLOAT e_origmapped[8][48]
Dequantized envelope scalefactors, remapped.
static const float bands[]
AAC_SIGNE n_lim
Number of limiter bands.
uint16_t f_tablelim[30]
Frequency borders for the limiter.
aacsbr functions pointers
static __device__ float sqrtf(float a)
void(* hf_g_filt)(INTFLOAT(*Y)[2], const INTFLOAT(*X_high)[40][2], const AAC_FLOAT *g_filt, int m_max, intptr_t ixh)
static void make_bands(int16_t *bands, int start, int stop, int num_bands)
AAC_SIGNE n[2]
N_Low and N_High respectively, the number of frequency bands for low and high resolution.
unsigned bs_smoothing_mode
Undefined Behavior In the C some operations are like signed integer dereferencing freed accessing outside allocated Undefined Behavior must not occur in a C it is not safe even if the output of undefined operations is unused The unsafety may seem nit picking but Optimizing compilers have in fact optimized code on the assumption that no undefined Behavior occurs Optimizing code based on wrong assumptions can and has in some cases lead to effects beyond the output of computations The signed integer overflow problem in speed critical code Code which is highly optimized and works with signed integers sometimes has the problem that often the output of the computation does not c
AAC_FLOAT q_m[8][48]
Amplitude adjusted noise scalefactors.
Spectral Band Replication.
uint8_t bs_invf_mode[2][5]
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)
AAC_SIGNE n_q
Number of noise floor bands.
AAC_FLOAT q_mapped[8][48]
Dequantized noise scalefactors, remapped.
#define i(width, name, range_min, range_max)
Spectral Band Replication per channel data.
INTFLOAT bw_array[5]
Chirp factors.
static void aacsbr_func_ptr_init(AACSBRContext *c)
static void sbr_dequant(SpectralBandReplication *sbr, int id_aac)
Dequantization and stereo decoding (14496-3 sp04 p203)
uint8_t noise_facs_q[3][5]
Noise scalefactors.
static av_always_inline float exp2fi(int x)
2^(x) for integer x
#define ENVELOPE_ADJUSTMENT_OFFSET
AAC_FLOAT s_m[8][48]
Sinusoidal levels.
uint8_t s_indexmapped[9][48]
AAC_SIGNE kx[2]
kx', and kx respectively, kx is the first QMF subband where SBR is used.
AAC_FLOAT e_curr[8][48]
Estimated envelope.