matlab - matsuyama lab | matsuyama...

45
MATLAB演習 2014/11/17, ディジタル信号処理 講義サイト: http://vision.kuee.Kyoto-u.ac.jp/lecture/dsp/ 質問等あれば [email protected] まで

Upload: lyduong

Post on 08-Jun-2018

245 views

Category:

Documents


0 download

TRANSCRIPT

MATLAB演習2014/11/17, ディジタル信号処理

講義サイト: http://vision.kuee.Kyoto-u.ac.jp/lecture/dsp/質問等あれば [email protected]まで

ディレクトリ構成について

en_2014

MATLAB

plots.m

lena.bmp

add_values.m

3

M:¥Documents¥MATLAB(ドキュメント→MATLAB)

演習用ファイル群:http://vision.kuee.Kyoto-u.ac.jp/lecture/dsp/tmp/en_2014.zip

講義資料http://vision.kuee.Kyoto-u.ac.jp/lecture/dsp/lecture/dsp/pdf/2014/DSP/dsp2014_TA_03.pdf

本日の内容

MATLAB の基礎

ビジュアライズ色々

2次元FFT ←松山先生の講義後へ

簡単な画像処理と補完

※このスライドはhttp://vision.kuee.kyoto-u.ac.jp/lecture/dsp/からダウンロードできます

6

基本的な流れ

7

データの準備

データの処理

ビジュアライズ

ファイルなどから読み込み,

行列の形で準備

様々な関数を用いて処理

☺MATLABでは行列をダイレクトに扱える

行列→グラフ

MATLAB使用の流れ

MATLAB はビジュアライズにも便利!!

8

>> x = 1:5 % 行ベクトルつくる

x =

1 2 3 4 5

>> y = exp(x) % ベクトルで計算

y =

2.7183 7.3891 20.0855 54.5982 148.4132

>> plot(x, y)

これだと別に大したことなさそうですが...→

MATLAB使用の流れ

MATLAB はビジュアライズにも便利!!

9

% 出力フォントの変更set(0, 'defaultAxesFontName', 'Arial'); set(0, 'defaultTextFontName', 'Times');

% 用紙サイズset(gcf, 'PaperUnits', 'inches');(中略)loglog(1:length(vnum), vnum, ‘.r’); % 両対数プロットhold on; % 重ね描き指定x = 1:length(vnum);y = power(x, gamma)*vnum(1);loglog(x, y, 'b');title(‘Distribution of dim.’); % タイトル設定legend(‘P(k)’, sprintf(‘P_t(k) (gamma = %d)’, gamma)); % 系列名xlabel(‘k’); % x軸のラベルylabel('P(k), P_t(k)');% PDFにファイル名を指定して書き出しprint('-dpdf', sprintf('./output/%s/distDim_%s.pdf', timedir, timedir));

そのまま論文に張れるクオリティ!

MATLAB買うと高いけどね...↑細かな点まですべてコードで指定できるのがうれしい

MATLABのビジュアライズ機能

10

Plot : 2次元のプロット Scatter : 散布図

Hist : ヒストグラム Imshow : 画像表示

mesh

などなど...

とにかく起動してみましょう

MATLABを起動しましょうスタート→すべてのプログラム→専門ソフト

→MATLAB→MATLAB 2013b

デスクトップ環境1. Command Window

2. Workspace

現在定義されている変数の一覧

3. Current Directory

現在いるディレクトリのファイル一覧

4. Command History

過去に使ったコマンドの一覧

11

1

23

4

MATLABの基礎

12

MATrix LABoratoryだけに,行列があたりまえに使えるのが便利!

行列計算

入力行列の定義

直接入力によるデータ定義

>>a=[1 ,2 ,3 ;4 ,5 ,6 ]a=

1 2 34 5 6

1. 要素全体を[ ]で囲む2. 各列をスペースまたはカ

ンマで区切る3. 各行をセミコロンで区切

>>b=[1:10]

1 2 3 4 5 6 7 8 9 10

>>c=[0:2:10]

0 2 4 6 8 10

コロンを用いると等間隔ベクトルを定義できる

行列計算

入力行列の定義

関数によるデータの定義

>>e=zeros(2,3)

0 0 0 0 0 0

