matlab - matsuyama lab | matsuyama...
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
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を起動しましょうスタート→すべてのプログラム→専門ソフト
→MATLAB→MATLAB 2013b
デスクトップ環境1. Command Window
2. Workspace
現在定義されている変数の一覧
3. Current Directory
現在いるディレクトリのファイル一覧
4. Command History
過去に使ったコマンドの一覧
11
1
23
4
行列計算
入力行列の定義
直接入力によるデータ定義
>>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個以上にできる!
音声のデータ配列
ディジタル化された音声も行列で表すことができる
サンプル数を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/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関数でグラフを描画
MATLAB 課題1
𝑚 =00
𝑠 =1 02 1
x1 = −10 −9.5 −9 ⋯ 10
x2 = −10 −9.5 −9 ⋯ 10
セミコロン:タテの区切り
コロン:等差数列をつくる
カンマ:ヨコの区切り