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
00035 #include "arm_math.h"
00036
00037
00038
00039
00040
00041 void arm_split_rfft_q15(
00042 q15_t * pSrc,
00043 uint32_t fftLen,
00044 q15_t * pATable,
00045 q15_t * pBTable,
00046 q15_t * pDst,
00047 uint32_t modifier);
00048
00049 void arm_split_rifft_q15(
00050 q15_t * pSrc,
00051 uint32_t fftLen,
00052 q15_t * pATable,
00053 q15_t * pBTable,
00054 q15_t * pDst,
00055 uint32_t modifier);
00056
00080 void arm_rfft_q15(
00081 const arm_rfft_instance_q15 * S,
00082 q15_t * pSrc,
00083 q15_t * pDst)
00084 {
00085 const arm_cfft_radix4_instance_q15 *S_CFFT = S->pCfft;
00086
00087
00088 if(S->ifftFlagR == 1u)
00089 {
00090
00091 arm_split_rifft_q15(pSrc, S->fftLenBy2, S->pTwiddleAReal,
00092 S->pTwiddleBReal, pDst, S->twidCoefRModifier);
00093
00094
00095 arm_radix4_butterfly_inverse_q15(pDst, S_CFFT->fftLen,
00096 S_CFFT->pTwiddle,
00097 S_CFFT->twidCoefModifier);
00098
00099
00100 if(S->bitReverseFlagR == 1u)
00101 {
00102 arm_bitreversal_q15(pDst, S_CFFT->fftLen,
00103 S_CFFT->bitRevFactor, S_CFFT->pBitRevTable);
00104 }
00105 }
00106 else
00107 {
00108
00109
00110
00111 arm_radix4_butterfly_q15(pSrc, S_CFFT->fftLen,
00112 S_CFFT->pTwiddle, S_CFFT->twidCoefModifier);
00113
00114
00115 if(S->bitReverseFlagR == 1u)
00116 {
00117 arm_bitreversal_q15(pSrc, S_CFFT->fftLen,
00118 S_CFFT->bitRevFactor, S_CFFT->pBitRevTable);
00119 }
00120
00121 arm_split_rfft_q15(pSrc, S->fftLenBy2, S->pTwiddleAReal,
00122 S->pTwiddleBReal, pDst, S->twidCoefRModifier);
00123 }
00124
00125 }
00126
00143 void arm_split_rfft_q15(
00144 q15_t * pSrc,
00145 uint32_t fftLen,
00146 q15_t * pATable,
00147 q15_t * pBTable,
00148 q15_t * pDst,
00149 uint32_t modifier)
00150 {
00151 uint32_t i;
00152 q31_t outR, outI;
00153 q15_t *pCoefA, *pCoefB;
00154 q15_t *pSrc1, *pSrc2;
00155
00156
00157 pSrc[2u * fftLen] = pSrc[0];
00158 pSrc[(2u * fftLen) + 1u] = pSrc[1];
00159
00160 pCoefA = &pATable[modifier * 2u];
00161 pCoefB = &pBTable[modifier * 2u];
00162
00163 pSrc1 = &pSrc[2];
00164 pSrc2 = &pSrc[(2u * fftLen) - 2u];
00165
00166 #ifndef ARM_MATH_CM0
00167
00168
00169
00170 i = 1u;
00171
00172 while(i < fftLen)
00173 {
00174
00175
00176
00177
00178
00179
00180
00181
00182
00183
00184
00185 #ifndef ARM_MATH_BIG_ENDIAN
00186
00187
00188 outR = __SMUSD(*__SIMD32(pSrc1), *__SIMD32(pCoefA));
00189
00190 #else
00191
00192
00193 outR = -(__SMUSD(*__SIMD32(pSrc1), *__SIMD32(pCoefA)));
00194
00195 #endif
00196
00197
00198
00199 outR = __SMLAD(*__SIMD32(pSrc2), *__SIMD32(pCoefB), outR) >> 15u;
00200
00201
00202
00203
00204 #ifndef ARM_MATH_BIG_ENDIAN
00205
00206 outI = __SMUSDX(*__SIMD32(pSrc2)--, *__SIMD32(pCoefB));
00207
00208 #else
00209
00210 outI = __SMUSDX(*__SIMD32(pCoefB), *__SIMD32(pSrc2)--);
00211
00212 #endif
00213
00214
00215 outI = __SMLADX(*__SIMD32(pSrc1)++, *__SIMD32(pCoefA), outI);
00216
00217
00218 pDst[2u * i] = (q15_t) outR;
00219 pDst[(2u * i) + 1u] = outI >> 15u;
00220
00221
00222 pDst[(4u * fftLen) - (2u * i)] = (q15_t) outR;
00223 pDst[((4u * fftLen) - (2u * i)) + 1u] = -(outI >> 15u);
00224
00225
00226 pCoefB = pCoefB + (2u * modifier);
00227 pCoefA = pCoefA + (2u * modifier);
00228
00229 i++;
00230
00231 }
00232
00233 pDst[2u * fftLen] = pSrc[0] - pSrc[1];
00234 pDst[(2u * fftLen) + 1u] = 0;
00235
00236 pDst[0] = pSrc[0] + pSrc[1];
00237 pDst[1] = 0;
00238
00239
00240 #else
00241
00242
00243
00244 i = 1u;
00245
00246 while(i < fftLen)
00247 {
00248
00249
00250
00251
00252
00253
00254 outR = *pSrc1 * *pCoefA;
00255 outR = outR - (*(pSrc1 + 1) * *(pCoefA + 1));
00256 outR = outR + (*pSrc2 * *pCoefB);
00257 outR = (outR + (*(pSrc2 + 1) * *(pCoefB + 1))) >> 15;
00258
00259
00260
00261
00262
00263
00264
00265 outI = *pSrc2 * *(pCoefB + 1);
00266 outI = outI - (*(pSrc2 + 1) * *pCoefB);
00267 outI = outI + (*(pSrc1 + 1) * *pCoefA);
00268 outI = outI + (*pSrc1 * *(pCoefA + 1));
00269
00270
00271 pSrc1 += 2u;
00272 pSrc2 -= 2u;
00273
00274
00275 pDst[2u * i] = (q15_t) outR;
00276 pDst[(2u * i) + 1u] = outI >> 15u;
00277
00278
00279 pDst[(4u * fftLen) - (2u * i)] = (q15_t) outR;
00280 pDst[((4u * fftLen) - (2u * i)) + 1u] = -(outI >> 15u);
00281
00282
00283 pCoefB = pCoefB + (2u * modifier);
00284 pCoefA = pCoefA + (2u * modifier);
00285
00286 i++;
00287
00288 }
00289
00290 pDst[2u * fftLen] = pSrc[0] - pSrc[1];
00291 pDst[(2u * fftLen) + 1u] = 0;
00292
00293 pDst[0] = pSrc[0] + pSrc[1];
00294 pDst[1] = 0;
00295
00296 #endif
00297
00298 }
00299
00300
00312 void arm_split_rifft_q15(
00313 q15_t * pSrc,
00314 uint32_t fftLen,
00315 q15_t * pATable,
00316 q15_t * pBTable,
00317 q15_t * pDst,
00318 uint32_t modifier)
00319 {
00320 uint32_t i;
00321 q31_t outR, outI;
00322 q15_t *pCoefA, *pCoefB;
00323 q15_t *pSrc1, *pSrc2;
00324 q15_t *pDst1 = &pDst[0];
00325
00326 pCoefA = &pATable[0];
00327 pCoefB = &pBTable[0];
00328
00329 pSrc1 = &pSrc[0];
00330 pSrc2 = &pSrc[2u * fftLen];
00331
00332 #ifndef ARM_MATH_CM0
00333
00334
00335
00336 i = fftLen;
00337
00338 while(i > 0u)
00339 {
00340
00341
00342
00343
00344
00345
00346
00347
00348
00349
00350
00351
00352
00353 #ifndef ARM_MATH_BIG_ENDIAN
00354
00355
00356
00357 outR = __SMUSD(*__SIMD32(pSrc2), *__SIMD32(pCoefB));
00358
00359 #else
00360
00361
00362
00363 outR = -(__SMUSD(*__SIMD32(pSrc2), *__SIMD32(pCoefB)));
00364
00365 #endif
00366
00367
00368
00369 outR = __SMLAD(*__SIMD32(pSrc1), *__SIMD32(pCoefA), outR) >> 15u;
00370
00371
00372
00373
00374 outI = __SMUADX(*__SIMD32(pSrc2)--, *__SIMD32(pCoefB));
00375
00376
00377
00378 #ifndef ARM_MATH_BIG_ENDIAN
00379
00380 outI = __SMLSDX(*__SIMD32(pCoefA), *__SIMD32(pSrc1)++, -outI);
00381
00382 #else
00383
00384 outI = __SMLSDX(*__SIMD32(pSrc1)++, *__SIMD32(pCoefA), -outI);
00385
00386 #endif
00387
00388
00389 #ifndef ARM_MATH_BIG_ENDIAN
00390
00391 *__SIMD32(pDst1)++ = __PKHBT(outR, (outI >> 15u), 16);
00392
00393 #else
00394
00395 *__SIMD32(pDst1)++ = __PKHBT((outI >> 15u), outR, 16);
00396
00397 #endif
00398
00399
00400 pCoefB = pCoefB + (2u * modifier);
00401 pCoefA = pCoefA + (2u * modifier);
00402
00403 i--;
00404
00405 }
00406
00407
00408 #else
00409
00410
00411
00412 i = fftLen;
00413
00414 while(i > 0u)
00415 {
00416
00417
00418
00419
00420
00421
00422
00423 outR = *pSrc2 * *pCoefB;
00424 outR = outR - (*(pSrc2 + 1) * *(pCoefB + 1));
00425 outR = outR + (*pSrc1 * *pCoefA);
00426 outR = (outR + (*(pSrc1 + 1) * *(pCoefA + 1))) >> 15;
00427
00428
00429
00430
00431
00432
00433
00434 outI = *(pSrc1 + 1) * *pCoefA;
00435 outI = outI - (*pSrc1 * *(pCoefA + 1));
00436 outI = outI - (*pSrc2 * *(pCoefB + 1));
00437 outI = outI - (*(pSrc2 + 1) * *(pCoefB));
00438
00439
00440 pSrc1 += 2u;
00441 pSrc2 -= 2u;
00442
00443
00444 *pDst1++ = (q15_t) outR;
00445 *pDst1++ = (q15_t) (outI >> 15);
00446
00447
00448 pCoefB = pCoefB + (2u * modifier);
00449 pCoefA = pCoefA + (2u * modifier);
00450
00451 i--;
00452
00453 }
00454
00455 #endif
00456
00457 }