手習ひデジタル信号処理(74) Scilab、今頃になってsyslinの使い方を知る

Joseph Halfmoon

前回 poly を使った多項式の定義がわかったような気がしたので、今回はそれを使って伝達関数を定義してみます。これまた過去に毎度もお世話になっている割にはなんだか謎なsyslinという関数を使って「使える形」にしていきます。線形システム?いや伝達関数のまま?なんじゃそりゃ。調べてみれば違いは一文字?

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

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

多項式が記述できれば、伝達関数も書ける?

多項式が記述できれば、伝達関数は分母/分子が多項式の有理式として表現できるのだからそれでよろし、と思いきや、表にはでてこない大きな一歩を踏み出さないと「使える伝達関数」にはなってくれないようです。

以下ではpolyをつかって文字 ‘s’ を多項式を表記するためのシンボル(多項式)として、伝達関数Hsをsを使って記述。そしてその先の一歩、syslin()関数を使って ‘c’ 、つまり連続な「ドメイン」の線形システムとしておるのです。sl00

上記のようにsLとHsの見た目は一緒の伝達関数っす。でもね、bode関数でボード線図を描いてもらうとその違いは明らかです。sLの方はほれこのように。sl01bode

ところがHsの方は、あえなく撃沈。「時間領域が未定義」らしいです。sl01c

以下は、いつもお世話になっておりますScilab 日本語Helpのsyslinのページへのリンクです。

syslin 線形システムを定義する

上記を読んでSilab素人は、syslinにかけると行列A、B、C、Dで表される「線形システム」に変換されて記憶されているものと勝手に思い込んでました。「線形システム」について素人は多くを語りますまい。以下のサイトなどどうぞ。

線形システム

しかし、今回調べてちょいと愕然としたのは、syslinに引数あたえるフォーマットも複数あり、確かに、A、B、C、Dで与える方法ならばそのようですが、伝達関数を与える方法の場合、伝達関数の分母、分子をわけて記憶しているだけみたいです。違いはたったの「一文字」です。sl01

上のdtのところに”c”と書かれておりますな。これは連続領域でのsyslinということでわけもわからず第一引数に与えたものにほかなりません。一方、元のHsはというとsl01b

分子num, 分母denは一緒ですが、dtが無し。つまりは「計算できる」伝達関数であるためにはdtの定義が重要みたいです。知らんけど。

離散ドメイン、サンプリング時間指定の場合

syslinがやっていることがおぼろげながら分かってきたので、こんどはzで記述できる離散ドメインの場合をやってみます。テキトーに伝達関数を書きました。zと書くか、sと書くかは単に人間のわかりやすさのみ。本質は ’d’ 離散ドメイン指定だと。zl00

実際にzLの中身を覗いてみるとこんな感じ。dtは”d”だと。zl01

 

そしてdtが”d”だと bode()関数に渡したときの挙動は異なります。

zl00bode

問題はx軸です。ただ離散ドメインだと宣言しただけでは具体的なサンプリング周波数などは分からないのです。離散的な周波数応答はサンプル時間Tが決まらないと具体的に計算できないので、「正規化周波数」で計算しておると。そういうことだったのね。

実は syslinに与えるのは、’d’ のサンプル時間が未決定の抽象的な離散ドメインでなく、具体的なサンプル時間を与えてしまってもよいのでした。こんな感じ。zT00

見た目の伝達関数は同じですが、周波数応答のx軸(周波数)には具体的な周波数が入ってきました。zT00bode

そのときのzTの中身は、zT01

そういうことだったのか。

tf2ss、伝達関数から線形システム表示への変換

上記のように伝達関数形式でsyslinしても中身は伝達関数のままみたいです。しかし、tf2ssという関数があり、これを通すことで行列A、B、C、Dで表される「線形システム」に変換できるみたいっす。まずは連続ドメインの場合。sl02tf2ss

続いて離散ドメインの場合

zl02tf2ss

最後に具体的なサンプル時間を指定した場合zT02tf2ss

連続から離散ドメインへ変換

そして以下に日本語Helpのある、dscrという関数を使うと連続ドメインで定義した伝達関数をサンプリング時間を指定した離散表現に変換できるみたいです。

dscr 線形システムの離散化

最初連続ドメインで考えていても、DSP実装となると離散へ行かないとならないので必須か?ホントか?

sld03

上記だと、ABCDの線形システム形式でピンとこないので、古めかしい伝達関数形式にすることもできます。今度はss2tf関数とな。sld04

おお、これが知りたかったんだ。計算できる?

手習ひデジタル信号処理(73) Scilab、今頃になってpolyの使い方を知る へ戻る

手習ひデジタル信号処理(75) Scilab、comm_tbxをインストールしてみる へ進む