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

MATLAB演習#2 - Matsuyama Lab | Matsuyama Labvision.kuee.kyoto-u.ac.jp/lecture/dsp/pdf/2014/DSP/dsp...本日の内容 MATLABでのディジタルフィルタ設計 フィルタを掛けてみる

Embed Size (px)

Citation preview

Page 1: MATLAB演習#2 - Matsuyama Lab | Matsuyama Labvision.kuee.kyoto-u.ac.jp/lecture/dsp/pdf/2014/DSP/dsp...本日の内容 MATLABでのディジタルフィルタ設計 フィルタを掛けてみる

MATLAB演習#22015/01/22, ディジタル信号処理

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

Page 2: MATLAB演習#2 - Matsuyama Lab | Matsuyama Labvision.kuee.kyoto-u.ac.jp/lecture/dsp/pdf/2014/DSP/dsp...本日の内容 MATLABでのディジタルフィルタ設計 フィルタを掛けてみる

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

en2

MATLAB

~~~.m

~~.m

~~.m

3

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

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

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

Page 3: MATLAB演習#2 - Matsuyama Lab | Matsuyama Labvision.kuee.kyoto-u.ac.jp/lecture/dsp/pdf/2014/DSP/dsp...本日の内容 MATLABでのディジタルフィルタ設計 フィルタを掛けてみる

本日の内容

MATLABでのディジタルフィルタ設計

フィルタを掛けてみる

左右の位相差と聞こえ方

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

6

Page 4: MATLAB演習#2 - Matsuyama Lab | Matsuyama Labvision.kuee.kyoto-u.ac.jp/lecture/dsp/pdf/2014/DSP/dsp...本日の内容 MATLABでのディジタルフィルタ設計 フィルタを掛けてみる

基本的な流れ

7

データの準備

データの処理

ビジュアライズ

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

行列の形で準備

様々な関数を用いて処理

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

行列→グラフ

Page 5: MATLAB演習#2 - Matsuyama Lab | Matsuyama Labvision.kuee.kyoto-u.ac.jp/lecture/dsp/pdf/2014/DSP/dsp...本日の内容 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)

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

Page 6: MATLAB演習#2 - Matsuyama Lab | Matsuyama Labvision.kuee.kyoto-u.ac.jp/lecture/dsp/pdf/2014/DSP/dsp...本日の内容 MATLABでのディジタルフィルタ設計 フィルタを掛けてみる

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

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

→MATLAB→MATLAB 2013b

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

2. Workspace

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

3. Current Directory

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

4. Command History

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

11

1

23

4

Page 7: MATLAB演習#2 - Matsuyama Lab | Matsuyama Labvision.kuee.kyoto-u.ac.jp/lecture/dsp/pdf/2014/DSP/dsp...本日の内容 MATLABでのディジタルフィルタ設計 フィルタを掛けてみる

MATLABの基礎

12

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

Page 8: MATLAB演習#2 - Matsuyama Lab | Matsuyama Labvision.kuee.kyoto-u.ac.jp/lecture/dsp/pdf/2014/DSP/dsp...本日の内容 MATLABでのディジタルフィルタ設計 フィルタを掛けてみる

行列計算

入力行列の定義

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

>>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

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

Page 9: MATLAB演習#2 - Matsuyama Lab | Matsuyama Labvision.kuee.kyoto-u.ac.jp/lecture/dsp/pdf/2014/DSP/dsp...本日の内容 MATLABでのディジタルフィルタ設計 フィルタを掛けてみる

行列計算

入力行列の定義

関数によるデータの定義

>>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 ○○などでいろいろ出てくる

Page 10: MATLAB演習#2 - Matsuyama Lab | Matsuyama Labvision.kuee.kyoto-u.ac.jp/lecture/dsp/pdf/2014/DSP/dsp...本日の内容 MATLABでのディジタルフィルタ設計 フィルタを掛けてみる

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

Page 11: MATLAB演習#2 - Matsuyama Lab | Matsuyama Labvision.kuee.kyoto-u.ac.jp/lecture/dsp/pdf/2014/DSP/dsp...本日の内容 MATLABでのディジタルフィルタ設計 フィルタを掛けてみる

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

Page 12: MATLAB演習#2 - Matsuyama Lab | Matsuyama Labvision.kuee.kyoto-u.ac.jp/lecture/dsp/pdf/2014/DSP/dsp...本日の内容 MATLABでのディジタルフィルタ設計 フィルタを掛けてみる

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

Page 13: MATLAB演習#2 - Matsuyama Lab | Matsuyama Labvision.kuee.kyoto-u.ac.jp/lecture/dsp/pdf/2014/DSP/dsp...本日の内容 MATLABでのディジタルフィルタ設計 フィルタを掛けてみる

