2023年11月28日火曜日

BlackFinを使ってみるなり(29) 間引きフィルタ

前回は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やってみる.

28へ    30へ

かしこ

0 件のコメント:

コメントを投稿