課題解説(その5)
短時間フーリエ変換
課題35:窓関数の近似の意味
課題36:ハミング窓とハニング窓
課題37:ガボールウェーブレット変換
課題38:多重解像度解析
課題35
窓関数を使って周波数特性の時間的変化を計算する方法(た
とえば、サウンドスペクトログラム)は、あくまでも元の信号の 周
波数特性の時間変化を「近似」したものである。
離散フーリエ変換の意味に基づいて、この「近似」が如何なる
ものであるかを説明しなさい。
課題35
MATLAB演習でも「あいうえお」の
パワースペクトルを出していただい
たが…
「あ」「い」「う」「え」「お」の部分のパ
ワースペクトルを別々に見たい
そこでパワースペクトルの時間変
化を求める
→短時間フーリエ変換

fft
課題35
短時間フーリエ変換
入力:信号
↓
窓関数を用いて信号を切り出す
↓
切り出した信号をフーリエ変換
↓
切り出す部分を変化させて繰り返し
↓
出力:x軸:時間, y軸:周波数, z軸:
パワーのグラフ→スペクトログラム

どのように信号を切り出せばよいか
課題35
• 音声の切り出し→窓関数
• 矩形波で切り出せばいいのか?

切り出す

離散フーリエ変換するために信号を周期化す
ると不連続になる部分が発生する
→異なる周波数成分の発生

周期信号化

不連続!!
課題35
• 境目はできるだけ滑らかにつなげよう
• 切り出す信号の端を0にしてみる

切り出す

より滑らかになった
矩形波を掛けた時に比べて異なる周波数成
分をより抑えることができる

周期信号化
課題35
• 窓関数を用いてもできるだけ周波数特性が変わらないように

したい→元の周波数特性との近似
• 単一周波数ならば周期信号化した信号がまた単一周波数に戻るように

近似しているといえる(もとの信号がサイン波だったら切り出して周期関
数化した信号はサイン波に近似している)
課題35(補足)
• 実験
• 110Hzと220Hzと440Hzの正弦波を適当な割合で足し合わせた信号を
用意 (すべて「ラ」の音)
f=110; %周波数
Fs=16000; %サンプリング周波数
T=1; %音の時間
t=0:1/Fs:T; %x軸
y=0.5*sin(2*pi*f*t)+0.3*sin(4*pi*f*t)+0.2*sin(8*pi*f*t); %音の生成
sound(y,Fs);
課題35(補足)
• 離散フーリエ変換する
• 異なる周波数成分が存在する
理想

fftsize = 8196;
y2=20*log(abs(fft(y,fftsize)));
x2=linspace(0,Fs,fftsize);
plot(x2(1:1000),y2(1:1000));
課題35(補足)
• ハミング窓を掛ける

• 窓関数を掛けたほうがより理

想に近い値が出る
w=hamming(length(y))';
y3=y.*w;
hold on;
y4=20*log(abs(fft(y3,fftsize)));
x4=linspace(0,Fs,fftsize);
plot(x4(1:1000),y4(1:1000),'Color','r');
課題36
1次元の信号処理の場合は、ハミング窓がよく使われるが、 2
次元の画像処理の場合は、ハニング窓の方が望ましい。 この
理由を考えなさい。
課題36
ハニング窓

ハミング窓

ハミングは端っこが
ゼロではない

ハミングの方がサ
イドローブ(真ん中
以外)の値が小さい
課題36
• 2次元の窓関数を作る関数を作成する
function w2=mado2(N,c)

if strcmp(c,'hamming')==1
w=hamming(N);
elseif strcmp(c,'hanning')==1
w=hanning(N);
end
w2=zeros(N,N);
for x=1:N
for y=1:N
r=round(sqrt((x-floor(N/2))^2+(y-floor(N/2))^2))+floor(N/2);
if(r<=N)
w2(x,y)=w(r);
end
end
end
課題36
• 2次元の窓関数を作る関数を作成する
• 自分で関数を定義できる
• 作成したい関数名と同じファイル名でスクリプ

function w2=mado2(N,c)
if strcmp(c,'hamming')==1
w=hamming(N);
elseif strcmp(c,'hanning')==1
w=hanning(N);
end
ここでは窓の大きさNとハミングかハ
ニングかの指定cを入力として2次元
の窓関数w2を出力する

トを作成
• 一行目に
function [ output ]= function_name( input )
と記述すれば,input(入力) を受け取り
output(出力) を返す関数を定義可能
• 複数の入出力が可能
cにhammingという文字列が代入されてい
れば一次元大きさNのハミング窓を,
hanningという文字列が代入されていれば
一次元の大きさNのハニング窓を作成する
課題36
• 2次元の窓関数を作る関数を作成する

w2=zeros(N,N);
for x=1:N
for y=1:N
r=round(sqrt((x-floor(N/2))^2+…
(y-floor(N/2))^2))+floor(N/2);
if(r<=N)
w2(x,y)=w(r);
end
end
end

一次元の窓関数𝑤1(𝑟)から2次元の窓関数
𝑤2(𝑥, 𝑦)を以下の式で作成する
w2 x, y = w1( 𝑥 2 + 𝑦 2 )
ただし窓関数の中央部を原点に移動させる必要
がある
rがNより大きい部分は全て0にする
課題36
y=mado2(200,'hamming');
mesh(y)