行列計算

行列計算

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

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

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

>>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

Page 14: MATLAB演習#2 - Matsuyama Lab | Matsuyama Labvision.kuee.kyoto-u.ac.jp/lecture/dsp/pdf/2014/DSP/dsp...本日の内容 MATLABでのディジタルフィルタ設計 フィルタを掛けてみる

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

データを抜き出す

>>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

Page 15: MATLAB演習#2 - Matsuyama Lab | Matsuyama Labvision.kuee.kyoto-u.ac.jp/lecture/dsp/pdf/2014/DSP/dsp...本日の内容 MATLABでのディジタルフィルタ設計 フィルタを掛けてみる

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

Page 16: MATLAB演習#2 - Matsuyama Lab | Matsuyama Labvision.kuee.kyoto-u.ac.jp/lecture/dsp/pdf/2014/DSP/dsp...本日の内容 MATLABでのディジタルフィルタ設計 フィルタを掛けてみる

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)

Page 17: MATLAB演習#2 - Matsuyama Lab | Matsuyama Labvision.kuee.kyoto-u.ac.jp/lecture/dsp/pdf/2014/DSP/dsp...本日の内容 MATLABでのディジタルフィルタ設計 フィルタを掛けてみる

行列計算

行列計算

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

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

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

>>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

Page 18: MATLAB演習#2 - Matsuyama Lab | Matsuyama Labvision.kuee.kyoto-u.ac.jp/lecture/dsp/pdf/2014/DSP/dsp...本日の内容 MATLABでのディジタルフィルタ設計 フィルタを掛けてみる

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

Page 19: MATLAB演習#2 - Matsuyama Lab | Matsuyama Labvision.kuee.kyoto-u.ac.jp/lecture/dsp/pdf/2014/DSP/dsp...本日の内容 MATLABでのディジタルフィルタ設計 フィルタを掛けてみる

関数

組み込み関数

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

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

• sin 正弦

• exp 指数

• log 対数(底がe)

• sqrt 平方根

• min 最小値

• mean 平均値

• sum 要素の和

• etc...

Page 20: MATLAB演習#2 - Matsuyama Lab | Matsuyama Labvision.kuee.kyoto-u.ac.jp/lecture/dsp/pdf/2014/DSP/dsp...本日の内容 MATLABでのディジタルフィルタ設計 フィルタを掛けてみる

MATLABの基本: 関数

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

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

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

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

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

「matlab scatter」:関数名で

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

Page 21: MATLAB演習#2 - Matsuyama Lab | Matsuyama Labvision.kuee.kyoto-u.ac.jp/lecture/dsp/pdf/2014/DSP/dsp...本日の内容 MATLABでのディジタルフィルタ設計 フィルタを掛けてみる

グラフの描画

グラフ描画の基本

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)])

でグラフを描ける

Page 22: MATLAB演習#2 - Matsuyama Lab | Matsuyama Labvision.kuee.kyoto-u.ac.jp/lecture/dsp/pdf/2014/DSP/dsp...本日の内容 MATLABでのディジタルフィルタ設計 フィルタを掛けてみる

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

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

Page 23: MATLAB演習#2 - Matsuyama Lab | Matsuyama Labvision.kuee.kyoto-u.ac.jp/lecture/dsp/pdf/2014/DSP/dsp...本日の内容 MATLABでのディジタルフィルタ設計 フィルタを掛けてみる

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個以上にできる!

Page 24: MATLAB演習#2 - Matsuyama Lab | Matsuyama Labvision.kuee.kyoto-u.ac.jp/lecture/dsp/pdf/2014/DSP/dsp...本日の内容 MATLABでのディジタルフィルタ設計 フィルタを掛けてみる

アウトライン

• MATLABの基礎

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

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

Page 25: MATLAB演習#2 - Matsuyama Lab | Matsuyama Labvision.kuee.kyoto-u.ac.jp/lecture/dsp/pdf/2014/DSP/dsp...本日の内容 MATLABでのディジタルフィルタ設計 フィルタを掛けてみる

音声のデータ配列

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

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

標本化

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

0.0677

0.0775

0.0915

0.1000

-0.1116

0.1263

0.1373

-0.1461

-0.1574

Page 26: MATLAB演習#2 - Matsuyama Lab | Matsuyama Labvision.kuee.kyoto-u.ac.jp/lecture/dsp/pdf/2014/DSP/dsp...本日の内容 MATLABでのディジタルフィルタ設計 フィルタを掛けてみる

音声の読み込みと再生

読み込みと再生

音声データの読み込み

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

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

y…音声の行列

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

音声データの再生

wavplay(y, Fs);

