関数のソース(CMSIS 2.0以上をダウンロード・インストールする必要あり)
CMSIS_2_00\CMSIS\DSP_Lib\Source\Cortex-M4-M3\TransformFunctions\arm_cfft_radix4_f32.c
サンプルソース(DFFSKN40基板付属CD-ROMに収録)
IARprojects\src\projects\arm_fft_float
引数と戻り値

説明(イメージ)

使用例(サンプルソースの一部)
|
#define fftLen 1024
float32_t testInput_250hz_fs48khz[fftLen*2] = { 0.9999999999, 0, 0.9994645873764192, 0,
0.9978589231388176, 0, 0.9951847265726784, 0,
0.9914448612746659, 0, 0.9866433319862147, 0,
0.9807852803051519, 0, 0.973876979179946, 0,
: 中略
-0.3214394652710148, 0, -0.3522500478860067, 0,
-0.38268343232682067, 0, -0.41270702976311774, 0,
-0.4422886901747672, 0, -0.4713967367788538, 0 };
: 中略
uint32_t ifftFlag = 0;
uint32_t doBitReverse = 1;
arm_status status;
arm_cfft_radix4_instance_f32 S;
/* Initialize the CFFT/CIFFT module */
status = arm_cfft_radix4_init_f32(&S, fftLen, ifftFlag, doBitReverse);
/* Process the data through the CFFT/CIFFT module */
arm_cfft_radix4_f32(&S, testInput_250hz_fs48khz);
/* Process the data through the Complex Magnitude Module for
calculating the magnitude at each bin */
arm_cmplx_mag_f32(testInput_250hz_fs48khz, testOutput, fftLen);
|
FFTのブロックサイズは1024、FFT結果はビット逆順ソートされる。
testInput_250hz_fs48khzは250Hzのサイン波を48kHzでサンプリングしたもの。複素数の配列なので実数、虚数、実数、虚数・・・と並ぶ。
FFT結果もtestInput_250hz_fs48khzに入っている。
FFT結果は複素数なのでarm_cmplx_mag_f32で実数にしている。testOutputがスペクトルの振幅になる。
実験
上記のサンプルソースをDFFSKN40基板(デジタルフィルター社)にて実験した。Cortex-M4マイコンはPK40X256VMD100(Kinetis,
フリースケール社)搭載。
LCDでスペクトルをグラフ表示している。左から6番目が48kHz/1024*(6-1) = 234Hzの成分。入力信号が250Hzなのでそのあたりが膨らんでいる。

まめ知識
arm_cfft_radix4_q15(整数16ビット版)はなぜか正常動作しない(CMSIS_2_00)。動かした人はご報告ください。
info@digitalfilter.com
このデバイスPK40X256VMD100にはFPU(浮動小数点ユニット)を持たないので本来は整数版を使うべきだが、上述の理由で浮動小数点版を使用した。
窓関数がないのでスペクトルのすそ野が広がっている。窓関数をかける場合は自力で生成して施す必要がある。
|