y=mado2(200,'hanning');
mesh(y)

ハミング窓

ハニング窓
課題36
• 画像に窓関数を掛けて二次

元離散フーリエ変換をする

理想
sima.jpg
課題36
img=imread('sima.jpg');
img=rgb2gray(img);
w1=mado2(size(img,1),'hanning');
xhan=double(img).*w1;
yhan=fft2(xhan);

詳しい解説は
MATLAB演習の
レンガのパワースペクトル
の部分を参照

[h, w]=size(img);
nw=floor(w/2);
nh=floor(h/2);
imout=[yhan(nh+1:h,nw+1:w),yhan(nh+1:h,1:nw);[yhan(1:nh,nw+1:w),y
han(1:nh,1:nw)]];
imshow(20*log10(abs(imout)),[0 255]);
課題36
結果
何も掛けない

境界成分(縦と横)の影
響が色濃く出てしまって
いる
これ

ハミング窓

放射状に模様ができて
いる

ハニング窓

3つの中では最も理想
に近い
窓関数を掛けた画像の比較
• 窓関数は等方的であるのに対して画像は矩形
• 実際に窓関数を掛けた画像を見てみる

ハミング窓

ここの領域の影響が色濃く出てしまう
放射線状の模様の原因
(音声にはこのような領域がない)

ハニング窓
なだらかに変化させることにより
影響を抑える
課題37
𝜓 𝑡 = 𝑔 𝜎 (𝑡)(𝑒
∞
−∞

𝑗𝜔𝑡

− 𝑒

− 𝜎𝜔 2

)のとき

𝜓 𝑡 𝑑𝑡 = 0を確認しなさい
課題37
• 課題8と同じ





 (t )dt 



1
2

 







e

t2
4 2

e

jt



 e ( ) dt
2

ガウス関数の無限積分





e



 x2

dx  

( t  2 j t )
t

  2
2 2
2
1    4 2


 
 ( )
4

e
dt  e
e
e dt 
2  



1
 2 2
2
 ( ) 2

e
 4    e
 4 2    0
2 
2



2

2


課題37(補足)
分解能とウェーブレット
今度はドレミファソラシドと変化していく音源のスペクトログラム
を求めてみる(またsound(x,fp);で聴いてみよう!!)
fs=16000; %サンプリング周波数
T=2; %音の時間
t=0:1/fs:T; %x軸
f0=130.8;
f1=261.6;
x=0.5*chirp(t,f0,T,f1)+0.25*chirp(t,2*f0,T,2*f1)+...
0.125*chirp(t,4*f0,T,4*f1)+0.125*chirp(t,8*f0,T,8*f1);
x=x.';
課題37(補足)
• スペクトログラムを作成する
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+1,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;
ylim([1 2500]);
課題37(補足)
• 結果

frame

四角い部分が分解能

30

60

120

窓の大きさを変えると周波数分解能が上がり時間分解能が下がる
課題37(補足)
• 一オクターブ
MIDI表記

オクターブ表記

周波数(Hz)

57-68

mid2A-mid2G#

220-440

69-80

hiA-hiG#

440-880

81-92

hihiA-hihiG#

880-1760

93-104

hihihiA-hihihiG#

1760-3520

• 同じピッチの変化でも高周波部と低周波部で大きさが異なる

→高周波部は周波数分解能が低くてもよい
逆に低周波部は周波数分解能が高い方が良い
課題37(補足)
• ウェーブレット変換はそのような点でも有効

• aは周波数の逆数である

aが大きい
周波数小
窓の大きさ大
周波数分解能小

aが小さい
周波数大
窓の大きさ小
周波数分解能大
課題38
𝑑 2 𝑓 𝑡 ∗𝑔 𝑡
𝑑𝑡 2

= 𝑓 𝑡 ∗

𝑑2 𝑔 𝑡
𝑑𝑡 2

が成り立つことを証明し
𝑔 𝑡 =
d2 g t
dt2

1
𝜎 2𝜋

𝑒

𝑡2
− 2
2𝜎

のとき

を計算しなさい
課題38
前半

d 2  f (t ) * g (t )  d 2
 2
2
dt
dt












f ( ) g (t   )d

二次微分を積分の中へ

d2
d 2 g (t )
f ( ) 2 g (t   )d  f (t ) *
dt
dt 2

証明終わり

後半
2
2
 t 2
dg (t )
1
1
 t   2t 2

 2 e
 3
te 2
dt
なので、
 2   
 2

d 2 g (t )
1
 3
dt
 2

2
t  2t22 
1
  2t 2
 2e
t  3
1 e


  2

 t2
  2t22
 2  1e




課題38
ラプラシアンは雑音による変化を検出しやすい
→信号を平滑化してからラプラシアンを計算する必要あり!
• 畳み込みの二次微分は、

フィルタを二次微分してから畳み込んでも結果が同じ

d 2  f (t ) * g (t ) 
d 2 g (t )
 f (t ) *
2
dt
dt 2

2
 t 2
1
g (t ) 
e 2
•
のとき=ガウス関数の畳み込み
 2
=信号の平滑化

観測信号のラプラシアンを計算する際には、

ガウス関数のラプラシアンを畳み込めばよい

ディジタル信号処理 課題解説 その5