+ All Categories
Home > Documents > ゼミ資料:WindowsによるMATLAB/Simulink入門 · 2017-04-26 · 1...

ゼミ資料:WindowsによるMATLAB/Simulink入門 · 2017-04-26 · 1...

Date post: 22-May-2020
Category:
Upload: others
View: 3 times
Download: 0 times
Share this document with a friend
107
1 ゼミ資料:Windows による MATLAB/Simulink 入門 (ver.1 1990, ver.2.2 7/16/01,ver.2.3 9/29/01,ver.3 10/4/01) 大分大学工学部 松尾 孝美 1.はじめに ,ソフト ェア MATLAB/Simulink から し, 題を してあります. された学 して りまし た. 学を めて学 テキストをよむ に,そこに されている 題を1つずつ MATLAB/Simulink により させグラフ するこ により がより むこ す. お,MATLAB プログラムを け, わりにデータをベクトル あるい するように 掛け さい.こ により,プログラムが り,また, します. さらに,Simulink を いる ,ブロック ベース うこ きます. お,ver2.3 および らびに ver.3 ディジタル を大 しました. 2.MATLAB/Simulink とは MATLAB MatrixLaboratory を した TheMathworksInc. プログラム す.オリジナル ある LINPACKおよび EISPACK す. MATLAB( ,多 ,データ ,因 ,グラフィック ,フィルター より され,コアモジュール れる)およびそれらを わせてプログラム した M- ファイル れるファイルから っている Toolbox,ブロック による シミ ュレータ Simulink,さらに Stateflow ,各 ツールを わせるこ により, うこ きます.以 ,Windows MATLAB について たい います. 2.1 特徴 MATLAB ,データ ,DSP/ す.MATLAB ,つぎ よう 意されています. ●アプリケーション ツール ・MATLABCompiler ・MATLABC/C++MathLibrary ・MATLABGraphicsLibrary ・MATLABWebServer ・MATLABRuntimeServer ●Toolboxes Toolbox するために された ライブラリ す. 意されており,つぎ よう があり
Transcript

1

ゼミ資料:Windows による MATLAB/Simulink 入門

(ver.1 1990, ver.2.2 7/16/01,ver.2.3 9/29/01,ver.3 10/4/01)

大分大学工学部 松尾 孝美

1.はじめに

本原稿は,ソフトウェア MATLAB/Simulink の一般的な使い方から説明し,最後に制御工

学の基礎的例題を示してあります.当研究室に配属された学生用の自習書として作りまし

た.制御工学を初めて学ぶ方は,制御工学のテキストをよむ際に,そこに掲載されている

例題を1つずつ MATLAB/Simulink により計算させグラフ化することにより制御工学の理解

がより進むこと請け合いです.なお,MATLAB でプログラムを組む際には,繰り返し計算は

なるべく避け,繰り返し計算の代わりにデータをベクトル化あるいは行列化するように心

掛け手下さい.このことにより,プログラムが簡潔になり,また,計算速度も増します.

さらに,Simulink を用いると,ブロック線図ベースでの制御系応答計算を行なうことがで

きます.なお,ver2.3 では,音声処理および画像処理の例題の追加,ならびに ver.3 では,

ディジタル信号処理の基礎項目を大幅に追加しました.

2.MATLAB/Simulink とは

MATLAB は Matrix Laboratory を略したもので,米国 The Mathworks Inc.の行列計算の会話

型プログラム言語です.オリジナルは行列計算で定評のあるLINPACK およびEISPACKです.

構成は,基本 MATLAB(行列計算,多項式計算,データ解析,周波数分解,基本数値計算関

数,微分方程式計算,因子分解,論理演算,グラフィック表示,フィルター設計などより

構成され,コアモジュールとよばれる)およびそれらを組み合わせてプログラム化した M-

ファイルとよばれるファイルから成っている Toolbox,ブロック線図による時間応答シミ

ュレータ Simulink,さらに Stateflow 等,各種ツールを組み合わせることにより,様々な

分野の研究や開発業務を最新の環境で行なうことができます.以下,Windows 版の MATLAB

の特徴について簡単に述べたいと思います.

2.1 特徴

MATLAB は,データの可視化,制御系設計,DSP/通信関連,金融解析など広範囲な分野

に適用可能です.MATLAB の製品群には,つぎのようなものが用意されています.

アプリケーション開発ツール

・MATLAB Compiler

・MATLAB C/C++ Math Library

・MATLAB Graphics Library

・MATLAB Web Server

・MATLAB Runtime Server

Toolboxes

Toolbox は,特別の目的に使用するために開発された関数ライブラリです.信号処理,画

像処理,制御系設計,最適化,金融工学などが用意されており,つぎのようなものがあり

2

ます.

Optimization, Financial,Statistics, Spline,Neural Network,GARCH

Symbolic Math, Datafeed,Extended Symbolic Math ,Financial Time Series

Partial Differential Equation, Financial Derivative,Signal Processing

Wavelet,Image Processing, Filter Design,System Identification

Control System, Mu-Analysis & Synthesis,Fuzzy Logic LMI Control

Robust Control, Model Predictive Control,Communications,GA

Simulink

ブロック線図を使った連続時間システム,離散時間システムおよびその混在システムの時

間応答シミュレーションを行うことができる.また,Simulink からは,つぎの 3つの機能

を使うことができます.

・ Stateflow:イベントドリブンシステムのモデリング及び設計のために用います.

・ Blocksets:特定分野のライブラリを Simulink に組み込むためのものです.

・ Code Generation Tools:Real-Time Workshop と Stateflow Coder は,組み込み機器

のための Cソースコードを生成します.

Simulink で使用する特殊目的のブロック群で市販されているものはつぎのとおりです.

Simulink RTW Ada Coder,Real-Time Workshop Real-Time Windows Target,

Stateflow, Dials & Gauges Blockset,Stateflow Coder xPC Target

Fixed Point Blockset, CDMA Reference Blockset,DSP Blockset

Motorola DSP Developer's Kit,Simulink Report Generator,Communications Blockset

Simulink Performance Tools,Power System Blockset, RTW Embedded Coder

Requirements Management Interface,Developer's Kit for Texas Instruments DSP,

Nonlinear Control Design Blockset

MATLAB と外部インターフェイス

MATLAB はつぎのような外部とのインターフェイスを持っています.

・ MEX:C,C++,Fortran などのインターフェイスとして用いられます.既存の

C,C++,Fortran アルゴリズムとの結合,ハードウェアの直接制御などが可能です.

・ DDE(Dynamic Data Exchange):Windows 専用であり,動的なクリップボードであり,

例えば,MATLAB データをそのまま Excel のワークシートにデータを転送できます.

・ Active X:MATLAB 内から外部アプリケーションを操作したり,外部アプリケーショ

ンから MATLAB を操作することができます.

・ Java:MATLAB6 から実装され,ネットワーク通信,外部アプリケーションとの結合な

どが可能です.

製品説明は,Mathworks, Inc.の日本代理店であるサイバネットシステム社のホームページ

http://www.cybernet.co.jp/products/matlab/ をご覧下さい.また,もっと詳しい説明は,

資料の最後にあげた参考文献をご覧下さい.

3

2.2 MATLABの起動と終了

PC-MATLAB におけるファイルは次のものからなっています.

4

Windows での MATLAB の起動は,スタートメニューあるいは,ディスクトップの MATLAB の

ショートカットアイコンから起動します.

MATLAB が起動されると,つぎのようなウィンドウが表示されます.

右側がコマンドウィンドウです.ウィンドウ内の

>>

がコマンドプロンプトです.MATLAB はインタプリタの一種であり,ちょうど,以前の MS-DOS

版の BASIC を起動したのと同じ状態になっていると考えてください.機能も BASIC をもっ

と使いやすくして,数値計算やグラフィックのライブラリがついたものと思ってもらって

結構です.また,MATLAB のコマンドモードで

>>quit

5

あるいは,

>>exit

と入力するか,メニューで終了を選択すると,MATLAB が終了します.

2.3 MATLABの基本的な使い方

では,起動後,どのようにして使うかについて説明しましょう.MATLAB は基本的なデータ

要素が行列である行列計算独自のプログラム言語であり型も自動判定するため,次元や型

の宣言をする必要がまったくありません.変数名や関数名は英数字とアンダースコアを使

い,最初から19文字までが区別されます.また,大文字と小文字も区別します.

2.3.1. 行列要素の定義法

>>のあとに,

>>A = [ 1 2 3

4 5 6

7 8 9 ]

あるいは,

>>A = [ 1 2 3 ; 4 5 6 ; 7 8 9 ]

と入力すると,3×3行列 Aを定義できる.また,このように入力すると,次のように確

認用の出力がでてきます.

A =

1 2 3

4 5 6

7 8 9

スカラー値やベクトル値は行列の特別な場合に当たりますが,次のように定義できます.

>>Scal = 1.5

>>Vec1 = [ 2.0 -1.8 ] (横ベクトル)

>>Vec2 = [ 2.0 ; -1.8 ] (縦ベクトル)

確認用出力を画面上に表示したくないときには,入力の後にセミコロンをつければ表示さ

れなくなります.つまり,

>>A = [ 1 2 3 ; 4 5 6 ; 7 8 9 ] ;

と入力すれば良いわけです.また,計算途中で値を参照したいときには,

>>A

と入力すれば,その値を表示できます.また,起動時の変数 i,j のデフォルト値は の平

方根になっており,複素数は

>>z = 2 + 3*i

で定義できます.もし,i を別の値として定義しなおした場合には,新しく虚数の定義を,

たとえば

>>im = sqrt(-1) (sqrt は平方根を求める基本関数)

6

とすれば,

>>z = 2 + 3*im

で複素数が表現できます.

2.3.2. 基本行列演算

以下に行列演算の例を列記します.

行列 B の定義(行列 A は 2.2.1.ですでに定義済みとする)

>>B = [ -1 -2 -3 ; -4 -5 -6 ; -7 -8 -9 ];

行列の転置( C = BT )

>>C = B '

行列の和( D = A+B )

>>D = A+B

行列の差( E = A-B )

>>E = A+B

行列の積( F = A*B )

>>F = A*B

行列の商( G = A-1*B )

>>G = A¥B (¥ 記号は98版の場合で,IBM-PC 版はバックスラッシュ)

行列の商( H = A*B-1 )

>>H = A/B

行列要素の総和

>>sum(A)

行列要素の総積

>>prod(A)

なお,行列の商は Gauss の消去法を用いています.

さらに,主な関数として次のようなものが装備されています.

行列式

>>d = det(A)

単位行列

>>A = eye(5) (5次元単位行列)

要素がすべてゼロの行列

>>B = zeros(3,5) (3行5列ゼロ行列)

固有値,固有ベクトル( D の対角成分が固有値,Vの各縦ベクトルが一般化固有ベクトル)

>>[V,D] = eig(A)

特異値分解

>>[U,S,V] = svd(A)

7

指数関数行列

>>BE = expm(A)

ほかに,対数,三角関数,トレース,特性多項式などがあります.

2.3.3. ベクトル,行列要素の操作

MATLAB の添え字機能を使うと,行列の任意要素の作成や除去が簡単にできますので,次

に列記します.コロン記号による横ベクトルの作成

x=[ -1 0 1 2 ]の場合

>>x = -1:2

y=[ 0.0 0.2 0.4 0.6 0.8 1.0 ]の場合

>>y = 0.0:0.2:1.0

コロン記号による縦ベクトルの作成

x=[ 0.0 0.2 0.4 0.6 0.8 1.0 ]T の場合

>>x = (0.0:0.2:1.0)'

ベクトルデータによる行列作成

>>x = (0.0:0.2:1.0)'

>>y = sin(x) (縦ベクトルの作成)

>>A = [x,y] (縦ベクトル xと yによる行列作成)

行列の任意要素の取り出し

>>C = A(1:2,5:8) (行列 Aの 1,2 行,5,6,7,8 列からなる 2行 4列の行列作成)

>>D = A(1:2,:) (行列 Aの 1,2 行全体からなる行列作成)

>>A(:,[1,3,5]) = B(:,1:3) (B の最初の 3列を Aの 1,3,5 列と置き換える)

行列のベクトル化

>>A = [ 1.1 2.1 ; 3.1 ,4.1 ]

>>b = A(:) ( b=[ 1.1 2.1 3.1 4.1 ]T になる)

ブロック行列の生成

>>A = 5*eye(3);

>>B = zeros(3,2);

>>C = [ 2 1 0 ; 3 2 1 ];

>>D = -2*eye(2);

>>E = [ A B ; C D ];

2.3.4. 配列演算

前述した行列演算とは,普通の行列の代数演算ですが,ここで述べる配列演算とは対応

する要素間同士の演算を意味します.配列演算子は普通の演算子の前にコンマを付けます.

和および差はもともと要素間同士の演算出すので,コンマは付けません.つまり,配列演

算と行列演算の違いは積と商のみに現われます.積の配列演算は”.*”で商の配列演算は”.

/”で表されます.たとえば,x=[2 3 4]と y=[1 2 4]同士の配列演算を行なうと,次のよ

8

うになります.

>>x = [ 2 3 4 ]; y = [ 1 2 4 ];

>>z = x .* y

z =

2 6 16

>>w = x./y

w =

2.0000 1.5000 1.0000

配列演算は特に次のような場合によく用います.

t=1,...9 において,z(t) = exp(t)sin(t)を求める場合

>>t = 0:9;

>>z = exp(t) .* sin(t)

上の例で,もしも

>>z = exp(t) * sin(t)

とすると,exp(t),sin(t)共に 10 次元横ベクトルであるので,これは計算できないことに

なり,また,

>>z = exp(t) ’* sin(t)

とすると,ベクトル同士の内積になってしまいます.

2.3.5. 行列の比較

比較演算子にはつぎのものがあります.

< , > , <= , >= , == , ~=

さらに,同じ次元の行列の比較は対応する要素同士で行われ,その結果は,真ならば1,

偽ならば0の行列を出力します.たとえば,

>>A = [ 2 1 ; 3 2 ];

>>B = [ 2 0 ; 0 2 ];

>>C = (A~=B)

とすると,行列 Cは C = [ 0 1 ; 1 0 ]となる.論理演算子の表し方は

& (AND) ,| (OR) ,~ (NOT)

の3とおりです.

2.3.6. 行列操作のための組込関数使用例

行列の格納方式に関する注意

2 次元配列の MATLAB 内のデータの格納される順番は,C言語と異なり,Fortran 言語ベース

になっている.たとえば,配列 A(2,2)では,A(1,1), A(2,1), A(1,2), A(2,2)の順番でメ

モリ内に記憶される.(C 言語の場合には,a[1][1]の場合,a[0][0], a[0][1], a[1][0],

a[1][1]の順番に格納される.)

9

reshape 関数:行列の縦と横のサイズ変更のための関数

2×2 行列を 1次元ベクトルに変換する例をつぎにあげる.

>> A = [ 1 2 ; 3 4 ];

>> reshape(A,1,4)

ans =

1 3 2 4

>> reshape(A’,1,4)

ans =

1 2 3 4

ones 関数:要素が全て 1の行列を定義

>> ones(2,3)

ans =

1 1 1

1 1 1

zeros 関数:要素が全て0の行列を定義

>> zeros(2,3)

ans =

0 0 0

0 0 0

eye 関数:単位行列その他を定義

>> eye(3)

ans =

1 0 0

0 1 0

0 0 1

>> eye(3,2)

ans =

1 0

0 1

0 0

size 関数,length 関数:行列のサイズ,ベクトルのサイズを返す

>> x=[1 3 0

1 1 2]

x =

1 3 0

1 1 2

10

>> size(x)

ans =

2 3

>> y=[1 2 3]

y =

1 2 3

>> length(y)

ans =

3

repmat 関数:要素を繰り返して行列を生成

>> repmat(3,2,5)

ans =

3 3 3 3 3

3 3 3 3 3

find 関数:0でない行列やベクトルの位置を取り出す

>> x=[1 0 2.1 0 -1 0]

x =

1.0000 0 2.1000 0 -1.0000 0

>> find(x)

ans =

1 3 5

また,行列要素の最大値を見つけ,その行と列を表示する場合も,find 関数を用いると,

1行で記述できる.

>> a=[-1.5 2 3 0 1.2

-10 -2 1 5 0.2]

a =

-1.5000 2.0000 3.0000 0 1.2000

-10.0000 -2.0000 1.0000 5.0000 0.2000

>> [rownum,colnum,maxval]=find(max(max(a))==a)

rownum =

2

colnum =

4

maxval =

1

11

diff 関数:差分データを生成

1 階差分の場合

>> x=[1 3 5 7 9 7 5 3 1]

x =

1 3 5 7 9 7 5 3 1

>> diff(x)

ans =

2 2 2 2 -2 -2 -2 -2

2 階差分の場合

>> diff(x,2)

ans =

0 0 0 -4 0 0 0

2.3.7. 多項式演算

多項式は次数の高いものの係数から並べた横ベクトルとして表現します.たとえば,

2s3+5s+1 は[ 2 0 5 1 ]とします.多項式処理に関する関数としては,

poly(行列の特性多項式),roots(多項式の根)

conv(乗算) ,deconv(除算)

residue(部分分数展開) ,polyfit(多項式近似)

などがあります.例を書くと次のようになります.

行列 Aと Bの特性多項式同士の積を求める場合

>>p1 = poly(A);

>>P2 = poly(B);

>>P3 = conv(P1,P2)

多項式 s5+3s3-2s2+s-5 の根を求める場合

>>roots([1 0 3 -2 1 -5])

2.3.8. 信号処理機能

高速フーリエ変換は,MATLAB コアモジュールに用意されていますが,その他の機能,たと

えば,IIR フィルタ,FIR フィルタ設計やパワースペクトルの計算などは,別売の Signal

Processing Toolbox に M-file として用意されていますが,くわしい話は省略し,MATLAB

コアモジュールに組み込み関数として用意されている高速フーリエ変換(fft)の例題を1

つあげておきましょう.

正弦波プラス正規雑音信号のパワースペクトルを求める例題:

簡単のため実データではなく,次の人工的な信号をFFTにより処理するものとします.

y(ti) = etsin(2πf1ti) + e-2tsin(2πf2ti) + sin(2πf3ti) + 2v(ti)

f1 = 50, f2 = 100, f3 = 180, ti=0,1,2,…,600

12

ただし,v(ti)は平均ゼロ,分散1の正規雑音とします.実際に MATLAB でプログラミング

