高次フィルタ

WEB上の設計ツールを使って、IIR形式の高次バタワースフィルタを作成します。

ソースコードやプロジェクトファイルのダウンロードはこちら →iir.zip

(1)雑音入り正弦波による試験用のプログラムです。
ブロック図
プログラム
coef = "iir_coef.csv";        // IIRフィルタ係数ファイル
dim = 4;                      // IIRフィルタ段数
dtMsec=1;
proc 
{ 
    signal = Ain( 0, 0, 1 );                     // アナログ入力ch0
    test = w_sin( period, 0, 1 ) + gauss( sd );  // 試験信号

    if mode>0 { IIRin = signal; }     // mode>0 ならアナログ入力
    else      { IIRin = test; }       // mode=0 ならシミュレーション

    IIRout = iir( IIRin, dim, coef ); // IIRフィルタ

    Aout( 0, 0, 1, IIRout );     // アナログ出力ch0:フィルタ出力
    Aout( 1, 0, 1, test );       // アナログ出力ch1:試験信号出力
} 
記号

以下の関数、信号、パラメータを使っています。 ソースコードで宣言したパラメータの値を操作パネルから変更はできません。

関数
(予約語)
 Ainアナログ入力ポートの電圧を数値化する関数です。
 Aoutアナログ出力ポートへ電圧を発生させる関数です。
 w_sin正弦波発生関数です。
 gauss白色正規雑音を発生させる関数です。
 iirIIRフィルタ関数です。
信号 inputアナログ入力です
 signal試験用信号です
 IIRinフィルタ入力です
 IIRoutフィルタ出力です
パラメータ coef IIRフィルタの係数ファイル名です
 dimIIRフィルタの段数です。
 dtMsec予約語です。演算周期を1msに固定します。
 period試験用信号の周期です。
 sd試験用信号のノイズの標準偏差です。
 mode入力信号の切換に使います。
例えば、m=0なら試験信号 test がフィルタの入力となり、 m=1ならアナログ入力した信号 signal がフィルタの入力になります。

説明

石川高専山田洋二研究室ホームページ http://dsp.jpn.org/dfdesign/のメニューから 「IIRフィルタ設計」を選択し、設計パラメータを入力して「設計する」ボタンを押します。
左の設計仕様に対して、右のような結果が得られます。

AprocSのフィルタ定義に合わせるために以下の変換を行います。

C i 1 = -b 1
C i 2 = -b 2
C i 3 = k * a 0
C i 4 = k * a 1
C i 5 = k * a 2   i=1, 2, 3, 4

これにより、以下のような4列の係数データを得ます。 上記のWEBデータをエクセルに貼り付けて変換し、CSV形式でファイル名 "iir_coef.csv" として保存しました。

設定例
記録例

 

(2)試験部を削除した実用のプログラムです。
ブロック図
プログラム
coef = "iir_coef.csv";        // IIRフィルタ係数ファイル
dim = 4;                      // IIRフィルタ段数
dtMsec=1;
proc 
{ 
    IIRin  = Ain( 0, 0, 1 );	// アナログ入力ch0
    IIRout = iir( IIRin, dim, coef );// IIRフィルタ
    Aout( 0, 0, 1, IIRout );	// アナログ出力ch0:フィルタ出力
}