离散傅里叶变换/逆变换的公式如下:
X ( n ) = ∑ k = 0 N − 1 x ( k ) e − i n 2 π k N X\left( n \right) = \sum\limits_{k = 0}^{N - 1} {x\left( k \right){e^{ - in\frac{{2\pi k}}{N}}}} X(n)=k=0∑N−1x(k)e−inN2πk
x ( m ) = 1 N ∑ n = 0 N − 1 [ X ( n ) ⋅ e i n 2 π m N ] x\left( m \right) = \frac{1}{N}\sum\limits_{n = 0}^{N - 1} {\left[ {X\left( n \right) \cdot {e^{in\frac{{2\pi m}}{N}}}} \right]} x(m)=N1n=0∑N−1[X(n)⋅einN2πm]
换换符号,等价重写一下
X ( k ) ≜ ∑ n = 0 N − 1 x ( n ) e − i k 2 π n N X\left( k \right) \triangleq \sum\limits_{n = 0}^{N - 1} {x\left( n \right){e^{ - ik\frac{{2\pi n}}{N}}}} X(k)≜n=0∑N−1x(n)e−ikN2πn
x ( n ) = 1 N ∑ k = 0 N − 1 [ X ( k ) ⋅ e i k 2 π n N ] x\left( n \right) = \frac{1}{N}\sum\limits_{k = 0}^{N - 1} {\left[ {X\left( k \right) \cdot {e^{ik\frac{{2\pi n}}{N}}}} \right]} x(n)=N1k=0∑N−1[X(k)⋅eikN2πn]
X ( k ) ≜ ∑ n = 0 N − 1 x ( n ) e − i k 2 π n N X\left( k \right) \triangleq \sum\limits_{n = 0}^{N - 1} {x\left( n \right){e^{ - ik\frac{{2\pi n}}{N}}}} X(k)≜n=0∑N−1x(n)e−ikN2πn
X ( N − k ) = ∑ n = 0 N − 1 x ( n ) e − i ( N − k ) 2 π n N = ∑ n = 0 N − 1 x ( n ) e − i ( 2 π n − k 2 π n N ) X\left( {N - k} \right) = \sum\limits_{n = 0}^{N - 1} {x\left( n \right){e^{ - i\left( {N - k} \right)\frac{{2\pi n}}{N}}}} = \sum\limits_{n = 0}^{N - 1} {x\left( n \right){e^{ - i\left( {2\pi n - k\frac{{2\pi n}}{N}} \right)}}} X(N−k)=n=0∑N−1x(n)e−i(N−k)N2πn=n=0∑N−1x(n)e−i(2πn−kN2πn)
根据欧拉公式, e − i θ = cos θ − j sin θ {e^{ - i\theta }} = \cos \theta - j\sin \theta e−iθ=cosθ−jsinθ
X ( N − k ) = ∑ n = 0 N − 1 x ( n ) e − i ( 2 π n + k 2 π n N ) = ∑ n = 0 N − 1 x ( n ) [ cos ( 2 π n − k 2 π n N ) − j sin ( 2 π n − k 2 π n N ) ] X\left( {N - k} \right) = \sum\limits_{n = 0}^{N - 1} {x\left( n \right){e^{ - i\left( {2\pi n + k\frac{{2\pi n}}{N}} \right)}}} = \sum\limits_{n = 0}^{N - 1} {x\left( n \right)\left[ {\cos \left( {2\pi n - k\frac{{2\pi n}}{N}} \right) - j\sin \left( {2\pi n - k\frac{{2\pi n}}{N}} \right)} \right]} X(N−k)=n=0∑N−1x(n)e−i(2πn+kN2πn)=n=0∑N−1x(n)[cos(2πn−kN2πn)−jsin(2πn−kN2πn)]
因为cos和sin函数都是以2Π为周期的函数,因此
X
(
N
−
k
)
=
∑
n
=
0
N
−
1
x
(
n
)
[
cos
(
−
k
2
π
n
N
)
−
j
sin
(
−
k
2
π
n
N
)
]
=
∑
n
=
0
N
−
1
x
(
n
)
[
cos
(
k
2
π
n
N
)
+
j
sin
(
k
2
π
n
N
)
]
=
∑
n
=
0
N
−
1
x
(
n
)
cos
(
k
2
π
n
N
)
+
∑
n
=
0
N
−
1
x
(
n
)
sin
(
k
2
π
n
N
)
⋅
j
=
a
k
+
b
k
j
而
X
(
k
)
=
∑
n
=
0
N
−
1
x
(
n
)
e
−
i
k
2
π
n
N
=
∑
n
=
0
N
−
1
x
(
n
)
[
cos
(
k
2
π
n
N
)
−
j
sin
(
k
2
π
n
N
)
]
=
∑
n
=
0
N
−
1
x
(
n
)
cos
(
k
2
π
n
N
)
−
∑
n
=
0
N
−
1
x
(
n
)
sin
(
k
2
π
n
N
)
⋅
j
=
a
k
−
b
k
j
因此可得, X ( N − k ) = X ∗ ( k ) X\left( {N - k} \right) = {X^*}\left( k \right) X(N−k)=X∗(k)
x = 1000 +500* sin(2 * pi * 50 * t + pi/6) + 250 * sin(2 * pi * 150 * t + pi/4) + 100 * sin(2 * pi * 250 * t+pi/3);
其中 T = 0.001; N = 2000; t = (1:N)*dt;
对序列进行x(n)离散傅里叶变换,可得X(k)的幅值和相位图


