2016-04-01 34 views
1

私はSTM32L4マイクロプロセッサを使用してFFTを計算しようとしていますが、 SDカードから.wavファイルを読み込み、パディングを削除して1024バイトのデータを配列に格納します。 私のPCの16進エディタで同じwavファイルを開くことにより、このデータが正しいことを確認しました。 MatLabでFFTを計算し、その大きさをとると、入力正弦波の周波数に対応する周波数ビンが一致します。これは私のCコードでは当てはまりません(私が使っているKeilデバッガに見られるように)。 ARM DSPライブラリによって与えられた値と、MatLabで生成された値との間には、MatLab = 5.2のbin [0]、C = 131246のbin [0]の間にほとんど相関はありません。 (...編集を参照してください) 私はFFTの2つの異なるバージョンを試してみたと私は以下のそれらの両方が含まれます:ARM DSPライブラリとMatLabを使用してFFTを計算すると、結果が矛盾します

/* Carry out an FFT on the (correctly formatted) input data */ 
arm_cfft_f32(&arm_cfft_sR_f32_len1024, inputBuffer, IFFTFLAG, BRFLAG); 
/* Calculate the complex magnitude of the FFT */ 
arm_cmplx_mag_f32(inputBuffer, outputBuffer, FFTSIZE); 

非推奨コード:

arm_cfft_radix4_instance_f32 S; 
arm_cfft_radix4_init_f32(&S, FFTSIZE, IFFTFLAG, BITREVERSEFLAG); 
arm_cfft_radix4_f32(&S, inputBuffer); 
arm_cmplx_mag_f32(inputBuffer, outputBuffer, FFTSIZE); 

どちらの結果で同じ(間違った)値。 Cで行われた前処理はすべて正しく、私は配列FFTSIZE * 2の長さを以下のように配列します: Re [0]、Im [0]、Re [1]、Im [1]、...、Re [1023 ]、Im [1023]。

ご意見やご協力をいただければ幸いです。 :)

EDIT: 私はDCビン以外では、2つの計算の間の値が実際に相関していることを認識しました。 すなわち両方の計算のために、ビン47は最大値を有する(それは22.05kHzでサンプリングされた1kHzの正弦波であるので意味がある)。 ARM DSPライブラリがビンの出力を大きく拡大する理由は何ですか?

+0

どのような問題がありますか? –

+0

@OliverCharlesworth Cで生成されたすべての値は、私のmatlabスクリプトのものと比較して膨大です。最初の10ビンを例として挙げます。 bin [1] - 413.7、bin [2] - 410、bin [3] - 415、bin [4] - 408. Matlab:bin [0] - 5.2、bin [1] - 5.2、bin [2] - 5.3、bin [3] - 5.2、bin [4] - 5.3。 –

+0

@OliverCharlesworth私は、DCビン以外の値が相関していることを認識しました(つまり、両方の計算ビン48が最大値です).Cのすべての結果のみが大幅にスケールアップされます。これを引き起こしている可能性がありますか? –

答えて

0

arm_cfft_f32には、32ビット浮動小数点サンプルデータが必要です。 .wavファイルには通常、16ビットのリトルエンディアン符号付き整数サンプルが含まれています。

+0

あなたは変換でダイナミックレンジを失っていると思いますか? – rts1

+0

@ rts1私は、int16バッファがfloat関数に渡されるとき、データが型打ちされていると言っていると思います。 – user3528438

+0

@ hotpaw2私はあなたが正しいと思う、実際に私の.wavのデータは8ビットです。私は、それぞれのサンプルをfloat32_tにキャストして、必要なフォーマットにデータをフォーマットしていたと思っていた機能を作成しましたが、私が思ったように動作していない可能性があります。 [ここに自分のコードを挿入しようとしている](http://pastebin.com/176BEJF2)あなたはその機能を見て、私が思った通りに動作しているかどうかを教えてくれますか?(8ビット入力データ、および浮動小数点数の配列の0でインターリーブする)?ありがとう。 –

関連する問題