DFT和IDFT的意义
DFT:离散傅里叶变换
离散傅里叶变换可以将连续的频谱转化成离散的频谱去计算,这样就易于计算机编程实现傅里叶变换的计算。FFT算法的出现,使得DFT的计算速度更快。
定义
DFT的定义
设
x
(
n
)
x(n)
x(n) 是一个长度为
M
M
M的有限长序列,则定义
x
(
n
)
x(n)
x(n)的
N
N
N点离散傅里叶变换为
X
(
k
)
=
D
F
T
[
x
(
n
)
]
=
∑
n
=
0
N
−
1
x
(
n
)
W
N
k
n
(
k
=
0
,
1
,
.
.
.
,
N
−
1
)
X(k) = DFT[x(n)] = \sum\limits_{n = 0}^{N - 1} {x(n)W_N^{kn}} \ \ \ \ \ \ \ (k=0, 1, ..., N-1)
X(k)=DFT[x(n)]=n=0∑N−1x(n)WNkn (k=0,1,...,N−1)
注意:
x
(
n
)
x(n)
x(n)的离散傅里叶变换结果与变换区间长度
N
N
N的取值有关。
DFT的定义
X
(
k
)
X(k)
X(k)的离散傅里叶逆变换(Inverse Discrete Fourier Transform, IDFT)为
x
(
n
)
=
I
D
F
T
[
X
(
k
)
]
=
1
N
∑
k
=
0
N
−
1
X
(
k
)
W
N
−
k
n
(
n
=
0
,
1
,
.
.
.
,
N
−
1
)
x(n) = IDFT[X(k)]=\frac{1}{N} \sum\limits_{k = 0}^{N - 1} {X(k)W_N^{-kn}} \ \ \ \ \ \ \ (n=0, 1, ..., N-1)
x(n)=IDFT[X(k)]=N1k=0∑N−1X(k)WN−kn (n=0,1,...,N−1)
式中,
W
N
=
e
−
j
2
π
N
W_{N}=e^{-j\frac{2\pi}{N}}
WN=e−jN2π,
N
N
N称为DFT变换区间长度,
N
≥
M
N \ge M
N≥M
DFT的矩阵分析
由DFT的数学表达式可以看出:
-
对于每一个 X ( k ) X(k) X(k)的计算,为两个向量的内积形式
-
对于 k = 0 , 1 , . . . , N − 1 k=0, 1, ..., N-1 k=0,1,...,N−1,则 X ( k ) X(k) X(k)的计算可以看做向量 x ( n ) x(n) x(n)和一个矩阵的乘积,我们一般讲这个矩阵称作DFT矩阵。 X ( k ) = D F T [ x ( n ) ] = ∑ n = 0 N − 1 x ( n ) W N k n = x ( n ) ∗ P ( k = 0 , 1 , . . . , N − 1 ) X(k) = DFT[x(n)] = \sum\limits_{n = 0}^{N - 1} {x(n)W_N^{kn}} = x(n)*P \ \ \ \ \ \ \ (k=0, 1, ..., N-1) X(k)=DFT[x(n)]=n=0∑N−1x(n)WNkn=x(n)∗P (k=0,1,...,N−1) P = [ W N 0 ∗ 0 W N 0 ∗ 1 . . . W N 0 ∗ n W N 1 ∗ 0 W N 1 ∗ 1 . . . W N 1 ∗ n . . . W N k ∗ 0 W N k ∗ 1 . . . W N k ∗ n ] P= \left[ \begin{array}{l} W_N^{0*0}\ \ W_N^{0*1} \ \ ...W_N^{0*n}\\ W_N^{1*0}\ \ W_N^{1*1} \ \ ...W_N^{1*n}\\ ... \\ W_N^{k*0}\ \ W_N^{k*1} \ \ ...W_N^{k*n}\\ \end{array} \right] P= WN0∗0 WN0∗1 ...WN0∗nWN1∗0 WN1∗1 ...WN1∗n...WNk∗0 WNk∗1 ...WNk∗n
-
同理,对于IDFT的运算,同样会有一个对应的IDFT矩阵,且和DFT矩阵有如下的关系: x ( n ) = I D F T [ X ( k ) ] = 1 N ∑ n = 0 N − 1 X ( k ) W N − k n = 1 N X ( k ) ∗ Q ( k = 0 , 1 , . . . , N − 1 ) x(n) = IDFT[X(k)]=\frac{1}{N} \sum\limits_{n = 0}^{N - 1} {X(k)W_N^{-kn}} =\frac{1}{N} X(k)*Q \\ (k=0, 1, ..., N-1) x(n)=IDFT[X(k)]=N1n=0∑N−1X(k)WN−kn=N1X(k)∗Q(k=0,1,...,N−1) Q = [ W N − 0 ∗ 0 W N − 0 ∗ 1 . . . W N − 0 ∗ n W N − 1 ∗ 0 W N − 1 ∗ 1 . . . W N − 1 ∗ n . . . W N − k ∗ 0 W N − k ∗ 1 . . . W N − k ∗ n ] Q= \left[ \begin{array}{l} W_N^{-0*0}\ \ W_N^{-0*1} \ \ ...W_N^{-0*n}\\ W_N^{-1*0}\ \ W_N^{-1*1} \ \ ...W_N^{-1*n}\\ ... \\ W_N^{-k*0}\ \ W_N^{-k*1} \ \ ...W_N^{-k*n}\\ \end{array} \right] Q= WN−0∗0 WN−0∗1 ...WN−0∗nWN−1∗0 WN−1∗1 ...WN−1∗n...WN−k∗0 WN−k∗1 ...WN−k∗n
-
对 P P P和 Q Q Q的形式进行分析,则可得到如下结论:
Q = P ∗ Q = P^{*} Q=P∗
其中, P P P是 D F T DFT DFT矩阵, Q Q Q是 I D F T IDFT IDFT矩阵,且 P P P和 Q Q Q均为对称阵。
P P P和 Q Q Q的第一行和第一列全为1。 -
将 P P P和 Q Q Q应用于DFT和IDFT中,则有
X ( k ) = D F T [ x ( n ) ] = x ( n ) ∗ P x ( n ) = I D F T [ X ( k ) ] = 1 N X ( k ) ∗ Q = 1 N x ( n ) ∗ P ∗ Q 1 N x ( n ) ∗ P ∗ Q = I N X(k) = DFT[x(n)] = x(n)*P \\ x(n) = IDFT[X(k)]=\frac{1}{N} X(k)*Q =\frac{1}{N} x(n)*P*Q \\ \frac{1}{N} x(n)*P*Q = I_{N} X(k)=DFT[x(n)]=x(n)∗Px(n)=IDFT[X(k)]=N1X(k)∗Q=N1x(n)∗P∗QN1x(n)∗P∗Q=IN
P ∗ Q = N ∗ I N P*Q = N * I_{N} P∗Q=N∗IN
说明 D F T DFT DFT矩阵 P P P和 I D F T IDFT IDFT矩阵 Q Q Q均为正交矩阵( A ∗ A H = E A*A^{H}=E A∗AH=E)。
这两个矩阵的每一行(列)都是有个基,在N个方向上都有不同的基向量。
因此, D F T DFT DFT和 I D F T IDFT IDFT都是一种正交变换。
DFT在matlab
对于matlab中的 D F T DFT DFT正变换,可使用内置函数dftmtx(n),而对于 I D F T IDFT IDFT的矩阵,可以通过 1 N ∗ d f t m t x ( N ) ∗ \frac{1}{N}*dftmtx(N)^{*} N1∗dftmtx(N)∗来得到。
相关的代码分析
%% Prepare
clc;
close all;
clear;
%% Define the signal
N = 8;
x = [0:N-1];
%% Generate the vector of n and k
N = length(x);
n = [0:N-1];
k = [0:N-1];
%% Generate the twist-factor W
imag_unit = sqrt(-1);
W = exp(-1*imag_unit*2*pi/N);
%% Generate P matrix
P = W.^(n'*k);
%% DFT transformation
X_P = x*P;
X_fft = fft(x);
X_err = norm(X_P - X_fft)
%% Generate Q matrix
Q = conj(P);
% IDFT transformation
x_Q = 1/N * X_P * Q;
x_ifft = ifft(X_fft);
x_err = norm(x_Q - x_ifft)
%% Test: P*Q == N*I_n
I_n = eye(N);
left = P*Q;
right = N*I_n;
err = norm(left - right)
%% Generate P and Q using dftmtx
P_dftmtx = dftmtx(N);
P_err = norm(P_dftmtx - P)
Q_dftmtx = conj(dftmtx(N));
Q_err = norm(Q_dftmtx - Q)