手習ひデジタル信号処理(86) Scilab、GUIつかってフィルタ作ろうとしてハマる

Joseph Halfmoon

前回、自前版NCOとて単なるSIN波、COS波を生成し、変調された信号に乗じてI/Q分離の第一段階をば実施。次はLPF、ということで今回はLPFを作成することにいたしました。そういえばScilabにはGUIを使ってLPFを生成する関数があったんじゃないだろうか?GUIならお楽ね。と思って使ってみてハマリましたです。

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

※動作確認に使用させていただいているのは、Scilab 6.1.1(Windows版)です。

当方で使用しておりますcomm_tbxは、以下のバージョンです。Scilab環境からATOMS(Scilabのライブラリ管理ツール?)でインストールをいたしたもの。

Scilab Communication Toolbox 0.3.1

SINCフィルタではなく単なるFIRフィルタ作りたい

このような局面では普通SINCフィルタでLPF兼デシメーションみたいなことになるのだと思いますが、ここは「非」実時間処理です。ステップ・バイ・ステップで信号が処理されていく様子を追いたいだけなので、どんなに時間が掛かろうとOKっす。フツーに(かつテキトーに)FIRフィルタ作成して前回の信号をフィルタしてみて~と考えました。

wfir_gui()にハマる

そういえばScilabには以下の関数あり

wfir_gui()

GUIを使って線形位相なFIRフィルタを作ってくれるのではなかったかしら。なんやら難し気なパラメータを一つ一つ書いていくよりGUIならお楽、きっと。ということで wfir_gui() を立ち上げてみました。こんな感じ。WFIR_GUI_

おいおい、ダメじゃん、GUIは立ち上がっているみたいだけれども文字化けしていてなんだか分かりません。

インストール時に手元のScilabは日本語モードになっており、コンソール、エディタ、ヘルプ画面などすべて日本語化されておるのです。いままで大きな不具合なかったのですが、このGUI画面ではフォントが化けてるみたい。

さっそく設定画面へ行ってフォント設定をいじってみました。こんな感じ。FONT_SETTING

上記のように日本語フォントを設定しまくって Apply して OKよっと。コンソール画面など即座にフォント変更が反映しております。やったね。

しかし、wfir_gui()立ち上げると、何も変わりません。文字化けしたまま。いたしかたないので、上記の一般設定から English を選択して再立ち上げしてみました。すると、こんな感じ。WFIR_GUI_ENG

おお、これだ、求めていたのは。

Viewのところにチェックを入れると周波数応答のグラフも描いてくれます。こんな感じ。おお、いいんでないかい。Wfir_GUI_freq

しかし、お間抜けはつづきます。何も代入先を用意せずに起動すると以下のようです。WFIR_GUI_ENG_JUST_T

設定成功したというオシルシらしい真偽値を返してくれますが、肝心の結果不在。空振りじゃん。

気をとりなおしてwfir_gui()のhelpみると、こんな感じ。5個も結果が返ってくるのね。以下ScilabのHelpから1か所引用させていただきます。WFIR_GUI_HELP

さっそく上記のSyntax通りでやってみます。こんな感じ。WFIR_GUI_ENG_ERROR

上記どおりに出力の代入先を5個用意したら、あろうことかのエラーです。なんでだ?言われたとおりにやっとりょーが。

万能の「試行錯誤法」の結果、出力代入先はHelpとことなり3個であれば実行成功することに気づきました。こんな感じ。WFIR_results

実行はできたました。そして上記の戻り値の中身をしげしげと眺めて気づきました。どこにもフィルタ係数のリストなんかないじゃん!

wfir_gui()には「兄弟」ともいえるコマンドライン関数 wfir()というものがあり、そいつにこのパラメータを適切な順番に「並べ替えて」入れたらフィルタ係数がもとまるのではという感じっす?ここまでやらせておいて結局wfir()にチマチマとパラメータを与えろってこと?このGUIの存在価値に哲学的な問題を感じつつ、切れました。

結局以下一行を「手動」で入力して、フィルタ係数 wft を求めてみました。

[wft, wfm, fr] = wfir('lp', 300, [0.0025 0.003], 'hm',[0 0]);

最初からGUIなど頼らずやっていればとっくにできていたじゃん。プンプン。

上記のwftを、前回生成の信号に通したらフィルタされとるようです。

[sz, szf] = filter(wft, 1, sT);
[cz, czf] = filter(wft, 1, cT);

LPF通過後のプロットが以下に。

sZcZplot

また、Scilabの闇を踏んづけてしまった?知らんけど。

手習ひデジタル信号処理(85) Scilab、自前版NCO、単なるSIN/COSの計算だけど    へ戻る

手習ひデジタル信号処理(87) Scilab、前回の続きでNCOした信号をLPF へ進む