前回は暫定版ですがFFT表示用の関数を作って多少お楽に。今回は以前から忸怩たる思い?をしてきた伝達関数からゲイン線図をプロットする方法を「改良」したいと思います。いつも正規化周波数に対するプロット。カッコイイお作法ではあるものの、具体的な周波数が入らないとイメージがわかない年寄です。実サンプリング周波数を与えたいです。
※「手習ひデジタル信号処理」投稿順 Indexはこちら
今回は、「遥か昔」に以下の投稿で、実機マイコン上で動かしてみた簡単なIIRフィルタ実例をScilab上でゲイン線図化してます(係数は違います。)
手習ひデジタル信号処理(4) STM32F446、最初はIIRフィルタ?
上記の投稿は、以下の御本を「手習ひ」して演習しているものでございます。
三上直樹先生著、工学社『「Armマイコン」プログラムで学ぶデジタル信号処理』
伝達関数
今回のターゲットは1次のIIRフィルタで、以下の伝達関数をもちます。
ブロック図で描くと以下のとおりであります。
なお、DC(直流、周波数0Hz)のときに振幅比1という制約条件から係数には以下の関係があります。
b0 = 1 - a1
伝達関数Hzからゲイン線図を描く関数
正規化周波数ではなく、具体的な周波数に対してゲイン線図を描くために、第1引数にサンプリング周波数Fsをとりました。第2引数には、syslin関数で定義した伝達関数(後ででてきます)を与えます。
横軸を具体周波数にするついでに、縦軸をdB単位にしてます。どさくさ紛れ。
// Magnitude plot // Fs: sampling frequency [Hz] // Hz: Transfer Function function plotMAG(Fs, Hz) [xm, fr]=frmag(Hz, 4096); clf(); plot2d(fr * Fs, 20*log10(xm)); xtitle('Magnitude plot','frequency [Hz]','magnitude [dB]'); endfunction
実際にゲイン線図を描いてみる
a1に具体的な係数を与え、さきほどのb1とa1の関係式からb1を求め、syslin関数を使って伝達関数を定義してみます。デジタル信号処理を「タイトル」にしているので、ことさらに離散的(ディスクリート)ということで ‘d’ をあたえ、%z(z変換用のシンボル)で伝達関数を記述しとります。
plotMagの第1引数にはサンプリング周波数10kHzを与えてます。
a1=0.996; b0=1-a1; Hz = syslin('d', b0/(1.0-a1*%z)); plotMAG(10000, Hz)
上記の実行結果が以下に。以前からしたら「微妙」によくなったです。横軸はフツーにHzだし、縦軸はdBだし。
塵も積もれば山となるのか、微妙な改良?割と小さいところで収束?