sbr_dct.c
来自「这是著名的TCPMP播放器在WINDWOWS,和WINCE下编译通过的源程序.笔」· C语言 代码 · 共 1,786 行 · 第 1/5 页
C
1,786 行
f274 = MUL_C(COEF_CONST(1.3718313541934939), f196);
y[11] = f273 - f272;
y[21] = f274 - f273;
f277 = f235 + f194;
f278 = MUL_F(FRAC_CONST(-0.2075082269882114), f235);
f279 = MUL_F(FRAC_CONST(0.8032075314806448), f277);
f280 = MUL_C(COEF_CONST(1.3989068359730783), f194);
y[13] = f278 + f279;
y[19] = f280 - f279;
f283 = f192 - f233;
f284 = MUL_F(FRAC_CONST(-0.0693921705079408), f233);
f285 = MUL_F(FRAC_CONST(0.7409511253549591), f283);
f286 = MUL_C(COEF_CONST(1.4125100802019774), f192);
y[15] = f285 - f284;
y[17] = f286 - f285;
}
#else
#define n 32
#define log2n 5
// w_array_real[i] = cos(2*M_PI*i/32)
static const real_t w_array_real[] = {
FRAC_CONST(1.000000000000000), FRAC_CONST(0.980785279337272),
FRAC_CONST(0.923879528329380), FRAC_CONST(0.831469603195765),
FRAC_CONST(0.707106765732237), FRAC_CONST(0.555570210304169),
FRAC_CONST(0.382683402077046), FRAC_CONST(0.195090284503576),
FRAC_CONST(0.000000000000000), FRAC_CONST(-0.195090370246552),
FRAC_CONST(-0.382683482845162), FRAC_CONST(-0.555570282993553),
FRAC_CONST(-0.707106827549476), FRAC_CONST(-0.831469651765257),
FRAC_CONST(-0.923879561784627), FRAC_CONST(-0.980785296392607)
};
// w_array_imag[i] = sin(-2*M_PI*i/32)
static const real_t w_array_imag[] = {
FRAC_CONST(0.000000000000000), FRAC_CONST(-0.195090327375064),
FRAC_CONST(-0.382683442461104), FRAC_CONST(-0.555570246648862),
FRAC_CONST(-0.707106796640858), FRAC_CONST(-0.831469627480512),
FRAC_CONST(-0.923879545057005), FRAC_CONST(-0.980785287864940),
FRAC_CONST(-1.000000000000000), FRAC_CONST(-0.980785270809601),
FRAC_CONST(-0.923879511601754), FRAC_CONST(-0.831469578911016),
FRAC_CONST(-0.707106734823616), FRAC_CONST(-0.555570173959476),
FRAC_CONST(-0.382683361692986), FRAC_CONST(-0.195090241632088)
};
// FFT decimation in frequency
// 4*16*2+16=128+16=144 multiplications
// 6*16*2+10*8+4*16*2=192+80+128=400 additions
static void fft_dif(real_t * Real, real_t * Imag)
{
real_t w_real, w_imag; // For faster access
real_t point1_real, point1_imag, point2_real, point2_imag; // For faster access
uint32_t j, i, i2, w_index; // Counters
// First 2 stages of 32 point FFT decimation in frequency
// 4*16*2=64*2=128 multiplications
// 6*16*2=96*2=192 additions
// Stage 1 of 32 point FFT decimation in frequency
for (i = 0; i < 16; i++)
{
point1_real = Real[i];
point1_imag = Imag[i];
i2 = i+16;
point2_real = Real[i2];
point2_imag = Imag[i2];
w_real = w_array_real[i];
w_imag = w_array_imag[i];
// temp1 = x[i] - x[i2]
point1_real -= point2_real;
point1_imag -= point2_imag;
// x[i1] = x[i] + x[i2]
Real[i] += point2_real;
Imag[i] += point2_imag;
// x[i2] = (x[i] - x[i2]) * w
Real[i2] = (MUL_F(point1_real,w_real) - MUL_F(point1_imag,w_imag));
Imag[i2] = (MUL_F(point1_real,w_imag) + MUL_F(point1_imag,w_real));
}
// Stage 2 of 32 point FFT decimation in frequency
for (j = 0, w_index = 0; j < 8; j++, w_index += 2)
{
w_real = w_array_real[w_index];
w_imag = w_array_imag[w_index];
i = j;
point1_real = Real[i];
point1_imag = Imag[i];
i2 = i+8;
point2_real = Real[i2];
point2_imag = Imag[i2];
// temp1 = x[i] - x[i2]
point1_real -= point2_real;
point1_imag -= point2_imag;
// x[i1] = x[i] + x[i2]
Real[i] += point2_real;
Imag[i] += point2_imag;
// x[i2] = (x[i] - x[i2]) * w
Real[i2] = (MUL_F(point1_real,w_real) - MUL_F(point1_imag,w_imag));
Imag[i2] = (MUL_F(point1_real,w_imag) + MUL_F(point1_imag,w_real));
i = j+16;
point1_real = Real[i];
point1_imag = Imag[i];
i2 = i+8;
point2_real = Real[i2];
point2_imag = Imag[i2];
// temp1 = x[i] - x[i2]
point1_real -= point2_real;
point1_imag -= point2_imag;
// x[i1] = x[i] + x[i2]
Real[i] += point2_real;
Imag[i] += point2_imag;
// x[i2] = (x[i] - x[i2]) * w
Real[i2] = (MUL_F(point1_real,w_real) - MUL_F(point1_imag,w_imag));
Imag[i2] = (MUL_F(point1_real,w_imag) + MUL_F(point1_imag,w_real));
}
// Stage 3 of 32 point FFT decimation in frequency
// 2*4*2=16 multiplications
// 4*4*2+6*4*2=10*8=80 additions
for (i = 0; i < n; i += 8)
{
i2 = i+4;
point1_real = Real[i];
point1_imag = Imag[i];
point2_real = Real[i2];
point2_imag = Imag[i2];
// out[i1] = point1 + point2
Real[i] += point2_real;
Imag[i] += point2_imag;
// out[i2] = point1 - point2
Real[i2] = point1_real - point2_real;
Imag[i2] = point1_imag - point2_imag;
}
w_real = w_array_real[4]; // = sqrt(2)/2
// w_imag = -w_real; // = w_array_imag[4]; // = -sqrt(2)/2
for (i = 1; i < n; i += 8)
{
i2 = i+4;
point1_real = Real[i];
point1_imag = Imag[i];
point2_real = Real[i2];
point2_imag = Imag[i2];
// temp1 = x[i] - x[i2]
point1_real -= point2_real;
point1_imag -= point2_imag;
// x[i1] = x[i] + x[i2]
Real[i] += point2_real;
Imag[i] += point2_imag;
// x[i2] = (x[i] - x[i2]) * w
Real[i2] = MUL_F(point1_real+point1_imag, w_real);
Imag[i2] = MUL_F(point1_imag-point1_real, w_real);
}
for (i = 2; i < n; i += 8)
{
i2 = i+4;
point1_real = Real[i];
point1_imag = Imag[i];
point2_real = Real[i2];
point2_imag = Imag[i2];
// x[i] = x[i] + x[i2]
Real[i] += point2_real;
Imag[i] += point2_imag;
// x[i2] = (x[i] - x[i2]) * (-i)
Real[i2] = point1_imag - point2_imag;
Imag[i2] = point2_real - point1_real;
}
w_real = w_array_real[12]; // = -sqrt(2)/2
// w_imag = w_real; // = w_array_imag[12]; // = -sqrt(2)/2
for (i = 3; i < n; i += 8)
{
i2 = i+4;
point1_real = Real[i];
point1_imag = Imag[i];
point2_real = Real[i2];
point2_imag = Imag[i2];
// temp1 = x[i] - x[i2]
point1_real -= point2_real;
point1_imag -= point2_imag;
// x[i1] = x[i] + x[i2]
Real[i] += point2_real;
Imag[i] += point2_imag;
// x[i2] = (x[i] - x[i2]) * w
Real[i2] = MUL_F(point1_real-point1_imag, w_real);
Imag[i2] = MUL_F(point1_real+point1_imag, w_real);
}
// Stage 4 of 32 point FFT decimation in frequency (no multiplications)
// 16*4=64 additions
for (i = 0; i < n; i += 4)
{
i2 = i+2;
point1_real = Real[i];
point1_imag = Imag[i];
point2_real = Real[i2];
point2_imag = Imag[i2];
// x[i1] = x[i] + x[i2]
Real[i] += point2_real;
Imag[i] += point2_imag;
// x[i2] = x[i] - x[i2]
Real[i2] = point1_real - point2_real;
Imag[i2] = point1_imag - point2_imag;
}
for (i = 1; i < n; i += 4)
{
i2 = i+2;
point1_real = Real[i];
point1_imag = Imag[i];
point2_real = Real[i2];
point2_imag = Imag[i2];
// x[i] = x[i] + x[i2]
Real[i] += point2_real;
Imag[i] += point2_imag;
// x[i2] = (x[i] - x[i2]) * (-i)
Real[i2] = point1_imag - point2_imag;
Imag[i2] = point2_real - point1_real;
}
// Stage 5 of 32 point FFT decimation in frequency (no multiplications)
// 16*4=64 additions
for (i = 0; i < n; i += 2)
{
i2 = i+1;
point1_real = Real[i];
point1_imag = Imag[i];
point2_real = Real[i2];
point2_imag = Imag[i2];
// out[i1] = point1 + point2
Real[i] += point2_real;
Imag[i] += point2_imag;
// out[i2] = point1 - point2
Real[i2] = point1_real - point2_real;
Imag[i2] = point1_imag - point2_imag;
}
#ifdef REORDER_IN_FFT
FFTReorder(Real, Imag);
#endif // #ifdef REORDER_IN_FFT
}
#undef n
#undef log2n
static const real_t dct4_64_tab[] = {
COEF_CONST(0.999924719333649), COEF_CONST(0.998118102550507),
COEF_CONST(0.993906974792480), COEF_CONST(0.987301409244537),
COEF_CONST(0.978317379951477), COEF_CONST(0.966976463794708),
COEF_CONST(0.953306019306183), COEF_CONST(0.937339007854462),
COEF_CONST(0.919113874435425), COEF_CONST(0.898674488067627),
COEF_CONST(0.876070082187653), COEF_CONST(0.851355195045471),
COEF_CONST(0.824589252471924), COEF_CONST(0.795836925506592),
COEF_CONST(0.765167236328125), COEF_CONST(0.732654273509979),
COEF_CONST(0.698376238346100), COEF_CONST(0.662415742874146),
COEF_CONST(0.624859452247620), COEF_CONST(0.585797846317291),
COEF_CONST(0.545324981212616), COEF_CONST(0.503538429737091),
COEF_CONST(0.460538715124130), COEF_CONST(0.416429549455643),
COEF_CONST(0.371317148208618), COEF_CONST(0.325310230255127),
COEF_CONST(0.278519600629807), COEF_CONST(0.231058135628700),
COEF_CONST(0.183039888739586), COEF_CONST(0.134580686688423),
COEF_CONST(0.085797272622585), COEF_CONST(0.036807164549828),
COEF_CONST(-1.012196302413940), COEF_CONST(-1.059438824653626),
COEF_CONST(-1.104129195213318), COEF_CONST(-1.146159529685974),
COEF_CONST(-1.185428738594055), COEF_CONST(-1.221842169761658),
COEF_CONST(-1.255311965942383), COEF_CONST(-1.285757660865784),
COEF_CONST(-1.313105940818787), COEF_CONST(-1.337290763854981),
COEF_CONST(-1.358253836631775), COEF_CONST(-1.375944852828980),
COEF_CONST(-1.390321016311646), COEF_CONST(-1.401347875595093),
COEF_CONST(-1.408998727798462), COEF_CONST(-1.413255214691162),
COEF_CONST(-1.414107084274292), COEF_CONST(-1.411552190780640),
COEF_CONST(-1.405596733093262), COEF_CONST(-1.396255016326904),
COEF_CONST(-1.383549690246582), COEF_CONST(-1.367511272430420),
COEF_CONST(-1.348178386688232), COEF_CONST(-1.325597524642944),
COEF_CONST(-1.299823284149170), COEF_CONST(-1.270917654037476),
COEF_CONST(-1.238950133323669), COEF_CONST(-1.203998088836670),
COEF_CONST(-1.166145324707031), COEF_CONST(-1.125483393669128),
COEF_CONST(-1.082109928131104), COEF_CONST(-1.036129593849182),
COEF_CONST(-0.987653195858002), COEF_CONST(-0.936797380447388),
COEF_CONST(-0.883684754371643), COEF_CONST(-0.828443288803101),
COEF_CONST(-0.771206021308899), COEF_CONST(-0.712110757827759),
COEF_CONST(-0.651300072669983), COEF_CONST(-0.588920354843140),
COEF_CONST(-0.525121808052063), COEF_CONST(-0.460058242082596),
COEF_CONST(-0.393886327743530), COEF_CONST(-0.326765477657318),
COEF_CONST(-0.258857429027557), COEF_CONST(-0.190325915813446),
COEF_CONST(-0.121335685253143), COEF_CONST(-0.052053272724152),
COEF_CONST(0.017354607582092), COEF_CONST(0.086720645427704),
COEF_CONST(0.155877828598022), COEF_CONST(0.224659323692322),
COEF_CONST(0.292899727821350), COEF_CONST(0.360434412956238),
COEF_CONST(0.427100926637650), COEF_CONST(0.492738455533981),
COEF_CONST(0.557188928127289), COEF_CONST(0.620297133922577),
COEF_CONST(0.681910991668701), COEF_CONST(0.741881847381592),
COEF_CONST(0.800065577030182), COEF_CONST(0.856321990489960),
COEF_CONST(0.910515367984772), COEF_CONST(0.962515234947205),
COEF_CONST(1.000000000000000), COEF_CONST(0.998795449733734),
COEF_CONST(0.995184719562531), COEF_CONST(0.989176511764526),
COEF_CONST(0.980785250663757), COEF_CONST(0.970031261444092),
COEF_CONST(0.956940352916718), COEF_CONST(0.941544055938721),
COEF_CONST(0.923879504203796), COEF_CONST(0.903989315032959),
COEF_CONST(0.881921231746674), COEF_CONST(0.857728600502014),
COEF_CONST(0.831469595432281), COEF_CONST(0.803207516670227),
COEF_CONST(0.773010432720184), COEF_CONST(0.740951120853424),
COEF_CONST(0.707106769084930), COEF_CONST(0.671558916568756),
COEF_CONST(0.634393274784088), COEF_CONST(0.595699310302734),
COEF_CONST(0.555570185184479), COEF_CONST(0.514102697372437),
COEF_CONST(0.471396654844284), COEF_CONST(0.427555114030838),
COEF_CONST(0.382683426141739), COEF_CONST(0.336889833211899),
COEF_CONST(0.290284633636475), COEF_CONST(0.242980122566223),
COEF_CONST(0.195090234279633), COEF_CONST(0.146730497479439),
COEF_CONST(0.098017133772373), COEF_CONST(0.049067649990320),
COEF_CONST(-1.000000000000000), COEF_CONST(-1.047863125801086),
COEF_CONST(-1.093201875686646), COEF_CONST(-1.135906934738159),
COEF_CONST(-1.175875544548035), COEF_CONST(-1.213011503219605),
COEF_CONST(-1.247225046157837), COEF_CONST(-1.278433918952942),
COEF_CONST(-1.306562900543213), COEF_CONST(-1.331544399261475),
COEF_CONST(-1.353317975997925), COEF_CONST(-1.371831417083740),
COEF_CONST(-1.387039899826050), COEF_CONST(-1.398906826972961),
COEF_CONST(-1.407403707504273), COEF_CONST(-1.412510156631470),
COEF_CONST(0), COEF_CONST(-1.412510156631470),
COEF_CONST(-1.407403707504273), COEF_CONST(-1.398906826972961),
COEF_CONST(-1.387039899826050), COEF_CONST(-1.371831417083740),
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?