パレット所蔵のブロックをざっと撫でた後にお楽しみのシミュレーションなど開始したいと希望。ブロック多数すぎて全部は撫でられないので「お楽」なところを触ってお茶を濁してます。離散時間パレットには「離散時間の状態空間形式」あり、そこに踏み込むと収拾つかなくなりそうなので、お楽しみにとって置くっと。手抜きだな。
※「ブロックを積みながら」投稿順 index はこちら
※動作確認にはWindows 11のパソコン(64bit)上にインストールしたScilabの以下バージョンを使用しています。
Scilab 2024.0.0
DLR(Discrete transfer funciton)ブロック
DLRブロックは離散時間パレット内にいくつもある「システム」の応答を記述するためのブロックの中でもっともシンプルなものかもしれません(個人の感想です。)単一入力を受け取って単一の出力を返すもの。システムは伝達関数記述です。離散時間なので「z変換」登場、zでかかれた伝達関数をうけとります。
そういえば最近、ということで思い出したのが以下の別シリーズ記事です。
手習ひデジタル信号処理(127) Scilab、filter関数で時間波形をBPフィルタ
上記では、ScilabのIIRフィルタ設計関数を使ってバンドパスフィルタの「zでかかれた伝達関数」を求めてます。IIRフィルタですから離散ね。
このとき使ったIIRフィルタ設計関数の結果をXcosに「輸入」して使えば、DLRブロック一撃じゃん。その方法が以下に。
Xcosにはコンテキスト設定というメニューコマンドあり。そこで開ける上のウインドウにScilab命令を書き込んでおくと、Xcosのシミュレーション開始時に自動で初期化実行してくれるみたい。そしてその結果をXcosのブロックどもが参照することができるようです。
上記では、サンプリング周波数1000Hzのときに、150Hzから250Hzの区間を通過させる11次のIIRバンドパスフィルタ(バタワース特性)の離散伝達関数を生成しております。詳しくは上記の別件記事で。
実験に使用したフロー
実験に使用したフローが以下に。最左端に正弦波信号源が3個並んでます。上から順に100Hz、200Hz、300Hzとな。これをΣのブロックで足し合わせ、S/H(サンプル&ホールド)ブロックに取り出すと離散信号とな。これを上記コンテキストブロックで生成した離散伝達関数をセットしてあるDLRブロックに通し、通過後の波形を観察してみます。
最左端の信号源の設定の一つ。後の祭りだけれど100、200、300とか整数倍の値にしてしまったのは失敗だったな。混ぜたときにもっとガタガタな感じにしたかった。
そして肝心のDLRブロックの設定が以下に。変数hzはコンテキストブロックで計算済の伝達関数です。hz.numで分子、hz.denで分母を取り出すことができます。
シミュレーション結果
以下は結果グラフです。上の黒の波形(約200Hzに見える)がDLRブロックを通過した後の波形です。下の緑はS/Hブロック通過後、DLR入力の元波形です。3周波数が混ざっているのでガタガタな感じ。
一入力一出力(SISO)な離散伝達関数の処理はできるみたい。ホントか?