Page 27: MATLAB演習#2 - Matsuyama Lab | Matsuyama Labvision.kuee.kyoto-u.ac.jp/lecture/dsp/pdf/2014/DSP/dsp...本日の内容 MATLABでのディジタルフィルタ設計 フィルタを掛けてみる

画像処理

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

• 黒:0→→→白:255

231 223 230 215

13 15 20 170

15 10 98 150

20 145 150 147

Page 28: MATLAB演習#2 - Matsuyama Lab | Matsuyama Labvision.kuee.kyoto-u.ac.jp/lecture/dsp/pdf/2014/DSP/dsp...本日の内容 MATLABでのディジタルフィルタ設計 フィルタを掛けてみる

画像処理

カラー画像なら値は各画素に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

Page 29: MATLAB演習#2 - Matsuyama Lab | Matsuyama Labvision.kuee.kyoto-u.ac.jp/lecture/dsp/pdf/2014/DSP/dsp...本日の内容 MATLABでのディジタルフィルタ設計 フィルタを掛けてみる

グラフの描画

例:課題18

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

𝑆𝑎 𝑡 =sin 𝜋𝑡

𝜋𝑡

𝐶 𝑡 =

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

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

Page 30: MATLAB演習#2 - Matsuyama Lab | Matsuyama Labvision.kuee.kyoto-u.ac.jp/lecture/dsp/pdf/2014/DSP/dsp...本日の内容 MATLABでのディジタルフィルタ設計 フィルタを掛けてみる

グラフの描画

例:課題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関数でグラフを描画

Page 31: MATLAB演習#2 - Matsuyama Lab | Matsuyama Labvision.kuee.kyoto-u.ac.jp/lecture/dsp/pdf/2014/DSP/dsp...本日の内容 MATLABでのディジタルフィルタ設計 フィルタを掛けてみる

グラフの描画

例:課題18

𝑆𝑎(𝑡)

𝐶(𝑡)

誤差関数

Page 32: MATLAB演習#2 - Matsuyama Lab | Matsuyama Labvision.kuee.kyoto-u.ac.jp/lecture/dsp/pdf/2014/DSP/dsp...本日の内容 MATLABでのディジタルフィルタ設計 フィルタを掛けてみる

MATLABでのディジタルフィルタ

MATLABのSignal Processing Toolboxディジタル信号処理の便利な関数郡

今回はできるだけ自前の実装でかく

86

𝐻 𝑧 = 𝑛=0𝑁 𝑏𝑛𝑧

−𝑛

𝑚=0𝑀 𝑎𝑚𝑧

−𝑚

MATLABでのディジタルフィルタ表現

ヨコベクトルa(分母の多項式係数)

ヨコベクトルb(分子の多項式係数)

Page 33: MATLAB演習#2 - Matsuyama Lab | Matsuyama Labvision.kuee.kyoto-u.ac.jp/lecture/dsp/pdf/2014/DSP/dsp...本日の内容 MATLABでのディジタルフィルタ設計 フィルタを掛けてみる

基本的な流れ

87

フィルタの作成: 手入力 fir1関数 窓関数法による設計

評価: 周波数特性 音声に適用して聞いてみる

(後述)b = fir1(次数, 閾値, 種類);a = 1;

b = [ 1 2 3];a = [4 5 6];

※音声ファイルを開く:[データ, サンプリング周波数] = audioread(ファイル名);音声ファイルを書き出す:audiowrite(ファイル名, データ, サンプリング周波数);

出力 = filter(b, a, 入力);

Page 34: MATLAB演習#2 - Matsuyama Lab | Matsuyama Labvision.kuee.kyoto-u.ac.jp/lecture/dsp/pdf/2014/DSP/dsp...本日の内容 MATLABでのディジタルフィルタ設計 フィルタを掛けてみる

1.移動平均フィルタ

データの平滑化に用いられる「移動平均」

88

ℎ 𝑛 =1

5, 𝑛 = 0, 1, … 4

0, 𝑜𝑡ℎ𝑒𝑟𝑤𝑖𝑠𝑒

ℎ 𝑧 =

𝑘=0

41

5𝑧−𝑘

→ ma.mを開いて実行してみましょう!

Page 35: MATLAB演習#2 - Matsuyama Lab | Matsuyama Labvision.kuee.kyoto-u.ac.jp/lecture/dsp/pdf/2014/DSP/dsp...本日の内容 MATLABでのディジタルフィルタ設計 フィルタを掛けてみる

2.FIRフィルタでのLPF/HPF

FIRフィルタ→直線位相を実現可能

89

Page 36: MATLAB演習#2 - Matsuyama Lab | Matsuyama Labvision.kuee.kyoto-u.ac.jp/lecture/dsp/pdf/2014/DSP/dsp...本日の内容 MATLABでのディジタルフィルタ設計 フィルタを掛けてみる

2.窓関数法によるLPF

90