matlab演習#2 - matsuyama lab | matsuyama...
TRANSCRIPT
MATLAB演習#22015/01/22, ディジタル信号処理
講義サイト: http://vision.kuee.Kyoto-u.ac.jp/lecture/dsp/質問等あれば [email protected]まで
ディレクトリ構成について
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
本日の内容
MATLABでのディジタルフィルタ設計
フィルタを掛けてみる
左右の位相差と聞こえ方
※このスライドは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→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
グラフの描画
例:課題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でのディジタルフィルタ
MATLABのSignal Processing Toolboxディジタル信号処理の便利な関数郡
今回はできるだけ自前の実装でかく
86
𝐻 𝑧 = 𝑛=0𝑁 𝑏𝑛𝑧
−𝑛
𝑚=0𝑀 𝑎𝑚𝑧
−𝑚
MATLABでのディジタルフィルタ表現
ヨコベクトルa(分母の多項式係数)
ヨコベクトルb(分子の多項式係数)
基本的な流れ
87
フィルタの作成: 手入力 fir1関数 窓関数法による設計
評価: 周波数特性 音声に適用して聞いてみる
(後述)b = fir1(次数, 閾値, 種類);a = 1;
b = [ 1 2 3];a = [4 5 6];
※音声ファイルを開く:[データ, サンプリング周波数] = audioread(ファイル名);音声ファイルを書き出す:audiowrite(ファイル名, データ, サンプリング周波数);
出力 = filter(b, a, 入力);
1.移動平均フィルタ
データの平滑化に用いられる「移動平均」
88
ℎ 𝑛 =1
5, 𝑛 = 0, 1, … 4
0, 𝑜𝑡ℎ𝑒𝑟𝑤𝑖𝑠𝑒
ℎ 𝑧 =
𝑘=0
41
5𝑧−𝑘
→ ma.mを開いて実行してみましょう!
2.FIRフィルタでのLPF/HPF
FIRフィルタ→直線位相を実現可能
89
2.窓関数法によるLPF
90