する際には,コマンドラインに順次命令を書いていくのは,非効率的であるので,MATLAB

エディタにより MATLAB のソースプログラム(M-ファイルという,後述する)を記述し,そ

れを実行します.つぎのようなプログラムになります.%以下の部分はコメントです.

----------------------MATLAB Mfile---------------------

t = 0:0.001:0.6; %サンプリング時刻ベクトルの生成

x = exp(t).*sin(2*pi*50*t) + exp(-2*t).*sin(2*pi*100*t) ...

+ sin(2*pi*180*t); %真の信号データ

rand('normal') %正規雑音指定(平均ゼロ,分散1)

y = x + 2*rand(t); %雑音の付加されたデータ

subplot(211)

plot(y(1:512)) %データプロット

xlabel('time'),ylabel('noisy data')

Y = fft(y,512); %データの高速フーリエ変換

Pyy = Y.*conj(Y)/512; %パワースペクトルの計算,conj(Y)は Y の conjugate

f = 1000*(0:255)/512; %周波数の計算

subplot(212)

plot(f,Pyy(1:256)) %周波数,パワースペクトルプロット

xlabel('frequency'),ylabel('power spectra')

clc

この実行手順はつぎのようになります.

(1) メニューのファイル--新規作成--M-fileを選択します.

13

(2) プログラムコードの編集用のウィンドウである MATLAB Editor が起動されます.

(3) コードを入力し,メニューのファイル--保存を選択します.

(4) 保存するファイル名を聞いてくるので,保存したいフォルダにファイル名を指定しま

す.ここでは,D:¥Matsuo¥matlabman¥Mfilesample フォルダにファイル名 ex_fft.m で保存

しています.MATLAB プログラムコードをファイルで保存するときのファイル名の拡張子

は,.m を用います.

14

(5) メニューのデバッグ—実行で Mファイルを実行します.

(6) 実行により,つぎのような図が表示されます.

15

ディジタル信号の畳み込み演算の例題:conv 関数

ディジタル信号 hと vの畳み込み演算は,つぎのように定義されます.

,...2,1,0,][][])[,( ±±=−= ∑∞

−∞=

nmnvmhnvhconvm

実行結果はつぎのようになります.

>> u=[0 0 2 4 6 8 10]

u =

0 0 2 4 6 8 10

>> v=[2 4 6 8]

v =

2 4 6 8

>> conv(u,v)

ans =

0 0 4 16 40 80 120 136 124 80

これは,つぎのような計算をしていることになります.

16]1[]2[]2[]1[]3[]0[]3)[,(4]0[]2[]1[]1[]2[]0[]2)[,(

0]0[]1[]1[]0[]1)[,(0]0[]0[]0)[,(

8]3[,6]2[,4]1[,2]0[],[]4[,0]1[][10]6[,8]5[,6]4[,4]3[,2]2[,0]1[,0]0[

][]7[,0]1[][

=++==++=

=+===

====∞==−=−∞=======

∞==−=−∞

vhvhvhvhconvvhvhvhvhconv

vhvhvhconvvhvhconv

vvvvvvvvhhhhhhh

hhhh

LL

LL

逆フーリエ変換:ifft 関数

>> h=[1 2 3 2 1 0 1]

h =

1 2 3 2 1 0 1

>> H = fft(h)

H =

Columns 1 through 3

10.0000 -0.5000 - 4.1405i -0.5000 + 1.1086i

Columns 4 through 6

-0.5000 + 0.9367i -0.5000 - 0.9367i -0.5000 - 1.1086i

Column 7

-0.5000 + 4.1405i

>> hi=ifft(H)

hi =

16

Columns 1 through 5

1.0000 2.0000 3.0000 2.0000 1.0000

Columns 6 through 7

-0.0000 1.0000

相互相関関数の sum 関数を用いた計算

∑Φ=

+=

==N

kxy kykx

nyyyynxxxx

1

][][][

][,],2[],1[],[,],2[],1[

ττ

LL

τ=0 の場合の相互相関関数はつぎのようにして計算することができます.

>> x=sin(0:0.1:2*pi);

>> y=cos(0:0.1:2*pi);

>> phi_xy0 = sum(x.*y)

phi_xy0 =

-0.0070

2.3.9. グラフィック機能

グラフ表示用のコマンドとしては次のようなものがあります.

線形 X-,Y-プロット(plot),両対数プロット(loglog)

片対数プロット(x-軸が対数)(semilogx)

片対数プロット(y-軸が対数)(semilogy)

極座標プロット(polar),3 次元プロット(plot3),3次元メッシュ(mesh)

バープロット(bar),階段状プロット(stairs)

また,ラベリング,タイトル付けやグリッドのコマンドとして次があります.

タイトル(title),x-軸ラベル(xlabel)

y-軸ラベル(ylabel),任意位置への文字列セット(text,gtext)

グリッドライン(grid)

その他に次のようなコマンドがあります.

軸のマニュアルスケーリング(axis)

グラフスクリーンの表示(shg)

グラフスクリーンのクリア(clg)

グラフスクリーンをサブスクリーンに分割(最大4画面)(subplot)

グラフィック表示の例を2つほど紹介しましょう.

sin カーブを描く場合)

>>t = 0.0:0.1:3*pi (pi にはデフォルト値として円周率が入っている)

>>y = sin(t)

>>plot(t,y),xlabel('time'),ylabel('sin(t)')

17

sin カーブを 2本描く場合)

>>t = 0.0:0.1:3*pi; %(pi にはデフォルト値として円周率が入っている)

>>y1 = sin(t);

>>y2 = 0.5*sin(5*t);

>>plot(t,y2,t,y2),xlabel('time'),ylabel('¥sin t and ¥sin 5t')

注意)label にギリシャ文字を書きたいときには,TeX コードをいれれば,ギリシャ

文字を表示することができます.

xyz3 次元プロット関数の仕使用例)

>> x=0:0.1:1

x =

Columns 1 through 7

0 0.1000 0.2000 0.3000 0.4000 0.5000 0.6000

Columns 8 through 11

0.7000 0.8000 0.9000 1.0000

18

>> y=1:0.1:2

y =

Columns 1 through 7

1.0000 1.1000 1.2000 1.3000 1.4000 1.5000 1.6000

Columns 8 through 11

1.7000 1.8000 1.9000 2.0000

>> z=2:0.1:3

z =

Columns 1 through 7

2.0000 2.1000 2.2000 2.3000 2.4000 2.5000 2.6000

Columns 8 through 11

2.7000 2.8000 2.9000 3.0000

>> plot3(x,y,z);grid

>> xlabel('x-axis'),ylabel('y-axis'),zlabel('z-axis')

ファジィメンバシップ関数の3次元表示の場合)

>>x = 0:0.1:5;

>>y = 0:0.1:5;

>>for i=1:51

for j=1:51

if x(i)>y(j)

z(i,j) = 1./(1.+100/(x(i)-y(j))^2);

else

z(i,j)=0.0;

end

19

end

end

>>mesh(z)

2.3.10. ピクセル座標系

文献 14)を元にピクセル座標系の使用方法の概略を説明します.ピクセル座標系(pixel

coordinate system)は,ディジタル画像処理に使用される座標系です.これは,画面の左

上隅が原点となり最初のx成分が右方向に増加し,y成分が下方向に増加する座標系です.

Image,imagesc 関数は,ちょうど行列の行と列に部分の値を,ゼロに近いほど黒く,大き

いほど白く表示する関数で,図は行と列の方向そのものが目に見える形になっています.

行列データを与え,ピクセル座標系で描く Mファイルの例はつぎのようになります.

%ピクセル座標系の使用方法

A = [0 0 0 0 0

0 0 1 0 0

0 0 0 2 0

1 0 0 0 0

0 0 0 0 0]

figure(1);image(A*10);

xlabel('col using xlabel'); ylabel('row using ylabel');

figure(2);imagesc(A*10);

xlabel('col using xlabel'); ylabel('row using ylabel');

figure(3);image(A*255);

xlabel('col using xlabel'); ylabel('row using ylabel');

figure(4);imagesc(A*255);

xlabel('col using xlabel'); ylabel('row using ylabel');

20

2.3.11. 制御文

制御文には for,while,if がありまので,以下これについて触れます.

1)for ループ

一般形 for v = 式(行列) 行列の列が個々に変数 V に

文 割り当てられ,文を実行する

end

例1)他の言語と同じ使い方

>>for ii = 1:2:n , x(i) = 0 , end

あるいは

>>for ii = 1:2:n

x(i) = 0

end

例2)MATLAB 特有の使い方

>>for ii = [ 1:3 ; 4:6 ]

21

b = [ b , ii ]

end

2)while ループ

一般形 while 条件 条件が真の間文を繰り返す

end

例)n!<100000 なる最大の nを表示する.

>>n = 1;

>>while prod(1:n) < 1.e5

n = n + 1 ;

end

>>n

3)if 文

一般形 if 条件1

文1

elseif 条件2

文2

else

文3

end

4)break 文

for や while ループのもっとも内側のものを中断する.

2.3.12. M-ファイル

ここまでは,MATLAB のコマンドモードでの使い方のみを述べてきましたが,もっと普通

の使い方として,ファイルに保存された一連のコマンド群を順次実行することができます.

これを,M-ファイルといいます.M-ファイルはソースプログラムに相当するもので,拡張

子として m がつけられています.M-ファイルには Script M-file と Function M-file があ

りますが,両方とも ASCII text file であり,MATLAB エディタで作成することができます.

1)Script M-file

Script M-file はコマンド群をそのまま列記してファイルとして保存したものです.た

とえば,MATLAB エディタで次のような M-ファイルを作成して,ファイル名 sinplot.m で保

存します.

t = 0.0:0.1:3*pi

y = sin(t)

22

plot(t,y)

pause (一時中断)

clg (グラフィック画面消去)

これを実行するには次の 2つの方法があります.

方法 1)MATLAB エディタのメニューのデバッグ--実行で行います.

方法 2)コマンドウィンドウから次のように Mファイル名を入力して実行します.ただし,

コマンドウィンドウの上で指定するカレントディレクトリは Mファイルを保存したフォル

ダ D:¥Matsuo¥matlabman¥Mfilesample を指定してある必要があります.

>>sinplot (M-file の呼出)

M-ファイルからはいくつの M-ファイルでも呼び出すことができます.ただし,注意するこ

とは,Script M-file はワークエリアの中のデータ全体に働くことです.このため引数に

よる入出力データの引き渡しのみを行うために Function M-file が用意されています.

2)Function M-file

Function M-file は最初の行にその宣言文を次のように書きます.

function 出力変数名 = ファイル名(入力変数名)

再帰呼出も可能です.たとえば,次のように Function M-file を作って,ファイル名を

saiki.m として保存します.

function f = saiki(n)

if n==0

f = 1;

else

f = n*saiki(n-1);

end

23

MATLAB コマンドウィンドウで

>>saiki(5)

とやると5の階乗計算ができます.また Function M-file はほかの M-file からも自由に何

度でも呼び出せます.M-file の便利なところは,ライブラリ化などをせずに,MATLABPATH

により指定された,ドライブ装置:フォルダ内にテキストファイルとして M-file を保存し

ておくと,自由に何度でも他の M-file から呼び出せることです.MATLABPATH は MATLAB の

メニューのパスの設定を選択するとパスの設定内容やその変更を行うことができます.

ただし,注意することは,Script M-file はワークエリア内の全データに働きますが,

Function M-file は入出力データのみであることです.ただし,コマンド global を用いる

ことにより大域変数を定義できます.

2.3.13 MATLAB のループ処理の特徴

24

MATLAB のよる繰返計算では,for ループをなるべく使わずに変数をベクトルデータにし

て処理することにより計算の高速化をはかることができます.文献 2)に上げられている

log 計算の繰返の計算時間をはかるプログラムを比較してみてください.

>> t1=clock; for i=1:10000, a(i)=log(i); end; e1=etime(clock,t1)

この命令の実行結果は次のとおりです.

e1 = 9.0600 (繰返し計算の所要時間)

>> t1=clock; ind=[1:10000]; for i=ind, a(i)=log(i); end; e2=etime(clock,t1)

この命令の実行結果は次のとおりです.

e2 = 0.3800

>> t1=clock; a=zeros(1,10000); ind=[1:10000]; for i=ind, a(i)=log(i); end;

e3=etime(clock,t1)

この命令の実行結果は次のとおりです.

e3 = 0.2700

>> t1=clock; ind=[1:10000]; a=log(ind); e4=etime(clock,t1)

この命令の実行結果は次のとおりです.

e4 = 0.0600

>> t1=clock; ind=[1:10000]; a=zeros(1,10000); a=log(ind); e5=etime(clock,t1)

この命令の実行結果は次のとおりです.

e3 = 0.0600

2.3.14 音声処理(wave データ処理)

文献 14)を元に,wave データ処理例について紹介します.パソコンのサウンドカードは,

サンプリング周波数 44.1KHz,ダイナミックレンジ 16bit,ステレオサウンド,PCM 録音

再生といった音楽 CD と同じスペックをもっています.

wavrecord.m 関数:マイクから音声データを取り込みます.Help wavrecord とすると,

つぎのように表示されます.これでだいたい使い方がわかります.

WAVRECORD は、WIndows オーディオ入力デバイスを使って、音声を録音します。

WAVRECORD(N,FS,CH) は、WIndows WAVE オーディオデバイスを使って、入力チャネル CH か

ら、FS Hz のサンプリングレートで、N 個のオーディオサンプルを録音します。標準のオ

ーディオレートは、8000,11025,22050,44100 Hz です。 サンプルは、サイズ N 行 CH 列

の行列で出力されます。設定しなければ、FS = 11025 Hz で、CH = 1 です。 WAVRECORD(...,

DTYPE) は、DTYPE で設定したデータタイプを使って、データを録音して、出力します。サ

ポートしているデータタイプと対応するビット数をつぎに示します。

DTYPE ビット数/サンプル

'double' 16

'single' 16

25

'int16' 16

'uint8' 8

この関数は、Windows 95/98/NT マシンでのみ使用できます。

wavplay.m 関数:スピーカーから音声データを出力します.Help wavplay とすると,つ

ぎのように表示されます.

WAVPLAY は、Windows のオーディオ出力デバイスを使って、音を再生します。

WAVPLAY(Y,FS) は、サンプル周波数 FS Hz をもつベクトル Y の信号を、Windows オーデ

ィ オデバイスに送ります。標準的なオーディオのサンプル周波数は、

8000,11025,22050,44100 Hz です。WAVPLAY(Y) は、自動的にサンプルレートを 11025 Hz に

設定します。ステレオでの再生用に、Y は、N 行 2 列の行列です。 WAVPLAY(...,'async')

は、音声の再生を始めます。そして、関数コールに戻ります(すなわち、ノンブロッキング

コール)。 WAVPLAY(...,'sync') は、音声の再生が終了するまで、関数コールから戻りま

せん(すなわち、ブロッキングコール)。これが、デフォルトの再生モードです。 Y は、

double,int16,uint8 行列のいずれかでストアしたオーディオサンプルでなければなりま

せん。倍精度データサンプルは、-1.0 <= y <= 1.0 の範囲の値になります。この範囲外の

値は、捨てられます。 サポートしているデータタイプや再生で使用できるビット数をつぎ

にまとめて示します。

データタイプ ビット/サンプル

'double' 16

'single' 16

'int16' 16

'uint8' 8

この関数は、Windows 95/98/NT マシンのみで使用できます。

マイクから 11.025 kHz でサンプリングした 16ビットのオーディオデータ 5秒分を録音

し,その大きさとスペクトログラムを表示し,さらに再生したあとで,mat ファイルに保

存する Mファイルは次のようになります.

%wav example

% 11.025kHz , 5sec data

Fs = 11025;

y = wavrecord(5*Fs, Fs, 'double');

plot((1:length(y))/Fs,y);

xlabel('time[sec]');

axis([0 length(y)/Fs -1 1]);

pause

specgram(y,256,Fs);

pause

26

wavplay(y, Fs);

% save wave_data as mat file

save dat_wav.mat y Fs

wavread 関数:Microsoft WAVE (".wav")サウンドファイルの読み込みます.Help wavread

とすると,つぎのように表示されます.

Y = WAVREAD(FILE)は、文字列 FILE で指定された WAVE ファイルを読み込み、サンプリン

グされたデータを Yに出力します。拡張子が指定されていない場合は、".wav"を付け加え

ます。振幅値は、範囲[-1,+1]です。

[Y,FS,NBITS] = WAVREAD(FILE)は、ヘルツ単位でサンプリングレート(FS)を出力し、ファ

イル内のデータを符号化するために使うサンプルあたりのビット数(NBITS)を出力します。

[...] = WAVREAD(FILE,N)は、ファイル内の各チャンネルから、最初の N個のサンプルのみ

を出力します。

[...] = WAVREAD(FILE,[N1 N2])は、ファイル内の各チャンネルから、N1から N2までのサ

ンプルのみを出力します。

SIZ = WAVREAD(FILE,'size')は、実際のオーディオデータの代わりに、ファイル内にある

オーディオデータのサイズを、ベクトル SIZ = [samples channels]として出力します。

[Y,FS,NBITS,OPTS] = WAVREAD(...)は、WAV ファイル内に含まれる付加的な情報を構造体

OPTS に出力します。この構造体の内容は、ファイル毎に異なります。一般に使われる構造

体のフィールド名は、'.fmt'(オーディオフォーマット情報)と'info'(サブジェクトタイト

ル、コピーライト等を記述するテキスト)です。サンプルあたり 16 ビットまでのマルチチ

ャンネルデータをサポートしています。

注意:このファイルリーダは、Microsoft PCM データフォーマットのみをサポートしてい

ます。wave-list データは、サポートしていません。

wavwrite 関数: Microsoft WAVE (".wav")サウンドファイルを書き出します.Help

wavwrite とするとつぎのように表示されます.

27

WAVWRITE(Y,FS,NBITS,WAVEFILE)は、データ Y を、ファイル名 WAVEFILE で指定された

Windows WAVE ファイルに、サンプルレート FS、ビット数 NBITS で書き出します。NBITS

は、8または 16 ビットでなければなりません。Stereo データは、2列の行列で指定してく

ださい。範囲[-1,+1]以外の振幅値は、切り取られます。

WAVWRITE(Y,FS,WAVEFILE)は、NBITS = 16 ビットを仮定しています。

