手習ひデジタル信号処理(116) Scilab、Analog LPF等価なIIRフィルタ作成

Joseph Halfmoon

前回はサイドローブを制限しないのマズいだろ~という中、ポンコツな例ということでRCフィルタを計算することに。それがScilab上でどうやてRCフィルタ(LPF)等価な特性を計算?という疑問になり、何とか計算。しかし実際にデジタル数列をフィルタ処理するにはデジタルフィルタ化せんといかんと。流れ流れて今回はiir関数っす。。

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

※Windows11上で、Scilab6.1.1およびScilab上のツールボックス Scilab Communication Toolbox 0.3.1(以下comm_tbx)を使用させていただいとります。

アナログフィルタと等価なIIRフィルタを作成可能

とはいうものの、それをどうやってScilab上で計算したらいいのか、信号処理素人の老人には分かりませぬ。手がかりになるのは以下のドキュメント(日本語)かと思われます。

analpf アナログローパスフィルタを作成する

iir デジタルフィルタ

上記のIIRフィルタのドキュメントを拝見すれば、analpf()関数に与えた引数相当のものをiir()関数に与えればデジタルフィルタが求まるんでないの?と思われたのです。まあ、例によって細かい波乱?はいろいろあり。

まずは所望のアナログフィルタの特性を復習

前回、抵抗とコンデンサで作るRCローパス・フィルタの特性をエミュレートせん、ということで analpfフィルタにたどりついたのでありました。まずは、周波数等の設定は以下のようです。サンプリング周波数Fs=500kHzデス。

Fs=500e3;
Fc=38e3;
Fsym=2e3;
Fcut=Fsym/2;
FcutNorm=Fcut/Fs;

上記の周波数の設定は、思い起こせば遥かな過去にも思えますが、Fc=38kHzサブキャリアの赤外線リモコン用の信号を想定していたためでありました。ボーレートはFsym=2000ボーね。現実の赤外線ならサイドローブも何もそんなの関係ねえ、と踏みつぶすこともOKなのですが、そこは手習ひ、フィルタも練習してみるしかないということであります。

さて、上記の周波数設定に対して、シンボル周波数の半分にカットオフ周波数Fcutを設定したRCフィルタ相当のアナログフィルタを作製してみます。ここは前回すったもんだした挙句?N=1のバタワースフィルタとして計算してやれば良いという結論に達してました。ホントか?

hza=analpf(1,'butt',[0 0],Fcut*2*%pi);
[fr, hf]=repfreq(hza,1,10000);
clf();
plot(log10(fr),20*log10(abs(hf)),'r', 'LineWidth', 3);
xgrid();
xlabel("Frequency [log10(Hz)]");
ylabel("Gain [dB]");
title("Butterworth filter");

上記によって得られた特性は以下のごとし。analogFilterMagPlot

横軸 3 (常用対数なので1000Hzってことね)で、-3dB。カットオフ周波数の設定どおりであります。そして横軸 4、10kHzにて-20dBであると。

等価なIIRフィルタを求める

iir()関数の解説を見ると、テキトーに引数かけば動きそう(実際そうともいえる)のですが、

analpf関数は実周波数で計算できる。しかし iir関数は正規化周波数相手。

というところで「即代入」路線は否決されます。さらにコマケーところを言うとanalpfはカットオフ周波数を角速度[rad/s]で与えるのに対して、iir関数は正規化周波数[Hz]です。換算せねば、メンドイ。iirに与えるカットオフ周波数はFcutNormということで。

また、iir関数は、バタワース特性だけでなく、各種の特性に共通の「ラッパ」的な関数のようで、バタワースのローパスフィルタでは設定不要なパラメータ(ローパスなのに形式的にカットオフ周波数が2個必要とか)も与えないと時々機嫌が悪くなってエラーを吐くみたいっす(お前が設定間違えるからだろ~。)よく見て値を決めないとなりません。

結構、引数の値を試行錯誤した後での結果が以下に。

hzi=iir(1,'lp', 'butt', [FcutNorm, FcutNorm*10], [0, 0]);
[hzm, fri]=frmag(hzi, 100000);
clf();
plot(log10(fri*Fs), 20*log10(abs(hzm)), 'g', 'LineWidth', 3);
xgrid();
xlabel("Frequency [log10(Hz)]");
ylabel("Gain [dB]");
title("IIR filter(N=1 LP BUTT)");

上記処理結果のプロットが以下に。正規化周波数のままだとアナログフィルタと比較できないので横軸は実周波数に換算してあります。また、上記だと広い範囲をプロットしてしまうので、以下はプロット画面でアナログフィルタとほぼほぼ同等な範囲のみズームした結果です。iirFilterMagPlot

 

まあ、一致しておるみたいに見える。アナログフィルタ等価なデジタルフィルタが求まった。大丈夫か?

手習ひデジタル信号処理(115) Scilab、RCフィルタ(LPF)をエミュレート? へ戻る

手習ひデジタル信号処理(117) Scilab、Analog LPFでベースバンドフィルタ へ進む