課題解説(その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
 を使うと、
)(*)()(
~
 s
FF  関数のフーリエ級数展開
教科書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 0
0
より
※課題5参照







m
jmT
m
jmT
emTfTemTTfF 
 )()()(
~
補足01





m
jmT
emTfTF 
 )()(
~
sT 2
):,10(,    rNnrNnmk  整数 を代入すると
kn
N
N
n
N
n r
N
kn
j
N
n r
kr
N
n
j
N
n r
TkrNnj
WnTfT
eTrNnfT
eTrNnfT
eTrNnfTF

 
 
 





















1
0
1
0
2
1
0
)(2
1
0
)(
)(
~
))((
))((
))(()(
~



N
T
N
T s  2

N
j
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列目の要素は𝑊𝑁
𝑖𝑗
= 𝑊𝑁
𝑗𝑖
よりこの行列は対
称行列である
• また任意の二つの行について 𝑘=0
N−1
𝑊𝑁
𝑘𝑛1
𝑊𝑁
𝑘𝑛2
=
𝑘=0
N−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
よって
𝑘=0
N−1
𝑊𝑁
𝑘𝑛1
𝑊𝑁
𝑘𝑛2
=
𝑁 𝑛1 + 𝑛2 ≡ 0(𝑚𝑜𝑑 𝑁)
0 𝑒𝑙𝑠𝑒
よってこの行列と対称行列の積をとると対角成分がN,他が0と
なる
つまり 𝑊 𝑇 𝑊 =
𝑁 0 … 0
0 𝑁 ⋱ ⋮
⋮ ⋱ ⋱ 0
0 … 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つ
の場合を 求めなさい.
課題24
2*2の場合
2次元離散フーリエ変換の行列式は
𝑋 0 𝑋[2]
𝑋 1 𝑋[3]
=
𝑊2
0
𝑊2
0
𝑊2
0
𝑊2
1
𝑥 0 𝑥[2]
𝑥 1 𝑥[3]
𝑊2
0
𝑊2
0
𝑊2
0
𝑊2
1
=
1 1
1 𝑒−𝑗
2𝜋
2
𝑥 0 𝑥[2]
𝑥 1 𝑥[3]
1 1
1 𝑒−𝑗
2𝜋
2
=
1 1
1 −1
𝑥 0 𝑥[2]
𝑥 1 𝑥[3]
1 1
1 −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]
=
𝑊4
0
𝑊4
0
𝑊4
0
𝑊4
0
𝑊4
0
𝑊4
1
𝑊4
2
𝑊4
3
𝑊4
0
𝑊4
2
𝑊4
4
𝑊4
6
𝑊4
0
𝑊4
3
𝑊4
6
𝑊4
9
𝑥 0 𝑥 4 𝑥[8] 𝑥[12]
𝑥 1 𝑥 5 𝑥[9] 𝑥[13]
𝑥[2] 𝑥[6] 𝑥[10] 𝑥[14]
𝑥[3] 𝑥[7] 𝑥[11] 𝑥[15]
𝑊4
0
𝑊4
0
𝑊4
0
𝑊4
0
𝑊4
0
𝑊4
1
𝑊4
2
𝑊4
3
𝑊4
0
𝑊4
2
𝑊4
4
𝑊4
6
𝑊4
0
𝑊4
3
𝑊4
6
𝑊4
9
=
1 1 1 1
1 −𝑗 −1 𝑗
1 −1 1 −1
1 𝑗 −1 −𝑗
𝑥 0 𝑥 4 𝑥[8] 𝑥[12]
𝑥 1 𝑥 5 𝑥[9] 𝑥[13]
𝑥[2] 𝑥[6] 𝑥[10] 𝑥[14]
𝑥[3] 𝑥[7] 𝑥[11] 𝑥[15]
1 1 1 1
1 −𝑗 −1 𝑗
1 −1 1 −1
1 𝑗 −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
平滑化フィルタ
ソーベルフィルタ
(エッジ抽出)
ラプラシアンフィルタ
(エッジ強調)

ディジタル信号処理 課題解説(その3) 2014年度版