WAVWRITE(Y,WAVEFILE)は、NBITS = 16 ビット、FS = 8000Hz を仮定しています。

ノイズ除去 Mファイル(文献14)より)

先の例題でmatファイルで保存した音声データdat_wav.matをloadコマンドでワークスペ

ース上に読み込むと音声データが変数名 y,サンプリング周波数 Fs で格納される.音声デ

ータ yの要素の絶対値が 0.02 以下のものをすべて 0にすることにより,ノイズ除去を行っ

た Mファイルはつぎのようになります.

load dat_wav

subplot(2,1,1);plot(y);

wavplay(y);axis tight;

subplot(2,1,2);plot((abs(y)>0.02).*y);

wavplay((abs(y)>0.02).*y);axis tight;

28

2.4 基本MATLAB付属の数値計算用M-ファイル群

MATLAB でプログラム開発するためには,それぞれの目的に合わせた M-file を自分でつ

くればいいわけですが,最初から付属している M-file もあります.また,制御技術者の開

発した制御系設計専用の M-file もオプションとして販売されています.基本 MATLAB 付属

M-file には主に次のようなものがあります.

erf(誤差関数計算),fminsearch(多変数関数の最小値探索)

fsolve(非線形方程式の求解),gamma(ガンマ関数の計算)

logspace(対数的に等間隔な要素からなるベクトル生成)

menu(ユーザ選択メニュー),nnls(最小自乗法による求解)

ode23,ode45(微分方程式の数値計算),quad(数値積分)

次に,基本 MATLAB 中の M ーファイルを用いた例題をいくつか述べましょう.

連立微分方程式の解法の場合)

微分方程式の数値解法の M-ファイルとして,second order Runge-Kutta 公式からなる

ode23.m と fourth order Runge-Kutta 公式からなる ode45.m が用意されています.

・Van der Pol 方程式の解法)

M-ファイルはメインプログラムであるScript mfileであるファイル名ex_diff_vdp.mと微

分方程式を定義する Function mfile であるファイル名 ex_vdp.m からなります.

# ex_diff.m の内容

tspan=[0,20];

y0=[2;0];

[t,y]=ode45(@ex_vdp,tspan,y0); %微分方程式定義ファイルは ex_vdp.m です.

plot(t,y(:,1))

xlabel('time')

ylabel('y')

title('Van del Pol eq.')

# ex_vdp.m の内容:ファイル名と最初の関数名は一致する必要があります.

function dydt = ex_vdp(t,y)

dydt = [y(2); (1-y(1)^2)*y(2)-y(1)];

29

・状態方程式の周波数応答の計算)

ある状態方程式の解を求める M-ファイルは下記のようになります.M-ファイルはメインプ

ログラムである Script mfile であるファイル名 ex_diff.m と微分方程式を定義する

Function mfile であるファイル名 diff_eq.m からなります.

# ex_diff.m の内容

global A B inp

%大域的変数の定義(引数に書かなくても関数Mファイルでこの変数を使用できる)

A = [ 0 1

-10 -5 ];

B= [0 ; 1];

inp = '5*sin(10*t)'; % 入力の定義

tspan=[0,10]; % 初期時刻と終端時刻の定義

x0=[2;0];

[t,x]=ode45(@diff_eq,tspan,x0); % diff_eq が微分方程式を定義する M-ファイル

xx = [x eval(inp)]; )]; %eval--->文字列マクロ機能

plot(t,xx)

# diff_eq.m の内容:ファイル名と最初の関数名は一致する必要があります.

function xdot = diff_eq(t,x)

global A B inp

xdot = A*x + B.*eval(inp);

MATLAB エディタのウィンドウは,次のようになります.

30

このとき,Matlab を起動して,M ーファイルを実行すると,次のような応答波形を得ること

ができます.

行列の固有値分布のグラフ化の場合)

2 つのファイルからなります.

# ex_eigen.m の内容:固有値の計算と作図のメインプログラム

A = [ 1 0 -2

-3 5 -10

-8 2 3 ];

e=eig(A);

x1=real(e(1));y1=imag(e(1));

x2=real(e(2));y2=imag(e(2));

x3=real(e(3));y3=imag(e(3));

xmin=-8;xmax=8;ymin=-5;ymax=5;

axis([xmin,xmax,ymin,ymax]) ;

plot(x1,y1,'*',x2,y2,'*',x3,y3,'*')

31

hold on

ex_line(xmin,0,xmax,0); %X軸線引き

ex_line(0,ymin,0,ymax); %Y軸線引き

plot(x1,y1,'*',x2,y2,'*',x3,y3,'*')

# ex_line.m の内容:指定した座標に対して直線をひく Function M-file

function ex_line(x1,y1,x2,y2)

x = [x1 x2]';

y = [y1 y2]';

plot(x,y)

このときの出力図形は次のようになります.

多変数関数の最小化問題の場合)

Rosenbrock's banana-shaped valley function と呼ばれる

f(x) = 100(x1-x22)2 + (1-x1)2

の最小解を求める M-ファイルは次の 2つからなります.

# ex_banana.m の内容

x0 = [ -1.2; 2 ];

[x1,x2] = meshdom(-1.5:.1:1.5,-1.5:.1:1.5);

z = 100*(x1-x2.*x2).^2 + (1 - x1).^2;

mesh(z,[20 20])

pause

format long

x_solution = fminsearch('fminfunc',x0) %fminfunc.m が最小値を求める関数名

# fminfunc.m の内容

function q = fminfunc(x)

x1 = x(1); x2 = x(2);

32

q = 100*(x1-x2.*x2).^2 + (1 - x1).^2;

この結果は次のようになります.

x_solution =

0.99993423012764

0.99996718043135

2.5 ツールボックス中のMーファイル群

さらに,別売の M-file 群はツールボックスと呼ばれ,制御関係では,

信号処理ツールボックス,制御ツールボックス,

ロバスト制御ツールボックス,システム同定ツールボックス

LMI ツールボックス,μ解析/設計ツールボックス

Fuzzy Logic ツールボックス,Neural Network ツールボックス

などがあります.制御ツールボックスでは,入力パラメータとして状態方程式や伝達関数

を与えるだけで,ボード線図やナイキスト線図,最適レギュレータ,最適フィルタなどの

計算が関数 M-ファイルとして準備されています.さらに,ロバスト制御ツールボックスや

LIM ツールボックスでは,プラントの状態方程式と周波数重み関数の状態空間表現を与え

ることにより,標準問題の状態空間表現を求める関数,および,それよりH∞制御器を求

める関数が与えられており,問題設定のみ知っていれば,自動的に制御系設計を行うこと

ができます.次の節でその具体的な例題を述べることにします.

2.6 制御系設計における例題

本節では,おもに Control System Toolbox 内の M ーファイルの使い方について述べます.

2.6.1 伝達関数(連続時間)からステップ応答とインパルス応答を求める場合

伝 達 関 数 は 分 母 多 項 式 と 分 子 多 項 式 に 分 け て 定 義 し ま す . 例 え ば ,

G(s)=(s2+2s+1)/(s3+3s2+2s+5)の場合には次のように定義します.

num = [ 1 2 1 ];

den = [ 1 3 2 5 ];

33

多入力系の伝達関数は上記のようには定義できませんが,1入力多出力系の伝達関数は

num を行列化することにより定義できます.例えば

num = [ 1 2 1 ; 0 2 3 ]

とすれば,2出力系となります.

ステップ応答とインパルス応答は,step(num,den,t),impulse(num,den,t)で計算できま

す.ただし,t は計算したい時間刻みのベクトルデータであるとします.なお,step と

impulse 連続系を離散系に変換して応答を計算する lsim.m を用いています.lsim.m は次節

で使い方を述べます.上の G(s)のステップ応答とインパルス応答を求める M ーファイルと

その結果は次のようになります.

num = [ 1 2 1 ]; den = [ 1 3 2 5 ];

t = 0 : 0.1 : 50;

y_step = step(num,den,t); y_impulse = impulse(num,den,t);

plot(t,y_step),xlabel('time'),ylabel('step respnse')

pause %図を表示して一時中断,何かキーを押すと下へ移る.

plot(t,y_impulse),xlabel('time'),ylabel('impulse response')

2.6.2 状態方程式(連続時間)からからステップ応答とインパルス応答を求める場合

状態方程式は行列(A,B,C,D)で定義します.ただし,状態方程式は次式とします.

BuAxx +=&

この場合も,step.m と impulse.m を用いますが,伝達関数の場合と異なるところは多入力

の場合にも使用できることです.i番目の入力に対する応答を求めたい場合には,

step(A,B,C,D,i,t) , impulse(A,B,C,D,i,t)

とすればよいのです.

2.6.3 任意の入力に対する連続時間系の応答を求める場合

この場合には lsim.m を次のように用います.

[y,x] = lsim(A,B,C,D,u,t,x0)

y = lsim(A,B,C,D,u,t,x0)

34

[y,x] = lsim(num,den,u,t)

ただし,uは tと同じ大きさをもつ入力時系列で x0は初期条件とします.伝達関数表現の

場合は当然のとこながら初期条件はゼロで,状態方程式の場合も初期値を省略するとゼロ

と見なします.次は2次振動系に正規白色雑音を入力した場合の応答を求めたものです.

om = 10; %固有角周波数

zt = 0.02; %減衰率

num = 1;

omi = 1/om;

den = [ omi*omi 2*zt*omi 1 ];

t = 0:0.02:5;

u = randn(length(t),1); %正規乱数によるスカラー入力信号の生成

y = lsim(num,den,u,t);

yu = [y u];

plot(t,yu),xlabel('time'),ylabel('response')

2.6.4 状態空間表現と伝達関数表現の相互変換

状態空間表現(A,B,C,D)から伝達関数表現[num,den]への変換は次のように行ないます.

[num,den] = ss2tf(A,B,C,D,k)

ただし,kの指定により,k番目の入力に対する伝達関数を求めることになります.また,

逆の場合は次のようになります.

[A,B,C,D] = tf2ss(num,den)

さらに,Robust-Control Toolbox の中に,多入出力伝達関数表現から状態空間表現へ変換

する M ーファイル tfm2ss.m が用意されています.くわしくは,マニュアルを参照下さい.

35

2.6.5 ボード線図を求める場合

bode.m により,周波数ベクトルに対するゲインと位相のベクトルデータを生成すること

ができます.伝達関数表現と状態空間表現の両方から使用可能です.例えば,2.5.3

節の2次振動系のボード線図を求めると次のようになります.

format short e

om = 10; %固有角周波数

zt = 0.02; %減衰率

num = 1;

omi = 1/om;

den = [ omi*omi 2*zt*omi 1 ];

w = logspace(-2,2,100);

%10^(-2)から 10^2 を対数的に 50 に等分割したベクトルを生成

[mag, phase] = bode(num,den,w);

subplot(211),loglog(w,mag),title('Bode gain diagram'),

xlabel('freq.'),ylabel('gain'),grid

subplot(212),semilogx(w,phase),title('Bode phase diagram'),

xlabel('freq.'),ylabel('phase'),grid

2.6.6 連続時間系と離散時間系の相互変換

連続時間の状態方程式をサンプリング周期 dt のサンプラとゼロ次ホールダをもつ離散

時間系に変換する場合は次のようにします.

[ Phi, Gamma ] = c2d(A,B,dt);

さらに,無駄時間をもつ連続系の状態方程式を離散時間系に変換する関数 M ーファイルとし

て c2dt.m が用意されています.

一方,逆変換の場合には次のようにします.

[ A, B ] = d2c(Phi,Gamma,dt);

36

2.6.7 離散時間系のステップ応答およびインパルス応答を求める場合

離散時間系の状態方程式のステップ応答とインパルス応答は次のようにして求めます.

[y,x] = dstep(A,B,C,D,k,n)

y = dstep(A,B,C,D,k,n)

[y,x] = dimpulse(A,B,C,D,k,n)

y = dimpulse(A,B,C,D,k,n)

たとえば,連続時間系をサンプリング周期 0.5 で離散時間系に変換した場合の応答を求め

ると,次のようになります.

A = [ 0 1 ; -10 -1 ]; B = [0 ; 1];

C = [ 1 0 ]; D = 0;

dt = 0.5;

[Phi,Gamma] = c2d(A,B,dt);

n = 50;

y_step = dstep(Phi,Gamma,C,D,1,n);

y_impulse = dimpulse(Phi,Gamma,C,D,1,n);

subplot(211),plot(y_step),xlabel('time'),ylabel('step response')

subplot(212),plot(y_impulse),xlabel('time'),ylabel('impulse response')

2.6.8.最適レギュレータの導出および応答波形の計算の場合

連続時間の状態方程式において,評価関数を最小にするフィードバックは,Riccati 方

程式の半正定解として与えられますが,これを MATLAB では次のようにして,関数 lqr.m

を用いて求めることができます.

K = lqr(A,B,Q,R);

[ K, S ] = lqr(A,B,Q,R);

例題として,最適レギュレータの極配置および応答波形を求める M-file を実行してみま

しょう.

37

A = [ 0 1 ; 0 1 ]; B = [ 0 ; 1 ];

Q = [ 9 0 ; 0 1 ]; R = 0.5;

K = lqr(A,B,Q,R)

A_close = A-B*K; %閉ループ系の固有値の計算

e = eig(A_close);

t = 0:0.05:10; x0 = [ 1 ; -1 ];

C = eye(2) ; D = [ 0 ; 0 ];

dim = length(t);

u = zeros(dim,1);

y = lsim(A_close,B,C,D,u,t,x0);

plot(t,y) %状態変数の時間波形

xlabel('time'),ylabel('state variable x')

2.6.9 極配置法によるフィードバック系の応答を求める場合

前節の系に対して,極配置法による閉ループ系の応答を求めると次のようになります.

ただし,極は,-1+j,-1-j とします.極配置には関数 place.m を用いることができます.

A = [ 0 1 ; 0 1 ];B = [ 0;1 ];

pole = [-1+j -1-j ];

K = place(A,B,pole); %極配置 M-ファイル

A_close = A - B*K;

t = 0:0.05:10; x0 = [ 1 ; -1 ];

C = eye(2); D = [ 0 ; 0 ];

dim = length(t);

u = zeros(1,dim);

y = lsim(A_close,B,C,D,u,t,x0);

plot(t,y),xlabel('time'),ylabel('closed-loop responses')

38

2.6.10 オブザーバにより推定値を求める場合

オブザーバを構成し,その推定値と比較します.オブザーバの極は-1,-2 として,place.m

によりオブザーバゲインを計算することができます.下記の例では,入力として正弦波が

印加された場合の系とオブザーバの応答波形を示しています.

A = [ 0 1 ; -2 -0.00001 ]; B = [ 0 ; 1 ];

C = [ 1 0 ]; D = 0;

t = 0:0.05:5;

x0 = [ 10 ; -10 ];

u = 2*sin(2*t);

[y , x ] = lsim(A,B,C,D,u,t,x0);

pole = [ -5 -10 ];

G_T = place(A',C',pole);

A_obs = A - G_T'*C;

B_obs = eye(2);

C_obs = eye(2);

D_obs = zeros(2);

x0_est = [ 0 ; 0 ];

timedim = length(t);

inp_obs = [];

for ii = 1:timedim

inp_obs = [ inp_obs G_T'*y(ii)+B*u(ii)];

end

x_est = lsim(A_obs,B_obs,C_obs,D_obs,inp_obs',t,x0_est);

plot(t,[x x_est]),xlabel('time'),ylabel('states & estimates')

39

2.6.11 カルマンフィルタにより推定値を求める場合

確率系に対してカルマンフィルタを構成し,状態の推定値を求める M-file は次のように

なります.カルマンフィルタのゲインは lqe.m により計算することができます.

v = randn(length(t),1);

w = randn(length(t),1);

x0 = [ -2; 2 ];

B_in = [ D zeros(2,1) ];

D_in = [ 0 1 ];

inp = [ v w ];

[y , x]= lsim(A,B_in,C,D_in,inp,t,x0);

A_fil = A - G*C;

B_fil = G;

C_fil = C;

D_fil = 0;

x0_est = [ 0 ; 0 ];

[ y_est, x_est ] = lsim(A_fil,B_fil,C_fil,D_fil,y,t,x0_est);

plot(t,[x x_est ]),xlabel('time'),ylabel('states & estimates')

40

2.6.12.練習問題

これまでの例を参考にして,オブザーバ併合制御系の応答および LQG 制御系の応答を求

める M ーファイルを作ってください.

その他,ロバスト制御やシステム同定に関する M-files は文献 5),6),7)を参照してくださ

い.

2.7 ディジタル信号処理における MATLAB 使用例

ここでは,信号処理計算の入門を述べます.学生のみなさんは,信号処理の基礎を習って

いませんので,なるべく基礎から書いたつもりですが,くわしくは文献16)20)を参

照してください.

2.7.1 ディジタル信号,z変換,遅延オペレータ

まず,時間区間(-∞,∞)の連続信号を考えます.連続時間信号 b(t)をサンプリング周期 T

ごとにとりだして並べたもの(このような操作をサンプリングといい,サンプリングを行

う装置をサンプラといいます)を時系列信号ということにします.これは,次式のように

