Upload
others
View
3
Download
0
Embed Size (px)
Citation preview
課題 A 信号処理 1. 1次元ディジタル信号処理
課題 A-1用のサポートWebページ :
http://www.sie.ics.saitama-u.ac.jp/seie/
を用意しています.適宜,参考にしてください.
1 1次元ディジタル信号処理
演習の目的— 1次元ディジタル信号処理
本演習では,主に
i. ディジタル信号処理の基本概念の 1つである,ディジタルフィルタを取り上げ,その設計法,および,
実行方法を学びます.
ii. 実際に,計算機シミュレーションによる実験を行うことで,1次元のディジタルフィルタリングについ
て,理解を深めます.
1.1 ディジタルフィルタ
環境の情報をマイクロホンやカメラなどのセンサで取得したとき,それらの情報はアナログ信号に変換され
ます.アナログ信号は,A-D変換を行ったのち,ディジタル処理を施し,D-A変換で,再びアナログ信号に
戻すことにより,高精度に処理されます.ディジタル信号処理とは,通常,その A-D変換から,D-A変換ま
での間の行程を指します(図 1.1).すでに,ディジタルに変換されたデ一タが与えられた,という前提におい
て,データをいかに効果的に,かつ能率的に処理するかが,ディジタル信号処理の課題となります.
ディジタルフィルタは,入力信号の周波数成分に変化を与えることにより,所望とされる処理を実現する回
路です.信号に含まれる雑音成分の除去は,ディジタルフィルタにおける,重要な役割のひとつとなっていま
す.
ディジタルフィルタは,その構成法の違いから,有限長インパルス応答 (FIR : Finite Impulse Response)
フィルタと,無限長インパルス応答 (IIR : Infinite Impulse Response)フィルタに大別されます.それぞれ
以下の特徴があります.
図 1.1 信号をディジタル処理する流れ
課題 A 信号処理 1. 1次元ディジタル信号処理
FIRフィルタ: 常に安定.理想特性に近い周波数特性を実現するためには,回路規模が大きくなる.
IIRフィルタ: 小さい回路規模で良好な特性を得られるが,安定性を保証するための工夫が必要.
今回は FIRフィルタの設計について取り上げます.
1.2 FIRフィルタの設計
FIRフィルタの周波数特性は,図 1.2に示すような,振幅特性と位相特性からなります.
0
1
0 π [rad]
振
幅
(a)振幅特性
-2π
0 0
位
相
π [rad]
(b)位相特性
図 1.2 フィルタの周波数特性
フィルタの伝達関数 : T(z)を,
T(z) =S∑
i=0
hc(i)z−i (1.1)
とします.ここで,Sはフィルタの次数,hc(i)はフィルタの係数,また zは,Z変換における複素数を表しま
す *1.(1.1)式によって,フィルタの伝達関数を表したとき,振幅特性 A(ω),および位相特性 θ(ω)は,それ
ぞれ (ω = 2π f として)
A(ω) =∣∣∣∣T (e jω
)∣∣∣∣ (∵ z = e jω)
(1.2)
θ(ω) = tan−1ℑ[T(e jω)]
ℜ [T (e jω)]tanθ(ω) =
ℑ[T(e jω)]
ℜ [T (e jω)] (1.3)
で与えられます.ここで,(1.2), (1.3) 式の ℜ は,複素数の実部 (Real Part) を,また ℑ は,複素数の虚部(Imaginary Part)を表します.
フィルタの理想特性は,通過域で 1,阻止域で 0 の振幅特性を有します.図 1.3 は,理想ローパスフィル
タの振幅特性を表しています.
FIRフィルタの代表的な設計法は,次に挙げるフーリエ級数展開法です.これにより,FIRフィルタの係数
は,所望特性にあわせて決定されます.
*1 (1.1)式における複素数 zを,z = e jω とした場合が,フーリエ変換の変換式に対応します.
課題 A 信号処理 1. 1次元ディジタル信号処理
T (e )jω
π ω-π -ωc ωc
1
O
図 1.3 カットオフ周波数 ωc の,理想ローパスフィルタの周波数特性
1.2.1 フーリエ級数展開法
1 [Hz] のサンプリング周波数を仮定した場合,通過域のカットオフ周波数を ωc とすると,理想ローパス
フィルタのインパルス応答 h(n)は,
h(n) =1
nπsin (ωcn) (−∞ < n < +∞) (1.4)
で与えられます.したがって,この応答を有限長,すなわち,
n = −N, −(N − 1), . . . ,−1, 0, 1, . . . ,N − 1, N (1.5)
の範囲に切りとることにより,FIRフィルタの係数は求められます.しかし,このままでは,因果性を満たさ
ないために,nの正の方向に Nだけずらして,
hc(n) = h(n −N) (n = 0, 1, 2, . . . , 2N) (1.6)
とし,これを,フィルタ係数として用います.
1.2.2 窓関数
(1.6)式のフィルタ係数からなる,FIRフィルタの周波数特性は,一般に,ギブス現象と呼ばれる現象を含ん
でしまいます.これを緩和するために,しばしば,窓関数が用いられます.
たとえば,次の (1.7)式で表される窓関数は,ハミング窓と呼ばれる窓関数です.
w(n) = 0.54 + 0.46 cos( n
Nπ)
(−N ≤ n ≤ N) (1.7)
この他,ハニング窓 :
w(n) = 0.5 + 0.5 cos( n
Nπ)
(−N ≤ n ≤ N) (1.8)
や,バートレット窓 :
w(n) = 1 − |n|N
(−N ≤ n ≤ N) (1.9)
などといった窓関数もありますが,いずれにしても,因果性を満たすように,
wc(n) = w(n −N) (n = 0, 1, 2, . . . , 2N) (1.10)
課題 A 信号処理 1. 1次元ディジタル信号処理
� �参考� � 因果性信号の因果性とは,信号処理においては,現在,および,現在よりも過去の時点におけるデータ系列しか用いるこ
とができない,という性質のことをいいます.すなわち,現在よりも未来の時点におけるデータ系列は,信号処理
に用いることはできません.
なお,ここでは,
• x(n)が,現在の時刻 : nにおける信号• x(n − 1), x(n − 2), . . . , x(n − k), . . . が,過去の時刻 : n − 1, n − 2, . . . , n − k, . . . における信号• x(n + 1), x(n + 2), . . . , x(n + k), . . . が,未来の時刻 : n + 1, n + 2, . . . , n + k, . . . における信号
に,それぞれ対応しています.
—さて,ここで,因果性の一例として「6時の時報が鳴った場面」を,考えてみましょう.まず,結論から述べてしまいますと,6時になる前に,“6時の時報”の音が,聞こえてしまってはいけないのです.“6時の時報” なる音のデータに対して,何らかのフィルタリングを施したい場合,当然のことながら,“6時の時報”の,音としてのデータをもっていなければなりません.6時 00分になった瞬間から,“6時の時報”の音のデータが,順次 (時間が経つごとに)手に入り,その (現在の)データを用いて,フィルタリングを施すことができます.あるいは,6時 01分の時点において,“6時の時報”のデータは,すでに,我々の手中にありますので,その (過去の)データを用いて,フィルタリングを施すこともできます.しかし,5時 59分の時点においては,“6時の時報”のデータは,まだ,形も影も見当たりません.だからといって,この時点で,我々の手中にないデータを,勝手に
「あることにして」用いる,ということも許されません a.
このように,信号処理の世界では,基本的に,未来のことは,まったくわからない,そのような前提において,種々
の信号を扱っています.したがって,形も影も見当たらない,何がくるのかわからないような (未来の)データを,“先取り”して用いて,フィルタリングを施すことはできないのです.
a ちなみに,未来の信号の値を “予測”する場合はありますが,その場合であっても,予測に用いるデータ系列は,現在,および,現在よりも過去の時点におけるデータ系列に,限られています.
と補正したのち,(1.6)式のフィルタ係数 : hc(n)に掛け合わせることにより,
hcw(n) = wc(n)hc(n) (1.11)
として,フィルタ係数を用います.
■ローパスフィルタの設計
以上の流れにもとづいて設計した,ローパスフィルタの一例を,Program 1.1に示します.
1.2.3 バンドパスフィルタ およびハイパスフィルタの設計
時間信号 : 1(n)のフーリエ変換を,G(e jω)とします.これを,ここでは
G(e jω)= F [1(n)
](1.12)
と表記することにします.
このようなフーリエ変換においては,次の周波数シフトの性質があります.
G(e j(ω−ω0)
)= F
[1(n) · e jω0n
](1.13)
この性質を利用すると,ローパスフィルタの係数 : hLP(n) を,次のように変形することにより,バンドパス
フィルタの係数 : hBP(n)が得られます.
hBP(n) = hLP(n) · e jω0n (1.14)
課題 A 信号処理 1. 1次元ディジタル信号処理
� �参考� � ギブス現象ギブス現象とは,平均収束の一例で,関数の不連続点にあたる部分の付近において,リップルが生じる現象をいい
ます.このことを確認するため,まずは,図 1.4を見てください.
-3 -2 -1 0 1 2 3
-1.5
-1
-0.5
0
0.5
1
1.5
x
f(x)
(a) N = 5の場合
-3 -2 -1 0 1 2 3
-1.5
-1
-0.5
0
0.5
1
1.5
x
f(x)
(b) N = 10の場合
-3 -2 -1 0 1 2 3
-1.5
-1
-0.5
0
0.5
1
1.5
x
f(x)
(c) N = 20の場合
-3 -2 -1 0 1 2 3
-1.5
-1
-0.5
0
0.5
1
1.5
x
f(x)
(d) N = 40の場合
図 1.4 f (x) = 4π
∑Nn=1
sin(2n−1)x2n−1 のグラフ
図 1.4は,フーリエ級数展開法により,方形波が生成されていく様子を,Nの値とともに示したものです.N の値の増加とともに,だんだんと,方形波に近づいていく様子が,見てとれます.それと同時に,不連続点,すなわち,x = 0の近辺における, f (x)の値の振動の様子が,(x ≈ 0以外の,比較的平坦な部分と,相対的に比較して) Nの値とともに,顕著になっています.この「x = 0の近辺における, f (x)の値の振動」のことを,一般にリップルといい,N → +∞のとき,このリップルは,x = 0において, f (0) = ±1から上下に突き出すような,ただ 1本の線分 a となり,その面積,および,面積の 2乗値は,ともに 0になる (平均収束する)ことが知られています.これは,フーリエ級数展開法の特性によるもので,したがって,この方法を用いたフィルタの設計においても,こ
れと同様の現象が確認できます.
a 文献 [6]によれば, f (x)におけるリップルの極限値は,およそ ±(0.09 × 2)となっています.
ただし,ここでの hBP(n)は,一般に,複素数となります.実部のみを取り出せば,任意の中心周波数 : ω0 の,
バンドパスフィルタの係数が得られます.しかし,sin関数と cos関数の足し合わせによって得られる,周波
数シフトの特性は,実部,すなわち,cos関数部のみを取り出すことにより,振幅値が 1/2に減衰してしまう
ため,係数値を,それぞれ 2倍して用いることにより,振幅特性が保持されるという点に,注意する必要があ
ります.
なお,ハイパスフィルタは,上記の周波数シフトにおいて, ω0 = π [rad/s] の場合に相当します.
■バンドパスフィルタおよびハイパスフィルタの設計
以上の流れにもとづいて設計した,バンドパスフィルタ および ハイパスフィルタの一例を,Program 1.2
に示します *2.
1.2.4 フィルタリング
上記の方法により,FIRフィルタの係数が決定されれば,(1.1)式にもとづいて,ディジタルフィルタが構成
されます.そのようなフィルタに,入力信号を与えれば,ディジタルフィルタリングが実行できます.
FIRフィルタによるフィルタリングは,入力信号を x(n),出力信号を y(n)とすると,
y(n) =2N∑i=0
hc(i)x(n − i) (1.15)
*2 なお,ここでは,Program 1.1で設計した,ローパスフィルタを利用しています.
課題 A 信号処理 1. 1次元ディジタル信号処理
Program 1.1 (TestLPF1.m)� �clear all; close all; % 初期化をする
N = 100; % フィルタの次数 (フィルタ長)
omega_c = pi / 4; % カットオフ周波数 (遮断周波数)
n = 1 : 2*N+1; % nの値の範囲を, 正の範囲にシフトする
% -N <= n <= N → 0 <= n+N <= N+N
% → 1 <= n+(N+1) <= 2N+1
f = (0:2*N) .* 2/(2*N+1); % 正規化周波数軸 (0~1)
%%%% 窓関数を用いない ローパスフィルタ %%%%
h_c(n) = (1 ./ (pi .* (n-(N+1)))) .* sin(omega_c .* (n-(N+1)));
% (理想)ローパスフィルタのインパルス応答
% 以下,因果性を満たすため, nを正の方向に (N+1)だけずらす
h_c(N+1) = omega_c / pi; % n = N+1 のところに値がないので,値を入れる
T_c = fft(h_c); % フィルタの周波数特性 (FFT)
A_c = abs(T_c); % 振幅特性 (Amplitude)
P_c = unwrap(atan2(imag(T_c) , real(T_c))); % 位相特性 (Phase)
figure; axis on; % figureで図ウィンドウを表示する
subplot(2,1,1); % subplot(m,n,p)で m行 n列の長方形の面に分割し、
% p番目の面に図を表示する
plot(f, A_c); %
axis([0 1 0 1.5]); % axis([xmin xmax ymin ymax]) で
xlabel(’Normalized Frequency (×π)’); ylabel(’Amplitude’);
title(’Amplitude’); % 図の x 軸と y 軸の表示範囲を設定する
subplot(2,1,2); plot(f, P_c); axis([0 1 -80 2]); title(’Phase’);
xlabel(’Normalized Frequency (×π)’); ylabel(’Phase’);
%%%% 窓関数を用いた ローパスフィルタ %%%%
w(n) = 0.54 + 0.46 .* cos((n-(N+1)).*pi./N); % 窓関数の定義 (ハミング窓の場合)
h_cw = w .* h_c; % 窓関数を掛け合わせたフィルタ係数
T_cw = fft(h_cw); % フィルタの周波数特性 (FFT)
A_cw = abs(T_cw); % 振幅特性 (Amplitude)
P_cw = unwrap(atan2(imag(T_cw) , real(T_cw))); % 位相特性 (Phase)
figure; axis on; % 振幅特性と位相特性を表示
subplot(2,1,1); plot(f, A_cw); axis([0 1 0 1.5]); title(’Amplitude’);
xlabel(’Normalized Frequency (×π)’); ylabel(’Amplitude’);
subplot(2,1,2); plot(f, P_cw); axis([0 1 -90 2]); title(’Phase’);
xlabel(’Normalized Frequency (×π)’); ylabel(’Phase’);� �によって与えられます.この処理は,たたみ込み (Convolution : コンボリューション) と呼ばれています.
このたたみ込みにより,x(n)の周波数成分が加工されて,y(n)には,フィルタの通過域成分のみが含まれるこ
とになります.
たたみ込みは,離散フーリエ変換 (DFT : Discrete Fourier Transform)と,逆離散フーリエ変換 (IDFT :
Inverse DFT)を用いることでも,実行することが可能です.しかし通常,DFT・IDFTは,多くの計算量が必
要とされるため,その高速計算法である,高速フーリエ変換 (FFT : Fast Fourier Transform)と,逆高速フー
リエ変換 (IFFT : Inverse FFT)が用いられます.ここで,FFTを記号 FFT[•]で,また,IFFTを記号 IFFT[•]
課題 A 信号処理 1. 1次元ディジタル信号処理
Program 1.2 (TestBPF1.m)� �TestLPF1; % ローパスフィルタ (Program 1.1)
omega_0 = pi / 2; % バンドパスフィルタの中心周波数
% (pi にセットした場合が,ハイパスフィルタに対応)
h_lp = h_cw; % ローパスフィルタのフィルタ係数
% (Program 1.1 で,ハミング窓を用いた場合)
h_bp(n) = real(h_lp(n) .* exp(1j .* omega_0 .* (n-1)));
% 中心周波数の分だけ,周波数シフト
% このとき,実部 (cos)だけを取り出している
h_bp = 2 .* h_bp; % インパルス応答の値を,2倍にする
T_bp = fft(h_bp); % フィルタの周波数特性 (FFT)
A_bp = abs(T_bp); % 振幅特性 (Amplitude)
P_bp = unwrap(atan2(imag(T_bp) , real(T_bp))); % 位相特性 (Phase)
figure; axis on; % 振幅特性と位相特性を表示
subplot(2,1,1); plot(f, A_bp); axis([0 1 0 1.5]); title(’Amplitude’);
xlabel(’Normalized Frequency (×π)’); ylabel(’Amplitude’);
subplot(2,1,2); plot(f, P_bp); axis([0 1 -170 20]); title(’Phase’);
xlabel(’Normalized Frequency (×π)’); ylabel(’Phase’);� �で表すことにすると,(1.15)式は
X(k) = FFT [x(k)] (k = 0, 1, 2, . . . , 2M − 1) (1.16)
H(k) = FFT [hc(k)] (k = 0, 1, 2, . . . , 2M − 1) (1.17)
y(k) = IFFT [H(k) · X(k)] (k = 0, 1, 2, . . . , 2M − 1) (1.18)
によって計算されます.ここで,Mは,処理するデータの数を表します *3.もし,x(k)と hc(k)の長さが等し
くない場合は,ゼロ値を付け加えることにより対処します.
■異なる周波数成分を含む 信号のフィルタリング
ここで,異なる 2つの周波数成分を含む入力信号 x(n)を,ローパスフィルタによって,実際にフィルタリ
ングした例を,Program 1.3に示します *4.
なお,Program 1.3では,たたみ込み (MATLABの関数 : filter)を利用した,時間領域におけるフィル
タリングを行う手法と,(1.16)~ (1.18)式に示したように,周波数領域における積をとって,フィルタリング
を行う手法を行い,両者の結果を比較しています.
*3 離散フーリエ変換のもつ性質により,周波数領域において,離散信号の線形たたみ込み (Linear Convolution)を行うためには,データ数がMではなく,2Mの FFTが必要となります [5].なお,データ数がMの FFTは,巡回たたみ込み (Circular Convolution)を行っていることに相当します.
*4 なお,ここでも,Program 1.1で設計した,ローパスフィルタを利用しています.
課題 A 信号処理 1. 1次元ディジタル信号処理
演習課題 1
演習課題 1では,MATLABを用いて,計算機シミュレーションを行います.以下の2つの演習課題を行っ
てください.� �必須課題� � (演習 1.1~演習 1.2)
演習 1.1 フーリエ級数展開法によるローパスフィルタの設計
フーリエ級数展開法により,ローパスフィルタを設計してください.このとき,カットオフ周波数 :
ωc,フィルタ係数の数 : 2N + 1(フィルタ次数)の値は任意に設定してください.
また窓関数を1つ選択し,同じカットオフ周波数,同じフィルタ係数の数をもつローパスフィルタを
設計してください.これらのフィルタの周波数特性 (振幅特性・位相特性)をプロットし,結果を比較し
てください.
演習 1.2 複数正弦波のフィルタリング
複数の異なる周波数成分を有する,正弦波からなる信号
x(n) =P∑
i=1
Ai sin(2π fin
)(∵ P ≥ 2) (1.19)
を生成してください.ここで,Ai, fi (i = 1, 2, . . . ,P)は,それぞれ,各正弦波の振幅と,周波数を表し
ています.ただし,周波数 f1 については,フィルタの通過域内になるように設定してください.
次に,(1.19)式で生成した正弦波信号 x(n)に対して,演習 1.1で設計した窓関数なしのローパスフィ
ルタを用いて,フィルタリングを行い,出力信号 y(n) を生成してください.そして,FFT を用いて,
フィルタの入出力における周波数成分を調べ,時間領域におけるフィルタリング結果と比較してくだ
さい.
課題 A 信号処理 1. 1次元ディジタル信号処理
Program 1.3 (TestFilter1.m)� �TestLPF1; % ローパスフィルタ (Program 1.1)
x(n) = 1.0 .* sin(pi/6 .* n) + 0.5 .* sin(pi/2 .* n);
% 合成正弦波信号を生成
y = filter(x, 1, h_cw); % 入力信号 xのフィルタリング → [1]
% 時間領域 における,インパルス応答 hの
% フィルタとの たたみ込み による
% (Program 1.1 で,ハミング窓を用いた場合)
M_x = length(x); M_y = length(y); % 処理するデータ数
T_x = fft(x, 2*M_x); % 入力信号 xの FFT
A_x = abs(T_x); % xの振幅特性 (Amplitude)
P_x = unwrap(atan2(imag(T_x) , real(T_x))); % xの位相特性 (Phase)
T_y = fft(y, 2*M_y); % 出力信号 yの FFT
A_y = abs(T_y); % yの振幅特性 (Amplitude)
P_y = unwrap(atan2(imag(T_y) , real(T_y))); % yの位相特性 (Phase)
yf = ifft(fft(x, 2*M_x) .* fft(h_cw, 2*M_x)); % 入力信号 xのフィルタリング → [2]
% 周波数領域 における 積 による
% (FFTの長さは,x [> h_cw] のほうに合わせる)
yf = real(yf); % FFT → IFFTにおける,虚数成分の誤差を除去
fx = (0:2*M_x-1) .* 2/(2*M_x); % 正規化周波数軸 (0~1) for A_x
fy = (0:2*M_y-1) .* 2/(2*M_y); % 正規化周波数軸 (0~1) for A_y
figure; axis on; % x, yの 振幅特性を表示
subplot(2,1,1); plot(A_x); axis([0 2*N 0 100]); title(’Amplitude (INPUT)’);
xlabel(’Normalized Frequency (×π)’); ylabel(’Amplitude’);
subplot(2,1,2); plot(A_y); axis([0 2*N 0 100]); title(’Amplitude (OUTPUT)’);
xlabel(’Normalized Frequency (×π)’); ylabel(’Amplitude’);
figure; axis on; % x, yの 時間領域における波形を表示 → [1] に対応
subplot(2,1,1); plot(x); axis([0 2*N -2 2]); title(’Time-Domain Wave (INPUT)’);
xlabel(’Time’); ylabel(’Value’);
subplot(2,1,2); plot(y); axis([0 2*N -2 2]); title(’Time-Domain Wave (OUTPUT)’);
xlabel(’Time’); ylabel(’Value’);
figure; axis on; % x, yの 時間領域における波形を表示 → [2] に対応
subplot(2,1,1); plot(x); axis([0 2*N -2 2]); title(’Time-Domain Wave (INPUT)’);
xlabel(’Time’); ylabel(’Value’);
subplot(2,1,2); plot(yf); axis([0 2*N -2 2]); title(’Time-Domain Wave (OUTPUT)’);
xlabel(’Time’); ylabel(’Value’);� �
課題 A 信号処理 1. 1次元ディジタル信号処理
� �参考� � フィルタリングを施した際に生じる,出力信号の遅延について一般に,線形位相性を有するフィルタを用いた場合でも,入力信号にフィルタリングを施した出力信号には,フィ
ルタ長:Nに相当する遅延 (Delay)が生じてしまいます.ここでは,その遅延が生じる理由について説明します.以下,入力信号を x(n),インパルス応答を h(n),出力信号を y(n)とします.まず,フーリエ変換には,双対性と呼ばれる性質があり,以下の関係が成立します a.
y(n) = x(n) ∗ h(n) フーリエ変換−−−−−−−−→ Y(ω) = X(ω) ·H(ω) (1.20)
次に,h(n)について,信号の因果性を満たすため,hc(n) = h(n −N)として,(1.20)式を
yc(n) = x(n) ∗ hc(n) フーリエ変換−−−−−−−−→ YC(ω) = X(ω) ·HC(ω) (1.21)
と書き換えてみます.
ここで,フーリエ変換の時間シフトと呼ばれる性質を利用すると,(1.21)式の hc(n)と HC(ω)の間に,以下の関係が成立します.
hc(n) = h(n −N) フーリエ変換−−−−−−−−→ HC(ω) = H(ω)e− jωN (1.22)
したがって,(1.21), (1.22)式より,
YC(ω) = X(ω) ·H(ω)e− jωN = Y(ω)e− jωN (1.23)
を得ます.
ここで再び,フーリエ変換の時間シフトの性質を利用すると,(1.23)式は
Y(ω)e− jωN 逆フーリエ変換−−−−−−−−−→ y(n −N) (1.24)
となります.
したがって,(1.24)式により,時刻 Nだけ遅延した出力信号:y(n −N)が得られることになります.
a もちろん,(1.20)式について,Y(ω) = X(ω) ·H(ω)逆フーリエ変換−−−−−−−−−−−→ y(n) = x(n) ∗ h(n)もまた成立します.
参考文献
[1] 高橋進一 (著),島村徹也 (著), “一次元ディジタル信号処理の基礎 (電気・電子・情報工学系テキストシリー
ズ)”,培風館, 2001/09 (ISBN : 456303696X).
[2] 中村尚五 (著), “デジタルフィルタビギナーズ”,東京電機大学出版局, 1989/12 (ISBN : 4501313501).
[3] 今井聖 (著), “ディジタル信号処理 (エレクトロニクス選書)”,秋葉出版, 1988/12 (ISBN : 4871840050).
[4] 辻井重男 (著),鎌田一雄 (著), “ディジタル信号処理 (ディジタル信号処理シリーズ)”,昭晃堂, 1990/04 (ISBN
: 4785620064).
[5] 池原 雅章 (著), 島村 徹也 (著), “MATLABマルチメディア信号処理 (上) ディジタル信号処理の基礎”, 培風
館, 2004/01 (ISBN : 4563067350).
[6] 小暮陽三 (著), “なっとくするフーリエ変換 (なっとくシリーズ)”,講談社, 1999/05 (ISBN : 4061545205).
課題 A 信号処理 2. 音声信号処理
2 音声信号処理
演習の目的— 音声信号処理
本演習では,主に
i. 音声の仕組みについて学び,音声のモデル化手法の一つであるソース・フィルタモデルについて学び
ます.
ii. 音声解析手法の一つであるケプストラム分析を学び,この手法を使った音声処理を実行し,理解を深め
ます.
2.1 音声の原理
実際に計算機で音声処理を行うには,音声の仕組みを理解する必要があります.音声が作り出される仕組み
を図 2.1に示します.まず人が発声する際,肺から空気を押し出し,咽喉にある声帯 (2枚の膜)により振動さ
せます.この声帯によって振動した空気 (音)を音源と呼びます.音源の時間波形を見ると,非対称な三角波
が等間隔に並んだ形になります.この音源の音色はブザーにとても似ています.声帯を締めつける強さによっ
て空気が振動する速さが変わり,これにより音源の音高が変化します.次に音源は咽喉や口腔,鼻腔で構成さ
れる声道を通り,最終的に口や鼻から放射されます.放射されるこの音を音声と呼びます.音声の音色は声道
の形状で決定されます.人は声道の形状をコントロールすることで「あ,い,う,え,お」等の音韻 (おんい
ん)を表現します.個人によって声道の形状が異なるため,人は音声の音色からある程度,個人を判別するこ
とができます.逆に,声道の形状が似ている人間同士であれば,個人の音色を模写 (物真似)することも可能で
す.以上をまとめると,音声は音高を決定する音源と音色を決定する声道によって特徴付けられます.
図 2.1 音声の原理
課題 A 信号処理 2. 音声信号処理
2.2 音声のモデル化
音声認識や音声合成など高度な音声処理を実行するには,音声から音源と声道の特性を調べる必要がありま
す.計算機でこの2つを調べるには,まず音声を数学的に表現しなければなりません.ここでは,音声を数理
的にモデル化する方法の1つであるソース・フィルタモデルについて説明します.
2.2.1 ソース・フィルタモデル
ソース・フィルタモデルでは,音源をパルス列,声道を FIRフィルタとみなします.ここで声道を表す FIR
フィルタを声道フィルタと呼びます.音源 s(n)を数式で表すと,
s(n) =K∑
k=1
sin(kω0n) (2.1)
となります.ここで ω0 は基本周波数と呼ばれます.一般に,音高は基本周波数のことを指します.音源は基
本周波数をもつ正弦波と,その整数倍の周波数 (倍音周波数)をもつ正弦波の和で表現されます.上式の K は
足し合わせる正弦波の数を示します.声道フィルタのフィルタ係数を h(n)とすると,音声は,s(n)に h(n)を
畳み込んだ信号として表現されます.すなわち,音声 x(n)は
x(n) = s(n) ⊗ h(n) ⇔ x(n) =L∑
i=0
s(n − i)h(i) (2.2)
と表現されます.ここで Lは h(n)のフィルタ次数です.音声の原理とソース・フィルタモデルを照らし合わ
せたものを図 2.2.1で示します.
�( ) !( )ℎ( )
⊗
図 2.2 ソース・フィルタモデル
課題 A 信号処理 2. 音声信号処理
2.3 音声の解析
音声の音高と声道の形状は,個人によって,そして何を発声しているかによって変わります.ソース・フィ
ルタモデルでも同様に,基本周波数 ω0 と声道フィルタのフィルタ係数 h(n)は個人により,そして発声内容に
より様々に変化します.実際の音声から ω0 と h(n)を正確に推定することは,音声処理において非常に重要な
課題となります.音声を解析するための代表的な手法は,次に挙げるケプストラム分析です.
2.3.1 ケプストラム分析
(1.19) 式で見たように,音声は音源に声道フィルタを畳み込んだ形で表現されます.このとき,x(n)から
s(n)とh(n)を分離することは困難で,これらを時間波形から同時に推定することはできません.そこでまずは
(1.19)式の両辺に離散フーリエ変換を適用して振幅特性を計算します.
|X(k)| = |H(k)||S(k)| (2.3)
この式のように,音声の振幅特性 |X(k)|は,声道フィルタの振幅特性 |H(k)|と音源の振幅特性 |S(k)|の積で表現できます.これを図 2.3.1に模式的に示します.図のように,|X(k)|は基本周波数とその倍音の成分で構成されます.ただしそれぞれの成分の振幅は異なります.一方で |S(k)| は |X(k)| と同じ周波数成分をもちますが,すべての振幅は等しくなります.最後に |H(k)|は緩やかなカーブを描きます.このカーブは |X(k)|の描く包絡線と一致するため,|H(k)|はスペクトル包絡と呼ばれます.
| ! |
"# 2"# 3"# "# 2"# 3"# "# 2"# 3"#
|$ ! | |% ! |
図 2.3 音声の振幅特性と声道フィルタ,音源の振幅特性の関係
次に (2.3)式の両辺に自然対数をとると,
log |X(k)| = log |H(k)| + log |S(k)| (2.4)
と計算できます.これにより,音声の対数振幅スペクトル log |X(k)| は,声道フィルタの対数振幅スペクトル log |H(k)|と音源の対数振幅スペクトル log |S(k)|の和の形で表現できました.最後に (2.4)の両辺を逆離散
フーリエ変換します.
IDFT[log |X(k)|] = IDFT[log |H(k)|] + IDFT[log |S(k)|] (2.5)
ここで左辺の IDFT[log |X(k)|]を x(n)のケプストラムと呼び,ケプストラムを用いて音声を解析することをケ
プストラム分析と呼びます.ここで,ケプストラムの計算を
Cx(l) = IDFT[log |X(k)|], (l = 0, 1, . . . ,M) (2.6)
課題 A 信号処理 2. 音声信号処理
と表現すると,式 (2.5)は,
Cx(l) = Ch(l) + Cs(l), (l = 0, 1, . . . ,M) (2.7)
と書き直すことができます.ここでMは IDFTを行う際の次数であり,ケプストラム次数と呼ばれます.ま
た Ch(l)と Cs(l)はそれぞれ h(n)のケプストラム,s(n)のケプストラムに対応します.
図 2.3.1 にある音声をケプストラム分析した結果を示します.横軸の l は"時間"と同じ尺度を示しますが,
ケプストラムにおいては明確に"時間"と区別するために,横軸の尺度をケフレンシー (quefrency) と呼びま
す.これは周波数 (frequency)に対するアナグラムになっています.
� (!)
!
!MAX!T
�"(!) �#(!)
図 2.4 音声のケプストラム
一般に |H(k)|は,緩やかなカーブを描く=低い周波数成分のみで表現できます.このとき Ch(l)は低ケフレ
ンシー領域にのみ値をもち,高ケフレンシー領域では 0の値をとります.一方で |S(k)|は,急峻なピークをもつパルス列になるため,高い周波数成分で表現されます.このとき Cs(l)は高ケフレンシー領域にのみ値をも
ちます.この特性を利用すると,声道フィルタと音高を容易に解析できます.図 2.3.1のように lT という閾値
を設けて低ケフレンシー領域と高ケフレンシー領域に分割すると,l ≤ lT の領域に Ch(l)が,l > lT の領域に
Cs(l)が現れ,互いを分離することができます.以上により,音声にケプストラム分析を行うことで,声道フィ
ルタと音高を同時に推定することが可能となります.
2.3.2 スペクトル包絡の推定
ここでは声道フィルタの振幅特性であるスペクトル包絡を求める方法を説明します.まずは Cx(l) に対し
て,低ケフレンシー領域のみを抽出して,Ch(l)を得ます.具体的には,以下の矩形窓:
wL(l) =
1 l ≤ lT,1 l ≥M − lT,0 otherwise,
(2.8)
を Cx(l)に掛け合わせて低ケフレンシー領域を抽出します.(2.8)式の第2項は,ケプストラムの折り返し成分
を考慮した場合の低ケフレンシー領域に対応しています.結果として以下の式で Ch(l)を得ることができます.
Ch(l) = wL(l)Cx(l) (2.9)
このように特定のケフレンシー領域のみを取り出す処理は,ケフレンシー領域のフィルタリングに相当し,ケ
プストラム分析においてリフタリング (liftering)と呼ばれます.これは,フィルタリング (filtering)のアナ
課題 A 信号処理 2. 音声信号処理
グラムとなっています.次に,リフタリングによって得た Ch(l)に対して,以下の式でスペクトル包絡 |H(k)|を得ることができます.
|H(k)| = exp(DFT[Ch(l)]
)(2.10)
2.3.3 基本周波数の推定
ケプストラムに対して高ケフレンシー領域を抽出するようにリフタリングすると,基本周波数の推定も可能
になります.まずは以下の矩形窓を用意します.
wH(l) ={
0 l ≤ λ,1 l > λ (2.11)
wH(l)を使って,Cs(l)は以下の式で抽出できます.
Cs(l) = wH(l)Cx(l) (2.12)
そこから以下の式で基本周波数を求めることができます.
ω0 =2π
lmax(2.13)
ここで lmax は,Cs(l)が最大値をとるときの lの値を指します.
2.4 音声の加工
ケプストラム分析を応用すれば,音声の加工も容易に行えます.ここでは音声加工の一つである音声合成技
術について取り上げます.音声合成技術は,読み上げソフトウェアや電子歌声など様々な応用で使われていま
す.以下に最も古典的な音声合成手法であるフォルマント音声合成を紹介します.
2.4.1 フォルマント音声合成
音声の性質は音色を決定するスぺクトル包絡と音高を決定する基本周波数で決まります.これらを適切に設
定することで,任意の音声を合成することが可能です.
人が音声から音韻を認識する際,フォルマントの情報を用いていると言われています.フォルマントとは,
スペクトル包絡の主だったピークのことを指します.一つのスペクトル包絡に複数のフォルマントが存在しま
すので,低い周波数のフォルマントから順に第一フォルマント (F1),第二フォルマント (F2),...のように区別
して呼んでいます.人が母音を弁別する際,第一フォルマント (約 500Hz~1000Hzに発生)と第二フォルマ
ント (約 1500Hz~3000Hzに発生)の情報を利用しています.図 2.5と図 2.6にそれぞれ/a/と/i/におけるフォ
ルマントを示します.これらの図のように,第ーフォルマントと第二フォルマントの値は母音によって異なり
ます.図 2.7は,母音の"あ,い,う,え,お"がそれぞれどのような第一,第二フォルマントをもつかを示し
たグラフです.横軸が第一フォルマントの周波数,縦軸が第二フォルマントの周波数を示しています.図から
わかるように,それぞれの母音は異なる第一,第二フォルマントの分布をもっているので,人間が弁別できま
す.ただここで注目すべき点は,各母音の分布は男女で違いはありつつも,個人に関係なく近い性質をもつと
いう点です.この性質は,音声合成において,第一,第二フォルマントさえ正しく再現できれば,人の声に近
いものを再現できることを意味ています.
課題 A 信号処理 2. 音声信号処理
図 2.5 /a/の振幅特性とスペクトル包絡 図 2.6 /i/の振幅特性とスペクトル包絡
図 2.7 日本人男性・女性
の第1,第2フォルマン
トと母音の関係
母音の音声を合成するには,まず"あ,い,う,え,お"に対応する声道フィルタをスペクトル包絡から予め
設計します.そして音源に対して合成したい母音に対応する声道フィルタを畳み込むことで音声を合成できま
す.畳み込む音源の基本周波数を細かく調整することで,より自然な音声を合成することも可能です.
ただし,音声の性質を決定する要素は,厳密にはスペクトル包絡と基本周波数のみではなく,基本周波数の
時間揺らぎや発話速度,イントネーション,発話の強さ等々,様々存在します.さらにそれらが複雑に関連し
ているため,人の音声と寸分違わない完全な音声合成を実現することは容易ではありません.
演習課題 2
演習課題 2では,MATLABを用いて,計算機シミュレーションを行います.以下の2つの演習課題を行っ
てください.� �必須課題� � (演習 2.1~演習 2.2)
演習 2.1 ケプストラム分析を用いたスペクトル包絡推定
Program 2.1 を参考に,ケプストラム分析によって音声のケプストラムをグラフに出力してくださ
い.音声ファイルはサポートページからダウンロードできます.また,スペクトル包絡を推定し,音声
の振幅スペクトルと比較してください.そして,閾値 lT を変更したときの,推定したスペクトル包絡
の変化を確認してください.
続いて,異なる母音の音声に対してスペクトル包絡を推定し,フォルマントの違いを確認してくださ
い.このとき,閾値 lT は任意の一つの値に固定してください.
課題 A 信号処理 2. 音声信号処理
Program 2.1 (TestCepstrum.m)� �clear all; close all; % 初期化
[x, fs]= audioread(’a_male.wav’); % 音声ファイルの読み込み:[音声, サンプリング周波数]
L = 1024; % 切り出す信号のサンプル数 = ケプストラム次数
StartInd = 5000; % 信号の切り出し位置
x_seg = x(StartInd:StartInd+L-1); % 信号の切り出し
f = (0:L-1) .* 2/L; % 正規化周波数軸 (0~1)
%%% ケプストラム分析 %%%
X = abs(fft(x_seg)); % 振幅特性
logX = log(X); % 対数振幅スペクトル
Cx = ifft(logX); % ケプストラム
figure;
plot(Cx(1:L/2))
axis([1 L/4 -0.4 0.8]); title(’Cepstrum’);
xlabel(’Quefrency’); ylabel(’Cx(l)’);
%%% スペクトル包絡の推定 %%%
% リフタリングによる声道フィルタケプストラムの抽出
l_T = 64; % ケプストラム領域を分ける閾値
wL = zeros(length(Cx),1); % 矩形窓の作成
wL(1:l_T) = 1; % 低ケフレンシー領域だけ抽出するようにする
wL(end-l_T:end) = 1; % 折り返し成分も考慮して抽出する
Ch = wL .* Cx; % リフタリング
% スペクトル包絡の推定
H = exp(real(fft(Ch))); % スペクトル包絡の計算
H = mean(X) .* H; % 振幅の正規化
figure;
plot(f, log10(X)); hold on;
plot(f, log10(H), ’r’, ’Linewidth’, 2); hold off;
xlim([0 1]); title(’Amplitude Characteristics’);
xlabel(’Normalized Frequency (×π)’); ylabel(’Log-Amplitude [dB]’);
legend(’Amplitude’,’Spectral Envelope’)� � 演習 2.2 ケプストラム分析を用いた音声合成
Program 2.2 を参考に,音声合成を実行してください.Program 2.2 にあるように,音声のスペク
トル包絡はあらかじめ用意した音声から取得します.ここで,音源の基本周波数 ω0 は任意に設定して
ください.
次に,合成した音声と元の音声のスペクトルを比較して違いを考察してください.また自然な音声合
成を実現するために必要な要素を検討してください.
課題 A 信号処理 2. 音声信号処理
Program 2.2 (TestSpeechSynthesis.m)� �TestCepstrum
n = 1:length(x); % 信号の長さ分だけのインデックス配列
%%% 音源の生成 %%%
f0 = 110; % 基本周波数 [Hz] (デフォルト:110Hzに設定)
w0 = 2*pi * f0/fs; % 基本周波数 [rad]
K = 50; % 音源に含まれる正弦波の個数
% f0 * K < fs/2 を満たすように K を設定すること.
% 例) (f0=110Hz) * K < (fs=16000)/2 → K < 72.7 → Kは最大で 72
s = zeros(length(x),1); % 音源の作成
for k=1:K
s(n) = s(n) + sin(k*w0.*n)’; % 倍音周波数をもつ正弦波の和を計算
end
%%% 声道フィルタの算出 %%%
h = ifft(H); % スペクトル包絡の IFFT
h = circshift(h, length(h)/2); % 因果性を満たすよう調整
%%% 音声合成 %%%
y = filter(h,1,s); % 音源に声道フィルタを畳み込む
y = y .* 0.5/max(abs(y)); % 振幅の正規化
y_seg = y(StartInd:StartInd+L-1); % 信号の切り出し
figure;
plot(f, log10(abs(fft(y_seg))), ’Linewidth’, 2); hold on; % 合成した音声の振幅特性
plot(f, log10(H), ’r’, ’Linewidth’, 2); hold off;
xlim([0 1]); title(’Amplitude Characteristics’);
xlabel(’Normalized Frequency (×π)’); ylabel(’Log-Amplitude [dB]’);
legend(’Amplitude of Synthesis Speech’,’Spectral Envelope’)
audiowrite(’speech_synthesis.wav’,y,fs); % wavファイルとして出力する� �参考文献
[1] 古井貞熙 (著), “音声・音響工学”,近代科学社, 1992/09 (ISBN : 7649-0196-X).
[2] 森勢将雅 (著),日本音響学会 (編), “音声分析合成”,コロナ社, 2018/08 (ISBN : 978-4-339-01137-1).
[3] 青木直史 (著), “ディジタル・サウンド処理入門”, CQ出版社, 2006/04 (ISBN : 7898-3090-X).
[4] 川村 新 (著), 黒崎 正行 (著), “ディジタル音声&画像の圧縮/伸張/加工技術”, CQ 出版社, 2013/05 (ISBN :
978-4-789-83145-1).
課題 A 信号処理 2 次元ディジタル信号処理
3 2 次元ディジタル信号処理
演習の目的 - 2 次元ディジタル信号処理
本演習では,主に以下の項目について学びます.
i. 二次元信号処理(画像処理)の基礎
ii. 二次元信号のフーリエ変換とスペクトル
iii. 画像のローパスフィルタ,ハイパスフィルタなどの周波数領域における演算
iv. 画像のエッジ抽出やノイズ除去などの画像処理
3.1 準備 ― ディジタル画像に関する基礎事項
3.1.1 ディジタル画像
値が連続的に変化するようなデータを一般にアナログデータと呼ぶのに対し,値として整数値のみが許され
るようなとびとびの値をもつデータをディジタルデータという.特にディジタルデータによって構成された画像を
ここではディジタル画像と呼ぶことにする.
3.1.2 画素
ディジタル画像の構成要素は画素(ピクセル)と呼ばれ,通常はそれら
が 2 次元の格子状に配列されることにより 1 個の画像データが作られて
いる.各画素にはその点の明るさ(輝度値)を表す階調値がデータとして
割り当てられている.これらは画素の値を表していることから画素値と呼
ばれることもある.
本演習では画像中の画素の位置を,画像の左上を原点(0,0)として図
2.1のように座標軸をとり(i, j)と表す.また,画素(i, j)の画素値を f (i, j)と
する.ただし,カラー画像の場合は赤(R),緑(G),青(B)に対してそれ
ぞれの画素値をもっているので,必要な場合はそれらを fR(i, j), fG(i, j),
fB(i, j)として区別する.
3.1.3 解像度
解像度は画像のきめの細かさを表しており単位長さ当り何個の画素によって画像を表示するかによって表
す.通常,長さの単位をインチにとり dpi(dot per inch) という単位を用いる.解像度が大きいほどきめ細かい画
像データであるといえる.
3.1.4 色(階調)の数
ニ値画像: 各画素の値が 0 または 1 の画像.1 画素当り 1 ビットのデータを用いる.
濃淡画像: 単色の画像.モノクロ画像またはグレイスケール画像と呼ばれることもある.1 画素当り n ビットの
データを用いれば階調は 0~2n − 1 までの 2n 段階になる.0~255の値を持つ 8 bit の階調値が
用いられることが多い.
カラー画像: 赤(R),緑(G),青(B)の各色がそれぞれ複数ビットで表された画像.一般に R,G,B の三原
色の明るさを表す 3 個の 8 bit の階調値が用いられることが多い. 8 bit×3(RGB)=24 bit なの
で 24 bitカラーということもある.この場合,合計で 224 ≑ 1677万色の色を表現することができる.
図 3.1 座標系
課題 A 信号処理 2 次元ディジタル信号処理
3.2 カラー画像から濃淡画像への変換
3.2.1 光の波長とカラー画像
一般のディジタルカメラは,1 枚のイメージセンサ
にベイヤー配列という特殊な配置で画素ごとに R, G,
B の色フィルタを取り付けてカラー画像情報を得てお
り,各画素は一色分の輝度情報のみを取得している
にすぎない.カラー画像はこれらの RGBの画素値か
らディジタル的な計算によりつくられている.ディジタ
ルカメラを用いて得られたカラー画像の色は人間の
目で見たときの感覚に対応しており,物理的な意味
での色ではないことに注意してもらいたい.
図 3.2にカラーCCDカメラの分光感度特性を示す.
一般にカラーCCD カメラで取り込まれる色情報は単
一波長の光ではなくある範囲内の波長の光をまとめて取り込んだものに相当する.
3.2.2 カラー画像から濃淡画像への変換
濃淡画像は白黒ディジタルカメラによって直接得ることができる.カラーディジタルカメラによって得られたカラ
ー画像を濃淡画像に変換する方法もある.ここでは一般的な RGB 成分からなるカラーディジタルカメラを用い
る場合について考える.
・カラー画像の RGB 成分から一色のみの成分を取り出して濃淡画像にする方法
カラー画像の画素値 fR(i, j), fG(i, j), fB(i, j)に対して一色分の輝度情報のみを利用することを考える.例えば
R 成分のみを利用する場合,濃淡画像 g(i, j)は g(i, j) = fR(i, j)となる.
・RGB 成分を適当な割合で加算して一つの濃淡画像にする方法
一般に利用されている変換式は次のものである.
),(114.0),(587.0),(299.0),( jifjifjifjig BGR ++= (3.1)
上式の右辺は整数にはならないので整数に変換する必要がある.係数は目的に応じて独自に設定してもよ
い.
3.2.3 濃淡画像から二値画像への変換
濃淡画像を二値画像へ変換することを特に二値化と呼ぶ.簡単な二値化は,閾値 θを決めて階調値がそれ
より小さい場合は 1,大きい場合は 0 とすることにより行われる.
≤
=otherwise
jififjig
0
),(1),(
θ (3.2)
画像の階調値が画像データ中に現れる出現頻度を調べたとき,はっきりした谷が認められる場合はその谷の
値を閾値とすれば良好な二値化を行うことができる.谷がはっきりしない場合は閾値によって結果が大きく変
化してしまうので注意が必要である.
3.3 フィルタリング
画像データ対して一定のルールに従って特定の処理を施す操作のことをフィルタリングという.フィルタリング
に用いるアルゴリズムあるいはそれを具体的に行うためのプログラムのことをフィルタと呼ぶ.入力画像にフィル
タをかけると,線やエッジの強調,雑音の除去,特定パターンの抽出などの処理を行うことができる.フィルタは
線形フィルタと非線形フィルタに分けることができる.ここでは線形フィルタについて取り扱う.
図3.2 DFW-V500(SONY)の分光感度特性[1]
課題 A 信号処理 2 次元ディジタル信号処理
フィルタリングの方法は空間領域で行うフィルタリングと周波数領域で行うフィルタリングに分けられる.画像
(二次元信号)に対する周波数を空間周波数という.ここでは便宜的に周波数と省略して表記するが,時間信
号の周波数とは異なることに留意してもらいたい.次にこれらのフィルタリングの関係について説明する.二つ
の関数 ),(),,( yxhyxg に対し,畳み込み積分(convolution)
dudvvyuxhvugyxhg ∫ ∫∞
∞−
∞
∞−−−= ),(),(),(* (3.3)
を考える.入力画像を ),( yxg ,フィルタ関数を ),( yxh とすると,式(3.3)の畳み込み積分は本質的に空間フィル
タリングと等価であり, ),(* yxhg はフィルタリング結果の画像に対応している.式(3.3)の両辺をフーリエ変換す
ると, ),(),()],([)],([)],(*[ vuHvuGyxhyxgyxhg =ℑℑ=ℑ (3.4)
となる.ただし, ][ℑ はフーリエ変換, )],([),()],,([),( yxhvuHyxgvuG ℑ=ℑ= である.式(3.4)が意味することは
『二つの関数の畳み込み積分をフーリエ変換したものはそれぞれの関数のフーリエ変換の積に等しくなる』とい
うことである.式(3.4)の両辺を逆フーリエ変換して書き換えると,
)],(),([),(* 1 vuHvuGyxhg −ℑ= (3.5)
となる.この式は畳込み積分はフーリエ変換を使って計算することができることを表している.
式(3.3)と式(3.5)がそれぞれ空間領域で行うフィルタリングと周波数領域で行うフィルタリングに対応する.こ
の関係を図示すると図 3.3 のようになる.一見すると畳み込み積分を直接行う式(3.3)のほうが簡単そうに見える.
しかし,式(3.3)には二重積分が含まれており,フィルタ関数のサイズが大きくなると計算時間が急激に増加する
傾向がある.式(3.5)ではフーリエ変換を 2 回,逆フーリエ変換を 1 回行う必要があり複雑な計算に見えるが,フ
ーリエ変換以外の計算は項別の掛算を行っているだけである.現在ではフーリエ変換の計算法として高速フ
ーリエ変換(FFT)アルゴリズムが確立しており,式(3.5)は高速に実行できるようになっている.FFT を用いる畳
み込み積分はフィルタ関数のサイズが大きくなっても計算時間がほとんど変わらないという性質がある.
空間領域と周波数領域との間には双対性があるため,畳み込み積分はどちらの領域でも行うことが可能で
あり,その結果は同じである.一般に,フィルタ関数のサイズが小さいときは空間領域におけるフィルタリング
(式(3.3))が,フィルタサイズが大きくなると周波数領域におけるフィルタリング(式(3.5))が有利になる.また,複
雑なフィルタ処理を行うときはフィルタ関数を柔軟に設計することができる周波数領域におけるフィルタリングの
ほうが使いやすい.どちらの領域で行うかは問題の性質によって決めるとよい.
×
図 3.3 空間フィルタリングと周波数フィルタリングの関係.
g(x,y)
G(u,v)
H(u,v)
G(u,v)H(u,v)
h(x,y) g*h(x,y)
課題 A 信号処理 2 次元ディジタル信号処理
3.4 空間領域におけるフィルタリング(畳み込み積分を直接行うフィルタリング)
ここでは畳み込み積分の離散表記の
∑ ∑−= −=
++=2
1
2
1
),(),(),(m
mm
n
nn
nmhnjmigjiy (3.6)
によって表される線形フィルタついて取り扱う.線形フィルタでは,上式中の m1,
m2, n1, n2 そしてフィルタ係数 h(m, n)の取り方によってフィルタの働きが異なって
くる.h(m, n)は図 3.4のように注目画素(i, j)を網掛けにして表すことにする.フィ
ルタ係数のサイズは 3×3 や 5×5 がよく利用されている.以下に代表的な 3×3
のフィルタ係数を示す.
平均値フィルタ: 平均値フィルタは平滑化フィルタの一種である.画像のもつ高周波成分の除去,ディジタル
化する際に混入する雑音の除去・軽減のために広く利用される.
エッジ強調フィルタ: 画像中の線や輪郭を強調するときに利用される.線形一次微分フィルタはデータの各点
での微分係数を新しい画素値とするフィルタである.水平方向と垂直方向に対するフィルタが
ある.Sobel フィルタは線形一次微分フィルタの一種で注目画素に近い画素の重みを大きくし
てある.ラプラシアンフィルタは水平方向,垂直方向の 2 階微分をそれぞれ
)}1,(),({)},()1,({),(
)},1(),({)},(),1({),(
2
2
2
2
−−−−+≡∂∂
−−−−+≡∂∂
jigjigjigjigjigj
jigjigjigjigjigi
によって定義し, ),(),(),(2
2
2
2
jigj
jigi
jiy∂∂+
∂∂= で得られるフィルタである.
(a) 水平方向
(b) 垂直方向
図 3.6 線形一次微分フィルタのフィルタ係数
図 3.5 平均値フィルタのフィルタ係数
図 3.8 ラプラシアンフィルタのフィルタ係数(a) 水平方向 (b) 垂直方向
図 3.7 Sobel フィルタのフィルタ係数
図 3.4 フィルタ係数
の表記法(8 近傍)
課題 A 信号処理 2 次元ディジタル信号処理
3.5 周波数領域におけるフィルタリング(フーリエ変換を利用するフィルタリング)
3.5.1 二次元フーリエ変換
画像の数学的表現を空間座標の 2つの変数 x, y をもつ関数 g(x, y)とする.位置(x, y)における関数の値はそ
の点での画像の輝度値(強度)を表す.二次元フーリエ変換は次式で定義される.
∫ ∫∞
∞−
∞
∞−+−= dxdyvyuxiyxgvuG )}(2exp{),(),( π (3.7)
ただし 1−=i であり,変数 u と v はそれぞれ x 方向と y 方向の空間周波数,G(u, v)はスペクトルと呼ばれる.
G(0, 0)は g(x, y)の直流(DC)成分と呼ばれる.二次元逆フーリエ変換は次式で与えられる.
∫ ∫∞
∞−
∞
∞−+= dudvvyuxivuGyxg )}(2exp{),(),( π (3.8)
一般に G(u,v)は複素数になるのでフーリエ変換の結果を解析するためには振幅 |),(| vuG と位相 )},(arg{ vuG
の両方で調べる必要がある.
22 )},(Im{)},(Re{|),(| vuGvuGvuG += (3.9)
)},(Re{
)},(Im{tan)},(arg{ 1
vuG
vuGvuG −= (3.10)
ただし )},(Re{ vuG と )},(Im{ vuG はそれぞれ G(u,v)の実部と虚部を表す.スペクトル解析では振幅の 2 乗であ
るパワースペクトル 2|),(| vuG がよく利用される.
コンピュータ上でディジタル画像をフーリエ変換する場合には離散値に対するフーリエ変換である離散フー
リエ変換(DFT)が用いられる.二次元 DFTは,有限領域 10 −≤≤ Mm と 10 −≤≤ Nn でゼロでない離散関数
g(m, n)に対して定義される.2 次元の M ×N の DFT と M ×N の逆 DFT の関係式は次のとおりである.
)2
exp()2
exp(),(),(1
0
1
0 N
nqi
M
mpinmgqpG
M
m
N
n
ππ −−= ∑∑−
=
−
= (3.11)
)2
exp()2
exp(),(),(1
0
1
0 N
nqi
M
mpiqpGnmg
M
p
N
q
ππ∑∑
−
=
−
== (3.12)
G(p, q)は g(m, n)の DFT 係数を表す.DFT の計算では高速フーリエ変換(FFT)アルゴリズムが用いられる.
■MATLAB における二次元 FFT 計算の例
MATLAB には二次元フーリエ変換と二次元逆フーリエ変換を計算する関数 fft2()および ifft2()が用意され
ている.一般に 2 のべき乗のデータ数をもつデータに対して FFT は高速に実行される.MATLAB の fft2(),
ifft2() はデータ数が 2 のべき乗でなくても自動的に FFT を計算してくれるので便利であるが,これを知らずに
使うと意図したものと異なる結果になる場合もあるので注意すること.
二次元 FFT の例: 二値画像をつくり,これを FFT してスペクトルを得る.FFT では周波数軸の原点が左上
隅の位置に現れる.画像のスペクトルを調べるときはゼロ周波数成分を中央位置にすると理解しやすいため
MATLAB では関数 fftshift()が用意されている.FFTの結果に対して fftshift()を使うと左上にある原点を中央に
移動させることができる.一般に画像のスペクトルは低周波数成分が強く,周波数ゼロ付近に大きなピークをも
つ.画像の細部に関係するのは高周波数成分であり,高周波数成分を詳細に調べるためには,スペクトル分
布を立体図や断面図で表示し,対数表示や低周波数成分の打ち切りなどを行い高周波数成分を見やすくす
る必要がある.
課題 A 信号処理 2 次元ディジタル信号処理
サンプルプログラムを次に示す.太字の部分をタイプすれば基本的な処理が実行できる.最初は太字部分
のみをタイプしてプログラムが動くことを確認するとよい.MATLAB ではグラフを描くために様々なオプションが
用意されているので利用してよい.
《補足説明》 ・ clear all; close all; はそれ以前に使った変数やグラフをクリアするために使う. ・ 画像を表示する関数 imshow(値, [下限,上限], オプション) は二次元図示のための MATLAB 組み込み関数である.
値のみで使うと自動的に調整されて表示される.カギカッコのなかに,[下限, 上限]のように値を設定すると,図は指
定した範囲内に合わせて描画される.[ ]のように何も書かないとデータの最小値から最大値の範囲で自動的に図示
される. mesh()は画像を三次元表示するため,plot()は折れ線グラフを描くための MATLAB 組み込み関数である. ・ このスクリプトでは MATLAB 組み込み関数を使っている.コマンドライン上で「> help 関数名」と打ち込めば説明が表
示される. ・ MATLAB はインタープリタ言語なので,よくわからないときは 1行ごとに実行してその結果がどうなるかを確認してみる
とよい.
clear all; close all; % 初期化 「%」以下の文はコメント文 N = 256; % N×Nの配列を設定,要素は全てゼロ g = zeros(N,N); % 半径20の円 % meshgrid() はMALABの組み込み関数 % 「.^ 」は項別の2乗計算でMALAB固有の計算表記法 [p,q]=meshgrid(-128:127,-128:127); g( (p.^2 + q.^2) < 20^2 ) = 1; figure; imshow(g,[]); % 図示 figure; mesh(g); % 2次元FFT ftg = fft2(g); % パワースペクトルを求める ps = abs(ftg).^2; figure; imshow(ps,[]); colormap(jet); % カラーマップを変更する figure; mesh(ps); % 周波数F(0,0) を中心に移動 ftg = fftshift(ftg); % パワースペクトルを求める ps = abs(ftg).^2; figure; imshow(ps,[]); axis on; % 軸を描画する例 figure; mesh(ps); title(' 三次元表示') %タイトルを付ける例 figure; plot(ps(N/2,1:N)); colorbar; % カラーバーを付ける例 figure; imshow(log10(1+ps),[]); % 対数グラフの例
課題 A 信号処理 2 次元ディジタル信号処理
図 3.9 MATLAB における 2 次元 FFT の実行例
課題 A 信号処理 2 次元ディジタル信号処理
3.5.2 周波数フィルタリング
周波数領域におけるフィルタリングは自由度が高く,フィルタを目的に応じて設計することができる.図 3.10
の空間周波数の原点が中心にあるスペクトル表現を用いて周波数フィルタリングについて説明する.原点の周
波数はゼロであり,外側に行くほど周波数が高くなると考えてほしい.
ローパスフィルタは低周波数成分のみを通過させるフィルタである.ハイパスフィルタはその逆で高周波成分
のみを通過させるフィルタである.ローパスとハイパスの区別は絶対的なものではなく,画像の特性や目的に応
じて決められるものである.バンドパスフィルタはある範囲内のスペクトルを通過させるフィルタである.フィルタ
を作用させる範囲は目的に応じて任意の形に設定してもよい.例えば,中央近辺にある小円の内側のスペクト
ルのみを残し外側をゼロにすれば簡単なローパスフィルタになる(周波数ゼロおよび低周波数成分が残る).ス
ペクトルを取り出す範囲として図中の矩形領域を設定すればこの領域に存在する周波数成分のみを取り出す
バンドパスフィルタとなる.
フィルタ形状の境界をはっきりと区別する特性にすると,フィルタリングされた画像に歪みが生じることが多い.
これはフィルタ自身が余計な周波数成分を発生させているとみなすこともできる.このような影響を避けるため
に緩やかに変化する関数をフィルタとして用いることが多い.実際の応用では,十分な遮断特性を保ちながら
歪みを抑えるように適切にフィルタを設計することが必要である.
3.6 MATLAB におけるフィルタリングの例
MATLAB には畳み込み積分を直接行う関数 convn()が用意されておる.また,二次元 FFT の関数 fft2()と
ifft2()も用意されており,周波数領域における畳み込み積分も簡単に行うことができる.
■convn()を利用したフィルタリングの例
図 3.10 空間周波数領域でのフィルタ.特定のスペクトルに作用させるようなフィルタも設定できる.
g = imread('gazou.tif'); % 画像データの読み込み
g = double(g); % 実数データに変換する
ave = [1/9 1/9 1/9; 1/9 1/9 1/9; 1/9 1/9 1/9];
C = convn( g , ave, ‘same’ ); % ‘same’ :元画像と同じ大きさで結果を返す
figure; imshow(C,[]);
課題 A 信号処理 2 次元ディジタル信号処理
■フーリエ変換を利用したフィルタリングの例
《補足説明》 ・ フィルタ関数のサイズが 3×3 や 5×5 のときは,畳み込み積分を直接行う方法でも十分速く実行できる.しかし,サイズ
が大きくなると急激に実行速度が遅くなる.大きなフィルタサイズの場合の計算時間を調べてみよう. ・ オリジナルデータと結果の引き算を行うことにより変化の様子を知ることができる.
d = g − C; figure; imshow( d, [] ); title('誤差'); % オリジナルデータとの差を求める
■ローパスフィルタの例
g = double( imread( ' gazou .tif' ) ); [ m, n ] = size(g) % 画像サイズを調べる ftg = fftshift( fft2(g) ); % fft2 してからfftshift する figure; imshow( log10(1+abs(ftg)), [] ); % 簡単なローパスフィルタの例 [p,q]=meshgrid(-n/2:n/2-1,-m/2:m/2-1); filt= zeros( m, n ); filt( (p.^2 + q.^2) < 30^2 ) = 1; % 半径30の円 figure; imshow( filt, [] ); axis on; % スペクトルの掛算(周波数領域でフィルタリング) f_ftg = ftg .* filt; figure; imshow( log10(1+abs(f_ftg)), [] ); % IFFT f_g = ifft2(f_ftg); figure; imshow( abs(f_g), [] ); title('LPF');
g = double(imread( 'gazou.tif' ));
ave = [1/9 1/9 1/9; 1/9 1/9 1/9; 1/9 1/9 1/9];
ave(p,q) = 0; % ave にゼロを付加して p 行 q 列にする
C = ifft2( fft2(g) .* fft2(ave) ); % 「.* 」は項別掛け算
C = real(C); % 実部のみをとる(丸め誤差による虚数部を除去)
figure; imshow( C, [] );
課題 A 信号処理 2 次元ディジタル信号処理
演習課題3
演習課題 3 でも MATLAB を用いて計算機シミュレーションを行います.演習 3.1,3.2 は必ず行ってください.
余裕のある人は発展問題も行ってください.この演習には画素数 256×256 または 512×512 の画像を用いて
ください.必ず結果に対する考察をあわせて示すようにしてください.以下の点に注意してください.
・ 結果は項目ごとにまとめて下さい.数値データや図が見やすくなるようにレイアウトを工夫して下さい.
・ プログラム作成においては,このテキストで使われている関数を使うようにしてください.
・ MATLAB には特別な関数が組み込み関数として使えるようになっています.MATLAB の特別な関数を
使った場合,その機能や特徴をレポートに記述してください.
演習 3.1 周波数フィルタに関して以下の問に答えよ. ただし,周波数範囲は各自で設定すること.
(1) x 軸(横)方向に 2 つの異なる周波数(fx1 < fx2)をもつ正弦波と y 軸(縦)方向に 2 つの異なる周波数(fy1 <
fy2)をもつ正弦波を加算した画像をつくれ.
(2) y 軸方向の周波数成分 fy1 のみを通すバンドバスフィルタをつくり,(1)の画像に作用させるとどのように変
化するか調べよ. ただし,各フィルタの周波数特性は各自で設定せよ.
ヒント: 周波数領域においてピーク形状のパワースペクトルが現れる位置を調べてみよう.図 3.3 の関係
を図示して,フィルタのスペクトル分布および画像の変化とスペクトル分布の変化を調べるとよい.
演習 3.2 (A)人物のグレイスケール画像,(B)文字の二値画像,(C)人工的な物体(建物,車など)のグレイス
ケール画像に対して,畳み込み積分 convn()を使って①平均値フィルタ,②Sobelフィルタ,③ラプラシアンフィ
ルタをかけるとする.以下の問いに答えよ.
(1) オリジナル画像のスペクトルとフィルタ適用後の画像のスペクトルを求めよ.
(2) (1)の結果を用いて画像が変化した理由を説明せよ.
ヒント: 図 3.3 の関係を図示して,フィルタのスペクトル分布および画像の変化とスペクトル分布の変化を
詳しく調べるとよい.N×N の平均値フィルタでは,画質の変化が目視でわかるように N の値を大きくとると
説明しやすい.
発展問題 A さまざまなフィルタを使って特徴的な画像をつくってみよう.自作したフィルタ関数や MATLAB の
組み込み関数を使うこと.いわゆる画像処理ソフトは使わないでください.
発展問題 B 周波数フィルタを使って画像のノイズを除去してみよう.
ヒント: ノイズを加えた画像は乱数を作る関数 rand()を使うとよい.これは一様なランダムノイズに相当する.
(実際のノイズはその発生源によって性質は異なります)
参考文献
[1] DFW-V500/VL500 User’s Guide (ソニー株式会社)
[2] ディジタル画像処理 (CG-ARTS 協会)
[3] MathWorks 社のホームページ(http://www.mathworks.co.jp/)