ディジタル信号処理 課題解説(その3) 2014年度版
TRANSCRIPT
課題解説(その3):2014年度版
(第5回)離散フーリエ変換
離散フーリエ変換
• 補足01:離散フーリエ変換の基本定理Ⅱの証明
• 課題22 :離散フーリエ変換の行列表示
• 課題23 :画像データの格納方法
• 課題24 :フーリエ変換の手計算
• 課題25 :線形定理における信号の系列長
• 補足02:離散畳み込みの証明
• 課題26 :離散畳み込みの手計算
補足01
任意の正定数Nに対して
𝑇 =𝑇𝑝
𝑁, 𝜔𝑠 =
2𝜋
𝑇, Ω =
𝜔𝑠
𝑁=
2𝜋
𝑁𝑇とすると
𝐹 𝑘Ω = 𝑇 𝑛=0𝑁−1 𝑓(𝑛𝑇)𝑊𝑁
𝑘𝑛を証明しなさい.
ただし𝑊𝑁 = 𝑒−𝑗2𝜋
𝑁を表す.
補足01
• そもそも離散フーリエ変換の基本定理Ⅰ・Ⅱとは…
• 周期関数化されたf(t)とF(ω)の関係を示している
• 周期信号化すると離散フーリエ変換を有限で表現できる
基本定理Ⅰ
基本定理Ⅱ
切り出す
切り出す
補足01
基本定理Ⅰと証明方法はほぼ同じ
m
m )()( ss を使うと、
)(*)()(~
sFF 関数のフーリエ級数展開
教科書p20の式(2.14)
m
m
T
mTtmTTf
mTttTf
ttf
tfF
s
s
)()(
)()(
)()(2
)}({)(2)}(~
{
1
-1-1 FF
m
jmT
meF )(~
m
m mTtF )()}(~
{ 1-F
両辺の逆フーリエ変換
j
tj
et
e
)(
)(2 00 より
※課題5参照
m
jmT
m
jmT emTfTemTTfF )()()(~
補足01
m
jmTemTfTF )()(~
sT 2
):,10(, rNnrNnmk 整数 を代入すると
kn
N
N
n
N
n r
N
knj
N
n r
krN
nj
N
n r
TkrNnj
WnTfT
eTrNnfT
eTrNnfT
eTrNnfTF
1
0
1
0
2
1
0
)(2
1
0
)(
)(~
))((
))((
))(()(~
NT
NT s 2
Nj
N
r
p
eW
rTnTfnTf
2
)()(~
【離散フーリエ変換の基本定理Ⅱ 証明終わり】
課題22
離散フーリエ変換の行列式はどのような行列であるか?
𝑋 0𝑋 1
𝑋 2⋮
𝑋 𝑘⋮
𝑋 𝑁 − 1
=
𝑊𝑁0 . . 𝑊𝑁
0 𝑁−1
𝑊𝑁0 . . 𝑊𝑁
1 𝑁−1
𝑊𝑁0 . . 𝑊𝑁
2 𝑁−1
. . . .
. 𝑊𝑁𝑘𝑛 . .
. . . .
𝑊𝑁0 . . 𝑊𝑁
𝑁−1 𝑁−1
𝑥 0𝑥 1
𝑥 2⋮
𝑥 𝑘⋮
𝑥 𝑁 − 1
ただし𝑊𝑁 = 𝑒−𝑗2𝜋
𝑁 Wとする
課題22
• i行j列目の要素とj行i列目の要素は𝑊𝑁𝑖𝑗= 𝑊𝑁
𝑗𝑖よりこの行列は対
称行列である
• また任意の二つの行について 𝑘=0N−1𝑊𝑁
𝑘𝑛1𝑊𝑁𝑘𝑛2 =
𝑘=0N−1𝑊𝑁
𝑘(𝑛1+𝑛2) = 𝑘=0𝑁−1 𝑒−𝑗
2𝜋
𝑁𝑘(𝑛1+𝑛2)
• 𝑛1 = −𝑛2のとき
𝑘=0𝑁−1 𝑒−𝑗
2𝜋
𝑁𝑘(𝑛1+𝑛2) = 𝑁
• 𝑛1 ≠ −𝑛2のとき
𝑘=0𝑁−1 𝑒−𝑗
2𝜋
𝑁𝑘(𝑛1+𝑛2)
=1−𝑒
−𝑗2𝜋 𝑛1+𝑛2 𝑁
𝑁
1−𝑒−𝑗
2𝜋 𝑛1+𝑛2𝑁
(等比数列の和)
課題22
𝑒−𝑗2𝜋 𝑛1+𝑛2 𝑁
𝑁 = 𝑒−𝑗2𝜋 𝑛1+𝑛2 = 1であるから
𝑘=0𝑁−1 𝑒−𝑗
2𝜋
𝑁𝑘(𝑛1+𝑛2) = 0
よって
𝑘=0N−1𝑊𝑁
𝑘𝑛1𝑊𝑁𝑘𝑛2 =
𝑁 𝑛1 + 𝑛2 ≡ 0(𝑚𝑜𝑑 𝑁)0 𝑒𝑙𝑠𝑒
よってこの行列と対称行列の積をとると対角成分がN,他が0となる
つまり 𝑊𝑇𝑊 =
𝑁 0 … 00 𝑁 ⋱ ⋮⋮ ⋱ ⋱ 00 … 0 𝑁
→Wを1/ 𝑁倍すればユニタリー行列になる
課題23
大きさが横N画素、縦 M画素の画像をラスター走査で画素を走査しながら処理を行うプログラムを考える。
ただし、
・1画素のデータは1バイトで記憶される
・N、Mは非常に大きい
・使用するコンピュータは、ページサイズがKバイトの 仮想記憶メモリ方式を用いている
とする。
この時、
CおよびFORTRANでプログラムを書く場合、画像を 表す配列はどのように定義すれば計算効率の低下を生じさせないか考えなさい。
課題23言語によって行列の格納方法が異なる
(矢印の方向)
C言語
x[0][0] x[0][1] x[0][2]
x[1][0] x[1][1] x[1][2]
x[2][0] x[2][1] x[2][2]
FORTRAN
x(1,1) x(1,2) x(1,3)
x(2,1) x(2,2) x(2,3)
x(3,1) x(3,2) x(3,3)
この格納方法の順に読み込む方が効率が良い
良い例
悪い例
課題23
MATLABで実験してみた
巨大な画像の画素をfor文で回しR,G,Bの成分を入れ替える
縦走査と横走査で処理時間を計測する
課題23
10240x7680の画像で実験した結果
横走査→178.927 s
縦走査→172.965 s
…
(思ったより変わらなかったが…)MATLABはFORTRAN型なので縦走査の方が計算時間が速くなるのは妥当である.
課題24
以下の画像のフーリエ変換を計算し,そのパワースペクトルを求めなさい.なお,計算は手計算で行うこととし, 白画素,黒画素の値はそれぞれ1,0とし,画像の大きさは、2*2、4*4の2つの場合を求めなさい.
課題242*2の場合
2次元離散フーリエ変換の行列式は𝑋 0 𝑋[2]
𝑋 1 𝑋[3]=
𝑊20 𝑊2
0
𝑊20 𝑊2
1
𝑥 0 𝑥[2]
𝑥 1 𝑥[3]
𝑊20 𝑊2
0
𝑊20 𝑊2
1
=1 1
1 𝑒−𝑗2𝜋2
𝑥 0 𝑥[2]
𝑥 1 𝑥[3]
1 1
1 𝑒−𝑗2𝜋2
=1 11 −1
𝑥 0 𝑥[2]
𝑥 1 𝑥[3]1 11 −1
xは(a)-(e)で
を代入すればよい(あとは行列の代入だけなので省略)
1 1
1 1
0 0
0 0
0 0
1 1
0 1
0 1
0 1
1 0
課題24
4*4の場合
離散フーリエ変換の行列式は𝑋 0 𝑋 4 𝑋[8] 𝑋[12]
𝑋 1 𝑋 5 𝑋[9] 𝑋[13]𝑋[2] 𝑋[6] 𝑋[10] 𝑋[14]
𝑋[3] 𝑋[7] 𝑋[11] 𝑋[15]
=
𝑊40 𝑊4
0 𝑊40 𝑊4
0
𝑊40 𝑊4
1 𝑊42 𝑊4
3
𝑊40 𝑊4
2 𝑊44 𝑊4
6
𝑊40 𝑊4
3 𝑊46 𝑊4
9
𝑥 0 𝑥 4 𝑥[8] 𝑥[12]
𝑥 1 𝑥 5 𝑥[9] 𝑥[13]𝑥[2] 𝑥[6] 𝑥[10] 𝑥[14]
𝑥[3] 𝑥[7] 𝑥[11] 𝑥[15]
𝑊40 𝑊4
0 𝑊40 𝑊4
0
𝑊40 𝑊4
1 𝑊42 𝑊4
3
𝑊40 𝑊4
2 𝑊44 𝑊4
6
𝑊40 𝑊4
3 𝑊46 𝑊4
9
=
1 1 1 11 −𝑗 −1 𝑗1 −1 1 −11 𝑗 −1 −𝑗
𝑥 0 𝑥 4 𝑥[8] 𝑥[12]
𝑥 1 𝑥 5 𝑥[9] 𝑥[13]𝑥[2] 𝑥[6] 𝑥[10] 𝑥[14]
𝑥[3] 𝑥[7] 𝑥[11] 𝑥[15]
1 1 1 11 −𝑗 −1 𝑗1 −1 1 −11 𝑗 −1 −𝑗
0 0 0 0
0 0 0 0
1 1 1 1
1 1 1 1代入
課題24
解答…
2x2
4x4
課題25
離散フーリエ変換の線形定理において
max 𝑁1, 𝑁2 = 𝑁1 = 𝑁としたとき,𝑥2 𝑛 𝑁2 ≤ 𝑛 ≤ 𝑁 − 1および𝑋2 𝑘 𝑁2 ≤ 𝑘 ≤ 𝑁 − 1 の値はどうするのか考えなさい.
課題25
長さが異なれば足し合わせることができないので短い方に0を補間する→パワースペクトルの波形が変わる
実際,短い方に値をどのように補間しても線形性を保つことができないので
x1 n :長さN1 ↔ 𝐹1[𝑘]
x2 n :長さN2 ↔ 𝐹2[𝑘](𝑁2 < 𝑁1)
において𝑥2 𝑛 に0を𝑁2 − 𝑁1個だけ追加した𝑥2’ 𝑛 を考える
この時𝑦 𝑛 = 𝑎𝑥1 𝑛 + 𝑏𝑥2’[𝑛]とすると
Y k = aX1 k + bX2′[k]というのが正しい表記である
補足02
𝑥𝑘 𝑛 = 𝑥 𝑛 (𝑘𝐿 ≤ 𝑘 + 1 𝐿 − 1, 𝑘 > 0)
0 (その他)
このときx[n]とy[n]の離散畳み込みw[n]は
𝑤 𝑛 = 𝑥 𝑛 ∗ 𝑦 𝑛 = 𝑘=0∞ 𝑥𝑘 𝑛 ∗ 𝑦[𝑛]であることを証明しな
さい
補足02
𝑤 𝑛 = 𝑥 𝑛 ∗ 𝑦 𝑛
離散畳み込みの式より
= 𝑘=0∞ 𝑥 𝑙 𝑦[𝑛 − 𝑙]
x[n]を長さLの部分系列の和で表現して
= 𝑙=−∞∞ 𝑘=0
∞ 𝑥𝑘 𝑙 𝑦[𝑛 − 𝑙]
線形性より
= 𝑙=−∞∞ 𝑘=0
∞ 𝑥𝑘 𝑙 𝑦[𝑛 − 𝑙]
= 𝑘=0∞ 𝑥𝑘 𝑛 ∗ 𝑦[𝑛]
補足02
• 課題9の解釈1を思い出してみよう….
これはf(t)を長さ1に分割したものといえる
0 0 0 0 0 3 3 3 3 3 3
0 0 1 1 1 0 0 0
0だけ動かしたとき
f(t)
g(t)
f(0)
…0 0 3 3 3 0 0 0…
0 0 0 0 0 3 3 3 3 3 3
0 0 1 1 1 0 0 0
1だけ動かしたとき
f(t)
g(t)
f(1)
…0 0 3 3 3 0 0 0… + +……+
すべて足し合わせると となる…0 0 3 6 9 9 9 9…
× ×
課題26
信号:𝑥 𝑛 = … , 0, 𝑥 −1 = 0, 𝑥 0 = 1, 𝑥 1 = 1,1,…
に対して,
フィルタ関数:𝑦1 𝑛 = {… , 0, 𝑦 −1 = 1/3, 𝑥 0 = 1/3, 𝑥 1 = 1/3,0,… }𝑦2 𝑛 = {… , 0, 𝑦 0 = 1/3, 𝑥 1 = 1/3, 𝑥 2 = 1/3,0,… }
を用いた離散畳み込みを計算し,両者の結果の関係がどのようになるかを考察しなさい.
課題26
x[n] y[n]
0 1 2 …… -1 0 1 ……
x[n]とy[n]の離散畳み込みz[n]を計算する𝑧 𝑛 = 𝑥 𝑛 ∗ 𝑦[𝑛]
課題26
x[n]
y[n]
0 1 2 ……
-1 0 1 ……
1
1/3
𝑧 0 = 0 ×1
3+ 1 ×
1
3+ 1 ×
1
3=
2
3
z[n]
2/3
0 1 2 ……
y[n]をdだけ動かした時𝑧 𝑑 = 𝑛=−∞𝑛=∞ 𝑥 𝑛 𝑦[𝑛 − 𝑑]
d=0の時
課題26
x[n]
y[n]
0 1 2 ……
-1 0 1 ……
1
1/3
𝑧 1 = 1 ×1
3+ 1 ×
1
3+ 1 ×
1
3= 1
z[n]
1
0 1 2 ……
y[n]をdだけ動かした時𝑧 𝑑 = 𝑛=−∞𝑛=∞ 𝑥 𝑛 𝑦[𝑛 − 𝑑]
d=0の時
課題26
x[n]
y[n]
0 1 2 ……
-1 0 1 ……
1
1/3
𝑧 1 = 1 ×1
3+ 1 ×
1
3+ 1 ×
1
3= 1
z[n]
1
0 1 2 ……
y[n]をdだけ動かした時𝑧 𝑑 = 𝑛=−∞𝑛=∞ 𝑥 𝑛 𝑦[𝑛 − 𝑑]
d=0の時
課題26
x[n]
y[n]
0 1 2 ……
-1 0 1 ……
1
1/3
z[n]
1
0 1 2 ……
x[n]にy[n]を畳み込むことによって0と1の境界部分が滑らかに変化するようになる
課題26
x[n]
y[n]
0 1 2 ……
-1 0 1 ……
1
1/3
z[n]
1
-1 0 1 ……
𝑦2[𝑛]の場合も同様に計算して図のようになる.
課題26
∗1
9
1
9
1
9
1
9
1
9
1
9
1
9
1
9
1
9
=
この部分を変えることにより様々な処理ができる
画像のフィルタリング
課題26
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); %平滑化した画像の表示
課題26
−1 -1 −1
−1 9 −1
−1 −1 −1
1 0 −1
2 0 −2
1 0 −1
1
9
1
9
1
9
1
9
1
9
1
9
1
9
1
9
1
9
平滑化フィルタ
ソーベルフィルタ(エッジ抽出)
ラプラシアンフィルタ(エッジ強調)