表すことができます.

),(,),3(),2(),(),0(),(,),(, LLLL MTbTbTbTbbTbMTb −−

これを離散時間…,-M,…,-1,0,1,2,…,M,…として表した次式をサンプル値信号と呼ぶこ

とにします.

],[,],3[],2[],1[],0[],1[,],[, LLLL MbbbbbbMb −−

さらに,信号の大きさをビット単位に変換したもの(量子化といいます)を,ディジタル

信号と呼びますが,ここでは,量子化の影響については無視し,サンプル値信号とディジ

タル信号とは同じものであるとして議論をすすめます.ディジタル信号の時間添字は連続

時間信号と区別するために,[]を使っています.上記の時系列信号のフーリエ変換からz

変換を導出する方法について述べます.時系列信号はサンプル点時刻でしか値を持たない

が,全時間区間での信号とみなすために,デルタ関数列を用いて表す.実際には,デルタ

関数列は各サンプル点時刻で∞の値を持つので,実際の信号とは異なりますが,フーリエ

変換を通して見ることにより,その妥当性が理解できると思います.次式を時系列信号の

全時間区間表現とします.

∑∞

−∞=

−=k

s kTtkTbtb )()()( δ

これをフーリエ変換すると,次式のようになります.

∑ ∫ ∑∫∞

−∞=

∞−

−∞=

−−−∞

∞−=−==

k k

kTjtjtjss ekbdtekTtkTbdtetbB ωωω δω ][)()()()(

ここで,複素数 zを Tjez ω=

41

とおくと,上式はつぎのようになります.

∑∞

−∞=

−=k

ks zkbB ][)(ω

これを時系列信号のz変換といいます.ここで,z-1は時刻を1サンプリング時刻遅らせる

オペレータを遅延オペレータとみなすことができます.ディジタル信号の両側 z変換とは,

この遅延オペレータを用いて,ディジタル信号を次式のように表すことをいいます. MM zMbzbzbbzbzMbnbZzb −−−− ++++−++−+== ][]2[]1[]0[]1[][][][ 211 LLL

上式に遅延オペレータを作用させると,ディジタル信号が時系列ごと,1サンプリング時

刻だけ後ろにシフトします.

LLL +++++−+= +−−−− )1(211 ][]1[]0[]1[][ MzMbzbzbbzbz

一般のディジタル信号f[n],n=0,1,2,…の z 変換は次式のように書けます.

∑∞

−∞=

−=k

nznfnfZ ][][

つぎに,時刻負の部分の信号はゼロと仮定した場合について述べます(このような信号

を因果性信号といいます).このような信号の時系列は,つぎのように表されます.

],[,],2[],1[],0[ LL Mcccc

このような因果性信号の z変換を右側 z変換といいます.つまり,次式のようになります.

∑∞

=

−=0

][][k

nzncncZ

これは,連続時間信号のラプラス変換に対応するものです.ディジタル信号におけるデル

タ関数とステップ関数は,初期時刻 0からの時系列として表すと,次のように定義されま

す.

,1,1,1][1,0,0,0,1][

L

L

==

nnδ

このことから,これらの信号の z変換は,次式のようになります.

1111][1

1001][

121

21

−=

−=+++=

=+++=

−−−

−−

zz

zzznZ

zznZ

L

2.7.2 Convolution と correlation 計算

ディジタルデータ b,x は M+1 次元で,次式のように与えられているとします.

][,],2[],1[],0[][,],2[],1[],0[

MxxxxxMbbbbb

L

L

==

この2つの信号のコンボリューション(畳み込み)yは次式で定義されます.

∑=

−=

=M

j

jkxjbky

Myyyyy

0

][][][

]2[,],2[],1[],0[ L

42

これを z変換を用いて表すと,つぎのようになります.

M

MM

M

M

zMyzyyzMxzxzxxzMbzbzbbbxy

zMxzxzxxxzMbzbzbbb

21

2121

21

21

]2[]1[]0[)][]2[]1[]0[)(][]2[]1[]0[(

][]2[]1[]0[][]2[]1[]0[

−−

−−−−−−

−−−

−−−

+++=++++++++==

++++=

++++=

L

LL

L

L

この計算は conv 関数と deconv を用いると簡単に計算できます.

y = conv(b,x)

deconv は d=conv(q,b)+r なる関係があるときに,d,b を指定して,商 q,余り r を求める

関数です.MATLAB コードで書き,実行すると次のようになります.

>> b=[1 2 3 4 5]

b =

1 2 3 4 5

>> x=[5 4 3 2 1]

x =

5 4 3 2 1

>> y=conv(b,x)

y =

5 14 26 40 55 40 26 14 5

>> [q,r]=deconv(y,b)

q =

5 4 3 2 1

r =

0 0 0 0 0 0 0 0 0

さらに,ディジタルデータ bと xのコリレーション(相互相関関数)は,つぎのように定

義されます.

∑=

−=

=M

j

kjxjbkw

Mwwwww

0

][][][

]2[,],2[],1[],0[ L

上式から,コリレーションはベクトル xの並びを逆にして,コンボリューションをとるこ

とによって求めることができることがわかります.ベクトルが行列の並びを逆にする関数

には,次のようなものがあります.以下は,help コマンドで表示したものです.

>> help rot90

ROT90 行列を 90°回転

ROT90(A)は、行列 Aを反時計回りに 90°回転します。ROT90(A,K)は、Kが整数の

とき、行列 Aを K*90°回転します。

43

例題

A = [1 2 3 B = rot90(A) = [ 3 6

4 5 6 ] 2 5

1 4 ]

>> help flipud

FLIPUD 行列の上下方向の反転

FLIPUD(X)は、Xの列はそのままで、行を上下方向に反転させた結果を出力しま

す。たとえば、

X = 1 4 は 3 6 になります。

2 5 2 5

3 6 1 4

>> help fliplr

FLIPLR 行列の左右方向の反転

FLIPLR(X)は、Xの行はそのままで、列を左右方向に反転させた結果を出力しま

す。

X = 1 2 3 は 3 2 1 になります。

4 5 6 6 5 4

>> help flipdim

FLIPDIM 指定の次元について行列を反転

FLIPDIM(X,DIM)は、次元 DIM について反転させた Xを出力します。

たとえば、

X = 1 4

2 5

3 6

のとき、FLIPDIM(X,1)は、つぎの結果を生成します。

3 6

2 5

1 4

fliplr を用いて,xを反転させて,conv 関数を用いて,コリレーションを計算すると,次

のようになります.

>> xr=fliplr(x)

xr =

1 2 3 4 5

>> w=conv(b,xr)

w =

1 4 10 20 35 44 46 40 25

44

また,コリレーションを直接求める関数である xcorr を用いても結果は同じになります.

>> wx=xcorr(b,x)

wx =

Columns 1 through 6

1.0000 4.0000 10.0000 20.0000 35.0000 44.0000

Columns 7 through 9

46.0000 40.0000 25.0000

2.7.3 システム関数

入力信号 u[z]と出力信号 y[z]を z 変換で表したときの伝達関数 H[z]も遅延オペレータを

使って表すことができます.この伝達関数をパルス伝達関数といいます.

][][][ zuzHzy =

一般には,H[z]は次式のように表せます.

=

=

+= N

k

k

M

j

j

zka

zjbzH

1

0

][1

][][

これは,z-1 の無限級数に展開することができるので,IIR(Infinite Impilse Response)

システムとも呼ばれます.特に,a[k]がすべてゼロのとき,つまり,

∑=

−=M

j

jzjbzH0

][][

のとき,FIR(Finite Impulse Response)システムといいます.MATLAB でシステム関数の出

力を求める例をつぎにあげます.下記では,a が H[z]の分母多項式,b が分子多項式で,

u[z]が入力信号としています.

>> a=[1 -2.24 2.24 -1];

>> b=[1 -1.43 0.81];

>> u=[1 zeros(1,30)];

>> y=filter(b,a,u);

>> plot(y,'o')

45

2.7.4 アナログフィルタとディジタルフィルタの周波数応答

アナログフィルタの周波数応答を計算するには,freqs.m を用います.Help 表示すると,

つぎのようになります.

>> help freqs

FREQS ラプラス変換(S-領域)の周波数応答

H = FREQS(B,A,W)は、ベクトル B と A に、分子と分母の係数が与えられた場合、フィルタ

B/A の複素周波数応答 Hを出力します。

nb-1 nb-2

B(s) b(1)s + b(2)s + ... + b(nb)

H(s) = ---- = --------------------------------

na-1 na-2

A(s) a(1)s + a(2)s + ... + a(na)

周波数応答は、ベクトル Wで指定される周波数点を設定します。FREQS(B,A,W)では、出力

引数を設定しない場合、周波数に対するゲインおよび位相応答をカレントの figure ウィン

ドウにプロット表示します。

[H,W] = FREQS(B,A)は、周波数応答 Hを計算する 200 個の周波数点 Wを自動的に設定しま

す。FREQS(B,A,N)は、N点の周波数応答を計算します。

つぎは 2次のアナログフィルタのボード線図をかく Mファイルの例です.フィルタ式は次

式です.

14.013.02.0)( 2

2

++++=

sssssH

% frequency response of analog filters

a = [1 0.1 1];b=[0.2 0.3 1];

w=logspace(-1,1);

h=freqs(b,a,w);

mag=20*log10(abs(h));phase=angle(h)*180/pi;

subplot(2,1,1);semilogx(w,mag);

subplot(2,1,2);semilogx(w,phase);

46

ディジタルフィルタの周波数応答を計算するには,freqz.m を用います.Help 表示する

と,つぎのようになります.ディジタルフィルタのパルス伝達関数で, Tjez ω= で置換え

ることにより,周波数応答をもとめることができます.ただし,T はサンプリング周期です.下の help ファイルの説明では,サンプリング周期を 1に規格化して書いてあります.

>> help freqz

FREQZ は、デジタルフィルタ周波数応答を計算します。

[H,W] = FREQZ(B,A,N) は、N 点でのフィルタの複素周波数応答ベクトル H とそれを計算

する N 点の周波数ベクトル(単位はラジアン)を出力します。

jw -jw -jmw

jw B(e) b(1) + b(2)e + .... + b(m+1)e

H(e) = ---- = ------------------------------------

jw -jw -jnw

A(e) a(1) + a(2)e + .... + a(n+1)e

は、ベクトル B と A に、分子と分母の係数を設定します。周波数応答は、単位円の上半

分に等間隔に分布した N 点で計算します。N が設定されていない場合、デフォルトの 512

を使います。

[H,W] = FREQZ(B,A,N,'whole') は、単位円全体を使います。

H = FREQZ(B,A,W) は、設定する周波数をラジアン/サンプル単位で、ベクトル W に設定(通

常は、0からπ)した周波数に対する応答を出力します。

[H,F] = FREQZ(B,A,N,Fs) と [H,F] = FREQZ(B,A,N,'whole',Fs) は、周波数ベクトル F(Hz

単位)も出力します。ここで、Fs はサンプリング周波数(Hz 単位)です。

H = FREQZ(B,A,F,Fs) は、ベクトル F(Hz 単位)に設定した周波数で、複素周波数応答を出

力します。ここで、Fs はサンプリング周波数(Hz 単位)です。

[H,W,S] = FREQZ(...)、または、[H,F,S] = FREQZ(...) は、FREQZPLOT で使用できるプロ

ット情報を出力します。S は、異なる周波数応答プロットを得るために修正できる構造体

のフィールドです。FREQZPLOT のヘルプを参照してください。

FREQZ(B,A,...) 自身では、カレントフィギュアウインドウ内にゲインと連続的な位相をプ

ロットします。

つぎは 5次のサンプリング周波数 1000Hz,カットオフ周波数 300Hz のディジタルバタワー

スフィルタのボード線図をかく M ファイルの例です.バタワースフィルタの計算関数

butter.m については次節を参照してください.

%frequency response of digital butterworth filter

[b,a]=butter(5,300/500);

[h,w]=freqz(b,a,128);

f=w*500/pi;

subplot(2,1,1);semilogy(f,abs(h));

47

subplot(2,1,2);plot(f,angle(h)*180/pi);

pause

clf

%digital impulse response of digital butterworth filter

y=filter(b,a,[1 zeros(1,100)]);

plot(y,'*');

2.7.5 フィルタ構成関数

システム関数としてフィルタを生成する関数には,つぎのようなものがあります.

butter,cheby1,cheby2,ellip

これを help コマンドにより使用法を表示すると,つぎのようになります.

>> help butter

BUTTER Butterworth アナログおよびディジタルフィルタの設計

[B,A] = BUTTER(N,Wn)は、N 次のローパスデジィタル Butterworth フィルタを設計し、フ

ィルタ係数を長さ(N+1)の行ベクトル Bおよび Aに、zの次数の降順に出力します。 また、

カットオフ周波数 Wn は、0と 1の間の数でなければなりません。ここで、1はサンプリン

グ周波数の 1/2(Nyquist 周波数)です。Wn が 2 要素ベクトル Wn = [W1 W2]の場合、BUTTER

は通過帯域 W1 < W < W2 をもつ 2*N 次のバンドパスフィルタを出力します。[B,A] =

BUTTER(N,Wn,'high')は、カットオフ周波数 Wn をもつハイパスフィルタを設計します。

[B,A] = BUTTER(N,Wn,'stop')は、Wnが 2要素ベクトル Wn = [W1 W2]の場合、遮断帯域 W1

< W < W2 をもつバンドストップフィルタを設計します。[Z,P,K] = BUTTER(...)のように、

3 つの出力引数を与えると、零点と極を長さ N の列ベクトル Z と P に、またゲインをスカ

ラ Kにそれぞれ出力します。[A,B,C,D] = BUTTER(...)のように、4つの出力引数を与える

と、状態空間行列を出力します。 BUTTER(N,Wn,'s'), BUTTER(N,Wn,'high','s'),

BUTTER(N,Wn,'stop','s')は、アナログ Butterworth フィルタを設計します。また、Wn は 1

より大きく設定することもできます。

48

>> help cheby1

CHEBY1 Chebyshev I 型フィルタの設計(通過帯域リップル)

[B,A] = CHEBY1(N,R,Wn)は、通過帯域に R dB のリップルをもつ N次のローパスディジタル

Chebyshev フィルタを設計します。これは、フィルタ係数を長さ(N+1)の行ベクトル B(分子)

および A(分母)に出力します。また、カットオフ周波数 Wnは、0と 1の間の数でなければ

なりません。ここで、1はサンプリング周波数の 1/2(Nyquist 周波数)です。Rはデフォル

トで 0.5 dB、デフォルト以外の値を設定する場合は、新たに R を設定してください。Wn

が 2 要素ベクトル Wn = [W1 W2]の場合には、CHEBY1 は、通過帯域 W1 < W <W2 をもつ 2*N

次のバンドパスフィルタを出力します。[B,A] = CHEBY1(N,R,Wn,'high')は、カットオフ周

波数 Wn をもつハイパスフィルタを設計します。[B,A] = CHEBY1(N,R,Wn,'stop')は、Wnが

2 要素ベクトル Wn = [W1 W2]の場合、遮断帯域 W1 < W < W2 をもつバンドストップフィ

ルタを設計します。[Z,P,K] = CHEBY1(...)のように、3つの出力引数を与えると、零点と

極を長さNの列ベクトルZとPに、またゲインをスカラKにそれぞれ出力します。[A,B,C,D]

= CHEBY1(...)のように、4 つの出力引数を与えると、状態空間行列を出力します。

CHEBY1(N,R,Wn,'s'), CHEBY1(N,R,Wn,'high','s'), CHEBY1(N,R,Wn,'stop','s')は、アナ

ログ Chebyshev I 型フィルタを設計します。 また、Wnは 1より大きく設定することがで

きます。

>> help cheby2

CHEBY2 Chebyshev II 型フィルタの設計(遮断帯域リップル)

[B,A] = CHEBY2(N,R,Wn)は、カットオフ周波数 Wnと通過帯域のピーク値から RdB 以上減衰

する遮断帯域にリップルをもつN次のローパスディジタルChebys-hevフィルタを設計しま

す。これは、フィルタ係数を、長さ(N+1)の行ベクトル B(分子)および A(分母)に出力しま

す。また、、カットオフ周波数 Wn は、0 と 1 の間の数でなければなりません。ここで、1

はサンプリング周波数の 1/2(Nyquist 周波数)です。Rはデフォルトで 20 dB で、デフォル

ト以外の値を設定する場合は、新たにRを設定してください。Wnが2要素ベクトルWn = [W1

W2]の場合、CHEBY2 は、通過帯域 W1 < W < W2 をもつ 2*N 次のバンドパスフィルタを出力

します。[B,A] = CHEBY2(N,R,Wn,'high')は、カットオフ周波数 Wn をもつハイパスフィル

タを設計します。[B,A] = CHEBY2(N,R,Wn,'stop')は、Wn が 2 要素ベクトル Wn = [W1 W2]

の場合、遮断帯域 W1 < W < W2 をもつバンドストップフィルタを設計します。 [Z,P,K] =

CHEBY2(...)のように、3つの出力引数を与えると、零点と極を長さ Nの列ベクトル Zと P

に、またゲインをスカラ Kにそれぞれ出力します。[A,B,C,D] = CHEBY2(...)のように、4

つの出力引数を与えると、状態空間行列を出力します。CHEBY2(N,R,Wn,'s'),

CHEBY2(N,R,Wn,'high','s'), CHEBY2(N,R,Wn,'stop','s')は、アナログ Chebyshev II 型

フィルタを設計します。 また、Wn は 1 より大きく設定することもできます。

>> help ellip

ELLIP 楕円または Cauer ディジタル、アナログフィルタの設計

49

[B,A] = ELLIP(N,Rp,Rs,Wn)は、通過帯域に Rp dB のリップルをもち、また通過帯域から

Rs dB 低い遮断帯域をもつ N次のローパスディジタル楕円フィルタを設計します。これは、

フィルタ係数を、長さ(N+1)の行ベクトル B(分子)および A(分母)に出力します。カットオ

フ周波数 Wn は、0と 1の間の数です。ここで、1はサンプリング周波数の 1/2(Nyquist 周

波数)です。どのような値を Rpと Rs に設定してよいか分からない場合は、まず、以下の値

に設定してください。

Rp = 0.5 、 Rs = 20

Wn が 2 要素ベクトル Wn = [W1 W2]の場合、ellip は通過帯域 W1< W <W2 をもつ 2*N 次

のバンドパスフィルタを出力します。[B,A] = ELLIP(N,Rp,Rs,Wn,'high')は、ハイパスフ

ィルタを設定します。[B,A] = ELLIP(N,Rp,Rs,Wn,'stop')は、Wn が 2 要素ベクトル Wn = [W1

W2]の場合、2*N 次のバンドストップフィルタで、遮断帯域は、W1< W <W2 となります。[Z,P,K]

= ELLIP(...)のように、3つの出力引数を与えると、零点と極を長さ Nの列ベクトル Zと P

に、またゲインをスカラ K にそれぞれ出力します。[A,B,C,D] = ELLIP(...)のように、4

つの出力引数を与えると、状態空間行列を出力します。ELLIP(N,Rp,Rs,Wn,'s')、

ELLIP(N,Rp,Rs,Wn,'high','s') 、または、ELLIP(N,Rp,Rs,Wn,'stop','s')は、アナログ楕

円フィルタを設計します。 また、Wn は 1 より大きく設定することができます。

サンプリング周波数 1KHz,つまり Nyquist 周波数 500Hz で,カットオフ周波数 300Hz の

9次の高域通過 Butterworth フィルタを設計し,さらにディジタルの周波数応答や出力を

計算する Mファイルを示します.

[b,a] = butter(9,300/500)

[h,w] = freqz(b,a,128);

f=w*500/pi;

semilogy(f,abs(h));

pause

plot(f,angle(h)*180/pi);

pause

u=[1 zeros(1,30)];

y=filter(b,a,u);

plot(y,'o')

50

2.7.6 離散時間フーリエ変換(DTFT)と離散フーリエ変換(DFT)

];[ ∞<<−∞ nnf で与えられるディジタル信号のフーリエ変換 ][ΩF は次式で定義され,

これを離散時間フーリエ変換(DTFT)といいます.

∑∞

−∞=

Ω−=Ωn

njenfF ][][

ここで,注意することは,Ωは連続値であることです.複素指数関数は周期2πの周期関数であるので,DTFT も同様に周期2πの周期関数になります.そこで, ][ΩF は 1周期区

間のみ( π20 <Ω≤ あるいは ππ <Ω≤− )表示すれば十分なわけです.離散時間逆フー

リエ変換は次式のようになります.これは, nje Ω の直交性(Ωは連続値なので,直交条件は1周期分の積分表現になります,後述の DFT との違いに注意してください)から容易に

導出できます.

∫ ΩΩ= Ωπ

π2

0][

21][ deFnf nj

][ΩF は複素数値であるので,極座標で表すことにします.

51

][]([][ Ω∠Ω=Ω FjeFF

絶対値部分を振幅スペクトル,偏角部分を位相スペクトルといいます.振幅の2乗をパワ

ースペクトルといいます.

][][][ 2 ΩΩ=Ω FFF

DTFT の手計算例として,次式の離散時間パルス信号をあげます.

=otherwise

Mnnb

,0,1

][

つぎのようにして導出できます.

2sin

)21sin(

11)1(

1][)12(

2

Ω

Ω+=

−−=++=

++++++=Ω

Ω

Ω+Ω−ΩΩ−

ΩΩΩ−Ω−

M

eeeee

eeeeB

j

MjjMMjjM

jMjjjM

L

LL

DTFT はつぎのような性質をもっています.

1)信号 ][nf が実数値の場合,次式が成立します.

][Im][Im],[Re][Re Ω−=Ω−Ω=Ω− FFFF

これより,振幅スペクトルはΩの偶関数で,位相スペクトルはΩの奇関数になります. 2)偶関数信号ではゼロ位相特性があります.

偶関数信号,つまり ][][ nfnf −= の場合の DTFT は,定義より虚数部分がないことが容易

にわかります.つまり,位相は常にゼロになり,これをゼロ位相といいます.一方,奇関

数信号の場合には,DTFT は純虚数になります.

3)信号を時間軸シフトした場合の特性はつぎのようになります.

