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 #include "arm_math.h"
00033
00034
00035
00036
00037
00038 void arm_split_rfft_q15(
00039 q15_t * pSrc,
00040 uint32_t fftLen,
00041 q15_t * pATable,
00042 q15_t * pBTable,
00043 q15_t * pDst,
00044 uint32_t modifier);
00045
00046 void arm_split_rifft_q15(
00047 q15_t * pSrc,
00048 uint32_t fftLen,
00049 q15_t * pATable,
00050 q15_t * pBTable,
00051 q15_t * pDst,
00052 uint32_t modifier);
00053
00077 void arm_rfft_q15(
00078 const arm_rfft_instance_q15 * S,
00079 q15_t * pSrc,
00080 q15_t * pDst)
00081 {
00082 const arm_cfft_radix4_instance_q15 *S_CFFT = S->pCfft;
00083
00084
00085 if(S->ifftFlagR == 1u)
00086 {
00087
00088 arm_split_rifft_q15(pSrc, S->fftLenBy2, S->pTwiddleAReal,
00089 S->pTwiddleBReal, pDst, S->twidCoefRModifier);
00090
00091
00092 arm_radix4_butterfly_inverse_q15(pDst, S_CFFT->fftLen,
00093 S_CFFT->pTwiddle,
00094 S_CFFT->twidCoefModifier);
00095
00096
00097 if(S->bitReverseFlagR == 1u)
00098 {
00099 arm_bitreversal_q15(pDst, S_CFFT->fftLen,
00100 S_CFFT->bitRevFactor, S_CFFT->pBitRevTable);
00101 }
00102 }
00103 else
00104 {
00105
00106
00107
00108 arm_radix4_butterfly_q15(pSrc, S_CFFT->fftLen,
00109 S_CFFT->pTwiddle, S_CFFT->twidCoefModifier);
00110
00111
00112 if(S->bitReverseFlagR == 1u)
00113 {
00114 arm_bitreversal_q15(pSrc, S_CFFT->fftLen,
00115 S_CFFT->bitRevFactor, S_CFFT->pBitRevTable);
00116 }
00117
00118 arm_split_rfft_q15(pSrc, S->fftLenBy2, S->pTwiddleAReal,
00119 S->pTwiddleBReal, pDst, S->twidCoefRModifier);
00120 }
00121
00122 }
00123
00140 void arm_split_rfft_q15(
00141 q15_t * pSrc,
00142 uint32_t fftLen,
00143 q15_t * pATable,
00144 q15_t * pBTable,
00145 q15_t * pDst,
00146 uint32_t modifier)
00147 {
00148 uint32_t i;
00149 q31_t outR, outI;
00150 q15_t *pCoefA, *pCoefB;
00151 q15_t *pSrc1, *pSrc2;
00152
00153
00154 pSrc[2u * fftLen] = pSrc[0];
00155 pSrc[(2u * fftLen) + 1u] = pSrc[1];
00156
00157 pCoefA = &pATable[modifier * 2u];
00158 pCoefB = &pBTable[modifier * 2u];
00159
00160 pSrc1 = &pSrc[2];
00161 pSrc2 = &pSrc[(2u * fftLen) - 2u];
00162
00163 i = 1u;
00164
00165 while(i < fftLen)
00166 {
00167
00168
00169
00170
00171
00172
00173
00174
00175
00176
00177
00178 outR = __SMUSD(*__SIMD32(pSrc1), *__SIMD32(pCoefA));
00179
00180
00181
00182 outR = __SMLAD(*__SIMD32(pSrc2), *__SIMD32(pCoefB), outR) >> 15u;
00183
00184
00185
00186 outI = __SMUSDX(*__SIMD32(pSrc2)--, *__SIMD32(pCoefB));
00187
00188
00189 outI = __SMLADX(*__SIMD32(pSrc1)++, *__SIMD32(pCoefA), outI);
00190
00191
00192 pDst[2u * i] = (q15_t) outR;
00193 pDst[(2u * i) + 1u] = outI >> 15u;
00194
00195
00196 pDst[(4u * fftLen) - (2u * i)] = (q15_t) outR;
00197 pDst[((4u * fftLen) - (2u * i)) + 1u] = -(outI >> 15u);
00198
00199
00200 pCoefB = pCoefB + (2u * modifier);
00201 pCoefA = pCoefA + (2u * modifier);
00202
00203 i++;
00204
00205 }
00206
00207 pDst[2u * fftLen] = pSrc[0] - pSrc[1];
00208 pDst[(2u * fftLen) + 1u] = 0;
00209
00210 pDst[0] = pSrc[0] + pSrc[1];
00211 pDst[1] = 0;
00212
00213 }
00214
00215
00228 void arm_split_rifft_q15(
00229 q15_t * pSrc,
00230 uint32_t fftLen,
00231 q15_t * pATable,
00232 q15_t * pBTable,
00233 q15_t * pDst,
00234 uint32_t modifier)
00235 {
00236 uint32_t i;
00237 q31_t outR, outI;
00238 q15_t *pCoefA, *pCoefB;
00239 q15_t *pSrc1, *pSrc2;
00240 q15_t *pDst1 = &pDst[0];
00241
00242 pCoefA = &pATable[0];
00243 pCoefB = &pBTable[0];
00244
00245 pSrc1 = &pSrc[0];
00246 pSrc2 = &pSrc[2u * fftLen];
00247
00248 i = fftLen;
00249
00250 while(i > 0u)
00251 {
00252
00253
00254
00255
00256
00257
00258
00259
00260
00261
00262
00263
00264
00265
00266 outR = __SMUSD(*__SIMD32(pSrc2), *__SIMD32(pCoefB));
00267
00268
00269
00270 outR = __SMLAD(*__SIMD32(pSrc1), *__SIMD32(pCoefA), outR) >> 15u;
00271
00272
00273
00274
00275 outI = __SMUADX(*__SIMD32(pSrc2)--, *__SIMD32(pCoefB));
00276
00277
00278 outI = __SMLSDX(*__SIMD32(pCoefA), *__SIMD32(pSrc1)++, -outI);
00279
00280
00281 *__SIMD32(pDst1)++ =
00282 (q31_t) ((outI << 1u) & 0xFFFF0000) | (outR & 0x0000FFFF);
00283
00284
00285 pCoefB = pCoefB + (2u * modifier);
00286 pCoefA = pCoefA + (2u * modifier);
00287
00288 i--;
00289
00290 }
00291
00292 }