📄 sbr_fbt.c
字号:
k1 = k0 << 1;
} else {
twoRegions = 0;
k1 = k2;
}
nrBand0 = (uint8_t)(2 * find_bands(0, bands, k0, k1));
nrBand0 = min(nrBand0, 63);
if (nrBand0 <= 0)
return 1;
q = find_initial_power(nrBand0, k0, k1);
#ifdef FIXED_POINT
qk = (real_t)k0 << REAL_BITS;
//A_1 = (int32_t)((qk + REAL_CONST(0.5)) >> REAL_BITS);
A_1 = k0;
#else
qk = REAL_CONST(k0);
A_1 = (int32_t)(qk + .5);
#endif
for (k = 0; k <= nrBand0; k++)
{
int32_t A_0 = A_1;
#ifdef FIXED_POINT
qk = MUL_R(qk,q);
A_1 = (int32_t)((qk + REAL_CONST(0.5)) >> REAL_BITS);
#else
qk *= q;
A_1 = (int32_t)(qk + 0.5);
#endif
vDk0[k] = A_1 - A_0;
}
/* needed? */
qsort(vDk0, nrBand0, sizeof(vDk0[0]), longcmp);
vk0[0] = k0;
for (k = 1; k <= nrBand0; k++)
{
vk0[k] = vk0[k-1] + vDk0[k-1];
if (vDk0[k-1] == 0)
return 1;
}
if (!twoRegions)
{
for (k = 0; k <= nrBand0; k++)
sbr->f_master[k] = (uint8_t) vk0[k];
sbr->N_master = nrBand0;
sbr->N_master = min(sbr->N_master, 64);
return 0;
}
nrBand1 = (uint8_t)(2 * find_bands(1 /* warped */, bands, k1, k2));
nrBand1 = min(nrBand1, 63);
q = find_initial_power(nrBand1, k1, k2);
#ifdef FIXED_POINT
qk = (real_t)k1 << REAL_BITS;
//A_1 = (int32_t)((qk + REAL_CONST(0.5)) >> REAL_BITS);
A_1 = k1;
#else
qk = REAL_CONST(k1);
A_1 = (int32_t)(qk + .5);
#endif
for (k = 0; k <= nrBand1 - 1; k++)
{
int32_t A_0 = A_1;
#ifdef FIXED_POINT
qk = MUL_R(qk,q);
A_1 = (int32_t)((qk + REAL_CONST(0.5)) >> REAL_BITS);
#else
qk *= q;
A_1 = (int32_t)(qk + 0.5);
#endif
vDk1[k] = A_1 - A_0;
}
if (vDk1[0] < vDk0[nrBand0 - 1])
{
int32_t change;
/* needed? */
qsort(vDk1, nrBand1 + 1, sizeof(vDk1[0]), longcmp);
change = vDk0[nrBand0 - 1] - vDk1[0];
vDk1[0] = vDk0[nrBand0 - 1];
vDk1[nrBand1 - 1] = vDk1[nrBand1 - 1] - change;
}
/* needed? */
qsort(vDk1, nrBand1, sizeof(vDk1[0]), longcmp);
vk1[0] = k1;
for (k = 1; k <= nrBand1; k++)
{
vk1[k] = vk1[k-1] + vDk1[k-1];
if (vDk1[k-1] == 0)
return 1;
}
sbr->N_master = nrBand0 + nrBand1;
sbr->N_master = min(sbr->N_master, 64);
for (k = 0; k <= nrBand0; k++)
{
sbr->f_master[k] = (uint8_t) vk0[k];
}
for (k = nrBand0 + 1; k <= sbr->N_master; k++)
{
sbr->f_master[k] = (uint8_t) vk1[k - nrBand0];
}
#if 0
printf("f_master[%d]: ", sbr->N_master);
for (k = 0; k <= sbr->N_master; k++)
{
printf("%d ", sbr->f_master[k]);
}
printf("\n");
#endif
return 0;
}
/* calculate the derived frequency border tables from f_master */
uint8_t derived_frequency_table(sbr_info *sbr, uint8_t bs_xover_band,
uint8_t k2)
{
uint8_t k, i;
uint32_t minus;
/* The following relation shall be satisfied: bs_xover_band < N_Master */
if (sbr->N_master <= bs_xover_band)
return 1;
sbr->N_high = sbr->N_master - bs_xover_band;
sbr->N_low = (sbr->N_high>>1) + (sbr->N_high - ((sbr->N_high>>1)<<1));
sbr->n[0] = sbr->N_low;
sbr->n[1] = sbr->N_high;
for (k = 0; k <= sbr->N_high; k++)
{
sbr->f_table_res[HI_RES][k] = sbr->f_master[k + bs_xover_band];
}
sbr->M = sbr->f_table_res[HI_RES][sbr->N_high] - sbr->f_table_res[HI_RES][0];
sbr->kx = sbr->f_table_res[HI_RES][0];
if (sbr->kx > 32)
return 1;
if (sbr->kx + sbr->M > 64)
return 1;
minus = (sbr->N_high & 1) ? 1 : 0;
for (k = 0; k <= sbr->N_low; k++)
{
if (k == 0)
i = 0;
else
i = (uint8_t)(2*k - minus);
sbr->f_table_res[LO_RES][k] = sbr->f_table_res[HI_RES][i];
}
#if 0
printf("bs_freq_scale: %d\n", sbr->bs_freq_scale);
printf("bs_limiter_bands: %d\n", sbr->bs_limiter_bands);
printf("f_table_res[HI_RES][%d]: ", sbr->N_high);
for (k = 0; k <= sbr->N_high; k++)
{
printf("%d ", sbr->f_table_res[HI_RES][k]);
}
printf("\n");
#endif
#if 0
printf("f_table_res[LO_RES][%d]: ", sbr->N_low);
for (k = 0; k <= sbr->N_low; k++)
{
printf("%d ", sbr->f_table_res[LO_RES][k]);
}
printf("\n");
#endif
sbr->N_Q = 0;
if (sbr->bs_noise_bands == 0)
{
sbr->N_Q = 1;
} else {
#if 0
sbr->N_Q = max(1, (int32_t)(sbr->bs_noise_bands*(log(k2/(float)sbr->kx)/log(2.0)) + 0.5));
#else
sbr->N_Q = (uint8_t)(max(1, find_bands(0, sbr->bs_noise_bands, sbr->kx, k2)));
#endif
sbr->N_Q = min(5, sbr->N_Q);
}
for (k = 0; k <= sbr->N_Q; k++)
{
if (k == 0)
{
i = 0;
} else {
/* i = i + (int32_t)((sbr->N_low - i)/(sbr->N_Q + 1 - k)); */
i = i + (sbr->N_low - i)/(sbr->N_Q + 1 - k);
}
sbr->f_table_noise[k] = sbr->f_table_res[LO_RES][i];
}
/* build table for mapping k to g in hf patching */
for (k = 0; k < 64; k++)
{
uint8_t g;
for (g = 0; g < sbr->N_Q; g++)
{
if ((sbr->f_table_noise[g] <= k) &&
(k < sbr->f_table_noise[g+1]))
{
sbr->table_map_k_to_g[k] = g;
break;
}
}
}
#if 0
printf("f_table_noise[%d]: ", sbr->N_Q);
for (k = 0; k <= sbr->N_Q; k++)
{
printf("%d ", sbr->f_table_noise[k] - sbr->kx);
}
printf("\n");
#endif
return 0;
}
/* TODO: blegh, ugly */
/* Modified to calculate for all possible bs_limiter_bands always
* This reduces the number calls to this functions needed (now only on
* header reset)
*/
void limiter_frequency_table(sbr_info *sbr)
{
#if 0
static const real_t limiterBandsPerOctave[] = { REAL_CONST(1.2),
REAL_CONST(2), REAL_CONST(3) };
#else
static const real_t limiterBandsCompare[] = { REAL_CONST(1.327152),
REAL_CONST(1.185093), REAL_CONST(1.119872) };
#endif
uint8_t k, s;
int8_t nrLim;
#if 0
real_t limBands;
#endif
sbr->f_table_lim[0][0] = sbr->f_table_res[LO_RES][0] - sbr->kx;
sbr->f_table_lim[0][1] = sbr->f_table_res[LO_RES][sbr->N_low] - sbr->kx;
sbr->N_L[0] = 1;
#if 0
printf("f_table_lim[%d][%d]: ", 0, sbr->N_L[0]);
for (k = 0; k <= sbr->N_L[0]; k++)
{
printf("%d ", sbr->f_table_lim[0][k]);
}
printf("\n");
#endif
for (s = 1; s < 4; s++)
{
int32_t limTable[100 /*TODO*/] = {0};
uint8_t patchBorders[64/*??*/] = {0};
#if 0
limBands = limiterBandsPerOctave[s - 1];
#endif
patchBorders[0] = sbr->kx;
for (k = 1; k <= sbr->noPatches; k++)
{
patchBorders[k] = patchBorders[k-1] + sbr->patchNoSubbands[k-1];
}
for (k = 0; k <= sbr->N_low; k++)
{
limTable[k] = sbr->f_table_res[LO_RES][k];
}
for (k = 1; k < sbr->noPatches; k++)
{
limTable[k+sbr->N_low] = patchBorders[k];
}
/* needed */
qsort(limTable, sbr->noPatches + sbr->N_low, sizeof(limTable[0]), longcmp);
k = 1;
nrLim = sbr->noPatches + sbr->N_low - 1;
if (nrLim < 0) // TODO: BIG FAT PROBLEM
return;
restart:
if (k <= nrLim)
{
real_t nOctaves;
if (limTable[k-1] != 0)
#if 0
nOctaves = REAL_CONST(log((float)limTable[k]/(float)limTable[k-1])/log(2.0));
#else
#ifdef FIXED_POINT
nOctaves = DIV_R((limTable[k]<<REAL_BITS),REAL_CONST(limTable[k-1]));
#else
nOctaves = (real_t)limTable[k]/(real_t)limTable[k-1];
#endif
#endif
else
nOctaves = 0;
#if 0
if ((MUL_R(nOctaves,limBands)) < REAL_CONST(0.49))
#else
if (nOctaves < limiterBandsCompare[s - 1])
#endif
{
uint8_t i;
if (limTable[k] != limTable[k-1])
{
uint8_t found = 0, found2 = 0;
for (i = 0; i <= sbr->noPatches; i++)
{
if (limTable[k] == patchBorders[i])
found = 1;
}
if (found)
{
found2 = 0;
for (i = 0; i <= sbr->noPatches; i++)
{
if (limTable[k-1] == patchBorders[i])
found2 = 1;
}
if (found2)
{
k++;
goto restart;
} else {
/* remove (k-1)th element */
limTable[k-1] = sbr->f_table_res[LO_RES][sbr->N_low];
qsort(limTable, sbr->noPatches + sbr->N_low, sizeof(limTable[0]), longcmp);
nrLim--;
goto restart;
}
}
}
/* remove kth element */
limTable[k] = sbr->f_table_res[LO_RES][sbr->N_low];
qsort(limTable, nrLim, sizeof(limTable[0]), longcmp);
nrLim--;
goto restart;
} else {
k++;
goto restart;
}
}
sbr->N_L[s] = nrLim;
for (k = 0; k <= nrLim; k++)
{
sbr->f_table_lim[s][k] = limTable[k] - sbr->kx;
}
#if 0
printf("f_table_lim[%d][%d]: ", s, sbr->N_L[s]);
for (k = 0; k <= sbr->N_L[s]; k++)
{
printf("%d ", sbr->f_table_lim[s][k]);
}
printf("\n");
#endif
}
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -