00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034 #include "arm_math.h"
00035
00036
00037
00038
00039
00040 void arm_split_rfft_q31(
00041 q31_t * pSrc,
00042 uint32_t fftLen,
00043 q31_t * pATable,
00044 q31_t * pBTable,
00045 q31_t * pDst,
00046 uint32_t modifier);
00047
00048 void arm_split_rifft_q31(
00049 q31_t * pSrc,
00050 uint32_t fftLen,
00051 q31_t * pATable,
00052 q31_t * pBTable,
00053 q31_t * pDst,
00054 uint32_t modifier);
00055
00080 void arm_rfft_q31(
00081 const arm_rfft_instance_q31 * S,
00082 q31_t * pSrc,
00083 q31_t * pDst)
00084 {
00085 const arm_cfft_radix4_instance_q31 *S_CFFT = S->pCfft;
00086
00087
00088 if(S->ifftFlagR == 1u)
00089 {
00090
00091 arm_split_rifft_q31(pSrc, S->fftLenBy2, S->pTwiddleAReal,
00092 S->pTwiddleBReal, pDst, S->twidCoefRModifier);
00093
00094
00095 arm_radix4_butterfly_inverse_q31(pDst, S_CFFT->fftLen,
00096 S_CFFT->pTwiddle,
00097 S_CFFT->twidCoefModifier);
00098
00099 if(S->bitReverseFlagR == 1u)
00100 {
00101 arm_bitreversal_q31(pDst, S_CFFT->fftLen,
00102 S_CFFT->bitRevFactor, S_CFFT->pBitRevTable);
00103 }
00104 }
00105 else
00106 {
00107
00108
00109
00110 arm_radix4_butterfly_q31(pSrc, S_CFFT->fftLen,
00111 S_CFFT->pTwiddle, S_CFFT->twidCoefModifier);
00112
00113
00114 if(S->bitReverseFlagR == 1u)
00115 {
00116 arm_bitreversal_q31(pSrc, S_CFFT->fftLen,
00117 S_CFFT->bitRevFactor, S_CFFT->pBitRevTable);
00118 }
00119
00120
00121 arm_split_rfft_q31(pSrc, S->fftLenBy2, S->pTwiddleAReal,
00122 S->pTwiddleBReal, pDst, S->twidCoefRModifier);
00123 }
00124
00125 }
00126
00127
00143 void arm_split_rfft_q31(
00144 q31_t * pSrc,
00145 uint32_t fftLen,
00146 q31_t * pATable,
00147 q31_t * pBTable,
00148 q31_t * pDst,
00149 uint32_t modifier)
00150 {
00151 uint32_t i;
00152 q31_t outR, outI;
00153 q31_t *pCoefA, *pCoefB;
00154 q31_t CoefA1, CoefA2, CoefB1;
00155 q31_t *pOut1 = &pDst[2], *pOut2 = &pDst[(4u * fftLen) - 1u];
00156 q31_t *pIn1 = &pSrc[2], *pIn2 = &pSrc[(2u * fftLen) - 1u];
00157
00158 pSrc[2u * fftLen] = pSrc[0];
00159 pSrc[(2u * fftLen) + 1u] = pSrc[1];
00160
00161
00162 pCoefA = &pATable[modifier * 2u];
00163 pCoefB = &pBTable[modifier * 2u];
00164
00165 i = fftLen - 1u;
00166
00167 while(i > 0u)
00168 {
00169
00170
00171
00172
00173
00174
00175
00176
00177
00178
00179 CoefA1 = *pCoefA++;
00180 CoefA2 = *pCoefA;
00181
00182
00183 outR = ((int32_t) (((q63_t) * pIn1 * CoefA1) >> 32));
00184
00185
00186 outI = ((int32_t) (((q63_t) * pIn1++ * CoefA2) >> 32));
00187
00188
00189 outR =
00190 (q31_t) ((((q63_t) outR << 32) + ((q63_t) * pIn1 * (-CoefA2))) >> 32);
00191
00192
00193 outI =
00194 (q31_t) ((((q63_t) outI << 32) + ((q63_t) * pIn1++ * (CoefA1))) >> 32);
00195
00196
00197 outR =
00198 (q31_t) ((((q63_t) outR << 32) + ((q63_t) * pIn2 * (-CoefA2))) >> 32);
00199 CoefB1 = *pCoefB;
00200
00201
00202 outI =
00203 (q31_t) ((((q63_t) outI << 32) + ((q63_t) * pIn2-- * (-CoefB1))) >> 32);
00204
00205
00206 outR =
00207 (q31_t) ((((q63_t) outR << 32) + ((q63_t) * pIn2 * (CoefB1))) >> 32);
00208
00209
00210 outI =
00211 (q31_t) ((((q63_t) outI << 32) + ((q63_t) * pIn2-- * (-CoefA2))) >> 32);
00212
00213
00214 *pOut1++ = (outR << 1u);
00215 *pOut1++ = (outI << 1u);
00216
00217
00218 *pOut2-- = -(outI << 1u);
00219 *pOut2-- = (outR << 1u);
00220
00221
00222 pCoefB = pCoefB + (modifier * 2u);
00223 pCoefA = pCoefA + ((modifier * 2u) - 1u);
00224
00225 i--;
00226
00227 }
00228
00229 pDst[2u * fftLen] = pSrc[0] - pSrc[1];
00230 pDst[(2u * fftLen) + 1u] = 0;
00231
00232 pDst[0] = pSrc[0] + pSrc[1];
00233 pDst[1] = 0;
00234
00235 }
00236
00237
00249 void arm_split_rifft_q31(
00250 q31_t * pSrc,
00251 uint32_t fftLen,
00252 q31_t * pATable,
00253 q31_t * pBTable,
00254 q31_t * pDst,
00255 uint32_t modifier)
00256 {
00257 q31_t outR, outI;
00258 q31_t *pCoefA, *pCoefB;
00259 q31_t CoefA1, CoefA2, CoefB1;
00260 q31_t *pIn1 = &pSrc[0], *pIn2 = &pSrc[(2u * fftLen) + 1u];
00261
00262 pCoefA = &pATable[0];
00263 pCoefB = &pBTable[0];
00264
00265 while(fftLen > 0u)
00266 {
00267
00268
00269
00270
00271
00272
00273
00274
00275
00276
00277 CoefA1 = *pCoefA++;
00278 CoefA2 = *pCoefA;
00279
00280
00281 outR = ((int32_t) (((q63_t) * pIn1 * CoefA1) >> 32));
00282
00283
00284 outI = -((int32_t) (((q63_t) * pIn1++ * CoefA2) >> 32));
00285
00286
00287 outR =
00288 (q31_t) ((((q63_t) outR << 32) + ((q63_t) * pIn1 * (CoefA2))) >> 32);
00289
00290
00291 outI =
00292 (q31_t) ((((q63_t) outI << 32) + ((q63_t) * pIn1++ * (CoefA1))) >> 32);
00293
00294
00295 outR =
00296 (q31_t) ((((q63_t) outR << 32) + ((q63_t) * pIn2 * (CoefA2))) >> 32);
00297
00298 CoefB1 = *pCoefB;
00299
00300
00301 outI =
00302 (q31_t) ((((q63_t) outI << 32) - ((q63_t) * pIn2-- * (CoefB1))) >> 32);
00303
00304
00305 outR =
00306 (q31_t) ((((q63_t) outR << 32) + ((q63_t) * pIn2 * (CoefB1))) >> 32);
00307
00308
00309 outI =
00310 (q31_t) ((((q63_t) outI << 32) + ((q63_t) * pIn2-- * (CoefA2))) >> 32);
00311
00312
00313 *pDst++ = (outR << 1u);
00314 *pDst++ = (outI << 1u);
00315
00316
00317 pCoefB = pCoefB + (modifier * 2u);
00318 pCoefA = pCoefA + ((modifier * 2u) - 1u);
00319
00320
00321 fftLen--;
00322
00323 }
00324
00325
00326 }