从实验结果确实来看,离散傅里叶变换的对称位置,幅值相等,相位相反。确实的共轭的。即
X
(
N
−
k
)
=
X
∗
(
k
)
,
k
∈
{
0
,
1
,
2
,
⋯
,
N
−
1
}
X\left( {N - k} \right) = {X^*}\left( k \right),k \in \left\{ {0,1,2, \cdots ,N - 1} \right\}
X(N−k)=X∗(k),k∈{0,1,2,⋯,N−1}
MatLAB代码附在文末4.4中。
注意到4.4附录的MatLAB代码有一行,单独拎出来进行解释解释。
figure(2); plot((0:N)/N/dt,abs(X)/N,'b','LineWidth',1.5);
(0:N)/N/dt相当于
F
(
k
⋅
2
π
N
T
)
F\left( {k \cdot \frac{{2\pi }}{{NT}}} \right)
F(k⋅NT2π)中的
k
⋅
1
N
T
k \cdot \frac{1}{{NT}}
k⋅NT1,为什么没有
×
2
π
\times 2\pi
×2π,如果
×
2
π
\times 2\pi
×2π,频率单位就是弧度制rad/s, 如果没有
×
2
π
\times 2\pi
×2π ,频率单位就是Hz。
也就是说 X(k)对应的频率是
2
π
k
N
T
\frac{{2\pi k}}{{NT}}
NT2πk (rad/s) |
k
N
T
\frac{{ k}}{{NT}}
NTk (Hz)。
X ( 0 ) = ∑ n = 0 N − 1 x ( n ) e − i 0 = ∑ n = 0 N − 1 x ( n ) X\left( 0 \right) = \sum\limits_{n = 0}^{N - 1} {x\left( n \right){e^{ - i0}}} = \sum\limits_{n = 0}^{N - 1} {x\left( n \right)} X(0)=n=0∑N−1x(n)e−i0=n=0∑N−1x(n) 没有虚部,是直流分量, 假设 N N N是偶数。
X ( N 2 ) = ∑ n = 0 N − 1 x ( n ) e − i N 2 2 π n N = ∑ n = 0 N − 1 x ( n ) e − i n π = ∑ n = 0 N − 1 x ( n ) cos ( n π ) − ∑ n = 0 N − 1 x ( n ) sin ( n π ) j = ∑ n = 0 N − 1 x ( n ) cos ( n π ) X\left( {\frac{N}{2}} \right) = \sum\limits_{n = 0}^{N - 1} {x\left( n \right){e^{ - i\frac{N}{2}\frac{{2\pi n}}{N}}}} = \sum\limits_{n = 0}^{N - 1} {x\left( n \right){e^{ - in\pi }}} = \sum\limits_{n = 0}^{N - 1} {x\left( n \right)\cos \left( {n\pi } \right)} - \sum\limits_{n = 0}^{N - 1} {x\left( n \right)\sin \left( {n\pi } \right)} j = \sum\limits_{n = 0}^{N - 1} {x\left( n \right)\cos \left( {n\pi } \right)} X(2N)=n=0∑N−1x(n)e−i2NN2πn=n=0∑N−1x(n)e−inπ=n=0∑N−1x(n)cos(nπ)−n=0∑N−1x(n)sin(nπ)j=n=0∑N−1x(n)cos(nπ)
X ( N 2 ) X\left( {\frac{N}{2}} \right) X(2N)也没有虚部,也是直流分量。
下面考虑 x ( n ) x\left( n \right) x(n) ,仍然假设 N N N 是偶数
N
×
x
(
n
)
=
N
×
1
N
∑
k
=
0
N
−
1
[
X
(
k
)
⋅
e
i
k
2
π
n
N
]
=
X
(
0
)
+
X
(
1
)
e
i
2
π
n
N
+
X
(
2
)
e
i
2
2
π
n
N
+
⋯
+
X
(
N
2
)
cos
(
n
π
)
+
X
(
N
2
+
1
)
e
i
(
N
2
+
1
)
2
π
n
N
+
⋯
+
X
(
N
−
1
)
e
i
(
N
−
1
)
2
π
n
N
定义直流分量 A 0 = X ( 0 ) + X ( N 2 ) cos ( n π ) {A_0} = X\left( 0 \right) + X\left( {\frac{N}{2}} \right)\cos \left( {n\pi } \right) A0=X(0)+X(2N)cos(nπ) , 根据傅里叶变换的共轭性质设 X ( N − k ) = a k + b k j X\left( {N - k} \right) = {a_k} + {b_k}j X(N−k)=ak+bkj, X ( k ) = a k − b k j X\left( k \right) = {a_k} - {b_k}j X(k)=ak−bkj
X
(
k
)
e
i
k
2
π
n
N
+
X
(
N
−
k
)
e
i
(
N
−
k
)
2
π
n
N
=
(
a
k
+
b
k
j
)
[
cos
(
k
2
π
n
N
)
+
sin
(
k
2
π
n
N
)
j
]
+
(
a
k
−
b
k
j
)
[
cos
(
2
π
n
−
k
2
π
n
N
)
+
sin
(
2
π
n
−
k
2
π
n
N
)
j
]
=
(
a
k
+
b
k
j
)
[
cos
(
k
2
π
n
N
)
+
sin
(
k
2
π
n
N
)
j
]
+
(
a
k
−
b
k
j
)
[
cos
(
k
2
π
n
N
)
−
sin
(
k
2
π
n
N
)
j
]
=
a
k
cos
(
k
2
π
n
N
)
+
[
a
k
sin
(
k
2
π
n
N
)
+
b
k
cos
(
k
2
π
n
N
)
]
j
−
b
k
sin
(
k
2
π
n
N
)
+
a
k
cos
(
k
2
π
n
N
)
−
[
a
k
sin
(
k
2
π
n
N
)
+
b
k
cos
(
k
2
π
n
N
)
]
j
−
b
k
sin
(
k
2
π
n
N
)
=
2
a
k
cos
(
k
2
π
n
N
)
−
2
b
k
sin
(
k
2
π
n
N
)
=
(
2
a
k
)
2
+
(
2
b
k
)
2
×
[
2
a
k
(
2
a
k
)
2
+
(
2
b
k
)
2
cos
(
k
2
π
n
N
)
−
2
b
k
(
2
a
k
)
2
+
(
2
b
k
)
2
sin
(
k
2
π
n
N
)
]
=
2
a
k
2
+
b
k
2
×
[
cos
φ
k
cos
(
k
2
π
n
N
)
−
sin
φ
k
sin
(
k
2
π
n
N
)
]
=
2
a
k
2
+
b
k
2
cos
(
k
2
π
n
N
+
φ
k
)
=
A
k
cos
(
k
2
π
n
N
+
φ
k
)
,
A
k
=
2
a
k
2
+
b
k
2
,
φ
k
=
arctan
b
k
a
k

