blackfinライブラリのFFTを動かせました.かなりクセあるなぁ.
今回の情報ネタ元はここです.ライブラリのサポート情報は有料なのかな? netの情報が少ないです.
じゃぁクセの強いところを掘り下げてゆきましょう.
1.FFTを動かすのに必要なwork memory
fract32 fft_input[FFT_LENGTH];
fract32 fft_window[FFT_LENGTH]; // window function
complex_fract32 fft_twiddle[FFT_LENGTH/2]; // sin(2pi/N*k)
complex_fract32 fft_output[FFT_LENGTH];
fract32 fft_magnitude[FFT_LENGTH];
FFT_LENGTHは256とか512とかです.FFTですから2のべき乗.
fft_window[]はハミング窓とかの格納です.
fft_twiddle[]は、フーリエ変換でsin(2πf/N*k)みたいなの使うじゃないですか、それをあらかじめ計算しておいて格納しておきます.
fft_output[]は複素数で出てきますので、√(re*re+im*im)しなくちゃグラフになりません.
fft_magnitude[]は√(re*re+im*im)の結果を格納します.
2.FFTを動かす手順
1)あらかじめハミング窓を計算しておく.
gen_hamming_fr32(fft_window, 1, FFT_LENGTH);
2)input配列にハミング窓を掛け算する.
__builtin_mult_fr1x32x32()は32bitx32bit=32bitの掛け算をしてくれる関数です.ご提供してくださる関数を使いましょう.
for(int i=0; i<FFT_LENGTH; i++) {
fft_input[i] = __builtin_mult_fr1x32x32(fft_input[i], fft_window[i]);
}
3)sin(2πf/N*k)を計算しておく.
twidfftrad2_fr32(fft_twiddle, FFT_LENGTH);
4)FFT関数が出力する数値.256長なら8となる.512長なら9となる.
int block_exponent; // log2(FFT_LENGTH) = log2(256) = 8
5)32bit FFT本体.引数の1の意味はよくわからん.
rfft_fr32(fft_input, fft_output, fft_twiddle, 1, FFT_LENGTH, &block_exponent, 1);
6)√(re*re+im*im)を計算する.
fft_magnitude_fr32(fft_output, fft_magnitude, FFT_LENGTH, block_exponent, 1);
7)dBに直して出力する.X範囲はfnyqまでなので/2してますが各位お好みで.
for(int i=0; i<FFT_LENGTH/2; i++) {
print(20*log10(fft_magnitude[i]));
}
以上です.
わかってしまえば楽なんですけど、関数定義されているfilter.hを読んでも関数の使い方はなにも書かれてないんです.深い闇だ.
かしこ
0 件のコメント:
コメントを投稿