信号 ][nf を Lサンプル時刻分遅らせた(時間軸の右方向にずらす)信号 ][ Lnf − の DTFT

は,信号 ][nf の DTFT ][ΩF に Lje Ω− を乗じたものに等しくなります.ラプラス変換と全く

同様にして導出できます.

4)周波数軸シフトした場合の特性はつぎのようになります.

DTFT ][ΩF の周波数推移した ][ 0Ω−ΩF の逆 DTFT は ][0 nfe njΩ になります.これを用いる

と変調信号の DTFT を求めることができます.離散時間信号 ][nf の変調信号とは,次式の

ような信号をいいます.

52

][)(21)cos(][ 00

0 nfeennf njnj Ω−Ω +=Ω

この信号の DTFT は,つぎのようになります.

)()(21

00 Ω+Ω+Ω−Ω FF

5)信号のエネルギーはパーセバル等式で表されます.

信号 ][nf の持つエネルギーは次式で定義されます.

∑∞

−∞=

=n

nfEnergy 2][

このエネルギーは DTFT を用いても,つぎのように表現することができます.

ΩΩ= ∫ dFEnergyπ

π2

0

2][21

文献17)に記載されている DTFT および逆 DTFT の関数 Mファイルを転載します.

%離散時間フーリエ変換 dtft.m

%出力変数 X=離散時間フーリエ変換

%入力変数 x=信号,n=時刻, w=周波数の格子点

function X = dtft(x,n,w)

X = zeros(1,length(w)); %X を初期化

for q = 1:length(w)

X(q) = x*exp(-j*w(q)*n).'; %X(q)を求める

End

%数値積分による離散時間フーリエ逆変換 invdtft.m

%出力変数 x=信号

%入力変数 X=離散時間フーリエ変換のベクトル,w=周波数格子点のベクトル

% n=時刻のベクトル

function x = invdtft(X,w,n)

dw = w(2)-w(1); %周波数格子点の間隔

x = zeros(1,length(n)); %信号の初期化

for p = 1:length(n)

x(p) = 1/(2*pi)*X*exp(j*w*n(p)).'*dw; %数値積分による逆変換の計算

end

53

これら 2つの関数 Mファイルの使用例についても,転載します.

非因果性信号の場合

%離散時間フーリエ変換の計算例

clear; %作業スペースからすべての変数を消去

x = [1 2 4 2 1]/10; %信号 x

n = -1:3; %時刻の範囲

w = linspace(-pi,pi,512); %周波数[-π,π]を 512 等分

X = dtft(x,n,w); %信号 xの離散時間フーリエ変換 X

magX = abs(X); argX = angle(X); %X の振幅と位相

subplot(2,1,1); plot(w,magX); grid; %振幅スペクトル|X|の図示

xlabel('¥omega [rad]'); ylabel('|X|');

subplot(2,1,2); plot(w,argX); grid; %位相スペクトル∠Xの図示

xlabel('¥omega [rad]'); ylabel('¥angle X');

因果性信号である指数関数と減衰する正弦波の DTFT の計算

%離散時間フーリエ変換の計算例

clear; %作業スペースからすべての変数を消去

alpha = 0.8; %定数

theta = pi/4; %周波数

n = 0:512; %時刻の範囲

a = realexp(alpha,n); %指数関数 a

w = linspace(-pi,pi,512); %周波数[-π,π]を 512 点に等分

A = dtft(a,n,w); magA = abs(A); %a の離散時間フーリエ変換と振幅スペクトル

x = realexp(alpha,n).*sin(theta*n); %減衰する正弦波 x

X = dtft(x,n,w); magX = abs(X); %x の離散時間フーリエ変換と振幅

subplot(2,2,1); plot(w,magA); grid; %振幅スペクトル|A|の図示

54

xlabel('¥omega [rad]'); ylabel('|A|');

subplot(2,2,2); plot(w,magX); grid; %振幅スペクトル|X|の図示

xlabel('¥omega [rad]'); ylabel('|X|');

ただし,上で呼び出した関数 Mファイル realexp.m は次のように定義されています.

%実数値の指数関数を生成する関数

%出力変数 x=指数関数

%入力変数 alpha=実定数,n=時刻ベクトル

function x = realexp(alpha,n)

x = alpha.^n.*(n>=0); %n>=0 ならば,x=alpha^n, その他のとき x=0

実行結果はつぎのとおりです.

変調前の非因果性信号と変調後の信号の DTFT を比較する例

%離散時間フーリエ変換の計算例

clear; %作業スペースからすべての変数を消去

x = [0.5 1 2 4 2 1 0.5]/10; %信号 x

n = -3:3; %時刻の範囲

subplot(2,1,1);stem(n,x); %時間応答

xlabel('time [n]');

w0 = pi/2;

md = cos(w0*n);

xm = x.*md; %変調信号

subplot(2,1,2);stem(n,xm); %時間応答

xlabel('time [n]');

pause

w = linspace(-pi,pi,512); %周波数[-π,π]を 512 等分

55

X = dtft(x,n,w); %信号 xの離散時間フーリエ変換 X

magX = abs(X); argX = angle(X); %X の振幅と位相

subplot(2,2,1); plot(w,magX); grid; %振幅スペクトル|X|の図示

xlabel('¥omega [rad]'); ylabel('|X|');

subplot(2,2,2); plot(w,argX); grid; %位相スペクトル∠Xの図示

xlabel('¥omega [rad]'); ylabel('¥angle X');

Xm = dtft(xm,n,w); %信号 xの離散時間フーリエ変換 Xm

magXm = abs(Xm); argXm = angle(Xm); %X の振幅と位相

subplot(2,2,3); plot(w,magXm); grid; %振幅スペクトル|Xm|の図示

xlabel('¥omega [rad]'); ylabel('|Xm|');

subplot(2,2,4); plot(w,argXm); grid; %位相スペクトル∠Xm の図示

xlabel('¥omega [rad]'); ylabel('¥angle Xm');

偶関数信号であるので位相スペクトルはゼロであり,変調信号は w0 のまわりにスペクトル

が 2山でていることがわかります.

因果性信号をインパルス応答を利用して計算する例

%離散時間フーリエ変換(DTFT)

u = [1 1 1 1 0 0 0 0]; %8 点の信号

n = 0:length(u)-1; %時間のインデックス

subplot(2,2,1);

stem(n,u); %信号の図示

axis([0 length(n) min(u) max(u)]);

xlabel('k'); ylabel('u[k]')

w = -pi:0.01:pi; %周波数の範囲

U_dtft = freqz(u,1,w); %離散時間フーリエ変換の計算

subplot(2,2,2);

56

mU = max(abs(U_dtft)); %|U_dtft|の最大値

plot(w,abs(U_dtft)); %振幅スペクトルの図示

axis([-pi pi 0 mU]);

xlabel('Normalized Frequency [-]');

ylabel('Mag');

subplot(2,2,3)

pU = atan(imag(U_dtft)./real(U_dtft));

plot(w,pU*180/pi);

xlabel('Normalized Frequency [-]');

ylabel('Phase [deg]');

前 M ファイルにおける stem.m 関数のヘルプ表示はつぎのとおりです.

>> help stem

STEM 離散データ列のプロットまたは"ステム"プロット

STEM(Y)は、データ値に対して円を終点とする、x軸からのステムとして、データ列 Yをプ

ロットします。STEM(X,Y)は、X で指定した値で、データ列 Y をプロットします。

STEM(...,'filled')は、マーカを塗りつぶしたステムプロットを作成します。

STEM(...,'LINESPEC')は、ステムとマーカに対して、指定したラインスタイルを使用しま

す。使用可能な値については、PLOT を参照してください。H = STEM(...)は、LINE オブジ

ェクトのハンドル番号からなるベクトルを出力します。

区間[0,N-1]の N 点で与えられたディジタル信号f[n],n=0,1,2,…,N-1の離散時間フーリ

エ変換(DFT)は次式で定義されます.

1,,2,1,0,][][1

0

)2(−== ∑

=

−NkenfkF

N

n

Nknj

57

逆 DFT はつぎのようになります.

1,,2,1,0,][1][1

0

)2(−== ∑

=

NnekFN

nfN

k

Nknj

DFT はディジタル信号f[n],n=0,1,2,…,N-1の DTFT を等間隔離散の角周波数点

1,,2,1,0,2 −==Ω NkN

kL

πで離散化したものに等しくなります.つまり,次式が成り立

ちます.

1,,2,1,0,][][)2(

−=Ω==Ω

NkFkFN

k Lπ

したがって,連続周波数分布が DTFT で,その周波数を離散化して書いたものが DFT になり

ます.DFT は MATLAB では,fft.m で計算することができます.この関数の help 表示はつぎ

のようになります.

>> help fft

FFT 離散フーリエ変換

FFT(X)は、ベクトル Xの離散フーリエ変換(DFT)を出力します。Xの長さが 2のベキ乗の場

合、基底を 2 とした高速フーリエ変換アルゴリズムが使われます。X の長さが 2 のベキ乗

でなければ、計算速度の遅いアルゴリズムが使われます。FFT は、行列に対しては列単位

で操作を行います。FFT は、N次元配列に対しては、最初に 1でない次元に対して操作を行

います。

FFT(X,N)は、N点の FFT を出力します。Xの長さが Nより小さい場合は、Nになるまで後ろ

に 0を加えます。Xの長さが Nより大きい場合は、Xの Nより長い部分は、打ち切られます。

FFT(X,[],DIM)と FFT(X,N,DIM)は、次元 DIM 上で FFT 演算を適用します。長さ N の入力ベ

クトル xに対して、DFT は、つぎの要素をもつ長さ Nのベクトル Xになります。

N

X(k) = sum x(n)*exp(-j*2*pi*(k-1)*(n-1)/N)、1 < = k < = N.

n = 1

逆 DFT(IFFT により計算される)は、つぎの式で与えられます。

N

x(n) = (1/N) sum X(k)*exp( j*2*pi*(k-1)*(n-1)/N)、1 < = n < = N.

k = 1

DFT とつぎの式

N/2

x(n) = a0 + sum a(k)*cos(2*pi*k*t(n)/(N*dt))+b(k)*sin(2*pi*k*t(n)/(N*dt))

k = 1

のフーリエ係数 aと bの関係は、つぎのようになります。

58

a0 = X(1)/N、a(k) = 2*real(X(k+1))/N、b(k) = -2*imag(X(k+1))/N

ここで、xは時間 t、間隔 dt でサンプリングされた、長さ Nの離散信号です。

定義にしたがって計算したものと fft 関数で計算したものを比較する Mファイルをあげま

す.

%離散フーリエ変換の計算例

%信号

u = [1 1 1 1 0 0 0 0]; %8 点の信号

n = 0:length(u)-1; %時間のインデックス

subplot(2,2,1);

stem(n,u); %信号の図示

axis([0 length(n) min(u) max(u)]);

xlabel('n'); ylabel('u(n)');

%離散フーリエ変換 DFT 定義式による計算

k = n %周波数のインデックス

N = length(u); %信号の長さ

kn = 0:N-1; %回転因子のインデックス

WN = exp(-j*2*pi/N);

WNkn = WN.^kn; %回転因子

X = zeros(1,N); %X の初期化

for kk = 0:N-1

for nn = 0:N-1

p = mod(kk*nn,N); %回転因子の指数の計算

X(kk+1) = X(kk+1)+u(nn+1)*WNkn(p+1); %DFT の計算

end

end %DFT の計算

magX = abs(X) %振幅スペクトル

subplot(2,2,2);

stem(k,magX); %振幅スペクトルの図示

maxX = max(magX);

axis([0 length(k) 0 maxX]);

xlabel('Frequency k'); ylabel('|X(k)|');

% fft.m を用いた DFT 計算

XX = fft(u,8);

magXX = abs(XX) %振幅スペクトル

subplot(2,2,3);

stem(k,magXX); %振幅スペクトルの図示

59

maxXX = max(magXX);

axis([0 length(k) 0 maxXX]);

xlabel('Frequency k'); ylabel('|X(k)|');

%離散フーリエ変換のシフト図示

kshift = k-floor(length(k)/2); %インデックスのシフト

Xshift = fftshift(X); %DFT X(k)のシフト

magXshift = abs(Xshift); %シフトされた DFT の振幅スペクトル

subplot(2,2,4);

stem(kshift,magXshift); %シフトされた振幅スペクトルの図示

axis([-length(k)/2 length(k)/2 0 maxX]);

xlabel('Frequency k'); ylabel('|X(k)|');

fft.mを用いてフーリエ変換し,振幅および位相スペクトルを表示する関数Mファイルは,

つぎのようになります.

%ファイル名 'freqres.m'

%

function [A,P] = freqres(x,N);

f = 0:1/N:1-1/N;

X = fft(x,N);

A = 20*log10(abs(X));

P = atan(imag(X)./real(X));

subplot(211);plot(f,A);

60

xlabel('Normalized Frequency [-]');

ylabel('Amplitude [rad]');

subplot(212);plot(f,P);

xlabel('Normalized Frequency [-]');

ylabel('Phase [rad]');

2.7.7 サンプリングされた信号のフーリエ変換

連続時間信号 f(t)のフーリエ変換,逆変換およびサンプリングされた信号 f[n]=f(nT)の

DTFT,逆変換はそれぞれ次式のようになっています.

∫∑

∫∫∞

∞−

Ω∞

−∞=

Ω−

∞−

∞−

ΩΩ==Ω

==

deFnfenfF

deFtfdtetfF

nj

n

nj

tjtj

][21][,][][

)(21)(,)()(

π

ωωπ

ω ωω

ディジタル信号と連続時間信号のフーリエ変換の関係は,次式のように表せます.

∑∫∫∞

−∞=

+∞

∞−===

r

Tr

Tr

jnTnTj deFdeFnTfnfπ

πωω ωω

πωω

π)1(2

2)(

21)(

21)(][

ここで, 12 =rnje π に注意して,変数変換

Trπωω 2−=′

を行うと,次式のようになる.

ωπωπ

ωπ

′+′= ′∞

−∞=∑∫ de

TrFnf jnT

r

T )2(21][

2

0

さらに, ω′=Ω T とおくと,次式のようになる.

∑∫∞

−∞=

Ω Ω+Ω=r

nj deT

rFT

nf )2(121][

2

0

ππ

π

上式は,逆 DTFT とみなせるので,次式の関係が成り立ちます.

)2(1][ ∑∞

−∞=

+Ω=Ωr T

rFT

F π

ディジタル信号のフーリエ変換はアナログ信号のフーリエ変換を順次周波数Ωを π2 だけ

(ωをTπ2だけ)ずらしていき,無限個足したものになっていることがわかる.信号 )(tf

が帯域制限信号であって,信号のフーリエスペクトルに Mω 以上の周波数成分を含まない,

つまり,次式が成立するとします.

61

MF ωωω >= ,0)(

このとき, πω <TM ならば, )2(T

rF π+Ωの和に重なりは生じないので,これから )(ΩF

を復元することが可能であることがわかります.しかし, πω >TM ならば,重なりが生

じて復元できないことがわかります.これをエリアシング(aliasing)といいます.

2.7.8 サンプリング定理

連続時間信号が周波数 maxf ,つまり角周波数 maxmax 2 fπω = より高い周波数成分を含まな

いとき,サンプリング周波数 Tf s /1= ,つまりサンプリング角周波数 ss fπω 2= を

max2 ff s ≥ あるいは max2ωω ≥s

と設定すれば,つぎのようにサンプリング信号 )(kTx から連続時間信号 )(tx を次式のよう

に完全に復元できます.これをサンプリング定理といいます.

∑∞

−∞= −−=

k TkTtTkTtkTxtx

/)()/)(sin()()(

ππ

ここで, max2 f をナイキスト周波数といいます.時刻 tを現在の時刻とすると,完全にサンプリング信号から連続時間信号を復元するためには未来のデータが必要であることが,サ

ンプリング定理からいえます.

2.7.9 ダウンサンプリングとアップサンプリング

ディジタル信号処理では,異なるサンプリング周波数(サンプリングレート)をもつ処理

装置を利用することがあり,このような処理をマルチレート信号処理といいます.

ダウンサンプリング(デシメーション)

入力信号 f[n]から Dごとの値を取りだし,それ以外を廃棄する操作をダウンサンプリング

といいます.これは式で書くとつぎのようになります.

整数:],[][ DnDfnf D =

アップサンプリング(インタポレーション)

アップサンプラの入力信号と出力信号の関係は次式のようになります.

==

otherwise

kkUnUnfnfU

0

:,,][][ 整数

2.7.10 ウィンドウ(窓)関数

DFT でスペクトル分布を計算する場合,有限時間の時系列信号を周期的に並べた構造にす

るために,時系列信号を切り出す窓を考え,窓関数を元の時系列信号に乗じる操作を行う

必要があります.窓関数には,箱窓,三角窓,ハニング窓,ハミング窓などがあります.

62

箱窓:

>≤

=ττ

tt

w,0,1

0

三角窓:

>

≤−=τ

ττ

t

tt

w,0

,11

ハニング窓:

>

≤+=τ

ττπ

t

ttw

,0

,)cos1(21

1

ハミング窓:

>

≤+=τ

ττπ

t

ttw

,0

,cos46.054.01

ハニング窓とハミング窓を表示し,さらに窓関数のパワースペクトルを計算し表示する M

ファイルはつぎのようになります.

n=200;

x=[hanning(n) hamming(n)];

subplot(2,1,1);plot(x);

y=fft(x,256);

[mx,my]=size(y);f=(0:25)/128;

Pyy=y(1:26,:).*conj(y(1:26,:));

subplot(2,1,2);semilogy(f,Pyy);

実際に前述の freqres.m を用いて,ハニング窓関数をかけた場合の周波数応答を表示して

みましょう.

% 8Hz sampling

% original data 1Hz

63

t = [0:1/8:8-1/8].';

x = cos(2*pi*t);

%ハニング窓,窓長を 64 点(8 [sec] 間)

t = [0:1/8:8-1/8].';

x = cos(2*pi*t);

w = hanning(64);

y = w.*x;

subplot(221);stem(x);title('without window function')

subplot(222);stem(w);title('Hanning window')

subplot(223);stem(y);title('output of hanning window')

pause

%512 fft

freqres(x,512);

subplot(211);axis([0 1 -100 50]);

pause

%ハニング窓を掛けた信号のスペクトル

freqres(y,212);subplot(211);axis([0 1 -100 50]);

64

2.8 MEX 関数(詳しくは文献14)参照してください)

MEX 関数 MATLAB Executable 関数の略で,C 言語や Fortran 言語で記述します.MEX 関数

は次のような目的で使用します.

・ 処理の高速化

・ C 言語や Fortran 言語の既存コードの MATLAB 上で使用

・ MATLAB とハードウェアや外部とのゲートウェイを作成:DDE,Active X,Java がサポ

ートされていないような場合に必要

2.8.1 MATLAB セットアップ

MATLAB で MEX ファイルをコンパイルするには,コンパイラ指定を行う必要があります.こ

のためには,つぎのように MATLAB プロンプトで入力します.

>>mex -setup

このとき,使用可能なコンパイラ(Cコンパイラ,Fortran コンパイラ)が表示され,それ

を選択します.この例では,visual C++や visual Fortran などがインストールされていな

いため,使用可能なものは MATLAB に標準添付されている Cコンパイラ lcc を選択していま

す.

2.8.2 簡単な MEX ファイルの作成,コンパイル,実行手順

C 言語で有名なプログラムである Hello World をモニタ上に表示する MEX 関数を作成して

みましょう.

1)MEX 関数のソースプログラムである hello.c をつぎのように,MATLAB エディタなどで