N
×
x
(
n
)
=
X
(
0
)
+
X
(
N
2
)
cos
(
n
π
)
+
∑
k
=
1
N
2
−
1
[
X
(
k
)
e
i
k
2
π
n
N
+
X
(
N
−
k
)
e
i
(
N
−
k
)
2
π
n
N
]
=
A
0
+
A
1
cos
(
1
2
π
n
N
+
φ
1
)
+
A
2
cos
(
2
2
π
n
N
+
φ
2
)
+
⋯
+
A
N
2
−
1
cos
(
(
N
2
−
1
)
2
π
n
N
+
φ
N
2
−
1
)
根据上述推导的结论,已经可以给出我们启示。下面用MatLAB实验进行分析和探讨。
还是用1.2使用的序列进行分析
x = 1000 +500* sin(2 * pi * 50 * t + pi/6) + 250 * sin(2 * pi * 150 * t + pi/4) + 100 * sin(2 * pi * 250 * t+pi/3);
其中 T = 0.001; N = 2000; t = (1:N)*dt;
对序列进行x(n)离散傅里叶变换,可得X(k)的幅值和相位图


在我们给出的信号当中,存在一个频率为50Hz的信号500* sin(2 * pi * 50 * t + pi/6)分量,显然它的幅值是500,相位是30°
但在离散傅里叶变换的结果中,却是250的幅值,-60°的相位。 这是为什么呢? 下面进行详细分析。
找到50Hz的信号对应的 X ( k ) , X ( N − k ) X\left( k \right),X\left( {N - k} \right) X(k),X(N−k)
X(k) = 2.5000e+05 - 4.3301e+05i
X(N-k) = 2.5000e+05 + 4.3301e+05i
在本例中 N = 2000
我先给 X(k)和X(N-k)来一个1/N
X(k) = 125 - 216.5i
= ak + bki
X(N-k) = 125 + 216.5i
= ak - bki
根据2.1的推导结论可知,在离散傅里叶逆变换的时,
X
(
k
)
,
X
(
N
−
k
)
X\left( k \right),X\left( {N - k} \right)
X(k),X(N−k) 会产生一个
A
k
cos
(
k
2
π
n
N
+
φ
k
)
{A_k}\cos \left( {k\frac{{2\pi n}}{N} + {\varphi _k}} \right)
Akcos(kN2πn+φk) 信号。
其中, A k = 2 a k 2 + b k 2 = 2 × 125 2 + ( − 216.5 ) 2 = 499 . 989 {A_k} = 2\sqrt {a_k^2 + b_k^2} = 2 \times \sqrt {{{125}^2} + {{\left( { - 216.5} \right)}^2}} = {\rm{499}}{\rm{.989}} Ak=2ak2+bk2=2×1252+(−216.5)2=499.989
到这里,就可以解释信号明明是500的振幅,离散傅里叶变换却产生的是两个幅值为250的复数。
应用:要得到一个频率点的振幅, 离散傅里叶变换之后, 先/N,再*2。
延续上述的分析,重点关注相位, φ k = arctan b k a k = arctan − 216.5 125 = arctan ( − 1 . 732 ) = − 6 0 o {\varphi _k} = \arctan \frac{{{b_k}}}{{{a_k}}} = \arctan \frac{{ - 216.5}}{{125}} = \arctan \left( {{\rm{ - 1}}{\rm{.732}}} \right) = - {60^o} φk=arctanakbk=arctan125−216.5=arctan(−1.732)=−60o
cos ( k 2 π n N + φ k ) = sin [ 90 o + ( k 2 π n N + φ k ) ] = sin ( k 2 π n N + 30 o ) \cos \left( {k\frac{{2\pi n}}{N} + {\varphi _k}} \right) = \sin \left[ {{{90}^o} + \left( {k\frac{{2\pi n}}{N} + {\varphi _k}} \right)} \right] = \sin \left( {k\frac{{2\pi n}}{N} + {{30}^o}} \right) cos(kN2πn+φk)=sin[90o+(kN2πn+φk)]=sin(kN2πn+30o) ,
👉 给点小提示 sin ( 90 o + θ ) = sin [ 90 − ( − θ ) ] = cos ( − θ ) = cos θ \sin \left( {{{90}^o} + \theta } \right) = \sin \left[ {90 - \left( { - \theta } \right)} \right] = \cos \left( { - \theta } \right) = \cos \theta sin(90o+θ)=sin[90−(−θ)]=cos(−θ)=cosθ
到这里,就能解释给定正弦信号的相位明明是30°,离散傅里叶变换产生的相位却是-60°了。
应用:要得到一个频率点的sin相位, 离散傅里叶变换之后, +90°。
进一步分析,假设我把原始信号换成如下的信号呢?
x = 1000 +500* cos(2 * pi * 50 * t + pi/6) + 250 * cos(2 * pi * 150 * t + pi/4) + 100 * cos(2 * pi * 250 * t+pi/3);
结果如下


