00001
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046 #if defined(FORCE_ALL_GENERICS) || \
00047 defined(FORCE_GENERIC_TRANS32_REALCOMPLEXFFT) || \
00048 !defined(TARGET_SPECIFIC_TRANS32_REALCOMPLEXFFT)
00049
00050 #include "trans_dsp32_twiddle_factors.h"
00051
00052 void dsp32_trans_realcomplexfft(dsp32_complex_t *vect1, dsp32_t *vect2, int nlog)
00053 {
00054 int size;
00055 int m;
00056 int stage, j, r, indice, inc_indice, r_brev, r_temp;
00057 dsp32_t e_real, e_imag, e2_real, e2_imag, e3_real, e3_imag;
00058 dsp32_t temp;
00059 int i0, i1, i2, i3;
00060
00061 long long a0_real, a0_imag, a1_real, a1_imag, a2_real, a2_imag, a3_real, a3_imag;
00062
00063 size = 1 << nlog;
00064
00065 for(r=0; r<size; r += 4)
00066 {
00067 r_brev = 0;
00068 r_temp = r;
00069 for(j=0; j<nlog; j++)
00070 {
00071 r_brev <<= 1;
00072 if (r_temp & 1)
00073 r_brev |= 1;
00074 r_temp >>= 1;
00075 }
00076
00077 a0_real = vect2[r_brev];
00078 r_brev += size >> 2;
00079 a1_real = vect2[r_brev];
00080 r_brev += size >> 2;
00081 a2_real = vect2[r_brev];
00082 r_brev += size >> 2;
00083 a3_real = vect2[r_brev];
00084
00085 vect1[r].real = (a0_real + a2_real + a1_real + a3_real) >> 2;
00086 vect1[r].imag = 0;
00087 vect1[r + 2].real = (a0_real + a2_real - a1_real - a3_real) >> 2;
00088 vect1[r + 2].imag = 0;
00089
00090 vect1[r + 1].real = (a0_real - a2_real) >> 2;
00091 vect1[r + 1].imag = (-a1_real + a3_real) >> 2;
00092 vect1[r + 3].real = (a0_real - a2_real) >> 2;
00093 vect1[r + 3].imag = (a1_real - a3_real) >> 2;
00094 }
00095
00096 m = 4;
00097 inc_indice = (DSP32_N_TWIDDLE_FACTORS/8);
00098 for(stage=4; stage <= nlog; stage+=2)
00099 {
00100 m <<= 2;
00101
00102 indice = 0;
00103
00104 for(r=0; r<size; r += m)
00105 {
00106 i0 = r;
00107 i1 = i0 + (m >> 2);
00108 i2 = i1 + (m >> 2);
00109 i3 = i2 + (m >> 2);
00110
00111 a0_real = vect1[i0].real;
00112 a0_imag = vect1[i0].imag;
00113 a1_real = vect1[i2].real;
00114 a1_imag = vect1[i2].imag;
00115 a2_real = vect1[i1].real;
00116 a2_imag = vect1[i1].imag;
00117 a3_real = vect1[i3].real;
00118 a3_imag = vect1[i3].imag;
00119
00120 vect1[i0].real = (a0_real + a2_real + a1_real + a3_real) >> 2;
00121 vect1[i0].imag = (a0_imag + a2_imag + a1_imag + a3_imag) >> 2;
00122 vect1[i2].real = (a0_real + a2_real - a1_real - a3_real) >> 2;
00123 vect1[i2].imag = (a0_imag + a2_imag - a1_imag - a3_imag) >> 2;
00124
00125 vect1[i1].real = (a0_real - a2_real + a1_imag - a3_imag) >> 2;
00126 vect1[i1].imag = (a0_imag - a2_imag - a1_real + a3_real) >> 2;
00127 vect1[i3].real = (a0_real - a2_real - a1_imag + a3_imag) >> 2;
00128 vect1[i3].imag = (a0_imag - a2_imag + a1_real - a3_real) >> 2;
00129 }
00130
00131 for(j=1; j<(m >> 2); j++)
00132 {
00133 indice += inc_indice;
00134
00135
00136 e_real = dsp32_twiddle_factors[indice];
00137 e_imag = dsp32_twiddle_factors[indice + 1];
00138
00139 #if DSP_OPTIMIZATION & DSP_OPTI_SIZE
00140
00141 if (indice >= DSP32_N_TWIDDLE_FACTORS/4)
00142 {
00143 r = DSP32_N_TWIDDLE_FACTORS - (indice << 1);
00144 e2_real = -dsp32_twiddle_factors[r];
00145 e2_imag = dsp32_twiddle_factors[r + 1];
00146
00147 if (r < DSP32_N_TWIDDLE_FACTORS/3)
00148 {
00149 r = indice - r;
00150 e3_real = -dsp32_twiddle_factors[r];
00151 e3_imag = -dsp32_twiddle_factors[r + 1];
00152 }
00153 else
00154 {
00155 r -= indice;
00156 e3_real = -dsp32_twiddle_factors[r];
00157 e3_imag = dsp32_twiddle_factors[r + 1];
00158 }
00159 }
00160 else
00161 {
00162 r = indice << 1;
00163 e2_real = dsp32_twiddle_factors[r];
00164 e2_imag = dsp32_twiddle_factors[r + 1];
00165
00166 if (r >= DSP32_N_TWIDDLE_FACTORS/3)
00167 {
00168 r = DSP32_N_TWIDDLE_FACTORS - (indice + r);
00169 e3_real = -dsp32_twiddle_factors[r];
00170 e3_imag = dsp32_twiddle_factors[r + 1];
00171 }
00172 else
00173 {
00174 r += indice;
00175 e3_real = dsp32_twiddle_factors[r];
00176 e3_imag = dsp32_twiddle_factors[r + 1];
00177 }
00178 }
00179
00180 #else
00181
00182 e2_real = dsp32_twiddle_factors2[indice*2];
00183 e2_imag = dsp32_twiddle_factors2[indice*2 + 1];
00184
00185
00186 e3_real = dsp32_twiddle_factors2[indice*2 + 2];
00187 e3_imag = dsp32_twiddle_factors2[indice*2 + 3];
00188 #endif
00189
00190 for(r=0; r<size; r += m)
00191 {
00192 i0 = j + r;
00193 i1 = i0 + (m >> 2);
00194 i2 = i1 + (m >> 2);
00195 i3 = i2 + (m >> 2);
00196
00197 #if DSP_OPTIMIZATION & DSP_OPTI_ACCURACY
00198 a0_real = vect1[i0].real;
00199 a0_imag = vect1[i0].imag;
00200 #else
00201 a0_real = vect1[i0].real >> 2;
00202 a0_imag = vect1[i0].imag >> 2;
00203 #endif
00204
00205 a1_real = vect1[i2].real;
00206 a1_imag = vect1[i2].imag;
00207 a2_real = vect1[i1].real;
00208 a2_imag = vect1[i1].imag;
00209 a3_real = vect1[i3].real;
00210 a3_imag = vect1[i3].imag;
00211
00212 #if DSP_OPTIMIZATION & DSP_OPTI_ACCURACY
00213
00214 temp = (a1_real*e_real - a1_imag*e_imag) >> (DSP32_QB);
00215 a1_imag = (a1_real*e_imag + a1_imag*e_real) >> (DSP32_QB);
00216 a1_real = temp;
00217 temp = (a2_real*e2_real - a2_imag*e2_imag) >> (DSP32_QB);
00218 a2_imag = (a2_real*e2_imag + a2_imag*e2_real) >> (DSP32_QB);
00219 a2_real = temp;
00220 temp = (a3_real*e3_real - a3_imag*e3_imag) >> (DSP32_QB);
00221 a3_imag = (a3_real*e3_imag + a3_imag*e3_real) >> (DSP32_QB);
00222 a3_real = temp;
00223
00224 vect1[i0].real = (a0_real + a2_real + (a1_real + a3_real)) >> 2;
00225 vect1[i0].imag = (a0_imag + a2_imag + (a1_imag + a3_imag)) >> 2;
00226 vect1[i2].real = (a0_real + a2_real - (a1_real + a3_real)) >> 2;
00227 vect1[i2].imag = (a0_imag + a2_imag - (a1_imag + a3_imag)) >> 2;
00228
00229 vect1[i1].real = (a0_real - a2_real + (a1_imag - a3_imag)) >> 2;
00230 vect1[i1].imag = (a0_imag - a2_imag - (a1_real - a3_real)) >> 2;
00231 vect1[i3].real = (a0_real - a2_real - (a1_imag - a3_imag)) >> 2;
00232 vect1[i3].imag = (a0_imag - a2_imag + (a1_real - a3_real)) >> 2;
00233 #else
00234 temp = (a1_real*e_real - a1_imag*e_imag) >> (DSP32_QB + 1);
00235 a1_imag = (a1_real*e_imag + a1_imag*e_real) >> (DSP32_QB + 1);
00236 a1_real = temp;
00237 temp = (a2_real*e2_real - a2_imag*e2_imag) >> (DSP32_QB + 1);
00238 a2_imag = (a2_real*e2_imag + a2_imag*e2_real) >> (DSP32_QB + 1);
00239 a2_real = temp;
00240 temp = (a3_real*e3_real - a3_imag*e3_imag) >> (DSP32_QB + 1);
00241 a3_imag = (a3_real*e3_imag + a3_imag*e3_real) >> (DSP32_QB + 1);
00242 a3_real = temp;
00243
00244 vect1[i0].real = (a0_real + a2_real + (a1_real + a3_real));
00245 vect1[i0].imag = (a0_imag + a2_imag + (a1_imag + a3_imag));
00246 vect1[i2].real = (a0_real + a2_real - (a1_real + a3_real));
00247 vect1[i2].imag = (a0_imag + a2_imag - (a1_imag + a3_imag));
00248
00249 vect1[i1].real = (a0_real - a2_real + (a1_imag - a3_imag));
00250 vect1[i1].imag = (a0_imag - a2_imag - (a1_real - a3_real));
00251 vect1[i3].real = (a0_real - a2_real - (a1_imag - a3_imag));
00252 vect1[i3].imag = (a0_imag - a2_imag + (a1_real - a3_real));
00253 #endif
00254 }
00255 }
00256 inc_indice >>= 2;
00257 }
00258 }
00259
00260 #endif