arm_cfft_radix4_f32関数
FFT(Fast Fourier Transform, 高速フーリエ変換)を実行する

関数のソース(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(浮動小数点ユニット)を持たないので本来は整数版を使うべきだが、上述の理由で浮動小数点版を使用した。
窓関数がないのでスペクトルのすそ野が広がっている。窓関数をかける場合は自力で生成して施す必要がある。

戻る

Top Page