作成し,MATLAB カレントディレクトリに保存します.

#include "mex.h"

void mexFunction(int nlhs,mxArray *plhs[],int nrhs,const mxArray * prhs[])

65

mexPrintf("Hello World¥n");

return;

2)つぎのようにして,MEX コマンドでコンパイルすると,MEX ファイル hello.dll が生成

されます.

>> mex hello.c

3)MATLAB プロンプトでファイル名を入力すると,実行できます.

>>hello

4)参考のため,上記 MEX ファイルを関数 Mファイルで作成すると,つぎのようになりま

す.

function mhello()

fprintf('Hello World¥n');

ここで,fprintf は C 言語での printf に相当する MATLAB 関数で,文字列は MATLAB ではシ

ングルクウォーテーションで囲むことに注意してください.

5)mexFunction()内の引数の意味はつぎのようになっています.

・ nlhs:Number of Left-Hand Side arguments(関数の左側(出力)の引数の数)

・ plhs:Pointer to Left-Hand Side arguments(関数の左側(出力)の引数へのポインタ)

・ nrhs:Number of Right-Hand Side arguments(関数の右側(入力)の引数の数)

・ prhs:Pointer to Right-Hand Side arguments(関数の右側(入力)の引数へのポイン

タ)

上記の引数を用いることにより,実行の際に MATLAB プロンプト上からデータを引き渡

す(入力する)ことが可能になります.入力されたデータは配列形式(ポインタ)で

mxGetScalar 関数を用いて,MEX プログラム内で使用可能です.文献14)の例題をあげ

66

ます.ファイル名は hello3.c としています.

#include <stdio.h>

#include "mex.h"

void mexFunction(int nlhs,mxArray *plhs[],int nrhs,const mxArray * prhs[])

int i;

double pdata;

mexPrintf("Hello World nlhs = %d nrhs = %d¥n",nlhs,nrhs);

for(i=0;i<nrhs;i++)

pdata = mxGetScalar(prhs[i]);

mexPrintf("%f¥n",pdata*pdata);

return;

MATLAB にデータを出力するには,mxCreateDoubleMatrix 関数を用います.文献14)の

例題を少し変更したものをあげます.ファイル名は hello4.c としています.

#include <stdio.h>

#include "mex.h"

void mexFunction(int nlhs,mxArray *plhs[],int nrhs,const mxArray * prhs[])

int i;

double data=0;

67

double* pdata;

mexPrintf("Hello World nlhs = %d nrhs = %d¥n",nlhs,nrhs);

for(i=0;i<nrhs;i++)

data += mxGetScalar(prhs[i]);

mexPrintf("%f¥n",data);

for(i=0;i<nlhs;i++)

plhs[i] = mxCreateDoubleMatrix(1,1,mxREAL);

pdata = mxGetPr(plhs[i]);

pdata[0] = data+i;

return;

3.Simulink の使用法

3.1 起動方法と構成内容

Simulink はブロック線図を使って,応答波形をビジュアル化が可能です.連続時間系に

ついては,以前のアナログコンピュータを計算機のソフトウェアで実現したものと思って

もらえれば良いと思います.Simulink を起動する方法は,つぎの2とおりです.

1)メニューのしたのツールバーをクリックして起動します.

68

2)コマンドウィンドウ内のコマンドラインからつぎのように起動します.

>> simulink

Simulink が起動されると,つぎのような Simulink ウィンドウが開きます.

Simulink は次のようなライブラリから構成されています.

・ Continuous:伝達関数や状態方程式表現

など線形連続時間系を表現するブロック

Derivative:微分ブロック

Integrator:積分ブロック

69

State-Space:状態方程式ブロック

Transfer Fcn:伝達関数ブロック

Transport Delay:むだ時間

など

・ Discrete:線形離散時間系を記述するブロック群

Descrete Transfer Fcn:パルス伝達関数

Descrete State-Space:離散時間状態方程式

Descrete-Time Integrator:離散時間積分器

Unit Delay:z-1オペレータ

Zero-Order Hold:ゼロ次ホールダ

など

・ Functions & Tables:一般的な関数を記述するブロック群

Fcn:一般的な関数を定義 sin や exp など.

MATLAB Fcn:MATLAB ファンクション

S-Function:S ファンクション

など

・ Math:加算器,積算器,比例要素,ゲイン

などを記述するブロック群

Gain:ゲイン

Matrix Gain:行列ゲイン

70

Product:信号積

Dot Product:ベクトルの内積

Sum:信号和

Sign:符号

Abs:絶対値

など

・ Nonlinear:飽和,バックラッシュなと非線形要素のブロック

Backlash:バックラッシュ

Dead Zone:デッドゾーン

Relay:リレー

Saturation:飽和

Switch:スイッチ

など

・ Signals & Systems:ベクトルの分解/合成,外部入力/出力とのデータの受け渡しな

どを記述するブロック群

In1:サブシステムの入力ポートを指定

Out1: サブシステムの出力ポートを指定

Mux:複数信号をベクトルとして1つにまとめる

Demux:ベクトルを複数の信号に分ける

など

・ Sinks:ブロックの出力を表示したりファ

イルやデータに受け渡すブロック群

Scope:オシロスコープ

71

XY Graph:2 次元スコープ

To Workspace:ワークスペースにデータ保存

To File:ファイルにデータ保存

Display:信号の数値データを表示

など

・ Sources:ステップ関数,正弦波関数などの信号を生成するブロック群

Step:ステップ関数を生成

Sin Wave:正弦波を生成

Random Number:乱数を生成

Pulse Generator:パルスを生成

Signal Generator:いろいろな信号を生成

など

3.2 ファイルの作り方

1)Simulink ウィンドウのメニューでファイ

ル—新規作成—モデルを選択するか,ツールバ

ーの新規モデルの作成を選択すると,編集ウィ

ンドウが開かれます.

2)お絵描きツールと同じように,各ブロック群から所望のブロックを選択して編集ウィ

ンドウ内に配置します.ここでは,1 次遅れのステップ応答を表示するモデルを作成しま

72

す.

3)ブロックのパラメータを設定するには,それぞれのオブジェクトをダブルクリックす

ると,データ入力ウィンドウが表示されます.

・Transfer Fcn の設定ウィンドウ

・Step の設定ウィンドウ

・Scope の設定ウィンドウ:Scope はダブルクリックした場合にはデータ表示ウィンドウ

がでてくるの,ここのツールバーでプロパティを選択することにより表示されます.

73

4)メニューでシミュレーションでシミュレーションパラメータを選択して,シミュレー

ション時間や微分方程式のソルバーなどの設定をします.

5)シミュレーション--開始を選択してシミュレーションをスタートさせます.

74

6)応答波形は Scope ウィンドウに表示されます.

(注意)グラフの軸の刻みを変更したい場合には,ツールバーの双眼鏡をクリックしてく

ださい.また,ワークスペースやファイルのデータを保存したい場合にはツールバーのプ

ロパティから保存名などを指定すればできます.また,M-file を実行して定義された変数

データはワークスペースに保存されていることから,Simulink 内で使用可能です.

75

3.3 例題1:音声データのフィルタ処理

FIR フィルタ処理

前述の例題で保存した dat_wav.mat ファイルを用いて,反響音を生成し再生してみましょ

う.dat_wav.mat ファイルはサンプリング周波数 Fs=11025Hz であるので,1秒のデータ数

は 11025 個で 5秒間のデータが変数 yが格納されています.

・ dat_wav.mat の生成 Mファイルを参考のため再掲します.

% 11.025kHz , 5sec data

Fs = 11025;

y = wavrecord(5*Fs, Fs, 'double');

plot((1:length(y))/Fs,y);

xlabel('time[sec]');

axis([0 length(y)/Fs -1 1]);

pause

specgram(y,256,Fs);

pause

wavplay(y, Fs);

save dat_wav.mat y Fs

・ SIMULINK のための MALTAB ワークスペース上データの生成 Mファイル

load dat_wav

wavplay(y);

len=length(y);

t=0:1/Fs:(len-1)*(1/Fs);

