⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sbr_fbt.c

📁 tcpmp.src.0.72RC1 优秀的多媒体播放器TCPMP的源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
        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 + -