仍然只关注50Hz处,结果可以看出相位是30°与给定相位符和。 因为给定的原始信号本身就是余弦信号,所以不需要+90°就能得到余弦的相位。
下面从理论上去证明离散傅里叶变换的周期性质。
X
(
N
+
k
)
=
∑
n
=
0
N
−
1
x
(
n
)
e
−
i
(
2
π
n
+
k
2
π
n
N
)
=
∑
n
=
0
N
−
1
x
(
n
)
e
−
i
(
2
π
n
+
k
2
π
n
N
)
=
∑
n
=
0
N
−
1
x
(
n
)
[
cos
(
2
π
n
+
k
2
π
n
N
)
−
j
sin
(
2
π
n
+
k
2
π
n
N
)
]
同用到cos和sin函数都是以2Π为周期的函数,因此
X
(
N
+
k
)
=
∑
n
=
0
N
−
1
x
(
n
)
[
cos
(
2
π
n
+
k
2
π
n
N
)
−
j
sin
(
2
π
n
+
k
2
π
n
N
)
]
=
∑
n
=
0
N
−
1
x
(
n
)
[
cos
(
k
2
π
n
N
)
−
j
sin
(
k
2
π
n
N
)
]
=
∑
n
=
0
N
−
1
x
(
n
)
e
−
i
k
2
π
n
N
=
X
(
k
)
X ( N + k ) = X ( k ) X\left( {N + k} \right) = X\left( k \right) X(N+k)=X(k)这说明了离散傅里叶变换是以 N N N为周期的周期函数。
把X(k) | X(N+k) | X(2N+k)全部都画出来了。【代码,将上述MatlLAB的num赋值为3即可】

