离散时间变量二维傅里叶变换(DFT)的原始公式为:
F ( u , v ) = ∑ x = 0 M − 1 ∑ y = 0 N − 1 f ( x , y ) e − j 2 π ( x M u + y N v ) F(u,v) = \sum_{x=0}^{M-1}\sum_{y=0}^{N-1}f(x,y)e^{-j2\pi(\frac{x}{M}u+\frac{y}{N}v)} F(u,v)=x=0∑M−1y=0∑N−1f(x,y)e−j2π(Mxu+Nyv)
傅里叶变换具有可分性,所以我们有
F ( u , v ) = ∑ y = 0 N − 1 e − j 2 π y N v ∑ x = 0 M − 1 f ( x , y ) e − j 2 π x M u F(u,v) = \sum_{y=0}^{N-1}e^{-j2\pi\frac{y}{N}v}\sum_{x=0}^{M-1}f(x,y)e^{-j2\pi\frac{x}{M}u} F(u,v)=y=0∑N−1e−j2πNyvx=0∑M−1f(x,y)e−j2πMxu
我们可以将该式转换为矩阵表达的形式,这样可以方便我们进行代码编程(特别是 Matlab 编程)
由于 Matlab 显示图像的方式为:竖直向下为y轴正方向,而 f ( x , y ) f(x,y) f(x,y) 当中 x x x 的取值是对纵坐标进行检索,表示行的行数----这与我们潜意识认为的横轴,即水平方向为 x x x 轴方向的惯性思维不一致,故我做出如下改动
F ( v , u ) = ∑ y = 0 N − 1 e − j 2 π y N v ∑ x = 0 M − 1 f ( y , x ) e − j 2 π x M u F(v,u) = \sum_{y=0}^{N-1}e^{-j2\pi\frac{y}{N}v}\sum_{x=0}^{M-1}f(y,x)e^{-j2\pi\frac{x}{M}u} F(v,u)=y=0∑N−1e−j2πNyvx=0∑M−1f(y,x)e−j2πMxu
即简单的调换一下变元的表达方式,本质计算上没有改变。
假设当 F ( v , u ) F(v,u) F(v,u) 为 R 1 × 1 R^{1\times1} R1×1 时,有如下推导
F ( v , u ) = ∑ y = 0 N − 1 e − j 2 π y N v [ f ( y , 0 ) f ( y , 1 ) … f ( y , M − 1 ) ] ⋅ [ 1 e − j 2 π 1 M u e − j 2 π 2 M u ⋮ e − j 2 π M − 1 M u ] F(v,u) =\sum_{y=0}^{N-1}e^{-j2\pi\frac{y}{N}v}\begin{bmatrix}f(y,0)&f(y,1)&\dots&f(y,M-1)\end{bmatrix} ·\begin{bmatrix}1\\e^{-j2\pi\frac{1}{M}u}\\e^{-j2\pi\frac{2}{M}u}\\\vdots\\e^{-j2\pi\frac{M-1}{M}u}\end{bmatrix} F(v,u)=y=0∑N−1e−j2πNyv[f(y,0)f(y,1)…f(y,M−1)]⋅⎣⎢⎢⎢⎢⎢⎡1e−j2πM1ue−j2πM2u⋮e−j2πMM−1u⎦⎥⎥⎥⎥⎥⎤
其中
[ f ( y , 0 ) f ( y , 1 ) … f ( y , M − 1 ) ] ⋅ [ 1 e − j 2 π 1 M u e − j 2 π 2 M u ⋮ e − j 2 π M − 1 M u ] = R 1 × M ⋅ R M × 1 = R 1 × 1 \begin{bmatrix}f(y,0)&f(y,1)&\dots&f(y,M-1)\end{bmatrix} ·\begin{bmatrix}1\\e^{-j2\pi\frac{1}{M}u}\\e^{-j2\pi\frac{2}{M}u}\\\vdots\\e^{-j2\pi\frac{M-1}{M}u}\end{bmatrix}=R^{1\times M}·R^{M\times 1}=R^{1\times1 } [f(y,0)f(y,1)…f(y,M−1)]⋅⎣⎢⎢⎢⎢⎢⎡1e−j2πM1ue−j2πM2u⋮e−j2πMM−1u⎦⎥⎥⎥⎥⎥⎤=R1×M⋅RM×1=R1×1
故我们可以知道
f ( y , x ) ⋅ [ 1 e − j 2 π 1 M u e − j 2 π 2 M u ⋮ e − j 2 π M − 1 M u ] = R N y × M x ⋅ R M x × 1 = R N y × 1 f (y,x)·\begin{bmatrix}1\\e^{-j2\pi\frac{1}{M}u}\\e^{-j2\pi\frac{2}{M}u}\\\vdots\\e^{-j2\pi\frac{M-1}{M}u}\end{bmatrix}=R^{N_y\times M_x}·R^{M_x\times 1}=R^{N_y\times1 } f(y,x)⋅⎣⎢⎢⎢⎢⎢⎡1e−j2πM1ue−j2πM2u⋮e−j2πMM−1u⎦⎥⎥⎥⎥⎥⎤=RNy×Mx⋅RMx×1=RNy×1
所以,后续可推导为
∑ y = 0 N − 1 e − j 2 π y N v = R 1 × N y \sum_{y=0}^{N-1}e^{-j2\pi\frac{y}{N}v}=R^{1\times N_y} y=0∑N−1e−j2πNyv=R1×Ny
即可完成当 F ( u , v ) F(u,v) F(u,v) 为 R 1 × 1 R^{1\times1} R1×1 时的累加
我们此时可以直接通过矩阵乘法的维度准则来推导,这里采取的是逆向思维
R N v × M u = R N v × ? 1 ⋅ R N y × M x ⋅ R ? 2 × M u R^{N_v\times M_u}=R^{N_v\times ?1}·R^{N_y\times M_x}·R^{?2\times M_u} RNv×Mu=RNv×?1⋅RNy×Mx⋅R?2×Mu
很明显 ? 1 = N y ?1=N_y ?1=Ny , ? 2 = M x ?2=M_x ?2=Mx
分别将
R N v × N y = [ 1 1 1 … 1 1 e − j 2 π 1 N 1 e − j 2 π 2 N 1 … e − j 2 π N − 1 N 1 1 e − j 2 π 1 N 2 e − j 2 π 2 N 2 … e − j 2 π N − 1 N 2 ⋮ ⋮ ⋮ e − j 2 π y N v ⋮ 1 e − j 2 π 1 N ( N − 1 ) e − j 2 π 2 N ( N − 1 ) … e − j 2 π N − 1 N ( N − 1 ) ] R^{N_v\times N_y}=\begin{bmatrix} 1&1&1&\dots&1\\ 1&e^{-j2\pi\frac{1}{N}1}&e^{-j2\pi\frac{2}{N}1}&\dots&e^{-j2\pi\frac{N-1}{N}1}\\ 1&e^{-j2\pi\frac{1}{N}2}&e^{-j2\pi\frac{2}{N}2}&\dots&e^{-j2\pi\frac{N-1}{N}2}\\ \vdots&\vdots&\vdots&e^{-j2\pi\frac{y}{N}v}&\vdots\\ 1&e^{-j2\pi\frac{1}{N}(N-1)}&e^{-j2\pi\frac{2}{N}(N-1)}&\dots&e^{-j2\pi\frac{N-1}{N}(N-1)} \end{bmatrix} RNv×Ny=⎣⎢⎢⎢⎢⎢⎡111⋮11e−j2πN11e−j2πN12⋮e−j2πN1(N−1)1e−j2πN21e−j2πN22⋮e−j2πN2(N−1)………e−j2πNyv…1e−j2πNN−11e−j2πNN−12⋮e−j2πNN−1(N−1)⎦⎥⎥⎥⎥⎥⎤
R M x × M u = [ 1 1 1 … 1 1 e − j 2 π 1 M 1 e − j 2 π 1 M 2 … e − j 2 π 1 M ( M − 1 ) 1 e − j 2 π 2 M 1 e − j 2 π 2 M 2 … e − j 2 π 2 M ( M − 1 ) ⋮ ⋮ ⋮ e − j 2 π x M u ⋮ 1 e − j 2 π M − 1 M 1 e − j 2 π M − 1 M 2 … e − j 2 π M − 1 M ( M − 1 ) ] R^{M_x\times M_u}=\begin{bmatrix} 1&1&1&\dots&1\\ 1&e^{-j2\pi\frac{1}{M}1}&e^{-j2\pi\frac{1}{M}2}&\dots&e^{-j2\pi\frac{1}{M}(M-1)}\\ 1&e^{-j2\pi\frac{2}{M}1}&e^{-j2\pi\frac{2}{M}2}&\dots&e^{-j2\pi\frac{2}{M}(M-1)}\\ \vdots&\vdots&\vdots&e^{-j2\pi\frac{x}{M}u}&\vdots\\ 1&e^{-j2\pi\frac{M-1}{M}1}&e^{-j2\pi\frac{M-1}{M}2}&\dots&e^{-j2\pi\frac{M-1}{M}(M-1)} \end{bmatrix} RMx×Mu=⎣⎢⎢⎢⎢⎢⎡111⋮11e−j2πM11e−j2πM21⋮e−j2πMM−111e−j2πM12e−j2πM22⋮e−j2πMM−12………e−j2πMxu…1e−j2πM1(M−1)e−j2πM2(M−1)⋮e−j2πMM−1(M−1)⎦⎥⎥⎥⎥⎥⎤
然后通过 Matlab 特有的矩阵乘法进行编程即可。