前回はFIR filterを実装してみました.
今回は、blackfinライブラリのfilter.hにある間引き機能(decimation)を動かしてみます.
まず間引かない普通のFIRのおさらいをします.
用意するもの.構造体、FIFO.
_fir_fr32_state firparam;
fract32 fir_input[64], fir_output[64];
fract32 fir_delay[2 * FILTER_TAP_NUM];
64の意味は、FIRに64 sampleのデータを一括入力するという意味です.出力も64 sampleが出てきます.
FIR構造体を設定します.
fir_init(firparam, filter_taps, fir_delay, FILTER_TAP_NUM, 1);
引数1 構造体
引数2 タップ配列
引数3 work area タップ数の2倍
引数4 タップ数
引数5 間引かないので1
FIRを呼び出します.
fir_fr32 (
fir_input,
fir_output,
64,
&firparam );
ーーーー
次は、1/32に間引くやりかたです.
つまり、ADCはsampling freq. 32kHz ですが、これを1kHz sampleに変換するという意味です.
用意するもの.構造体、FIFO.
_fir_fr32_state firparam;
fract32 fir_input[64], fir_output[2];
fract32 fir_delay[2 * FILTER_TAP_NUM];
outputサイズが2になってます.理由は、1/32に間引くので64個が2個に減っちゃうからです.
FIR構造体を設定します.
fir_init(firparam, filter_taps, fir_delay, FILTER_TAP_NUM, 32);
引数5 1/32に間引くので32
FIRのdecimationバージョンを呼び出します.
fir_decima_fr32 (
fir_input,
fir_output,
64,
&firparam );
データを間引いたメリットはこうです.
間引く前:
ADCのcallbackは32kHzの64サンプル分=2mSec周期です.2mSecで64個のデータを処理しなくちゃいけません.
1/32に間引くと:
2mSecで2個のデータを処理するだけですのでとても軽くなりました.いろんなフィルタ処理をやりやすくなるでしょう.
次はFFTやってみる.
かしこ
0 件のコメント:
コメントを投稿