>>f=ones(3,4)

1 1 1 11 1 1 11 1 1 1

他にもeye,magic,rand...などいろいろある

分からない関数などがあれば>>help ○○などでいろいろ出てくる

MATLABの基本: 行列とベクトル

MATLABでは行列の扱いが簡単

列ベクトル 行ベクトル

2 3 5 7 11

5

1

3

2

1

>> a = zeros(3, 1) % 零で初期化a =

000

>> size(a)ans = 3 1

>> b = ones(3, 1) % 1で初期化b =

1 1 1>> size(b)ans = 1 3

15

MATLABの基本: 行列とベクトル

MATLABでは行列の扱いが簡単注意! MATLABでは配列要素の番号は1から始まる!

C言語 MATLAB

int a[5] = { 2, 3, 5, 11};

printf(“%d”, a[1]); /* 結果は “3” */

>> a = [2, 3, 5, 7, 11] % 1で初期化b =

2 3 5 7 11>> a(1)ans = 2

16

2 3 5 7 11

0 1 2 3 4

2 3 5 7 11

1 2 3 4 5

MATLABの基本: 行列とベクトル

MATLABでは行列の扱いが簡単

行列(2次元配列) 多次元配列

>> C = [1,2,3,4; 5,6,7,8; 9,10,11,12] C = (省略)>> size(C)ans =

3 4>> length(C) % 最大の次元ans = 4

>> D(:, :, 1) = [1,2,3,4; 5,6,7,8; 9,10,11,12]>> D(:, :, 2) = [1,2,3,4; 5,6,7,8; 9,10,11,12]

>> size(D)ans =

3 4 2

1 2 3 4

5 6 7 8

9 10 11 121番目の次元:

大きさ3

2番目の次元:大きさ4

1 2 3 4

5 6 7 8

9 10 11 12

1 2 3 4

5 6 7 8

9 10 11 12

1st

2nd

3rd

17

行列計算

行列計算

算術演算子を用いる要素ごとの演算をする際は前にドット(.)をつける

和 : + , 差 : - , 積 : * 右除算 : / , 左除算 : ¥べき乗: ^

複素共役転置 : ’ 転置 : . ’

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

1 4 72 5 83 6 9

>>B=A.'B =

1 2 34 5 67 8 9

>>C=A*BC =

66 78 9078 93 10890 108 126

抜き出す,置き換える,結合する

データを抜き出す

>>a=A(2,3)

a=

8

>>b=A(1,1:2)

b=

1 4

>>c=A(2,:)

c=

2 5 8

データの操作

データを置き換える

>>A(1:2,1)=10A=

10 4 710 5 83 6 9

データを結合する( , 横結合 : 縦結合)

>>D=[A,B]D=

10 4 7 1 2 310 5 8 4 5 63 6 9 7 8 9

MATLABの基本: 配列アクセス

20

A( 2:3, 2:3 ) = 5 86 9

部分配列

1 2 のこと

A =1 4 72 5 83 6 9

1

2

3

1 2 3

A(2, 3) = 6

要素

A =1 4 72 5 83 6 9

1

2

3

1 2 3

MATLABの基本: 配列アクセス

21

タテベクトル

ヨコベクトル

A =1 4 72 5 83 6 9

1

2

3

1 2 3

「全て」

>> A(:, 2)

>> A(1:end, 2)

>> A(1:3, 2)

A =1 4 72 5 83 6 9

1

2

3

1 2 3>> A(3, :)

>> A(3, 1:end)

>> A(3, 1:3)

行列計算

行列計算

算術演算子を用いる要素ごとの演算をする際は前にドット(.)をつける

和 : + , 差 : - , 積 : * 右除算 : / , 左除算 : ¥べき乗: ^

複素共役転置 : ’ 転置 : . ’

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

1 4 72 5 83 6 9

>>B=A.'B =

1 2 34 5 67 8 9

>>C=A*BC =

66 78 9078 93 10890 108 126

MATLABの基本: 演算子

演算子,関数は行列を考慮して作られているA * B ---行列として乗算

A .* B ---各要素ごとに乗算そのままだと行列演算

.(ドット)をつけると各要素ごと

A.’ ---転置

