📄 sbr_fbt.c
字号:
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 + -