Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Matlab演習

11,424 views

Published on

京都大学 電気電子工学科3回生配当のディジタル信号処理の講義中に行ったMATLABの演習です

Published in: Education
  • Be the first to comment

Matlab演習

  1. 1. MATLAB演習 • スタート画面から 全てのプログラム→専門ソフト→MATLAB→R2011b→MATLAB R2011b でMATLABを起動してください • ディジタル信号処理のホームページ http://vision.kuee.kyoto-u.ac.jp/lecture/dsp/?menu=top の講義情報からzipファイルをダウンロードしてください • zipファイルを解凍しフォルダごとM:¥Documents¥MATLABに入れてください
  2. 2. アウトライン • MATLABの基礎 • コンピュータ上での音,画像の扱い • 標本化 第4回 • 離散フーリエ変換 第5,6回 • (フィルタリング,畳み込み) 第5回 難しい式がいろいろ出てきたが,MATLABなら関数一つ で実行可能!!
  3. 3. MATLABの起動 起動画面
  4. 4. アウトライン • MATLABの基礎 • • • • • • • • • 行列の計算 データ操作 関数 グラフのプロット スクリプト コンピュータ上での音,画像の扱い 標本化 離散フーリエ変換 (フィルタリング,畳み込み)
  5. 5. 行列計算 復習 A=[1,2;3,4] B=[1,2;3,4] C=A.’*B 入力行列の 定義 行列計算 1.入力行列の定義 2.行列計算
  6. 6. 行列計算 入力行列の定義 直接入力によるデータ定義 >>a=[1 ,2 ,3 ;4 ,5 ,6 ] a= 123 456 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 コロンを用いると等間隔ベ クトルを定義できる
  7. 7. 行列計算 入力行列の定義 関数によるデータの定義 >>e=zeros(2,3) 0 0 0 0 0 0 >>f=ones(3,4) 1111 1111 1111 他にもeye,magic,rand...な どいろいろある 分からない関数などがあれ ば >>help ○○ などでいろいろ出てくる
  8. 8. 行列計算 行列計算 算術演算子を用いる 要素ごとの演算をする際 は前にドット(.)をつける 和:+,差:- ,積:* 右除算 : / , 左除算 : ¥ べき乗: ^ 複素共役転置 : ’ 転置 : . ’ >>A=[1,4,7;2,5,8;3,6,9] A= 1 4 7 2 5 8 3 6 9 >>B=A.' B= 1 2 3 4 5 6 7 8 9 >>C=A*B C= 66 78 90 78 93 108 90 108 126
  9. 9. データの操作 抜き出す,置き換える,結合する データを抜き出す データを置き換える >>a=A(2,3) a= 8 >>A(1:2,1)=10 A= 10 4 7 10 5 8 369 >>b=A(1,1:2) b= 14 データを結合する ( , 横結合 : 縦結合) >>c=A(2,:) c= 258 >>D=[A,B] D= 10 4 7 1 2 3 10 5 8 4 5 6
  10. 10. 関数 組み込み関数 MATLABでは多くの組み込み関数が用意されており,そのほとんどが ベクトルや行列のデータに対応している 引数の規則やオプションなどもhelpコマンドでわかる • sin • exp • log • sqrt • min • mean • sum • etc... 正弦 指数 対数(底がe) 平方根 最小値 平均値 要素の和
  11. 11. グラフの描画 グラフ描画の基本 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)]) でグラフを描ける
  12. 12. スクリプト いちいちコマンドをコマンドウインドウでタイプするのは面倒 処理をひとまとめにしてスクリプトとして記述すれば楽 ホームタブの左上の新規スクリプトを開く(スクリプトはメモ帳など好きな エディタで書いてもよい) コメントアウトは「%」 保存はCtrl + s 実行:コマンドウィンドウでファイル名を呼ぶ(.mは不要) パスを通していない場合、カレントディレクトリにある*.mファイルしか 実行出来ない >> Hogehoge ( Hogehoge.mの例 ) ディレクトリはcdか左のファイルマネージャで移動
  13. 13. グラフの描画 講義の課題18 補間関数𝐶(𝑡)は𝑆𝑎(𝑡)の近似関数である sin 𝜋𝑡 𝑆𝑎 𝑡 = 𝜋𝑡 1 − 2 𝑡 2 + 𝑡 3 (0 ≤ |𝑡| ≤ 1) 𝐶 𝑡 = 4 − 8 𝑡 + 5 𝑡 2 − 𝑡 3 (1 ≤ |𝑡| ≤ 2) 0(2 ≤ |𝑡|) (1)関数𝑆𝑎(𝑡)を描画しなさい (2)関数𝐶(𝑡)を描画しなさい (3)両者の誤差関数を描きなさい
  14. 14. グラフの描画 例:課題18 (1) Sa(t)の描画 (2) C(t)の描画 (3) 誤差関数の 描画 • • • • • • • • • • • • • • • • • • • • • t= -10:0.1:10; y1=sin(pi*t)./(pi*t); subplot(3,1,1); plot(t,y1); 補間関数𝐶(𝑡)は𝑆𝑎(𝑡)の近似関数である sin 𝜋𝑡 𝑆𝑎 𝑡 = 𝜋𝑡 1 − 2 𝑡 2 + 𝑡 3 (0 ≤ |𝑡| ≤ 1) 𝐶 𝑡 = 4 − 8 𝑡 + 5 𝑡 2 − 𝑡 3 (1 ≤ |𝑡| ≤ 2) for ii=1:length(t) 0(2 ≤ |𝑡|) if 0<=abs(t(ii))&&abs(t(ii))<1 (1)関数𝑆𝑎(𝑡)を描画しなさい y2(ii)=1-2*abs(t(ii)).^2+abs(t(ii)).^3; elseif 1<=abs(t(ii))&&abs(t(ii))<2 (2)関数𝐶(𝑡)を描画しなさい y2(ii)=4-8*abs(t(ii))+5*abs(t(ii)).^2-abs(t(ii)).^3; (3)両者の誤差関数を描きなさい else y2(ii)=0; end end subplot(3,1,2); plot(t,y2); y3=abs(y1-y2); subplot(3,1,3); plot(t,y3);
  15. 15. グラフの描画 例:課題18 • • • • • • %横軸のベクトルを用意 t= -10:0.1:10; %_/_/_/_/_/_/_/ %Sa(t)の描画 %_/_/_/_/_/_/_/ • %対応する縦軸の値を用意 • y1=sin(pi*t)./(pi*t); • %subplotは図を並べたいときに使う • subplot(3,1,1); • %グラフのプロット • plot(t,y1); subplot(3,1,1);ならば 3行1列に図を並べる 1 2 3 3つ目の引数が1ならば 上図の1の部分に図が入 る
  16. 16. グラフの描画 例:課題18 • %_/_/_/_/_/_/_/ • %Sa(t)の描画 • %_/_/_/_/_/_/_/ • %tの値についてifで場合分け • for ii=1:length(t) • • • • • • • • • • • • • % 0 ≤ |𝑡| ≤ 1の時 if 0<=abs(t(ii))&&abs(t(ii))<1 y2(ii)=1-2*abs(t(ii)).^2+abs(t(ii)).^3; %1 ≤ |𝑡| ≤ 2 の時 elseif 1<=abs(t(ii))&&abs(t(ii))<2 y2(ii)=4-8*abs(t(ii))+5*abs(t(ii)).^2-abs(t(ii)).^3; %その他 else y2(ii)=0; end end subplot(3,1,2); plot(t,y2); tが1行10列の行列なら length(t)=10である abs(t)でtの絶対値をとる
  17. 17. グラフの描画 例:課題18 t= -10:0.1:10; y1=sinc(t); subplot(3,1,1); plot(t,y1); 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 このようなスクリプトを for文なしで書けることも MATLABの魅力 →計算速度を上げるため には必須
  18. 18. グラフの描画 例:課題18 𝑆𝑎(𝑡) 𝐶(𝑡) 誤差関数
  19. 19. 補足 MATLABの扱うデータ MATLAB(に限らずコンピュータ上)ではデータは全て離散信 号として扱っている • MATLABでフーリエ変換はできない(できるのは離散フーリエ 変換) • plotも離散化したデータをつなげてるだけ x=0:1/50:4; y=cos(n*x); plot(x,y); nを増やしていくと…?
  20. 20. 補足 MATLABの扱うデータ n = 100πの時に直線に戻った 実際にcos(100𝜋 ∗ sin 100𝜋 ∗ 1 50 1 50 ∗ 0) = 1 ,cos 100𝜋 ∗ ∗ 2 = 1… となりすべて1となる →離散特有の性質 1 50 ∗ 1 = 1,
  21. 21. アウトライン • MATLABの基礎 • コンピュータ上での音声,画像の扱い • 音声 • 画像 • 標本化 • 離散フーリエ変換 • (フィルタリング,畳み込み)
  22. 22. 音声のデータ配列 ディジタル化された音声も行列で表 すことができる サンプル数をNとして,モノラルの 場合はNx1,ステレオの場合はNx2 の行列となる 標本化 それぞれの値が行列 の一要素となる 0.0677 0.0775 0.0915 0.1000 -0.1116 0.1263 0.1373 -0.1461 -0.1574 ⋮
  23. 23. 音声の読み込みと再生 読み込みと再生 音声データの読み込み (カレントディレクトリに音声ファイルを入れておく) [y,Fs] = wavread(‘en/aiueo.wav’) y…音声の行列 Fs…サンプリング周波数(1秒間に何個のサンプルをとるか) 音声データの再生 wavplay(y, Fs);
  24. 24. 画像処理 画像も音声と同様に行列で表現できる • 音声は一次元,画像は二次元 • 白黒画像なら値は輝度値を示す • 黒:0→→→白:255 231 223 230 215 13 15 20 170 15 10 98 150 20 145 150 147
  25. 25. 画像処理 200 180 165 150 235 195 155 70 220 209 98 50 202 85 69 47 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 10 17 R カラー画像なら値は各画素に R,G,Bの3つの成分を持つ →3次元配列 G B 15
  26. 26. 画像の読み込みと表示 画像の読み込み (音声の時と同様,カレントディレクトリに画像ファイルを入 れておく) img=imread(‘en/lena.jpg’); 画像の表示 imshow(img);
  27. 27. アウトライン • MATLABの基礎 • コンピュータ上での音声,画像の扱い • 標本化 • 補間 • 離散フーリエ変換 • (フィルタリング,畳み込み)
  28. 28. 標本化 ∞ 𝑥 𝑠 𝑡 = 𝑥(𝑡) 𝛿(𝑡 − 𝑛𝑇) 𝑛=−∞ 標本化 1/サンプリング周波数 とびとびのデルタ関数で表す → 間のデータはどうするのか?
  29. 29. 講義の課題19 ホームページにある音データに対して、1/2の downsamplingおよび2倍のupsamplingを行ったものをそ のまま音として聞くとどのようになるかを調べなさい. (音再生ソフトは再生する音データのサンプリング周波数が 固定あるいは可変になっている.)
  30. 30. 講義の課題19 元波形 アップサンプリング ダウンサンプリング 間に0を補間する 値を間引く
  31. 31. 講義の課題19 clear all close all [in,Fs] = wavread(‘sample.wav’) l_in = length(in); l_out1 = floor(l_in/2); out1 = zeros(1,l_out1); for i= 1:l_out1 out1(i) = in(2*i); end wavwrite(out1,Fs/2,'down.wav'); l_out2 = l_in*2; out2 = zeros(1,l_out2); for i= 1:l_in out2(i*2) = in(i); end h1=fir1(40,(Fs/2)/Fs,'low'); out2=conv(out2,h1); out2=out2(1:l_out2); wavwrite(out2,Fs*2,'up.wav');
  32. 32. 講義の課題19 clear all close all [in,Fs] = wavread(‘sample.wav’) l_in = length(in); %_/_/_/_/_/_/_/_/_/_/ %ダウンサンプリング %_/_/_/_/_/_/_/_/_/_/ %あらかじめ入力の半分の長さを持った行列を作成する(値は全て0) l_out1 = floor(l_in/2); out1 = zeros(1,l_out1); %入力のサンプルを一個おきに出力に代入する for i= 1:l_out1 out1(i) = in(2*i); end %音声の書き出し サンプリング周波数は2分の1 wavwrite(out1,Fs/2,'down.wav');
  33. 33. 講義の課題19 %_/_/_/_/_/_/_/_/_/_/ %アップサンプリング %_/_/_/_/_/_/_/_/_/_/ %あらかじめ入力の2倍の長さを持った行列を作成する(値は全て0) l_out2 = l_in*2; out2 = zeros(1,l_out2); %入力のサンプルを出力に一個おきに代入する for i= 1:l_in out2(i*2) = in(i); end %折り返しノイズを拾ったままであるのでLPFをかける %LPFを用意 h1=fir1(40,(Fs/2)/Fs,'low'); %畳み込み out2=conv(out2,h1); out2=out2(1:l_out2); wavwrite(out2,Fs*2,'up.wav');
  34. 34. 講義の課題19 スペクトログラムの違い 元波形 ダウンサンプリング アップサンプリング
  35. 35. 画像における補間 画像を3倍に拡大する→赤い部分の画素値はどうやって決める?
  36. 36. 画像における補間 最近傍補間→とりあえず近くの画素値を使う
  37. 37. 画像における補間 線形補間,双3次補間→中間値をうまくとっていく
  38. 38. 画像の補間 %画像の読み込み 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列に図を並べる 1 2 3 3つ目の引数が1ならば 上図の1の部分に図が入 る
  39. 39. 画像の補間 最近傍補間 線形補間 双三次補間
  40. 40. アウトライン • MATLABの基礎 • コンピュータ上での音声,画像の扱い • 標本化 • 離散フーリエ変換 • (フィルタリング,畳み込み)
  41. 41. 離散フーリエ変換 時間領域の離散信号を周波数領域の離散スペクトルへ変換す るもの clear all close all [y1,fs]=wavread('en/aiueo.wav'); x1=1:length(y1); x1=x1/fs; subplot(2,1,1); plot(x1,y1); 時間波形 fftsize=2^ceil(log2(length(y1))); y2=20*log10(abs(fft(y1,fftsize))); x2=linspace(0,fs,fftsize); subplot(2,1,2) plot(x2(1:fftsize/2),y2(1:fftsize/2)); パワースペクトル
  42. 42. 離散フーリエ変換 以前までの変数を削除し表示して ある図を消去する スクリプトの前に書いておくと意 図しないバグが生じなくてよい %前処理 clear all close all %音声の読み込み [y1,fs]=wavread('aiueo.wav'); x1=1:length(y1); x1=x1/fs; subplot(2,1,1); plot(x1,y1); y1が1行10列の行列なら length(y1)=10である このままだと横軸が1,2,…のまま なので時間に変換する サンプリング周波数fsは一秒間の サンプル数であるのでnサンプル 目の時間はn/fsである
  43. 43. 離散フーリエ変換 %高速離散フーリエ変換 fftsize=2^ceil(log2(length(y1))); y2=20*log10(abs(fft(y1,fftsize))); x2=linspace(0,fs,fftsize); subplot(2,1,2) plot(x2(1:fftsize/2),y2(1:fftsize/2)); 使える周波数はfs/2である 仮にすべて表示させると左右対称 なグラフが描かれる • fftは高速フーリエ変換 • fftsizeは変換後のサンプル数(下の行 列のN) fftsizeは2の累乗にすると 最も高速になる • 結果は複素数で出てくるので絶対値 をとってパワースペクトルとする • y軸はデシベルで表現することが多 い サンプルを周波数に変換 x2=linspace(0,fs,fftsize); は0からfsまでの値をfftsize分割す るという意味
  44. 44. 離散フーリエ変換 音声を細かく分割→それぞれの領域でフーリエ変換すること により音声の様々な性質がわかる (短時間フーリエ変換の知識が必要) →例:スペクトログラム 周波数(kHz) 強い 弱い
  45. 45. スペクトログラム clear all close all [x,fs]=wavread('aiueo.wav'); frameMs=30; periodMs=10; frame=round(fs*frameMs/1000); period=round(fs*periodMs/1000); fftlength=2^ceil(log2(frame)); range=1:period:(length(x)-frame); spec=zeros(fftlength/2,length(range)); for ii=1:length(range) temp=20*log10(abs(fft(x([1:frame]+(ii-1)*period).*blackman(frame),fftlength))+eps); spec(:,ii)=temp(1:fftlength/2+1); end xx=linspace(0,length(x)/fs,size(spec,2)); yy=linspace(0,fs/2,size(spec,1)); surface(xx,yy,spec);shading flat;
  46. 46. スペクトログラム • frame…切り出すフレームの大きさ. ここでは30ms秒分のフレームを切り 出している clear all close all [x,fs]=wavread('aiueo.wav'); frameMs=30; periodMs=10; frame=round(fs*frameMs/1000); period=round(fs*periodMs/1000); fftlength=2^ceil(log2(frame)); range=1:period:(length(x)-frame); spec=zeros(fftlength/2,length(range)); • period…for文一回あたりに動かすフ レーム.ここでは10ms分のフレーム を動かす • fftlength…変換後のサンプル数.こ の時サンプル数は2の累乗が最も高速 である • range…切り出しの開始フレームのベ クトル • spec…出力されたスペクトログラム を格納するための変数
  47. 47. スペクトログラム • 以上のことを図にすると… for ii=1:length(range) temp=20*log10(abs(fft(x([1:frame]+… (ii-1)*period).*blackman(frame),fftlength))+eps); spec(:,ii)=temp(1:fftlength/2+1); end xx=linspace(0,length(x)/fs,size(spec,2)); yy=linspace(0,fs/2,size(spec,1)); surface(xx,yy,spec);shading flat; … 30ms 10ms 0 10 20… range • 窓関数は今後の講義で(おそらく)出てくる (ここではblackman windowが使われている)
  48. 48. スペクトログラム 調波構造 あ い う え お フォルマント スペクトログラムを見 ると「あいうえお」の どの音が発声されたの かが分かる 基本周波数
  49. 49. 画像のパワースペクトル 講義でもレンガの横方向の線を消去するというものがあった が…
  50. 50. 画像のパワースペクトル clear all close all img = imread('en/renga.bmp'); img=rgb2gray(img); subplot(2,2,1); imshow(img); %2次元フーリエ変換 im=fft2(img); %パワースペクトルの表示 [h, w]=size(im); nw=floor(w/2); nh=floor(h/2); imout=[im(nh+1:h,nw+1:w),im(nh+1:h,1:nw);… [im(1:nh,nw+1:w),im(1:nh,1:nw)]]; subplot(2,2,2); imshow(20*log10(abs(imout)),[0 255]); %縦方向の周波数をゼロに置き換える im_arranged=im; im_arranged(:,w-5:w)=0; im_arranged(:,1:5)=0; im_arranged(1,1)=im(1,1); %置き換えたものを表示 imout2=[im_arranged(nh+1:h,nw+1:w),… im_arranged(nh+1:h,1:nw);… [im_arranged(1:nh,nw+1:w),… im_arranged(1:nh,1:nw)]]; subplot(2,2,4); imshow(20*log10(abs(imout2)),[0 255]); %逆2次元フーリエ変換 img2 = abs(ifft2(im_arranged)); %逆フーリエ変換したものを表示 subplot(2,2,3) imshow(uint8(img2));
  51. 51. 画像のパワースペクトル clear all close all img = imread('en/renga.bmp'); img=rgb2gray(img); subplot(2,2,1); imshow(img); %2次元フーリエ変換 im=fft2(img); %パワースペクトルの表示 [h, w]=size(im); nw=floor(w/2); nh=floor(h/2); imout=[im(nh+1:h,nw+1:w),im(nh+1:h,1:nw);… [im(1:nh,nw+1:w),im(1:nh,1:nw)]]; subplot(2,2,2); imshow(20*log10(abs(imout)),[0 255]); • fft2で二次元高速フーリエ変換 • fftsizeを特に指定しなければ入力 と出力のサンプル数は同じになる • パワースペクトルを見やすいものに するために直流成分を画像中央に 持っていく この時対称性より行列 を図のように入れ替えればよい • つまりできた画像をA,B,C,Dに分割 し[D,C;B,A]のようにする 元画像 入れ替えた画像 A B D C C D B A
  52. 52. 画像のパワースペクトル %縦方向の周波数をゼロに置き換える im_arranged=im; im_arranged(:,w-5:w)=0; im_arranged(:,1:5)=0; im_arranged(1,1)=im(1,1); %置き換えたものを表示 imout2=[im_arranged(nh+1:h,nw+1:w),… im_arranged(nh+1:h,1:nw);… [im_arranged(1:nh,nw+1:w),… im_arranged(1:nh,1:nw)]]; subplot(2,2,4); imshow(20*log10(abs(imout2)),[0 255]); %逆2次元フーリエ変換 img2 = abs(ifft2(im_arranged)); %逆フーリエ変換したものを表示 subplot(2,2,3) imshow(uint8(img2)); • 再び並べ替え前の画像を用いる • ここでは横方向の波を消すためにy軸 に近い点を0とする • ただし直流成分も0にすると画像が全 体的に暗くなるのでその部分は残す • 逆二次元高速フーリエ変換はifft2
  53. 53. パワースペクトル 元画像 パワースペクトル 最終結果 縦方向の周波数をゼロにする
  54. 54. アウトライン • • • • MATLABの基礎 コンピュータ上での音声,画像の扱い 標本化 離散フーリエ変換 • フィルタリング,畳み込み
  55. 55. フィルタリング x[n] …0 1 y[n] 2 … … -1 0 1 … x[n]とy[n]の離散畳み込みz[n]を計算する 𝑧 𝑛 = 𝑥 𝑛 ∗ 𝑦[𝑛]
  56. 56. フィルタリング y[n]をdだけ動かした時𝑧 𝑑 = d=0の時 𝑛=∞ 𝑛=−∞ 𝑥 𝑛 𝑦[𝑛 − 𝑑] 1 x[n] …0 1 2 … 1/3 … -1 0 y[n] 1 … 2/3 z[n] …0 1 2 … 1 1 1 2 𝑧 0 =0× +1× +1× = 3 3 3 3
  57. 57. フィルタリング y[n]をdだけ動かした時𝑧 𝑑 = d=1の時 𝑛=∞ 𝑛=−∞ 𝑥 𝑛 𝑦[𝑛 − 𝑑] 1 x[n] …0 1 2 … 1/3 … -1 0 y[n] 1 … 1 z[n] …0 1 2 … 1 1 1 𝑧 1 =1× +1× +1× =1 3 3 3
  58. 58. フィルタリング y[n]をdだけ動かした時𝑧 𝑑 = d=2の時 𝑛=∞ 𝑛=−∞ 𝑥 𝑛 𝑦[𝑛 − 𝑑] 1 x[n] …0 1 2 … 1/3 … -1 0 y[n] 1 … 1 z[n] …0 1 2 … 1 1 1 𝑧 1 =1× +1× +1× =1 3 3 3
  59. 59. フィルタリング 1 x[n] …0 1 2 … 1/3 … -1 0 y[n] 1 … 1 z[n] …0 1 2 … x[n]にy[n]を畳み込むことによって0と1の境界部分が滑らかに変化するようになる
  60. 60. ローパスフィルタ 𝑧 𝑛 = 𝑥 𝑛 ∗ 𝑦 𝑛 ⇔ 𝑍 𝑘 = 𝑋 𝑘 𝑌[𝑘] × = 周波数領域では畳み込みは1対1で掛け合わす
  61. 61. ローパスフィルタ • clear all • xx=linspace(0,fs/1000,length(x)); • close all • • • plot(xx(1:fftlength),in(1:fftlength),'b','linewidth',2); • [x,fs] = audioread('akstn.wav'); • hold on; • fftlength=length(x)/2; • plot(xx(1:fftlength),out1(1:fftlength),'g','linewidth',2); • filterSize=40; • plot(xx(1:fftlength),out2(1:fftlength),'r','linewidth',2); • in=20*log10(abs(fft(x))); • • h1=fir1(filterSize,500/(fs/2),'low'); • y1=conv(x,h1); • y1=y1(1:length(x)); • out1=20*log10(abs(fft(y1))); •
  62. 62. ローパスフィルタ • clear all • close all • • [x,fs] wavread('aiueo.wav'); • fftlength=length(x)/2; • filterSize=40; • in=20*log10(abs(fft(x))); • • h1=fir1(filterSize,500/(fs/2),'low'); • y1=conv(x,h1); • y1=y1(1:length(x)); • out1=20*log10(abs(fft(y1))); • • fir1でフィルタ作成 一つ目の引数にフィルタサイズ(40く らい) 二つ目の引数にカットオフ周波数 ここで設定する周波数は(カットオフ周 波数)/(ナイキスト周波数)であるこ とに注意(ナイキスト周波数はサンプリ ング周波数の2分の1) 三つ目の引数にフィルター タイプ ここでハイパスやローパスを決める • convで畳み込み
  63. 63. ローパスフィルタ • xx=linspace(0,fs/1000,length(x)); • • plot(xx(1:fftlength),in(1:fftlength),'b','linewidth',2); • hold on; • plot(xx(1:fftlength),out1(1:fftlength),'g','linewidth',2); • plot(xx(1:fftlength),out2(1:fftlength),'r','linewidth',2); • plotの後に設定を追加する ことで色を付けたり実線を 点線にしたりすることがで きる 詳しくはhelpコマ ンドなどで • 一つ目のplotの後にhold on と打つことによりもと もと書いてあったグラフに 上書きできる
  64. 64. ローパスフィルタ
  65. 65. フィルタリング ∗ 1 9 1 9 1 9 1 9 1 9 1 9 1 9 1 9 1 9 ここを変えることにより 様々な処理ができる =
  66. 66. 平滑化フィルタ clear all close all im=imread('lena.jpg'); im= rgb2gray(im); subplot(1,2,1); imshow(im); %前処理 %画像の読み込み %グレ-スケール化 %元画像の表示 im=double(im); %uint8→double型へ f=[1,1,1;1,1,1;1,1,1]/9; %フィルタの作成 imout=filter2(f,im,'same');%元画像とフィルタの畳み込み imout=uint8(imout); %double→uint型へ subplot(1,2,2); imshow(imout); %平滑化した画像の表示
  67. 67. フィルタの中身を変えると…? 平滑化フィルタ 1 9 1 9 1 9 1 9 1 9 1 9 1 9 1 9 1 9 ソーベルフィルタ (エッジ抽出) ラプラシアンフィルタ (エッジ強調) 1 0 −1 −1 -1 −1 2 0 −2 −1 9 −1 1 0 −1 −1 −1 −1
  68. 68. メディアンフィルタ n×nマスの中で中間の濃度値を出力 10 34 78 10 34 78 13 99 89 13 36 89 45 36 16 45 36 16 5番目の数値をとる 10,13,16,34,36,45,78,89,99
  69. 69. メディアンフィルタ エッジは保存したまま平滑化できる 2 5 200 178 2 5 200 178 4 2 189 211 4 2 189 211 4 8 196 190 4 8 196 190 3 9 203 216 3 9 203 216 2 5 200 178 2 5 200 178 2 5 200 178 2 5 200 178 4 68 189 211 4 5 189 211 4 2 129 211 4 2 189 211 4 8 196 190 4 8 196 190 4 8 196 190 4 8 196 190 3 9 203 216 3 9 203 216 3 9 203 216 3 9 203 216 平滑化フィルタ
  70. 70. メディアンフィルタ 平滑化フィルタと違いエッジが残る 元画像 平滑化フィルタ メディアンフィルタ
  71. 71. メディアンフィルタ 孤立点ノイズを消去できる 182 175 200 178 194 2 189 211 204 8 196 190 173 189 203 216 182 画素値の小さい部分 に引っ張られる 175 200 178 182 175 200 178 194 150 189 211 194 189 189 211 204 8 196 190 204 8 196 190 173 189 203 216 173 189 203 216 画素値の小さい部分 に影響しない
  72. 72. メディアンフィルタ ノイズ除去 im=imread('lena.jpg'); im=rgb2gray(im); subplot(1,2,1); imshow(im); 元画像 imout=medfilt2(im,[5,5]); subplot(1,2,2); imshow(imout); メディアンフィルタ
  73. 73. まとめ • MATLABの基礎 • 講義でやった部分の実装 講義で出てくる難しい話は基本MATLABの関数を用 いれば簡単に書ける 今回話せなかったことやこれから出てくる内容はホー ムページを活用して何とかします… (課題の回答はtwitterでこっそりあげてるよ)

×