前回はFIRローパスフィルタの「設計用」関数に「一皮」かぶせてみました。今回はIIRローパスフィルタと行きたいデス。今回は比較対象というか、目標を掲げました。以前、勝手に手習ひさせていただいていた三上直樹先生著の御本の付録のIIRフィルタ設計用関数です。「おんなじ」ような感じにいたしとうございます。
※「手習ひデジタル信号処理」投稿順 Indexはこちら
勝手に手習ひさせていただいていただいておりました教科書は以下です。
三上直樹先生著、工学社『「Armマイコン」プログラムで学ぶデジタル信号処理』
上記ご本のArm(STM32F446)用のプログラム・ソースはArm社のWeb環境であるOnline Compiler上で公開されていたのですが、2022年末にOnline Compilerは閉鎖、Keil Studio Cloudへと移行してます。三上先生の公開されていたソースはどうなっていることか?
さて上記教科書には付録(ご本を購入した人用の)があり、その中にIIRフィルタ設計用のGUIツールも含まれておりました。こちらは上記の公開ソースとは無関係(非公開)です。今回は、信号処理素人が、無謀にも三上先生のツールと同等の「設計」をできる関数をScilab上に実装しようという回。まあ、実際に計算を行うのはScilab様なので、計算はできるハズ、と。
IIR_Designツール
まずは、目標とする三上先生ツールです。C#で書かれたGUIアプリです。
今回は、三上先生の御本のP.65で設計されているIIRフィルタと同じパラメータを与えてます。
-
- 次数 6次
- 標本化周波数 10kHz
- 遮断周波数355Hz
- 連立チェビシェフ特性(楕円フィルタ)
- 低域通過フィルタ
- 通過域リップル 0.5dB
- 阻止域減衰量 40dB
ScilabのIIRフィルタ設計関数
ScilabのIIRフィルタ設計関数のHELPページ(日本語)が以下に。
まあ、ScilabにもGUIを表示する機能はあるのですが、ここはまずCUIで三上先生と同等のフィルタが設計できるようにしてみたいとおもいます。はるかな後にはGUI化するかもないデスが。
Scilab用のIIRフィルタ設計関数はほぼほぼ三上先生ツールと同等な機能を行えそうではあるのですが、例によって正規化周波数ベースであったり、リップルの定義がdBでなかったりと三上先生ツールとはパラメータの与え方が異なります。そこで一皮かぶせてみたものが以下に。
// Calculate and Plot IIR Lowpass Filter(elliptic) // Fs: sampling frequency [Hz] // nFlt: number of filter order // Fc: cut-off frequency [Hz] // Rp: Ripple, passband [dB] // Rs: Ripple, stopband [dB] // Plt: 1 for plot, 0 for no plot function hz=genIIRLPe(Fs, nFlt, Fc, Rp, Rs, Plt) Fcnorm = Fc / Fs; freqV = [Fcnorm Fcnorm*1.1]; delta = [1-10^(-Rp/20) 10^(-Rs/20)] [hz] = iir(nFlt, 'lp', 'ellip', freqV, delta); if Plt == 1 then [hzm,fr]=frmag(hz,256) clf(); plot2d(fr*Fs, 20*log10(hzm)) xtitle('Magnitude plot','frequency [Hz]','magnitude [dB]'); end endfunction
実際にフィルタを作ってみる
上記関数を定義後、以下のようにして実行してみました。genIIRLPeの引数は順に
-
- サンプリング周波数[Hz]
- 次数
- 遮断周波数[Hz]
- 通過域リップル[dB]
- 阻止域減衰量[dB]
- プロットフラグ(1でプロット、0でプロット無)
です。結果はHz(伝達関数)です。
三上先生ツールと同じパラメータを与えて実行したところが以下に。
Fs=10000; hz=genIIRLPe(Fs, 6, 355, 0.5, 40, 1);
ほぼほぼ「クリソツ」。いいんでないかい。知らんけど。