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_TRANS16_COMPLEXFFT) || \
00048 !defined(TARGET_SPECIFIC_TRANS16_COMPLEXFFT)
00049
00050 #include "trans_dsp16_twiddle_factors.h"
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00073 void dsp16_trans_complexfft(dsp16_complex_t *vect1, dsp16_complex_t *vect2, int nlog)
00074 {
00075 int size;
00076 int m;
00077 int stage, j, r, indice, inc_indice, r_brev, r_temp;
00078 dsp16_t e_real, e_imag, e2_real, e2_imag, e3_real, e3_imag;
00079 dsp16_t temp;
00080 int i0, i1, i2, i3;
00081 dsp32_t a0_real, a0_imag, a1_real, a1_imag, a2_real, a2_imag, a3_real, a3_imag;
00082
00083 size = 1 << nlog;
00084
00085 for(r=0; r<size; r += 4)
00086 {
00087 r_brev = 0;
00088 r_temp = r;
00089 for(j=0; j<nlog; j++)
00090 {
00091 r_brev <<= 1;
00092 if (r_temp & 1)
00093 r_brev |= 1;
00094 r_temp >>= 1;
00095 }
00096
00097 a0_real = vect2[r_brev].real;
00098 a0_imag = vect2[r_brev].imag;
00099 r_brev += size >> 2;
00100 a1_real = vect2[r_brev].real;
00101 a1_imag = vect2[r_brev].imag;
00102 r_brev += size >> 2;
00103 a2_real = vect2[r_brev].real;
00104 a2_imag = vect2[r_brev].imag;
00105 r_brev += size >> 2;
00106 a3_real = vect2[r_brev].real;
00107 a3_imag = vect2[r_brev].imag;
00108
00109 vect1[r].real = (a0_real + a2_real + a1_real + a3_real) >> 2;
00110 vect1[r].imag = (a0_imag + a2_imag + a1_imag + a3_imag) >> 2;
00111 vect1[r + 2].real = (a0_real + a2_real - a1_real - a3_real) >> 2;
00112 vect1[r + 2].imag = (a0_imag + a2_imag - a1_imag - a3_imag) >> 2;
00113
00114 vect1[r + 1].real = (a0_real - a2_real + a1_imag - a3_imag) >> 2;
00115 vect1[r + 1].imag = (a0_imag - a2_imag - a1_real + a3_real) >> 2;
00116 vect1[r + 3].real = (a0_real - a2_real - a1_imag + a3_imag) >> 2;
00117 vect1[r + 3].imag = (a0_imag - a2_imag + a1_real - a3_real) >> 2;
00118 }
00119
00120 m = 4;
00121 inc_indice = (DSP16_N_TWIDDLE_FACTORS/8);
00122 for(stage=4; stage <= nlog; stage+=2)
00123 {
00124 m <<= 2;
00125
00126 indice = 0;
00127
00128 for(r=0; r<size; r += m)
00129 {
00130 i0 = r;
00131 i1 = i0 + (m >> 2);
00132 i2 = i1 + (m >> 2);
00133 i3 = i2 + (m >> 2);
00134
00135 a0_real = vect1[i0].real;
00136 a0_imag = vect1[i0].imag;
00137 a1_real = vect1[i2].real;
00138 a1_imag = vect1[i2].imag;
00139 a2_real = vect1[i1].real;
00140 a2_imag = vect1[i1].imag;
00141 a3_real = vect1[i3].real;
00142 a3_imag = vect1[i3].imag;
00143
00144 vect1[i0].real = (a0_real + a2_real + a1_real + a3_real) >> 2;
00145 vect1[i0].imag = (a0_imag + a2_imag + a1_imag + a3_imag) >> 2;
00146 vect1[i2].real = (a0_real + a2_real - a1_real - a3_real) >> 2;
00147 vect1[i2].imag = (a0_imag + a2_imag - a1_imag - a3_imag) >> 2;
00148
00149 vect1[i1].real = (a0_real - a2_real + a1_imag - a3_imag) >> 2;
00150 vect1[i1].imag = (a0_imag - a2_imag - a1_real + a3_real) >> 2;
00151 vect1[i3].real = (a0_real - a2_real - a1_imag + a3_imag) >> 2;
00152 vect1[i3].imag = (a0_imag - a2_imag + a1_real - a3_real) >> 2;
00153 }
00154
00155 for(j=1; j<(m >> 2); j++)
00156 {
00157 indice += inc_indice;
00158
00159
00160 e_real = dsp16_twiddle_factors[indice];
00161 e_imag = dsp16_twiddle_factors[indice + 1];
00162
00163 #if DSP_OPTIMIZATION & DSP_OPTI_SIZE
00164
00165 if (indice >= DSP16_N_TWIDDLE_FACTORS/4)
00166 {
00167 r = DSP16_N_TWIDDLE_FACTORS - (indice << 1);
00168 e2_real = -dsp16_twiddle_factors[r];
00169 e2_imag = dsp16_twiddle_factors[r + 1];
00170
00171 if (r < DSP16_N_TWIDDLE_FACTORS/3)
00172 {
00173 r = indice - r;
00174 e3_real = -dsp16_twiddle_factors[r];
00175 e3_imag = -dsp16_twiddle_factors[r + 1];
00176 }
00177 else
00178 {
00179 r -= indice;
00180 e3_real = -dsp16_twiddle_factors[r];
00181 e3_imag = dsp16_twiddle_factors[r + 1];
00182 }
00183 }
00184 else
00185 {
00186 r = indice << 1;
00187 e2_real = dsp16_twiddle_factors[r];
00188 e2_imag = dsp16_twiddle_factors[r + 1];
00189
00190 if (r >= DSP16_N_TWIDDLE_FACTORS/3)
00191 {
00192 r = DSP16_N_TWIDDLE_FACTORS - (indice + r);
00193 e3_real = -dsp16_twiddle_factors[r];
00194 e3_imag = dsp16_twiddle_factors[r + 1];
00195 }
00196 else
00197 {
00198 r += indice;
00199 e3_real = dsp16_twiddle_factors[r];
00200 e3_imag = dsp16_twiddle_factors[r + 1];
00201 }
00202 }
00203
00204 #else
00205
00206 e2_real = dsp16_twiddle_factors2[indice*2];
00207 e2_imag = dsp16_twiddle_factors2[indice*2 + 1];
00208
00209
00210 e3_real = dsp16_twiddle_factors2[indice*2 + 2];
00211 e3_imag = dsp16_twiddle_factors2[indice*2 + 3];
00212 #endif
00213
00214 for(r=0; r<size; r += m)
00215 {
00216 i0 = j + r;
00217 i1 = i0 + (m >> 2);
00218 i2 = i1 + (m >> 2);
00219 i3 = i2 + (m >> 2);
00220
00221 #if DSP_OPTIMIZATION & DSP_OPTI_ACCURACY
00222 a0_real = vect1[i0].real;
00223 a0_imag = vect1[i0].imag;
00224 #else
00225 a0_real = vect1[i0].real >> 2;
00226 a0_imag = vect1[i0].imag >> 2;
00227 #endif
00228
00229 a1_real = vect1[i2].real;
00230 a1_imag = vect1[i2].imag;
00231 a2_real = vect1[i1].real;
00232 a2_imag = vect1[i1].imag;
00233 a3_real = vect1[i3].real;
00234 a3_imag = vect1[i3].imag;
00235
00236 #if DSP_OPTIMIZATION & DSP_OPTI_ACCURACY
00237
00238 temp = (a1_real*e_real - a1_imag*e_imag) >> (DSP16_QB);
00239 a1_imag = (a1_real*e_imag + a1_imag*e_real) >> (DSP16_QB);
00240 a1_real = temp;
00241 temp = (a2_real*e2_real - a2_imag*e2_imag) >> (DSP16_QB);
00242 a2_imag = (a2_real*e2_imag + a2_imag*e2_real) >> (DSP16_QB);
00243 a2_real = temp;
00244 temp = (a3_real*e3_real - a3_imag*e3_imag) >> (DSP16_QB);
00245 a3_imag = (a3_real*e3_imag + a3_imag*e3_real) >> (DSP16_QB);
00246 a3_real = temp;
00247
00248 vect1[i0].real = (a0_real + a2_real + (a1_real + a3_real)) >> 2;
00249 vect1[i0].imag = (a0_imag + a2_imag + (a1_imag + a3_imag)) >> 2;
00250 vect1[i2].real = (a0_real + a2_real - (a1_real + a3_real)) >> 2;
00251 vect1[i2].imag = (a0_imag + a2_imag - (a1_imag + a3_imag)) >> 2;
00252
00253 vect1[i1].real = (a0_real - a2_real + (a1_imag - a3_imag)) >> 2;
00254 vect1[i1].imag = (a0_imag - a2_imag - (a1_real - a3_real)) >> 2;
00255 vect1[i3].real = (a0_real - a2_real - (a1_imag - a3_imag)) >> 2;
00256 vect1[i3].imag = (a0_imag - a2_imag + (a1_real - a3_real)) >> 2;
00257 #else
00258 temp = (a1_real*e_real - a1_imag*e_imag) >> (DSP16_QB + 1);
00259 a1_imag = (a1_real*e_imag + a1_imag*e_real) >> (DSP16_QB + 1);
00260 a1_real = temp;
00261 temp = (a2_real*e2_real - a2_imag*e2_imag) >> (DSP16_QB + 1);
00262 a2_imag = (a2_real*e2_imag + a2_imag*e2_real) >> (DSP16_QB + 1);
00263 a2_real = temp;
00264 temp = (a3_real*e3_real - a3_imag*e3_imag) >> (DSP16_QB + 1);
00265 a3_imag = (a3_real*e3_imag + a3_imag*e3_real) >> (DSP16_QB + 1);
00266 a3_real = temp;
00267
00268 vect1[i0].real = (a0_real + a2_real + (a1_real + a3_real));
00269 vect1[i0].imag = (a0_imag + a2_imag + (a1_imag + a3_imag));
00270 vect1[i2].real = (a0_real + a2_real - (a1_real + a3_real));
00271 vect1[i2].imag = (a0_imag + a2_imag - (a1_imag + a3_imag));
00272
00273 vect1[i1].real = (a0_real - a2_real + (a1_imag - a3_imag));
00274 vect1[i1].imag = (a0_imag - a2_imag - (a1_real - a3_real));
00275 vect1[i3].real = (a0_real - a2_real - (a1_imag - a3_imag));
00276 vect1[i3].imag = (a0_imag - a2_imag + (a1_real - a3_real));
00277 #endif
00278 }
00279 }
00280 inc_indice >>= 2;
00281 }
00282 }
00283
00284 #endif