2023年11月28日火曜日

BlackFinを使ってみるなり(30) ライブラリのFFT、これクセあるわぁ

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を読んでも関数の使い方はなにも書かれてないんです.深い闇だ.

29へ    31へ

かしこ

0 件のコメント:

コメントを投稿