手習ひデジタル信号処理(120) Scilab、wfirでFIRフィルタを設計

Joseph Halfmoon

前回、周波数標本法というアルゴリズムでFIRフィルタを設計できるfsfirlin関数の出力でフィルタできることを確かめました。今回はウインドウィング法で線形位相のFIRフィルタを設計できるwfir関数を使ってみます。この関数は「推し」みたい。Scilabには珍しくGUIも完備してます。手放しで喜べないのだけれども。

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

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

wfir関数

この関数は、ウインドウィング法(WINDOWING TECHNIQUES-FIR FILTER DESIGN)を使い、線形位相のFIRフィルタを設計できる関数であるようです。HELPページが以下に。

wfir

実に引数が5つ、出力が3つある関数です。その上、とっつきが悪いのは、引数に2文字の略号をとるのですが、上記のHELPページなどにはその略号がどういう意味なのか説明がないことであります。

第1のftype引数にはフィルタのタイプを2文字で与えます。こんな感じ。

    • lp、ローパス
    • hp、ハイパス
    • bp、バンドパス
    • sb、ストップバンド

さすがに、lpはローパスだろ~といった想像はつくのでこれはまあOKか。

第2引数のforderにはフィルタの次数を数値で与えます。値は正の整数です。ただしhpとsbは奇数でないといけないと。まあ、ここは当然か。

第3引数は、カットオフ周波数(正規化)を2要素ベクトルで与えます。2要素になるのは、bp, sbでは2か所指定する必要があるためです。lpとhpは1か所しか必要ないので第1要素のみ参照するようです。なお、第1要素<第2要素。

第4引数は、窓関数を二文字で与えるのですが、信号処理素人の老人にはちょいとキツイです。最初に出てくる re をみて、あれ何だっけ?と。レクタングルのreであったので 矩形窓ね。。。以下こんな感じです。

    • re、矩形窓
    • tr、三角窓
    • hm、hamming窓
    • hn、hann窓
    • kr、Kaiser窓
    • ch、Chebychev窓

呼吸をするように窓関数を選択できるヒトは良いのですが、ぱっと窓関数名など列挙できない素人には説明が欲しかったです。

第5引数は、2要素のベクトルなのですが、上記のkrとchを指定したときだけ参照されるようです。hamming窓など使うときはテキトーに[0 0]で良いみたい。知らんけど。

さて引数が分かったので、HELPページのサンプルにおいてあったパラメータでフィルタ係数を計算し、その特性を眺めてみたいと思います。処理はこんな感じ。

[h,hm,fr]=wfir("lp",33,[.2 0],"hm",[0 0]);
clf;
plot(fr, 20*log10(hm))
xlabel("Normarized Frequency");
ylabel("Gain[dB]");
title("FIR filter(LPF N=33 Cutoff=0.2 hamming)");

上記で h こそが求めるフィルタの係数ベクトルです。hm, frは上記のように周波数特性を表すもの。プロット結果が以下に。wfirSampleMAGplot

wfir_gui

上記のようなCUI操作に、素人は引数の文字など覚えられんからメンドイよな、と思っていたら、GUIが用意されてました。wfir_guiとな。起動したところが以下に。wfirGUIwindow

なんだ、これならタイプを示す2文字の文字列など覚えなくても済むじゃん。下の方にある View というチェックボックスにチェック入れておくとフィルタの周波数特性グラフも表示されます。これでOK押せばよいのね?えい。wfirGUIresult

何も代入先の変数を設定せず、wfir_guiを直接呼んでしまうと設定してOKしてもTが返るだけです。トホホ。

以下のhelpファイルを見ると、代入先の変数名を指定しておかないとダメだと。

https://help.scilab.org/docs/6.1.0/ja_JP/wfir_gui.html

上記では以下のように呼ぶように書かれています。結局5つのパラメータを各変数に返してくるのね。。

[ftype,forder,cfreq,wtype,fpar] = wfir_gui()

しかし、上記をやると変数の個数が違うと文句を言われます。Helpとは違うの?

いろいろやってみたところでは、代入先変数は3個でノーエラーです。

[r1, r2, r3] = wfir_gui()

上記のようにして得た結果を見ていきます。r1から。wfirGUI_r1

この最初の戻り値は、フィルタの生成が成功した意味でのTだよね。多分、何かうまく行かない設定されるとFが返るのかな?

r2が以下に。

wfirGUI_r2

まさに、r2にwfir関数に与えるべき引数どもが列挙されております。ただ、カットオフ周波数などは2要素ベクトルに対して low, highと個別、一方、fparは2要素ベクトル。ちょっと首尾一貫してない感じ。それに最後のfreq_echって何よ?聞いてないよ~。

r3はr2の繰り返し的な感じです。全部文字列。ただし引数順序と個数は異なります。これはこれでどう扱ったらよいの?wfirGUI_r3

GUIを使えば2文字の文字列を記憶せずに済むけれど、結局、wfir関数に与える引数リストを「再構成」するのは自分?フィルタ係数のベクトルまで落としてくれるわけでないのね。。。

手習ひデジタル信号処理(119) Scilab、fsfirlinのLPFでフィルタしてみる へ戻る

手習ひデジタル信号処理(121) Scilab、ffiltでFIRフィルタを設計 へ進む