ypt=[t' y];

・ SIMULINK による FIR フィルタ計算

SIMULINK 全体図

76

サンプリング時間は 1/Fs にします.シミュレーションパラメータは次のように設定し,シ

ミュレーション—開始で FIR フィルタ出力を計算します.

77

From Workspace および To Workspace の設定値

To Workspace のデータ形式は,StructureWithTime にしています.これは,時間データ

と出力データが構造体で出力されます.出力変数の形式は MATLAB プロンプトで次のように

入力するとわかります.

>> filtoutpt

filtoutpt =

time: [55126x1 double]

signals: [1x1 struct]

blockName: 'filt/To Workspace'

したがって,時間データは,filtoutpt.time でデータ数 55126 の double 型で格納され,

filtoutpt.signals はまだ構造体であることがわかります.さらに,つぎのようにして,

filtoutpt.signals の構造がわかります.

>> filtoutpt.signals

ans =

values: [55126x1 double]

dimensions: 1

label: ''

したがって,filtoutpt.signals.values に出力データがデータ数 55126 の double 型で格

納されていることがわかります.

・ フィルタ出力の再生および比較

% execute after executing both createdata_slink and filt.mdl

subplot(2,1,1);plot(t',y);

subplot(2,1,2);plot(filtoutpt.time,filtoutpt.signals.values);

wavplay(filtoutpt.signals.values,Fs);

78

pause

subplot(2,1,1);specgram(y,256,Fs);

subplot(2,1,2);specgram(filtoutpt.signals.values,256,Fs);

連続時間フィルタによる wav データ処理例題

まずは,データをワークスペース上にロードして,SIMULINK データを生成する Mファイル

です.

79

load dat_wav

wavplay(y);

len=length(y);

t=0:1/Fs:(len-1)*(1/Fs);

ypt=[t' y];

つづいて,連続時間高域通過フィルタとその逆により生成したデータをサンプリングして,

MATLAB のワークスペース上に格納する SIMULINK です.

80

また,シミュレーションパラメータはつぎのように設定しています.

シミュレーション後にワークスペース上に構造体として保存された変数 filtoutpt2,

filtoutpt3 のグラフ表示および音声再生を行う Mファイルは,つぎのようになります.

% execute after executing both createdata_slink and filt.mdl

subplot(2,1,1);plot(t',y);

subplot(2,1,2);plot(filtoutpt2.time,filtoutpt2.signals.values);

wavplay(filtoutpt2.signals.values,Fs);

pause

subplot(2,1,1);plot(t',y);

81

subplot(2,1,2);plot(filtoutpt3.time,filtoutpt3.signals.values);

wavplay(filtoutpt3.signals.values,Fs);

pause

subplot(2,1,1);specgram(y,256,Fs);

subplot(2,1,2);specgram(filtoutpt2.signals.values,256,Fs);

pause

subplot(2,1,1);specgram(y,256,Fs);

subplot(2,1,2);specgram(filtoutpt3.signals.values,256,Fs);

出力データ表示は,つぎのようになります.

3.4 例題2:画像データ処理

画像処理で注意することは,MATLAB の数値計算は double 型の一方,画像データの入出力

では,uint 型,文字データの処理には char 型が使われる点です.たとえば,gif 形式と

jpeg 形式のデータは次のように表示されます.MATLAB への画像データの読み込みは,

imread を用いています.これは,image processing toolbox はなくても,動きます.

>> Agif=imread('barfy1.gif','gif');

82

>> Ajpg=imread('m_pic2.jpg','jpg');

>> whos Agif

Name Size Bytes Class

Agif 227x330 74910 uint8 array

Grand total is 74910 elements using 74910 bytes

>> whos Ajpg

Name Size Bytes Class

Ajpg 72x351x3 75816 uint8 array

Grand total is 75816 elements using 75816 bytes

上記の例では,gif ファイルは白黒で,jpg ファイルはカラーになっています.実際のデー

タはつぎのようなものです.

imread で読み込んだ画像は uint8 型で, M×M 画素では,白黒画像の場合,M×M 次配列,

カラー画像の場合,M×M×3になります.上記のカラー画像のデータの場合,

Ajpg(:,:,1)が赤,Ajpg(:,:,2)がグリーン,Ajpg(:,:,3)が青になります.これらのデータ

を数値演算する場合には,つぎのように double 型に変換して処理を行います.

>>Ad = double(Ajpg);

また,数値処理したデータを,画像データに戻すには,最大値が 255 になるように正規化

したあとで,8ビット型に変換します.

>>dmax=max(max(Ad));

>>Aim3=uint8(Ad/dmax*255);

画像を扱う関数 imread,imwrite,image の help 表示は以下のようになります.これらは,

image processing toolbox なしで動作します.

>> help imread

IMREAD グラフィックスファイルからイメージを読み込みます

A = IMREAD(FILENAME,FMT)は、FILENAME 内のイメージを、Aに読み込みます。ファイルが

グレイスケール強度イメージを含む場合、A は 2 次元配列です。ファイルがトゥルーカラ

ー(RGB)イメージを含む場合、Aは 3次元(M*N*3)配列です。FILENAME は、グラフィックス

ファイル名を指定する文字列で、FMT はファイルの書式を指定する文字列です。ファイル

は、カレントのディレクトリ、または MATLAB パス上のディレクトリになければなりません。

83

IMREAD がファイル名 FILENAME を見つけられない場合は、FILENAME.FMT を探します。

FMT の取り得る値を以下に示します。

'jpg' または 'jpeg' Joint Photographic Experts Group (JPEG)

'tif' または 'tiff' Tagged Image File Format (TIFF)

'gif' Graphics Interchange Format (GIF)

'bmp' Windows Bitmap (BMP)

'png' Portable Network Graphics

'hdf' Hierarchical Data Format (HDF)

'pcx' Windows Paintbrush (PCX)

'xwd' X Window Dump (XWD)

'cur' Windows Cursor resources (CUR)

'ico' Windows Icon resources (ICO)

[X,MAP] = IMREAD(FILENAME,FMT)は、FILENAME のインデックス付きイメージを Xに読み込

み、対応するカラーマップを MAP に読み込みます。イメージファイル内のカラーマップの

値は、読み込まれたときに、範囲[0,1]に再スケーリングされます。

[...] = IMREAD(FILENAME)は、その内容からファイルの書式を推測します。

データタイプ

------------

IMREAD によりサポートされているイメージファイルフォーマットのほとんどで、ピクセル

は、カラー平面について、8 またはそれ以下のビット数でストアされます。このようなフ

ァイルを読み込むとき、出力(A または X)のクラスは uint8 になります。IMREAD は、TIFF

やPNGファイルから、ピクセルあたり16ビットのデータを読むことをサポートしています。

このようなイメージファイルに対して、出力(A または X)のクラスは unit16 です。

TIFF 固有のシンタックス

-----------------------

[...] = IMREAD(...,IDX)は、複数のイメージをもつ TIFF ファイルから、1 つのイメージ

を読み込みます。IDX は、ファイル内のイメージの順番を指定する整数値です。 たとえば、

IDX が 3 の場合、IMREAD は、ファイルの 3番目のイメージを読み込みます。この引数を省

略すると、IMREAD はファイルの 1番目のイメージを読み込みます。

PNG 固有のシンタックス

-----------------------

[...] = IMREAD(...,'BackgroundColor',BG)は、BG 内に設定したカラーに対して、入力イ

メージ内のピクセルを対応付けします。BG が'none'の場合、対応付けは存在しません。

'none'以外では、入力イメージがインデックス付きイメージの場合、BG は[1,P]の範囲の

整数になり、P はカラーマップ長になります。入力イメージがグレースケールの場合、BG

は[0,1]の範囲の整数です。また、入力イメージが RGB の場合、BGは範囲が[0,1]の値から

84

なる 3成分のベクトルになります。文字列'BackgroundColor'は省略される可能性がありま

す。

下に示すような ALPHA 出力引数が使われる場合、ユーザが設定できない'none'が、BGのデ

フォルトになります。それ以外で、PNG ファイルか、バックグランドカラーチャンクを含

んでいる場合、カラーは BG に対するデフォルト値として使用されます。ALPHA が使用され

ず、ファイルがバックグラウンドカラーチャンクを含んでいない場合、BGに対するデフォ

ルト値は、インデックス付きイメージで 1、グレースケールイメージで 0、RGB イメージで

[0,0,0]になります。

[A,MAP,ALPHA] = IMREAD(...)は、存在するならば、ALPHA チャンネルを出力し、存在しな

い場合は[]で、ALPHA に出力します。ファイルがグレースケールまたはトゥルーカライメ

ージを含む場合は、MAP は空になります。

HDF 固有のシンタックス

-----------------------

[...] = IMREAD(...,REF)は、複数のイメージをもつ HDF ファイルから、1つのイメージを

読み込みます。REF は、イメージを識別するために使う参照番号を指定する整数値です。

たとえば、REF が 12 の場合、IMREAD は参照番号が 12 のイメージを読み込みます(HDF ファ

イルでは、参照番号はファイル内のイメージの順序と対応させる必要はありません。参照

番号をイメージの順番に一致させるためには、IMFINFO を使うことができます)。この引数

を省略すると、IMREAD は、ファイルの 1番目のイメージを読み込みます。

ICO- と CUR-固有のシンタックス

------------------------------

[...] = IMREAD(...,IDX) は、マルチイメージアイコン、または、カーソルファイルのど

ちらかから一つのイメージの中を読みます。IDX は、ファイルの中に表れるイメージの順

番を指定する整数値です。たとえば、IDX が 3 の場合、IMREAD は、ファイル内の 3番目の

イメージを読みます。この引数を省略すると、IMREAD は、ファイルの中の最初のイメージ

を読みます。

[A,MAP,ALPHA] = IMREAD(...) は、リソース用の AND マスクを出力します。これは、透明

度の情報を決定するために使われるものです。カーソルファイルに対して、このマスクは、

使用可能なデータのみを含んでいます。

サポートしているファイルタイプ

-----------------------

JPEG 任意のベースラインの JPEG イメージ。一般的に使われる拡張付きの JPEG イメージ

TIFF 1 ビット、8 ビット、24 ビットの圧縮されていないイメージを含む任意のベースラ

インの TIFF イメージ。packbit 圧縮の 1ビット、8ビット、24 ビットイメージ。CCITT 圧

縮の 1ビットイメージ。また、16 ビットグレースケールイメージ、16ビットインデックス

付きイメージ、48 ビット RGB イメージ。

85

GIF 1 ビット、8ビットの圧縮されていないイメージ。

BMP 1 ビット、4ビット、8ビット、24ビット、32ビットの圧縮されていないイメージ。

4ビットと 8ビットの実行長エンコード(RLE)イメージ。

PNG 1 ビット、2 ビット、4 ビット、8 ビット、16 ビットのグレースケールイメージ、8

ビット、16 ビットのインデックス付きイメージ、24 ビット、48 ビットの RGB イメージを

含む任意の RNG イメージ

HDF 関連するカラーマップをもつ、あるいはもたない 8ビットのラスターイメージデー

タセット。24 ビットラスターイメージデータセット。

PCX 1 ビット、8ビット、24 ビットのイメージ。

XWD 1 ビットと 8ビットの Zpixmaps。XYBitmaps。1 ビットの XYPixmaps。

ICO 1-ビット、4-ビット、8-ビットの圧縮をしていないイメージ

CUR 1-ビット、4-ビット、8-ビットの圧縮していないイメージ

参考:IMFINFO, IMWRITE, FREAD, IMAGE, DOUBLE, UINT8.

>> help imwrite

IMWRITE イメージをグラフィックスファイルに書き出します

IMWRITE(A,FILENAME,FMT)は、イメージ Aを FILENAME に書き出します。FILENAME は、出力

ファイル名を指定する文字列で、FMT はファイルの書式を指定する文字列です。Aがグレイ

スケールイメージ、(M行 N 列)またはトゥルーカラーイメージ(MxNx3)のどちらでも構いま

せん。

FMT の取りうる値を以下に示します。

'tif' または 'tiff' Tagged Image File Format (TIFF)

'jpg' または 'jpeg' Joint Photographic Experts Group (JPEG)

'bmp' Windows Bitmap (BMP)

'png' Portable Network Graphics(PNG)

'hdf' Hierarchical Data Format (HDF)

'pcx' Windows Paintbrush (PCX)

'xwd' X Window Dump (XWD)

IMWRITE(X,MAP,FILENAME,FMT)は、Xのインデックス付きイメージと関連するカラーマップ

MAP を、FILENAME に書き出します。Xのクラスが uint8 または uint16 の場合、IMWRITE は

配列の実際の値をファイルに書き出します。Xのクラスが double の場合、IMWRITE は、書

き出す前に uint8(X-1)を使って配列内の値をオフセットします。MAP は、有効な MATLAB

のカラーマップでなければなりません。ほとんどのイメージファイルの書式は、256 要素

以上のカラーマップはサポートしないことに注意してください。

IMWRITE(...,FILENAME)は、ファイル名の拡張子から使用する書式を推測して、イメージを

FILENAME に書き出します。拡張子は、FMT に対して適切な値でなければなりません。

IMWRITE(...,PARAM1,VAL1,PARAM2,VAL2,...)は、出力ファイルの種々の特性を制御するパ

86

ラメータを指定します。パラメータは、カレントでは、HDF、JPEG、TIFF、PNG ファイルに

対してサポートされています。

データタイプ

-----------------------

サポートされているイメージファイルフォーマットの大部分は uint8 データです。PNG と

TIFF は、uint16 データもサポートしています。グレースケールや RGB イメージに対して、

データ配列が double の場合、仮定するダイナミックレンジは[0,1]になります。データ配

列は、uint8として書き出す前に255で自動的にスケーリングされます。データ配列がuint8

または uint16 の場合、それぞれ、uint8 または uint16 として、スケーリングしないで書

き出されます。

注意:論理上の double または uint8 が、PNG、または、TIFF ファイルで書かれている場合、

それは、バイナリイメージと仮定され、1のビットデプスで表現されます。

インデックス付きイメージに対して、インデックス付き配列が double の場合、インデック

ス群は、まず、各要素から 1 を引き、ゼロベースのインデックス付きに変換し、uint8 と

して表現します。インデックス付き配列が、uint8 または uint16 の場合、uint8 または

uint16 になるような変更は行われません。

PNG ファイルを書くとき、'BitDepth'パラメータを使って、この挙動特性を書き換えます。

詳細を示します。

HDF 固有のパラメータ

-----------------------

'Compression' 'none' (デフォルト)、'rle' (グレイスケールとインデックス付きイメ

ージについてのみ有効)、'jpeg' (グレイスケールと RGB イメージについてのみ有効)のい

ずれか。

'Quality' 0 から 100 の間の数字。パラメータは、'Compression'が'jpeg'のときの

み適用します。数字が大きいほど、画質が良い(圧縮によるイメージの劣化が少ない)こと

を意味しますが、結果のファイルサイズは大きくなります。

'WriteMode' 'overwrite' (デフォルト)または'append'のいずれか。

JPEG 固有のパラメータ

-----------------------

'Quality' 0 から 100 の間の数字。

数字が大きいほど、画質が良い(圧縮によるイメージの劣化が少ない)ことを意味しますが、

結果のファイルサイズは大きくなります。

TIFF 固有のパラメータ

-----------------------

'Compression' 'none'、'packbits'(非バイナリイメージのデフォルト)、'ccitt'(バイ

ナリイメージのデフォルト)のいずれか。'ccitt'は、バイナリイメージにのみ有効です。

87

'Description'

任意の文字列 IMFINFO が出力する ImageDescription フィールドに書き出します。

'Resolution'

出力ファイルの中の XResolution と YResolution タグに対して使用するスカラ値。デフォ

ルト値は 72 です。

'WriteMode'

'overwrite' (デフォルト)、または、'append'のいずれかを使用

PNG 固有のパラメータ

-----------------------

'Author' 文字列

'Description' 文字列

>> help image

IMAGE イメージの表示

IMAGE(C)は、行列 C をイメージとして表示します。C の各要素は、イメージ内の patch の

カラーを指定します。Cは、M行 N列または MxNx3 の行列で、double,uint8 または uint16

のデータを含んでいます。Cが 2次元の M行 N列の行列のとき、Cの要素は、カラーを指定

するために、カレントの COLORMAP のインデックスとして使用されます。イメージオブジェ

クトの CDataMapping プロパティの値は、カラーマップの要素を選択する方法を指定します。

CDataMapping が'direct'(デフォルト)の場合、Cの値はカラーマップのインデックスとし

て取り扱われます(double なら 1 ベース、uint8 または uint16 ならば 0 ベース)。

CDataMapping が'scaled'の場合、C値は、最初にデータ CLim に従ってスケーリングされ、

それらの結果カラーマップのインデックスとして取り扱います。C が 3 次元の MxNx3 行の

とき、C(:,:,1)の要素は赤の強度、C(:,:,2)の要素は緑の強度、C(:,:,3)要素は青の強度

として解釈され、image の CDataMapping プロパティは無視されます。double を含む行列に

対して、カラーの強度は[0.0、1.0]の範囲です。uint8 または uint16 を含む行列に対して、

カラーの強度は[0、255]の範囲です。

IMAGE(C)は、要素 C(1,1)の中心を軸の(1,1)に設定し、要素(M,N)の中心を軸の(M,N)に設

定して、幅と高さの 1つの単位として、各 patch を描画します。結果として、イメージの

外側の範囲は、軸の[0.5 N+0.5 0.5 M+0.5]になり、各イメージの中心のピクセルは、1と

Mまたは Nの間の範囲の整数で表された座標に設定されます。

IMAGE(X,Y,C)は、Xと Yがベクトルのとき、C(1,1)と C(M,N)のピクセルの中心の位置を指

定します。要素 C(1,1)は、(X(1)、Y(1))を中心とし、要素 C(M,N)は(X(end)、Y(end))を中

心とし、C の残りの要素の中心のピクセルは、これらの 2 点の間に等間隔に設定されるの

で、patch は、すべて同じ幅と高さになります。

IMAGE は、IMAGE オブジェクトのハンドル番号を出力します。

C または X,Y,C の 3 要素の後に、イメージのプロパティを指定するために、パラメータと

88

値の組を続けることができます。C または X,Y,C の 3 要素を省略して、パラメータと値の

組合わせを使ってすべてのプロパティを指定できます。

C、または、X,Y,C を使って呼び出されるとき、IMAGE はイメージを囲むように軸の範囲を

設定し、axes の Ydir プロパティを'reverse'に、axes の View プロパティを[0 90]に設定

します。

イメージオブジェクトは、axes の[0 90]以外の角度 Vでは描画されません。イメージを回

転することによって同様の効果を得るには、テキストマッピングと共に SURF を使うか、ま

たは PCOLOR を使ってください。Hがイメージのハンドル番号のとき、イメージオブジェク

トのプロパティや、カレントの値のリストを見るためには、GET(H)を実行してください。

イメージオブジェクトのプロパティや有効なプロパティ値のリストを見るためには、

SET(H)を実行してください。

参考:IMAGESC, COLORMAP, PCOLOR, SURF, IMREAD, IMWRITE.

Image 関数では,jpeg は次の例のようにちゃんと表示されますが,gif や tif などはディ

スプレイイメージをことなっています.Image proccessing toolbox では,imshow 関数に

よりディスプレイイメージを表示できます.これがない場合には,colormap()関数により

表示形式を変えます.

>> Agif=imread('barfy1.gif','gif');

>> image(Agif)

なお,画像データは文献19)を使用しています.左が通常の画像ビューアで表示した本

当のディスプレイイメージで,右はなにも指定せずに image 関数で表示した場合です.

colormap()関数を指定して image 関数を実行すると,つぎのようになります.いくつか例

をあげます.

>>colormap(gray);image(Agif);

>>colormap(hsv);image(Agif);

>>colormap(hot);image(Agif);

>>colormap(gray(2^8));image(Agif);

89

>> help colormap

COLORMAP カラールックアップテーブル

COLORMAP(MAP)は、カレントの figure のカラーマップを MAP に設定します。

COLORMAP('default')は、カレントの figure のカラーマップを、ルートのデフォルトの設

定である JET に設定します。

MAP = COLORMAP は、カレントのカラーマップを取得します。カラーマップの値は、0から

1 の間の数値です。カラーマップ行列は、任意の行数をもつことができますが、列は 3 列

でなければなりません。各行は、1番目の要素が赤の強度を指定し、2番目の要素が緑、3

番目の要素が青を指定する色として解釈されます。色の強度は、0.0 から 1.0 の区間で指

定されます。たとえば、[0 0 0]は黒、[1 1 1]は白、[1 0 0]は純粋な赤、[.5 .5 .5]はグ

レイ、[127/255 1 212/255]はアクアマリンです。擬似カラーを使うグラフィックスオブジ

ェクト -- SURFACE と PATCH オブジェクト、これらは関数 MESH、SURF、PCOLOR によって作

成され、行列の値が[Cmin、Cmax]の範囲であるカラー行列 Cを、範囲[1、m]のインデック

ス Kを要素とする配列に写像します。Cmin と Cmax の値は、min(min(C))と max(max(C))、

または、CAXIS で指定した値のどちらかです。写像は、Cmin をインデックス 1に、Cmax を

インデックス mに線形に写像します。インデックスは、各行列の要素に関連するカラーを

90

決定するために、カラーマップで使用されます。詳細は、CAXIS を参照してください。

HELP GRAPH3D とタイプすると、種々の使用可能なカラーマップの内容を見ることができま

す。COLORMAP は、カレントの figure の Colormap プロパティを設定する M-ファイルです。

参考:HSV, CAXIS, SPINMAP, BRIGHTEN, RGBPLOT, FIGURE.

カラーマップの違いは,デモファイル¥matlabR12¥toolbox¥matlab¥demos¥imagedemo.m を

実行して見てください.

コンボリューション処理した画像を文献19)の例題を参考に作ってみました.

% gif ファイルの平均化フィルタ処理

clear

Agif=imread('barfy1.gif','gif');

Adbl=double(Agif);

rcA=size(Adbl);

h=[1 1 1 1]/4;

for i=1:rcA(2)

Bdbl(:,i)=conv(h,Adbl(:,i)); %縦方向 4点平均化処理

end

colormap(gray);image(Bdbl);

pause

rcB=size(Bdbl);

for i=1:rcB(1)

Cdbl(i,:)=conv(h,Bdbl(i,:)); %横方向 4点平均化処理

end

colormap(gray);image(Cdbl);

pause

rcC=size(Cdbl);

h=[0 0 0 0 0 0 -1 0 0 0 0 0 0 0 1];

for i=1:rcC(2)

Edbl(:,i)=conv(h,Cdbl(:,i));

end

colormap(gray);image(Edbl);

pause

%最大値が 255 になるように正規化し,8ビット型に変換

Fdbl=Adbl*100;

dmax=max(max(Fdbl));

Gdbl=uint8(Fdbl/dmax*255);

colormap(gray);image(Gdbl);

91

それぞれの画像出力はつぎのようになりました.

92

3.5 例題3:画像データのアナログフィルタ処理および逆フィルタによる復元処理

jpg ファイルを読み込んで,m_pic2.mat ファイルに保存し,さらに SIMULINK で From

Workspace で用いるデータ Amat を生成する Mファイルはつぎのようになります.

% 画像の読み込み,表示,保存

filename = 'm_pic2.jpg'; %読み込もうとするファイル名

A = imread(filename,'jpeg') ; %

size(A) % 画像サイズの確認

%imshow(A);

subplot(2,1,1);image(A);

pause

save m_pic2.mat A

clear

load m_pic2.mat

A1=A(:,:,1);

subplot(2,1,2);image(A1);

nrc=size(A1);

% convert from matrix to vector

A1d=double(A1); %通常の数値データへの変換

Avec=reshape(A1d,nrc(1)*nrc(2),1);

%サンプリング間隔 stime

stime=0.1;

Aind=0:stime:(nrc(1)*nrc(2)-1)*stime;

Amat=[Aind' Avec];

% use Amat as "From Workspace"

93

1 次のアナログ低域通過フィルタにより処理したデータを filtim2,逆フィルタにより復元

したデータを filtim3 に構造体の形で保存する SIMULINK 構成図はつぎのようになります.

94

filtim2,および filtim3 を表示させる Mファイルはつぎのようになります.

%画像復元

% 1) execute save_jpg2mat.m

% 2) simulate imcont_filt.mdl

% 3) execute this m file

Arcv2=reshape(filtim2.signals.values,nrc(1),nrc(2));

%最大値が 255 になるように正規化し,8ビット型に変換

dmax2=max(max(Arcv2));

Aim2=uint8(Arcv2/dmax2*255);

subplot(2,1,1);image(Aim2);

Arcv3=reshape(filtim3.signals.values,nrc(1),nrc(2));

Aim3=uint8(Arcv3/dmax2*255);

subplot(2,1,2);image(Aim3);

95

3.5 例題3:倒立振子応答シミュレーション

倒立振子とコントローラのパラメータを与える Mファイルの例をあげます.コントローラ

の種類により,この Mファイルを変えます.

%Inverted pendulum

% Higashi's B thesis

% ver.1 2/20/00

% ver.2 2/21/00

% ver.3 2/21/00 14:00PM

% ver.3-2 8/27/00 Add the LQ regulator

%Plant parameters Adtechs Inc.'s Inverted Pendulum

M=0.64;

m=0.045;

g=0.98;

a=0.98;

J=4.71e-4;

c=3.58e-4;

F=9.8;

l=0.125;

alpha=F/(M+m);

beta=a/(M+m);

c1=c/(J+m*l*l);

c2=m*l/(J+m*l*l);

%open loop system---(approximatedly linearized system)--

% matrices of second order differential equation

G1=[ M+m m*l

m*l J+m*l*l ];

G2=[F 0

0 c];

G3=[0 0

0 -m*g*l];

G4=[a

0];

G0i=inv(G1);%inverse matrix of G1

GC1=[ M+m 0

m*l J+m*l*l];

GC1i=inv(GC1);

96

% matrices of state space equation

A = [ zeros(2) eye(2)

-GC1i*G3 -GC1i*G2]; % A-matrix of open loop system

B = [ zeros(2,1)

GC1i*G4];% B-matrix of open loop system

%-----------------------------------

%parameters of controller

%-----------------------------------

% (1) pole place method for designing the parameters of controller

%closed-loop system------(Saeki's controller)----

% K = PLACE(A,B,P) computes a state-feedback matrix K such that

% the eigenvalues of A-B*K are those specified in vector P.

% No eigenvalue should have a multiplicity greater than the

% number of inputs.

p=[-1;-2;-3;-4];%closed loop poles

KKs=-place(A,B,p); %feedback gain for (A+B*KKs)

%KKs=[141.4 173.8 87.5 26.3];% Ohyama's LQ controller

ACs= A+B*KKs;

disp('closed loop ploles of linearized system with state feedback')

eig(ACs) %eigenvalues of ACs

% convert the parameter to Saeki's gain k1,k2,k3 and k4

k3 = -KKs(1)

k1 = beta*KKs(2)

k4 = -KKs(3)

k2 = beta*KKs(4)

%-----------------------

% (2)LQ method for designing the parameters of controller

% K = LQ gain

%LQR Linear-quadratic regulator design for continuous-time systems.

%

% [K,S,E] = LQR(A,B,Q,R,N) calculates the optimal gain matrix K

% such that the state-feedback law u = -Kx minimizes the cost

% function

%

% J = Integral x'Qx + u'Ru + 2*x'Nu dt

% .

97

% subject to the state dynamics x = Ax + Bu.

%

% The matrix N is set to zero when omitted. Also returned are the

% Riccati equation solution S and the closed-loop eigenvalues E:

% -1

% SA + A'S - (SB+N)R (B'S+N') + Q = 0 , E = EIG(A-B*K) .

%

Q = [100 0 0 0

0 100 0 0

0 0 50 0

0 0 0 50];

R = 10;

[K_LQ,S_LQ,E_LQ] = lqr(A,B,Q,R);

KKs=-K_LQ; %feedback gain for (A+B*KKs)

%KKs=[141.4 173.8 87.5 26.3];% Ohyama's LQ controller

ACs= A+B*KKs;

disp('closed loop ploles of linearized system with LQ regulator')

eig(ACs) %eigenvalues of ACs

% convert the parameter to Saeki's gain k1,k2,k3 and k4

k3 = -KKs(1)

k1 = beta*KKs(2)

k4 = -KKs(3)

k2 = beta*KKs(4)

%k1= g+10;

%k2=-c1/c2+1;

%k3=0.01;

%k4=-9.9;

q=1/beta;

q1=1;

q2=alpha+beta*k4;

q3=k3;

disp('roots of s^2+(alpha+beta*k4)s+beta')

roots([1 alpha+beta*k4 beta])

q2=0

q3=0

98

倒立振子単体の動特性をあらわす SIMULINK 図は,つぎのようになります.

これをサブシステム化したものが以下です(1つのブロックとして表したい部分を選択し

て,編集メニューのサブシステム化を選択します).

ある種のフィードバックシステムを構成した例が,つぎの SIMULINK 図です.

99

パラメータ計算をする Mファイルを動かしたあとで,SIMULINK のメニューでシミュレーシ

ョン--開始でシミュレーションを行います.

100

3.6 例題4:カオス暗号システム

我々が作ったカオス暗号システムの Simulink はつぎのようになっています.詳細は省略し

ます.

Simulink 内の設定変数は,つぎのような M-file で定義されていますので,まず,こちら

の M-file を実行した後に,Simulink のシミュレーションをスタートさせます.

この例で,plain.text を音声データや画像データにして,暗号システムの有効性を具体例

で検証してみましょう.

101

4.MATLAB と DDE

DDE(Dynamic Data Exchange)は Windows 専用の機能であり,動的なクリップボードとみな

せるものです.ここでは,文献14)をもとに,Excel とのデータのやり取りを DDE を使

う例をあげます.MATLAB で使える DDE インターフェイスは,ddeinit,ddeterm,ddeexec,

ddereq,ddepoke,ddeadv,ddeunadv です.それぞれの命令の help 表示はつぎのようになり

ます.

>> help ddeinit

DDEINIT DDE 通信の初期化

DDEINIT は、サービスまたはアプリケーションの名前と、サービスのトピックを表す 2 つ

の引数を必要とします。他の MATLAB DDE 関数で使用するためのチャンネルハンドルを出力

します。

channel = DDEINIT(service,topic)

channel 通信に割り当てられたチャンネル

service 通信のためのサービスまたはアプリケーション名を指定する文字列

topic 通信のためのトピックスを指定する文字列

たとえば、Microsoft Excel のスプレッドシート'forecast,xls'との通信を初期化します。

channel = ddeinit('excel','forecast.xls');

>> help ddeterm

DDETERM DDE 通信の終了

DDETERM は、DDE 通信を確立する DDEINIT から得たチャンネルハンドルを引数として与えま

す。

rc = DDETERM(channel)

rc 返り値: 0 は失敗、1は成功を意味します。

channel DDEINIT からの通信チャンネル

たとえば、つぎのように DDE 通信を終了させます。

rc = ddeterm(channel);

>> help ddeexec

DDEEXEC 実行のための文字列を転送

DDEEXEC は、確立された DDE 通信によって、他のアプリケーションに実行するための文字

列を転送します。文字列は、引数 command として指定します。

rc = DDEEXEC(channel,command,item,timeout)

rc 返り値: 0 は失敗、1は成功を意味します。

channel DDEINIT からの通信チャンネル

command 実行されるコマンドを指定する文字列

item (オプション的に)実行のための DDE アイテムを指定する文字列。この引数は、多

102

くのアプリケーションでは使用されません。アプリケーションでもの引数が必要な場合、

command についての追加情報を与えます。詳細は、サーバドキュメントを参照してくださ

い。

timeout (オプション的に)オペレーションの制限時間を指定するスカラ値。timeout は、

1000 分の 1秒単位で指定します。timeout のデフォルト値は、3秒です。

たとえば、通信に割り当てられたチャンネルを与え、コマンドを Excel に転送します。

rc = ddeexec(channel、'[formula.goto("r1c1")]');

>> help ddereq

DDEREQ アプリケーションからのデータの要求

DDEREQ は、DDE 通信によってサーバアプリケーションからデータを要求します。

DDEREQ は、要求されたデータを含む行列を出力するか、失敗したなら空行列を出力します。

data = DDEREQ(channel,item,format,timeout)

data 要求されたデータを含む行列。失敗の場合は、空行列になります。channel DDEINIT

からの通信チャンネル

item 要求されたデータに対するサーバアプリケーションの DDE アイテム名を指定する

文字列。

format (オプション的に)要求されたデータの書式を指定する 2 要素の配列。1 番目の要

素は、使用する Windows クリップボードの書式を指定します。現在は、CF_TEXT のみサポ

ートされていて、値 1 に対応します。2 番目の要素は、結果の行列タイプを指定する配列

です。有効なタイプは、NUMERIC(デフォルトで、値 0に対応)と、STRING(値 1に相当)です。

デフォルトフォーマットは、[1 0]です。

timeout (オプション的に)オペレーションの制限時間を指定するスカラ値。制限時間は、

1000 分の 1秒単位で指定します。デフォルト値は、3秒です。

たとえば、Excel から、セルの行列を要求します。

mymtx = ddereq(channel, 'r1c1:r10c10');

>> help ddepoke

DDEPOKE アプリケーションにデータを転送

DDEPOKE は、DDE 通信によってアプリケーションにデータを転送します。DDEPOKE は、サー

バアプリケーションにデータを転送する前に、つぎのようにデータ行列をフォーマットし

ます。

* 文字行列は要素毎にキャラクタに変換され、変換後のキャラクタバッファが転送されま

す。

* 数値行列は、列をタブ区切りで、行をキャレッジリターンやラインフィード区切りで転

送されます。スパースではない行列の実数部のみが転送されます。

rc = DDEPOKE(channel,item,data,format,timeout)

rc 返り値: 0 は失敗、1は成功を意味します。

103

channel DDEINIT からの通信チャンネル

item データ転送のためのデータアイテムを指定する文字列。item は、data 引数で、転

送されるデータを含むためのサーバデータ自身です。

data 転送するデータを含んだ行列

format (オプション的に)要求されたデータ形式を指定するスカラ値。データ転送に指定

する Windows クリップボード形式を表します。現在は、CF_TEXT のみサポートしていて、

値 1に対応します。

timeout (オプション的に)オペレーションの制限時間を指定するスカラ値。制限時間は、

1000 分の 1秒単位で指定します。デフォルト値は、3秒です。

たとえば、5行 5列の単位行列を Excel に転送します。

rc = ddepoke(channel,'r1c1:r5c5',eye(5));

>> help ddeadv

DDEADV アドバイサリリンクの設定

DDEADV は、MATLAB とサーバアプリケーションとの間のアドバイザリリンクを設定します

(詳細は、"DDE Advisory Links"の章)。引数 item によって与えられたデータが変更される

と、引数 callback で与えられた文字列が eval 関数に与えられ、実行されます。アドバイ

ザリリンクがホットリンクの場合、DDE は item のデータを反映するためにアップデート行

列 upmtx を修正します。item がデータ値の範囲と一致する場合は、範囲内での値の変更に

よって、コールバックが実行されます。

rc = DDEADV(channel,item,callback,upmtx,format,timeout)

rc 返り値: 0 は失敗、 1 は成功を意味します。

channel DDEINIT からの通信チャンネル

item アドバイザリリンクに対する DDE アイテムの名前を指定する文字列サーバがア

ドバイザリリンクと同期を取るとき、アイテムによって指定されたデータが変更されます。

callback アップデート通知で実行される callback を指定した文字列。サーバでアイテム

が変更されると callback が eval 関数に与えられ、実行されます。

upmtx (オプション的に)アップデート通知で送られたデータを保持している行列の名

前。upmtx が含まれていると、サーバでのアイテムの変更により修正データで upmtx がア

ップデートされます。アップデート行列を指定することによってホットリンクを作成しま

す。uptmx を与えなかったり、空行列として与えるとウォームリンクを作成します。upmtx

がワークスペースに存在する場合は、その内容は上書きされます。upmtx が存在しなけれ

ば、作成されます。

format (オプション)更新で転送されるデータフォーマットを設定する 2要素配列。最初

の要素は、データに対して使用する Windows クリップボードフォーマットを指定し、カレ

ントサポートされているフォーマットは、CF_TEXT のみで、これは値 1 に対応します。2

番目の要素は、合成される行列のタイプを設定するものです。正しい値は、NUMERIC (デフ

104

ォルトで、0の値に対応)と STRING(1 に対応)のどちらかです。デフォルトフォーマット配

列は、[1 0]です。

timeout (オプション)この演算に対する時間制限を設定するスカラです。時間制限は、ミ

リ秒単位で設定します。アドバイザリリンクが、時間制限の範囲外でなされた場合、関数

はエラーになります。時間制限のデフォルト値は 3秒です。

たとえば、Excel のセルの範囲と行列'x'の間のホットリンクを設定します。成功すると、

行列はつぎのように表示されます。

rc = ddeadv(channel, 'r1c1:r5c5', 'disp(x)', 'x');

>> help ddeunadv

DDEUNADV アドバイザリリンクの解除

DDEUNADV は、DDEADV によって確立された MATLAB とサーバアプリケーション間のアドバイ

ザリリンクを解除します。channel,item,format は、リンクを初期化する DDEADV で指定さ

れたものと同じでなければなりません。timeout 引数を指定して、format 引数はデフォル

ト値を用いる場合は、format 引数を空行列として指定しなければなりません。

rc = DDEUNADV(channel,item,format,timeout)

rc 返り値: 0 は失敗、1は成功を意味します。

channel DDEINIT からの通信チャンネル。

item アドバイザリリンクに対する DDE アイテム名を指定する文字列。

format (オプション的に)アドバイザリリンクのためのデータ形式を指定する 2要素の配

列。アドバイザリリンクを設定するための関数 DDEADV で format 引数を指定した場合、

DDEUNADV でも同じ値を指定しなければなりません。配列の形式は、DDEADV を参照のこと。

timeout (オプション的に)オペレーションの制限時間を指定するスカラ値。制限時間は、

1000 分の 1秒単位で指定します。デフォルト値は、3秒です。

たとえば、ddeadv の例題で確立したホットリンクを解除します。

rc = ddeunadv(channel, 'r1c1:r5c5');

format はデフォルト値、timeout は値を指定して、ホットリンクを解除します。

rc = ddeunadv(chan, 'r1c1:r5c5',[],6000);

DDE では,アプリケーション間でデータを動的にやりとりするために,MATLAB と供に,

データをやり取りするアプリケーションも起動しておく必要があります.

MATLAB から Excel ワークシートへ行列を送信する場合

・関数 Mファイル:

function void = mat2xceldde(A)

channel = ddeinit('excel','sheet1');

if channel == 0,

error('error initiating conversation');

105

end

Asize = size(A);

worksheet=sprintf('r1c1:r%dc%d',Asize);

rc = ddepoke(channel,worksheet,A);

if rc == 0,

error('error poking data');

end

ddeterm(channel);

・使用方法:

関数 Mファイルをつぎのように起動します.

>> mat2xceldde([1 0 0;0 1 0;0 0 1])

この結果,Excel のワークシート上のセルに行列データを送信できます.

Excel から MATLAB へデータを取りこむ関数 Mファイル

・関数 Mファイル:

function A = xcel2matdde(row,col)

channel = ddeinit('excel','sheet1');

if channel == 0,

error('error initiating conversation');

end

Asize(2) = col;

Asize(1) = row;

worksheet=sprintf('r1c1:r%dc%d',Asize);

A = ddereq(channel,worksheet);

ddeterm(channel);

106

・使用方法:

さきほど,データ送信した Excel のワークシートでセル A1:C3 のデータを MATLAB に取りこ

んだ場合,つぎのようになります.

>> Z = xcel2matdde(3,3)

Z =

1 0 0

0 1 0

0 0 1

5.Handle Graphics ユーティリティ

そのうち加筆します.

6.GUI 構築ユーティリティ

そのうち加筆します.

7.Real-Time Workshop

8.おわりに

以上,MATLAB/Simulink の使い勝手のよさを説明しましたが,いかがでしたでしょうか.

通常のプログラミング言語で記述するよりも,開発効率が格段によいことがわかると思い

ます.また,MATLAB は日々進化している強力なツールで,理工学の幅広い分野に適用可能

ですので,ぜひマスターしてください.ただし,学生さんは,通常のプログラミング言語

もマスターする必要があります.なぜなら,最初から MATLAB を使うと,プログラミングの

ほんとうの大変さを認識せずに卒業してしまう危険性があるからです.MATLAB 自体は C言

語で書かれていますので,こちらの方も勉強してください. また,情報技術自体も日々進

化を続けていますので,これらの動向にも興味を持ち続けてください.ただ,最後にいい

たいのは,これらはツールであることから,オリジナリティのある理論構築がもっとも大

切なことです.そのためには,数学力がもっとも重要です.しっかりと数学の基礎を勉強

してください.

107

参考文献

1) 各種 MATLAB ユーザーズガイドおよびツールボックスマニュアル(日本語訳,サイバネッ

トシステム社).