从图中可以看出离散傅里叶变换是周期性质的,其中每个周期开始的第一个值,是直流分量。用下图用红色方框分别构框住了三个周期。

close all; clear all; clc;
dt = 0.001;
N = 2000;
t = (1:N)*dt;
x = 1000 + 500 * sin(2 * pi * 50 * t + pi/6) + 250 * sin(2 * pi * 150 * t + pi/4) + 100 * sin(2 * pi * 250 * t+pi/3);
% x = 1000 +500* cos(2 * pi * 50 * t + pi/6) + 250 * cos(2 * pi * 150 * t + pi/4) + 100 * cos(2 * pi * 250 * t+pi/3);
figure(1);plot(t,x,'r','LineWidth',1.5);grid on; hold on; title('生成的离散信号');
xlabel('时间 T / s');
num = 1;
% num = 3;
% DFT
X = zeros(1,num*N+1);
for k=1:num*N
for n = 1:N
X(k) = X(k) + x(n)*exp((-(k-1)*2*pi*n/N)*1i);
end
end
figure(2);plot((0:num*N)/(N*dt),abs(X)/N,'b','LineWidth',1.5);grid on; hold on; title('离散傅里叶变换-幅值'); xlabel('频率f / Hz');
axis([-100,num*1000+100,-500,1500]);
P = angle(X)*180/pi;
P1 = zeros(1,N+1);
P1(0+1)=P(0+1);
P1(100+1)=P(100+1);
P1(300+1)=P(300+1);
P1(500+1)=P(500+1);
P1(N+1-0)=P(N+1-0);
P1(N+1-100)=P(N+1-100);
P1(N+1-300)=P(N+1-300);
P1(N+1-500)=P(N+1-500);
figure(3);plot((0:N)/(N*dt),P1,'b','LineWidth',1.5);grid on; hold on; title('离散傅里叶变换-相位(仅提取了关注的位置)');
xlabel('频率f / Hz');
axis([-100,1100,-180,180]);
%IDFT
y = zeros(1,N);
for n=1:N
for k = 1:N
y(n) = y(n) + (1/N)*X(k)*exp(((k-1)*2*pi*n/N)*1i);
end
end
figure(4);plot(t,y,'k','LineWidth',1.5);grid on; hold on; title('离散傅里叶逆变换');
xlabel('时间 T / s');
figure(5);plot(t,x-y,'g','LineWidth',1.5);grid on; hold on; title('误差');
系列学习链接:欢迎大家点赞、收藏、留言讨论。
傅里叶级数与傅里叶变换_Part0_欧拉公式证明+三角函数和差公式证明
傅里叶级数与傅里叶变换_Part2_周期为2Π的函数展开为傅里叶级数
傅里叶级数与傅里叶变换_Part3_周期为2L的函数展开为傅里叶级数