Simulinkモデルの作成

Simulinkモデルの作成方法ですが、ライブラリから所望の機能を持ったブロックを、モデルウィンドウにドラッグ&ドロップして行います。Simulink基本ライブラリには四則演算、比較演算、論理演算、遅延子といった非常にプリミティブな機能を持ったブロックから、伝達関数(連続/離散領域)、PIDコントローラ、アナログ・デジタルフィルタなどある抽象度の高いブロックがあります。さらにオプション製品のブロックライブラリでは、FFT/DCT、QPSK/QAMなどの変復調、画像処理用2-Dフィルタなど、専門分野において使用される機能が豊富に提供されています。また、C/C++コードをSimulinkブロック化できるS-functionブロックやMATLABコードをSimulink上で使用することができるMATLAB Functionブロックといったものもあるので、Simulink以外の開発環境で作られた設計資産を活用することも出来るようになっています。

試しに簡単なSimulinkモデルを作成してみましょう。まずは連続系のシステムです。最初に必要な機能を持ったブロックをライブラリからモデルウィンドウへマウスでドラッグ&ドロップして配置します。ここではStep信号を生成するStepブロック、伝達関数で線形システムのモデルを表現するTransfer Functionブロック、可視化用Scopeブロックを配置しました。

各ブロックをダブルクリックしてパラメータ設定を行うことが出来ます。Stepブロックのパラメータ[最終値]を5に設定します。

Transfer Functionブロックでは伝達関数の係数を変更できるようになっていますが、ここではデフォルトのまま使います。

最後に可視化用のScopeブロックで、座標軸数を2に設定します。

パラメータ設定が終わったら信号線を繋いでいきます。Stepブロック⇒Transfer Functionブロック⇒Scopeブロックの順に接続します。Scopeブロックは2軸に設定したので、入力ポートも2つに増えています。片方にはStepブロックの出力信号、片方にはTransfer Functionブロックの出力信号を接続し、信号の変化を表示するようにします。

これでモデルは完成です。実行ボタン(緑色の真ん中に三角がある丸型ボタン)を押すとシミュレーションが実行され、Scopeブロックにはシステムの時間軸応答が表示されます。

動画
Simulinkモデルの作成手順例の動画(wmv形式 24.7MB 1分53秒)

非常にシンプルなモデルだからというのもありますが、プログラミング言語で書いた処理に比べて、どのような信号が入力されて、何の処理を行っているかがブロック線図で図示されているため、一目で誰にでも理解できるかと思います(もちろん伝達関数などの基本的な理系の知識は必要ですが)。そもそも、このような連続系システムをC言語などのプログラミング言語で記述しようとすると、シミュレーションで行いたい処理内容だけでなく、常微分方程式の近似計算式まで含めて考えてやる必要があるので、非常に骨の折れる作業になります。

次に離散システムをプリミティブなブロックを使ってモデリングしてみましょう。入力信号にはSin波のスイープ信号を出力するChirp Signalブロックを使います。Chirp Signalブロックは連続系の信号が出力されるので、Zero Order Holdブロックに接続し1kHzで離散化します。離散化された信号はディジタルフィルタを構成する3つのGainブロック、2つのDelayブロック、Addブロックに順に接続します。最後に可視化用のScopeブロックに接続します。

この図を見れば、スイープ信号が入力され、離散化(Zero-Order Hold)、遅延(Delay)…という処理内容がある程度理解できるのではないでしょうか? 筆者が開発業務に従事していた時には、プログラミングした信号処理アルゴリズムのソースコードを見ても何の処理を行っているのか第三者には理解不能なので、引き継ぎ資産として手書きやMicrosoft Visioで書いたブロック線図で残すという馬鹿なことをしていました。もちろんそのブロック線図はただの絵なのでシミュレーションすることなど出来なかったのですが、Simulink環境では実行して波形を確認したり、パラメータ変更するとどのように結果が変わるのか確認したりすることができます。

ブロックの接続を行い、各ブロックのパラメータ設定を次のとおり行います。

Chirp Signalブロック:スイープ信号を生成

[初期周波数(Hz)]:10
[ターゲット時間(秒)]:10
[ターゲット時間の周波数(Hz)]:500

Zero Order Holdブロック:連続系信号を離散化

[サンプル時間]:1/1000

Gain, Gain1ブロック:ゲイン

ゲイン:c(1) , c(2)

Delayブロック:離散遅延

遅延の長さ:1

Addブロック:加算

符号リスト:++

Scopeブロック

座標軸数:2

2つのGainブロックのパラメータをc(1), c(2)としたのは、後からパラメータ変更を容易にするためです。この変数をMATLABで定義しておくと、シミュレーション前にパラメータが読み込まれてから実行されます。例えばMATLAB上で次のように定義してみましょう。

>> c = [0.5 0.5]   % Low Pass Filter
c =
    0.5000    0.5000

変数cは両方とも0.5なので、Gainブロック、Gain1ブロック共に0.5が読み込まれます。シミュレーションを実行すると以下に示すようにローパスフィルタの特性が得られます。

次に、変数を以下のように変更してみます。

>> c = [0.5 -0.5]   % High Pass Filter
c =
    0.5000    -0.5000

Gainブロックには変数cの1番目の要素0.5が、Gain1ブロックには変数cの2番目の要素-0.5が読み込まれます。シミュレーションを行うと、今度はハイパスフィルタの特性が得られます。

このように、MATLABで定義したパラメータをSimulinkで読み込んで、MATLABとSimulinkとで連携させた使い方をすると利便性が高まります。

フィルタ部分は次数が高くなってブロック数が増えてくると見通しが悪くなるので、複数のブロックと信号線をサブシステムとしてカプセル化しましょう。モデルが階層化されて見た目がすっきりしました。このように作成した複数のサブシステムを登録してライブラリ化しておくと、組織内での設計資産共有にも大いに役立ちます。

著者紹介

松本 充史(まつもと あつし)
MathWorks Japan
アプリケーションエンジニアリング部
シニアアプリケーションエンジニア
Mathworks JapanではMATLABの中でも特に信号処理やコード生成に関する機能を担当している