1:10 ---コロン演算子:「1から10まで」→ヨコベクトル [1 2 3 4 5 6 7 8 9 10]をつくる

ちなみに 1:2:9 = [1 3 5 7 9]

<,>,<=,>=,==,~= ---関係演算子注意:「一致しない」は”~=”

• C言語での”!=”と異なるので注意

23

関数

組み込み関数

MATLABでは多くの組み込み関数が用意されており,そのほとんどがベクトルや行列のデータに対応している

引数の規則やオプションなどもhelpコマンドでわかる

• sin 正弦

• exp 指数

• log 対数(底がe)

• sqrt 平方根

• min 最小値

• mean 平均値

• sum 要素の和

• etc...

MATLABの基本: 関数

MATLABは関数の使い方が肝心だが,結構ややこしい

便利な関数を早く覚えると苦労が少ない

困ったときは遠慮なく聞いてください

Google先生に聞くのも良し「matlab○○」でググると公式のドキュメントがすぐ出ます

「matlab両対数」:やりたいことで

「matlab scatter」:関数名で

lookfor ‘検索ワード’で関数検索もできる27

グラフの描画

グラフ描画の基本

2次元のグラフはplotで書ける

x=[-5:0.1:5];

y=sin(x);

plot(x,y)

plot関数は第一引数を横軸(ここではx=[−5.0 − 4.9 − 4.8 ⋯4.8 4.9 5.0])

第二引数を縦軸(ここではy=[sin(−5.0) sin(−4.9) sin(−4.8)

⋯sin( 4.8) sin( 4.9) sin( 5.0)])

でグラフを描ける

MATLABの基本: 値の表示

結果表示

29

• 行末のコロンを省いて式をかく

>> a = 2 * pi * 5.5

a =

34.5575

• disp(変数名)

>> a = 53;

>> disp(a)

53

• fprintf関数

>> a = 53;

>> fprintf('a = %d¥n', a);

a = 53

文字列はシングルクォーテーションでかこむ

MATLAB:スクリプトと関数

スクリプト

ひとまとまりの処理を保存して,何度でも実行できる

ワークスペースの変数を共有

部分実行できる

関数

入力->出力という処理を書き残せる

ワークスペースと変数が分離 変数名が衝突しない

しかしデバッグ時には困る

32

%%X = 1:10;Y = sin(X);

plot(X, Y);

%%scatter(X, Y);

%%で区切った部分だけ実行:Ctrl+Enter

function [ out1, out2] = hoge(in1, in2) % 処理………out1 = …;out2 = …;

↓これをファイルhoge.mとして作る

C言語と違って2個以上にできる!

アウトライン

• MATLABの基礎

• コンピュータ上での音声,画像の扱い• 音声• 画像

• 標本化• 離散フーリエ変換• (フィルタリング,畳み込み)

音声のデータ配列

ディジタル化された音声も行列で表すことができる

サンプル数をNとして,モノラルの場合はNx1,ステレオの場合はNx2の行列となる

標本化

それぞれの値が行列の一要素となる

0.0677

0.0775

0.0915

0.1000

-0.1116

0.1263

0.1373

-0.1461

-0.1574

音声の読み込みと再生

読み込みと再生

音声データの読み込み

(カレントディレクトリに音声ファイルを入れておく)

[y,Fs] = wavread(‘en/aiueo.wav’)

y…音声の行列

Fs…サンプリング周波数(1秒間に何個のサンプルをとるか)

音声データの再生

wavplay(y, Fs);

画像処理

画像も音声と同様に行列で表現できる• 音声は一次元,画像は二次元• 白黒画像なら値は輝度値を示す

• 黒:0→→→白:255

231 223 230 215

13 15 20 170

15 10 98 150

20 145 150 147

画像処理

カラー画像なら値は各画素にR,G,Bの3つの成分を持つ

→3次元配列

200 180 165 150

235 195 155 70

220 209 98 50

202 85 69 47

R

G

B

131 35 38 40

113 47 50 17

115 110 9 15

120 14 15 14

113 23 30 25

121 34 30 8

150 110 11 12

126 15 10 17

画像の読み込みと表示

画像の読み込み(音声の時と同様,カレントディレクトリに画像ファイルを入れておく)img=imread(‘en/lena.jpg’);

