void dst_32(Int32 vec[], Int32 scratch_mem[]) /* scratch_mem size 32 */ { Int32 *temp_even = scratch_mem; Int32 i; const Int32 *pt_cos = &CosTable_16[13]; Int32 tmp0 = vec[31] >> 1; Int32 tmp1, tmp2; Int32 *pt_even = temp_even; Int32 *pt_odd = vec; Int32 *pt_vec = vec; Int32 *pt_vecN_1 = vec; Int32 tmp3; tmp1 = 0; for (i = 5; i != 0; i--) { *(pt_even++) = *(pt_vec++); tmp2 = *(pt_vec++); *(pt_even++) = *(pt_vec++); tmp3 = *(pt_vec++); *(pt_even++) = *(pt_vec++); *(pt_odd++) = tmp2 + tmp1; tmp1 = *(pt_vec++); *(pt_odd++) = tmp3 + tmp2; *(pt_odd++) = tmp1 + tmp3; } *(pt_even) = *(pt_vec++); *(pt_odd) = *(pt_vec) + tmp1; dst_16(temp_even, &scratch_mem[16]); dst_16(vec, &scratch_mem[24]); pt_vecN_1 = &vec[16]; tmp1 = temp_even[15]; tmp3 = fxp_mul32_Q31((vec[15] - tmp0) << 3, Qfmt31(0.63687550772175F)) << 2; tmp2 = temp_even[14]; *(pt_vecN_1++) = tmp3 - tmp1; vec[15] = tmp3 + tmp1; tmp1 = temp_even[13]; tmp3 = fxp_mul32_Q31((vec[14] + tmp0) << 3, Qfmt31(0.85190210461718F)); *(pt_vecN_1++) = tmp3 - tmp2; vec[14] = tmp3 + tmp2; pt_even = &temp_even[12]; pt_vec = &vec[13]; for (i = 2; i != 0; i--) { tmp3 = fxp_mul32_Q29((*(pt_vec) - tmp0), *(pt_cos--)); tmp2 = *(pt_even--); *(pt_vec--) = tmp3 + tmp1; *(pt_vecN_1++) = tmp3 - tmp1; tmp3 = fxp_mul32_Q29((*(pt_vec) + tmp0), *(pt_cos--)); tmp1 = *(pt_even--); *(pt_vec--) = tmp3 + tmp2; *(pt_vecN_1++) = tmp3 - tmp2; } for (i = 5; i != 0; i--) { tmp3 = fxp_mul32_Q31((*(pt_vec) - tmp0), *(pt_cos--)) << 1; tmp2 = *(pt_even--); *(pt_vec--) = tmp3 + tmp1; *(pt_vecN_1++) = tmp3 - tmp1; tmp3 = fxp_mul32_Q31((*(pt_vec) + tmp0), *(pt_cos--)) << 1; tmp1 = *(pt_even--); *(pt_vec--) = tmp3 + tmp2; *(pt_vecN_1++) = tmp3 - tmp2; } }
/*---------------------------------------------------------------------------- ; DEFINES ; Include all pre-processor statements here. Include conditional ; compile variables also. ----------------------------------------------------------------------------*/ #define R_SHIFT1 29 #define Qfmt29(x) (Int32)(x*((Int32)1<<R_SHIFT1) + (x>=0?0.5F:-0.5F)) #define Qfmt31(a) (Int32)(a*0x7FFFFFFF + (a>=0?0.5F:-0.5F)) const Int32 CosTable_16[14] = { Qfmt31(0.50060299823520F), Qfmt31(0.50547095989754F), Qfmt31(0.51544730992262F), Qfmt31(0.53104259108978F), Qfmt31(0.55310389603444F), Qfmt31(0.58293496820613F), Qfmt31(0.62250412303566F), Qfmt31(0.67480834145501F), Qfmt31(0.74453627100230F), Qfmt31(0.83934964541553F), Qfmt29(0.97256823786196F), Qfmt29(1.16943993343288F), Qfmt29(1.48416461631417F), Qfmt29(2.05778100995341F) }; /*---------------------------------------------------------------------------- ; LOCAL FUNCTION DEFINITIONS ; Function Prototype declaration ----------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------- ; LOCAL STORE/BUFFER/POINTER DEFINITIONS
void eight_ch_filtering(const Int32 *pQmfReal, const Int32 *pQmfImag, Int32 *mHybridReal, Int32 *mHybridImag, Int32 scratch_mem[]) { Int32 real; Int32 imag; Int32 tmp1; Int32 tmp2; real = fxp_mul32_Q29(Q29_fmt(-0.06989827306334f), pQmfReal[ 4]); real = fxp_mac32_Q31(real, Qfmt31(0.01055120626280f), pQmfReal[12]); imag = fxp_mul32_Q29(Q29_fmt(-0.06989827306334f), pQmfImag[ 4]); imag = fxp_mac32_Q31(imag, Qfmt31(0.01055120626280f), pQmfImag[12]); mHybridReal[2] = (imag - real); mHybridImag[2] = -(imag + real); real = fxp_mul32_Q29(Q29_fmt(-0.07266113929591f), pQmfReal[ 3]); real = fxp_mac32_Q31(real, Qfmt31(0.04540841899650f), pQmfReal[11]); imag = fxp_mul32_Q29(Q29_fmt(-0.07266113929591f), pQmfImag[ 3]); imag = fxp_mac32_Q31(imag, Qfmt31(0.04540841899650f), pQmfImag[11]); tmp1 = fxp_mul32_Q29(Q29_fmt(-0.38268343236509f), real); mHybridReal[3] = fxp_mac32_Q29(Q29_fmt(0.92387953251129f), imag, tmp1); tmp2 = fxp_mul32_Q29(Q29_fmt(-0.92387953251129f), real); mHybridImag[3] = fxp_mac32_Q29(Q29_fmt(-0.38268343236509f), imag, tmp2); mHybridImag[4] = fxp_mul32_Q31(Qfmt31(0.09093731860946f), (pQmfReal[ 2] - pQmfReal[10])); mHybridReal[4] = fxp_mul32_Q31(Qfmt31(0.09093731860946f), (pQmfImag[10] - pQmfImag[ 2])); real = fxp_mul32_Q29(Q29_fmt(-0.02270420949825f), pQmfReal[ 1]); real = fxp_mac32_Q31(real, Qfmt31(0.14532227859182f), pQmfReal[ 9]); imag = fxp_mul32_Q29(Q29_fmt(-0.02270420949825f), pQmfImag[ 1]); imag = fxp_mac32_Q31(imag, Qfmt31(0.14532227859182f), pQmfImag[ 9]); tmp1 = fxp_mul32_Q29(Q29_fmt(0.92387953251129f), imag); mHybridReal[5] = fxp_mac32_Q31(tmp1, Qfmt31(0.76536686473018f), real); tmp2 = fxp_mul32_Q29(Q29_fmt(-0.92387953251129f), real); mHybridImag[5] = fxp_mac32_Q31(tmp2, Qfmt31(0.76536686473018f), imag); real = fxp_mul32_Q29(Q29_fmt(-0.00527560313140f), pQmfReal[ 0]); real = fxp_mac32_Q31(real, Qfmt31(0.13979654612668f), pQmfReal[ 8]); imag = fxp_mul32_Q29(Q29_fmt(-0.00527560313140f), pQmfImag[ 0]); imag = fxp_mac32_Q31(imag, Qfmt31(0.13979654612668f), pQmfImag[ 8]); mHybridReal[6] = (imag + real); mHybridImag[6] = (imag - real); tmp1 = fxp_mul32_Q31(Qfmt31(0.21791935610828f), pQmfReal[ 7]); mHybridReal[7] = fxp_mac32_Q31(tmp1, Qfmt31(0.09026515280366f), pQmfImag[ 7]); tmp2 = fxp_mul32_Q29(Q29_fmt(-0.04513257640183f), pQmfReal[ 7]); mHybridImag[7] = fxp_mac32_Q31(tmp2, Qfmt31(0.21791935610828f), pQmfImag[ 7]); mHybridReal[0] = pQmfReal[HYBRID_FILTER_DELAY] >> 3; mHybridImag[0] = pQmfImag[HYBRID_FILTER_DELAY] >> 3; tmp1 = fxp_mul32_Q29(Q29_fmt(-0.04513257640183f), pQmfImag[ 5]); mHybridReal[1] = fxp_mac32_Q31(tmp1, Qfmt31(0.21791935610828f), pQmfReal[ 5]); tmp2 = fxp_mul32_Q31(Qfmt31(0.21791935610828f), pQmfImag[ 5]); mHybridImag[1] = fxp_mac32_Q31(tmp2, Qfmt31(0.09026515280366f), pQmfReal[ 5]); /* * 8*ifft */ ps_fft_rx8(mHybridReal, mHybridImag, scratch_mem); }
/*---------------------------------------------------------------------------- ; DEFINES ; Include all pre-processor statements here. Include conditional ; compile variables also. ----------------------------------------------------------------------------*/ #define R_SHIFT 28 #define Qfmt(x) (Int32)(x*((Int32)1<<R_SHIFT) + (x>=0?0.5F:-0.5F)) #define Qfmt31(x) (Int32)(x*(0x7FFFFFFF) + (x>=0?0.5F:-0.5F)) const Int32 CosTable_8i[8] = { Qfmt31(0.50241928618816F), Qfmt31(0.52249861493969F), Qfmt31(0.56694403481636F), Qfmt31(0.64682178335999F), Qfmt(0.78815462345125F), Qfmt(1.06067768599035F), Qfmt(1.72244709823833F), Qfmt(5.10114861868916F) }; /*---------------------------------------------------------------------------- ; LOCAL FUNCTION DEFINITIONS ; Function Prototype declaration ----------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------- ; LOCAL STORE/BUFFER/POINTER DEFINITIONS ; Variable declaration - defined here and used outside this module
void two_ch_filtering(const Int32 *pQmf_r, const Int32 *pQmf_i, Int32 *mHybrid_r, Int32 *mHybrid_i) { Int32 cum0; Int32 cum1; Int32 cum2; Int32 tmp1; Int32 tmp2; #ifndef ANDROID_DEFAULT_CODE tmp1 = qadd(pQmf_r[ 1], pQmf_r[11]); tmp2 = qadd(pQmf_i[ 1], pQmf_i[11]); #else tmp1 = pQmf_r[ 1] + pQmf_r[11]; tmp2 = pQmf_i[ 1] + pQmf_i[11]; #endif cum1 = fxp_mul32_Q31(Qfmt31(0.03798975052098f), tmp1); cum2 = fxp_mul32_Q31(Qfmt31(0.03798975052098f), tmp2); #ifndef ANDROID_DEFAULT_CODE tmp1 = qadd(pQmf_r[ 3], pQmf_r[9]); tmp2 = qadd(pQmf_i[ 3], pQmf_i[9]); #else tmp1 = pQmf_r[ 3] + pQmf_r[ 9]; tmp2 = pQmf_i[ 3] + pQmf_i[ 9]; #endif cum1 = fxp_msu32_Q31(cum1, Qfmt31(0.14586278335076f), tmp1); cum2 = fxp_msu32_Q31(cum2, Qfmt31(0.14586278335076f), tmp2); #ifndef ANDROID_DEFAULT_CODE tmp1 = qadd(pQmf_r[ 5], pQmf_r[7]); tmp2 = qadd(pQmf_i[ 5], pQmf_i[7]); #else tmp1 = pQmf_r[ 5] + pQmf_r[ 7]; tmp2 = pQmf_i[ 5] + pQmf_i[ 7]; #endif cum1 = fxp_mac32_Q31(cum1, Qfmt31(0.61193261090336f), tmp1); cum2 = fxp_mac32_Q31(cum2, Qfmt31(0.61193261090336f), tmp2); cum0 = pQmf_r[HYBRID_FILTER_DELAY] >> 1; /* HYBRID_FILTER_DELAY == 6 */ #ifndef ANDROID_DEFAULT_CODE mHybrid_r[0] = qadd(cum0, cum1); mHybrid_r[1] = qsub(cum0, cum1); #else mHybrid_r[0] = (cum0 + cum1); mHybrid_r[1] = (cum0 - cum1); #endif cum0 = pQmf_i[HYBRID_FILTER_DELAY] >> 1; /* HYBRID_FILTER_DELAY == 6 */ #ifndef ANDROID_DEFAULT_CODE mHybrid_i[0] = qadd(cum0, cum2); mHybrid_i[1] = qsub(cum0, cum2); #else mHybrid_i[0] = (cum0 + cum2); mHybrid_i[1] = (cum0 - cum2); #endif }