手習ひデジタル信号処理(61) Scilab、伝達関数H(z)からゲイン線図、Fs対応版

Joseph Halfmoon

前回は暫定版ですがFFT表示用の関数を作って多少お楽に。今回は以前から忸怩たる思い?をしてきた伝達関数からゲイン線図をプロットする方法を「改良」したいと思います。いつも正規化周波数に対するプロット。カッコイイお作法ではあるものの、具体的な周波数が入らないとイメージがわかない年寄です。実サンプリング周波数を与えたいです。

※「手習ひデジタル信号処理」投稿順 Indexはこちら

今回は、「遥か昔」に以下の投稿で、実機マイコン上で動かしてみた簡単なIIRフィルタ実例をScilab上でゲイン線図化してます(係数は違います。)

手習ひデジタル信号処理(4) STM32F446、最初はIIRフィルタ?

上記の投稿は、以下の御本を「手習ひ」して演習しているものでございます。

三上直樹先生著、工学社『「Armマイコン」プログラムで学ぶデジタル信号処理

伝達関数

今回のターゲットは1次のIIRフィルタで、以下の伝達関数をもちます。

BlockDiagramHz

ブロック図で描くと以下のとおりであります。

IIR1st

なお、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だし。gainPlot

塵も積もれば山となるのか、微妙な改良?割と小さいところで収束?

手習ひデジタル信号処理(60) Scilab、FFT表示用関数「とりあえず版」追加 へ戻る

手習ひデジタル信号処理(62) Scilab、伝達関数H(z)から位相プロット、Fs対応版 へ進む