画像の表示imshow(img);

アウトライン

• MATLABの基礎• コンピュータ上での音声,画像の扱い

• 標本化• 補間

• 離散フーリエ変換• (フィルタリング,畳み込み)

標本化

𝑥𝑠 𝑡 = 𝑥(𝑡)

𝑛=−∞

𝛿(𝑡 − 𝑛𝑇)

とびとびのデルタ関数で表す → 間のデータはどうするのか?

1/サンプリング周波数

標本化

画像における補間

画像を3倍に拡大する→赤い部分の画素値はどうやって決める?

画像における補間

最近傍補間→とりあえず近くの画素値を使う

画像における補間

線形補間,双3次補間→中間値をうまくとっていく

画像の補間

%画像の読み込みimg=imread('en/lenasmall.jpg');

%グレースケール化img=rgb2gray(img);

%最近傍補間imgA=imresize(img,3,'nearest');

%線形補間imgB=imresize(img,3,'bilinear');

%双3次補間imgC=imresize(img,3,'bicubic');

%画像の表示subplot(1,3,1);

imshow(imgA);

subplot(1,3,2);

imshow(imgB);

subplot(1,3,3);

imshow(imgC);

imresize(img,3,'nearest');

画像の行列,拡大率,補間方法を引数に取る

subplot(1,3,1);ならば

1行3列に図を並べる

3つ目の引数が1ならば上図の1の部分に図が入る

1 2 3

画像の補間

最近傍補間 線形補間 双三次補間

グラフの描画

例:課題18

補間関数 𝐶(𝑡)は 𝑆𝑎(𝑡)の近似関数であるが,両者の誤差関数を描きなさい

𝑆𝑎 𝑡 =sin 𝜋𝑡

𝜋𝑡

𝐶 𝑡 =

1 − 2 𝑡 2 + 𝑡 3(0 ≤ |𝑡| ≤ 1)

4 − 8 𝑡 + 5 𝑡 2 − 𝑡 3(1 ≤ |𝑡| ≤ 2)0(2 ≤ |𝑡|)

グラフの描画

例:課題18t= -10:0.1:10; %横軸範囲

%Sa(t)の描画

y1=sinc(t);

subplot(3,1,1);

plot(t,y1);

%C(t)の描画

I = find((0<=abs(t)&abs(t)<1));

J = find(1<=abs(t)&abs(t)<2);

y2=zeros(size(t));

y2(I)=1-2*abs(t(I)).^2+abs(t(I)).^3;

y2(J)=4-8*abs(t(J))+5*abs(t(J)).^2-

abs(t(J)).^3;

subplot(3,1,2);

plot(t,y2);

%誤差関数の描画

y3=abs(y1-y2);

subplot(3,1,3);

plot(t,y3)

STEP1:Xのベクトルを用意

STEP2:それに対応するYのベクトルを用意

STEP3:plot関数でグラフを描画

グラフの描画

例:課題18

𝑆𝑎(𝑡)

𝐶(𝑡)

誤差関数

→配布のソースコードを打ち込んでみましょう

MATLAB 課題1

𝑚 =00

𝑠 =1 02 1

x1 = −10 −9.5 −9 ⋯ 10

x2 = −10 −9.5 −9 ⋯ 10

セミコロン:タテの区切り

コロン:等差数列をつくる

カンマ:ヨコの区切り

実装

各x1, x2の値に対して,

ループ内でベクトルxに値をセット,

Gの値を計算

を繰り返す

←x1の1番目の要素から最後の要素まで

←x2の1番目の要素から最後の要素まで

そのまま

実装

meshgrid関数:

たとえば, 𝑎 = 1 2 3 ,b = 4 5 ,のとき

[A, B] = meshgrid(a, b) とすると

𝐴 =1 2 31 2 3

,B =4 4 45 5 5

を返す

←x1の1番目の要素から最後の要素まで

←x2の1番目の要素から最後の要素まで

元の式を展開した 𝑔 𝑥 =1

2𝜋 Σ −12

exp −12𝑎𝑥12 + 𝑏 + 𝑐 𝑥1𝑥

2 + 𝑑𝑥22

で計算

• 関数に行列で入力

• 一気に計算

が速い!