2) B. Shahian and M. Hassul : Control System Design Using MATLAB, Prentice Hall,

Inc. (1993).

3) 真田幸俊,サイバネットシステム:MATLAB/Simulink による CDMA, 東京電機大学出版

局 (2000).

4) 井上和夫監修川田昌克,西岡勝博著:MATLAB/Simulink によるわかりやすい制御工学

2001).

5) 足立修一:MATLAB による制御のためのシステム同定,東京電機大学出版局 (1998).

6) 野波健蔵編著:MATLAB による制御理論の基礎,東京電機大学出版局 (1998).

7) 野波健蔵編著:MATLAB による制御系設計,東京電機大学出版局 (1998).

8) K. Ogata : Designing Linear Control Systems with MATLAB, , Prentice Hall, Inc.

(1994).

9) B.C. Kuo and D.C. Hanselman : MATLAB Tools for Control System Analysis and

Design, , Prentice Hall, Inc. (1994).

10) J. Moscinski and Z. Ogonowski : Advanced Control with MATLAB&SIMULINK, Ellis

Horwood Ltd. (1995).

11) W. Gander and J. Hrebicek : Solving Problem in Scientific Computing Using Maple

and MATLAB, Springer (1993).

12) P. Marchand : Graphics and GUIs with MATLAB, Second Edition, CRC Press LLC.

(1999).

13) 小林一行:MATLAB ハンドブック,秀和システム (1998).

14) 小林一行:MATLAB 活用ブック,秀和システム (2001).

15) http://www.ikko.k.hosei.ac.jp/~matlab/mbbok2/coordinate.htm

16) 青木由直:オペレータ法ディジタル信号処理,コロナ社 (1996).

17) http://www.mk.ecei.tohoku.ac.jp/home_page_j.html

18) http://sawori.tp.chiba-u.ac.jp/~haneishi/MATLABdemo/index.htm

19) http://www-isys.eei.metro-u.ac.jp/~sho/pub/ttmatlab/SPSec_4.htm

20) 浜田望:よくわかる信号処理,オーム社 (1995).

21) 小川吉彦:信号処理の基礎,朝倉書店 (1991).

22) 西山 清:最適フィルタリング,培風館 (2001).


Recommended