此篇博文主要简述傅里叶变换的相关概念以及如何代码实现离散序列的傅里叶变换。
傅里叶变换的一般形式
我们都知道,傅里叶变换是频域分析的重要工具;其将信号从时域转换到了频域,以更直观的角度向我们展示了信号的本质——频率。下面先不加证明地引出傅里叶变换的公式:
连续非周期信号
傅里叶变换为:
X
(
w
)
=
∫
−
∞
∞
x
(
t
)
e
−
j
w
t
d
t
X(w)=\int_{-\infty}^{\infty} x(t) e^{-j w t} d t
X(w)=∫−∞∞x(t)e−jwtdt
傅里叶反变换为:
x
(
t
)
=
1
2
π
∫
−
∞
∞
X
(
j
w
)
e
j
w
t
d
w
x(t)=\frac{1}{2 \pi} \int_{-\infty}^{\infty} X(j w) e^{j w t} d w
x(t)=2π1∫−∞∞X(jw)ejwtdw
连续周期信号
傅里叶变换为:
X
(
n
w
0
)
=
1
T
∫
t
0
t
0
+
T
x
~
(
t
)
e
−
j
n
w
0
t
d
t
X\left(n w_{0}\right)=\frac{1}{T} \int_{t_{0}}^{t_{0}+T} \tilde{x}(t) e^{-j n w_{0} t} d t
X(nw0)=T1∫t0t0+Tx~(t)e−jnw0tdt
傅里叶反变换为:
x
(
t
)
=
∑
n
=
−
∞
∞
X
(
n
w
0
)
e
j
n
w
0
t
x(t)=\sum_{\mathbf{n}=-\infty}^{\infty} X\left(n w_{0}\right) e^{j n w_{0} t}
x(t)=n=−∞∑∞X(nw0)ejnw0t
其中 w 0 = 2 π T w_{0}=\frac{2 \pi}{T} w0=T2π
离散非周期信号
傅里叶变换为:
X
~
(
e
j
Ω
T
)
=
∑
n
=
−
∞
∞
x
(
n
T
)
e
−
j
n
Ω
T
\tilde{X}\left(e^{j \Omega T}\right)=\sum_{n=-\infty}^{\infty} x(n T) e^{-j n \Omega T}
X~(ejΩT)=n=−∞∑∞x(nT)e−jnΩT
傅里叶反变换为:
x
(
n
T
)
=
T
2
π
∫
−
π
T
π
T
X
(
e
j
Ω
T
)
e
j
n
Ω
T
d
Ω
x(n T)=\frac{T}{2 \pi} \int_{-\frac{\pi}{T}}^{\frac{\pi}{T}} X\left(e^{j \Omega T}\right) e^{j n \Omega T} d \Omega
x(nT)=2πT∫−TπTπX(ejΩT)ejnΩTdΩ
其中: Ω = k Ω 0 = 2 π N T k = 2 π f s N k = 2 π f \Omega=k \Omega_{0}=\frac{2 \pi}{N T} k=\frac{2 \pi f_{s}}{N} k=2 \pi f Ω=kΩ0=NT2πk=N2πfsk=2πf, f s f_{s} fs为采样频率。
离散周期信号
傅里叶变换为:
X
~
(
k
)
=
∑
n
=
0
N
−
1
x
~
(
n
)
e
−
j
2
π
N
n
k
\tilde{X}(k)=\sum_{n=0}^{N-1} \tilde{x}(n) e^{-j \frac{2 \pi}{N} n k}
X~(k)=n=0∑N−1x~(n)e−jN2πnk
傅里叶反变换为:
x
~
(
n
)
=
1
N
∑
k
=
0
N
−
1
X
~
(
k
)
e
j
2
π
N
n
k
\tilde{x}(n)=\frac{1}{N} \sum_{k=0}^{N-1} \tilde{X}(k) e^{j \frac{2 \pi}{N} n k}
x~(n)=N1k=0∑N−1X~(k)ejN2πnk
根据上述变换的形式,我们可以总结出如下结论:
结论
- 连续非周期信号的傅里叶变换为非周期连续函数——傅里叶变换;
- 连续周期信号的傅里叶变换为非周期离散函数——傅里叶级数;
- 离散非周期信号的傅里叶变换为周期连续函数——离散时间傅里叶变换;
- 离散周期信号的傅里叶变换为周期离散函数——离散傅里叶级数。
即时域上的离散对应频域上的周期,时域上的周期对应频域上的离散;
拓展1:对时域中的信号进行采样转化为离散序列时,相当于冲激采样信号与被采样信号时域上相乘(等价于频域上的卷积);从而时域上的采样会引起频域上的周期延拓(这回答了为何离散化的时域信号其频谱呈现周期性)。下图详细描述了这一点:
此外从上图可以看出,由于
w
s
=
2
π
T
s
w_s = \frac{2\pi}{T_s}
ws=Ts2π,当
w
s
<
2
w
m
w_s <2w_m
ws<2wm时,采样后的信号会出现频率混叠;这要求我们要想通过采样不失真地复现原信号,采样频率必须高于信号中最高频率分量的两倍(奈奎斯特采样定理)。
拓展2:为了从采样信号中复现原信号,观察采样后的频谱图可知,只需将采样后的信号通过理想低通滤波器即可,但由于理想低通滤波器的物理不可实现性,工程中常用零阶保持器来代替;至此原信号通过冲激采样信号采样再通过零阶保持器便完成了信号的采样和保持,最终得到了阶梯状的信号序列,如下图所示:
离散傅里叶级数
接着来看离散周期信号的傅里叶变换(即离散傅里叶级数
D
F
S
DFS
DFS)
其傅里叶变换如下所示:
X
~
(
k
)
=
∑
n
=
0
N
−
1
x
~
(
n
)
e
−
j
2
π
N
n
k
\tilde{X}(k)=\sum_{n=0}^{N-1} \tilde{x}(n) e^{-j \frac{2 \pi}{N} n k}
X~(k)=n=0∑N−1x~(n)e−jN2πnk
实际上,由于离散信号的傅里叶变换是周期函数,故
X
~
(
k
)
\tilde{X}(k)
X~(k)有无穷多项,为方便计算,取
k
k
k的上限为
N
−
1
N-1
N−1(事实上,此时系数矩阵满秩,方程具有唯一解);将上式写成矩阵形式则有:
X
~
=
W
N
x
~
\tilde{X}=W_{N} \tilde{x}
X~=WNx~
即:
[
1
1
⋯
1
1
W
N
1
⋯
W
N
N
−
1
⋮
⋮
⋱
⋮
1
W
N
N
−
1
⋯
W
N
(
N
−
1
)
2
]
[
x
~
(
0
)
x
~
(
1
)
⋮
x
~
(
N
−
1
)
]
=
[
X
~
(
0
)
X
~
(
1
)
⋮
X
~
(
N
−
1
)
]
\left[\begin{array}{cccc}{1} & {1} & {\cdots} & {1} \\ {1} & {W_{N}^{1}} & {\cdots} & {W_{N}^{N-1}} \\ {\vdots} & {\vdots} & {\ddots} & {\vdots} \\ {1} & {W_{N}^{N-1}} & {\cdots} & {W_{N}^{(N-1)^{2}}}\end{array}\right]\left[\begin{array}{c}{\tilde{x}(0)} \\ {\tilde{x}(1)} \\ {\vdots} \\ {\tilde{x}(\mathrm{N}-1)}\end{array}\right]=\left[\begin{array}{c}{\tilde{X}(0)} \\ {\tilde{X}(1)} \\ {\vdots} \\ {\tilde{X}(\mathrm{N}-1)}\end{array}\right]
⎣⎢⎢⎢⎡11⋮11WN1⋮WNN−1⋯⋯⋱⋯1WNN−1⋮WN(N−1)2⎦⎥⎥⎥⎤⎣⎢⎢⎢⎡x~(0)x~(1)⋮x~(N−1)⎦⎥⎥⎥⎤=⎣⎢⎢⎢⎡X~(0)X~(1)⋮X~(N−1)⎦⎥⎥⎥⎤
其中:
W N = e − j 2 π N W_{N}=e^{-j \frac{2 \pi}{N}} WN=e−jN2π
上述矩阵即为DFS矩阵,观察其形式可知其为范德蒙矩阵,则其逆可表示为:
W N − 1 = 1 N W N ∗ W_{N}^{-1}=\frac{1}{N} W_{N}^{*} WN−1=N1WN∗
进一步可以写成:
W
N
−
1
=
[
1
1
⋯
1
1
W
N
1
⋯
W
N
N
−
1
⋮
⋮
⋱
⋮
1
W
N
N
−
1
⋯
W
N
(
N
−
1
)
2
]
−
1
=
1
N
[
1
1
⋯
1
1
W
N
−
1
⋯
W
N
−
(
N
−
1
)
⋮
⋮
⋱
⋮
1
W
N
−
(
N
−
1
)
⋯
W
N
−
(
N
−
1
)
2
]
W_{N}^{-1}=\left[\begin{array}{cccc}{1} & {1} & {\cdots} & {1} \\ {1} & {W_{N}^{1}} & {\cdots} & {W_{N}^{N-1}} \\ {\vdots} & {\vdots} & {\ddots} & {\vdots} \\ {1} & {W_{N}^{N-1}} & {\cdots} & {W_{N}^{(N-1)^{2}}}\end{array}\right]^{-1}=\frac{1}{N}\left[\begin{array}{cccc}{1} & {1} & {\cdots} & {1} \\ {1} & {W_{N}^{-1}} & {\cdots} & {W_{N}^{-(N-1)}} \\ {\vdots} & {\vdots} & {\ddots} & {\vdots} \\ {1} & {W_{N}^{-(N-1)}} & {\cdots} & {W_{N}^{-(N-1)^{2}}}\end{array}\right]
WN−1=⎣⎢⎢⎢⎡11⋮11WN1⋮WNN−1⋯⋯⋱⋯1WNN−1⋮WN(N−1)2⎦⎥⎥⎥⎤−1=N1⎣⎢⎢⎢⎢⎡11⋮11WN−1⋮WN−(N−1)⋯⋯⋱⋯1WN−(N−1)⋮WN−(N−1)2⎦⎥⎥⎥⎥⎤
上述步骤的详细证明
同样地,可以写出离散周期信号的傅里叶反变换形式为:
x ~ = W N − 1 X ~ \tilde{x}=W_{N}^{-1} \tilde{X} x~=WN−1X~
傅里叶变换在MATLAB中的实现
上述步骤在Matlab中的实现为:
%DFS:
function [Xk] = dfs(xn,N)
n=0:1:N-1;
k=0:1:N-1;
WN = exp(-j*2*pi/N);
nk = n'*k;
WNnk = WN.^nk;
Xk = xn*WNnk;
end
%IDFS:
function [Xk] = dfs(xn,N)
n=0:1:N-1;
k=0:1:N-1;
WN = exp(-j*2*pi/N);
nk = n'*k;
WNnk = WN.^(-nk);
Xk = xn*WNnk/N;
end
一个例子:
Ts = 0.01; %离散步长
T = 10; %采样时间
t= Ts:Ts:T;%采样步长
w1 = 5*2*pi;
w2 = 20*2*pi;
w3 = 35*2*pi; %频率分量,单位为弧度
N=length(t); %样点个数
y= cos(w1*t) + cos(w2*t) + cos(w3*t);
Fs=1/Ts; %采样频率
df=Fs/(N-1) ; %分辨率
f=(0:N-1)*df; %其中每点的频率
Xf = dfs(y,N); %傅里叶变换
Phase = zeros(1,len); %用于存储各频率点的幅值
Amplitude = zeros(1,len);%用于存储各频率点的相位
%幅值
for i=1:N
Amplitude(i) = abs(Xf(i));
Phase(i) = angle(Xf(i));
end
%绘制源信号波形
figure(1)
plot(t,y)
grid on
%绘制频谱图
figure(2)
plot(f,2*Amplitude/N)
xlabel('频率/Hz')
ylabel('幅值')
grid on
原信号波形:
频谱图(原图):
频谱图(截断处理后):
注意
1.对于一个时域信号
x
(
t
)
x(t)
x(t),采样频率为
F
s
F_s
Fs,采样点数为
N
N
N,采样后序列为
y
(
n
)
y(n)
y(n),则上述
F
=
d
f
s
(
y
,
N
)
F=dfs(y,N)
F=dfs(y,N)计算所得的结果就是一个有
N
N
N个元素的复数序列
a
n
+
b
n
j
a_n + b_n j
an+bnj;该序列每一个复数对应着一个频率点,复数的模值和相角对应信号在该频率值下的幅相特性;
2.频率:
F
F
F序列的第
n
n
n点处的对应的实际频率是
n
∗
F
s
/
N
n*Fs/N
n∗Fs/N;
3.幅值:
F
F
F序列的第
n
n
n点处对应的复数为
a
+
b
j
a+bj
a+bj,模值
A
=
a
2
+
b
2
A=\sqrt{a^2+b^2}
A=a2+b2,那么实际信号在该频率值下的幅值是
2
∗
A
/
N
2*A/N
2∗A/N;特别的,当
n
=
0
n=0
n=0时,对应幅值为
A
/
N
A/N
A/N;
4.相位:
F
F
F序列每个频率点处的复数的相位就是信号在该频率值下的相位;
5.采样频率必须大于信号中最高频率分量的两倍,否则会引起频率混叠;
6.
D
F
S
DFS
DFS得到的
F
F
F序列关于中间位置
F
s
/
2
F_s/2
Fs/2对称(周期性),由采样定理可知,高于
F
s
/
2
F_s/2
Fs/2的信号将会出现频率混叠,频谱图显示的最高频率应为
F
s
/
2
F_s/2
Fs/2,故需对
F
F
F序列的横坐标进行截断处理。
离散傅里叶变换
离散傅里叶级数(DFS)提供了一种对离散时间傅里叶变换做数值计算的技巧,它在时域和频域都是周期的,但在实际中大多数信号不具有周期性,且很可能只具有有限持续时间。这就要求我们探讨一种对非周期离散有限信号序列进行傅里叶变换的方法,即离散傅里叶变换(DFT)。
DFT是对任意有限持续时间序列可数值计算的傅里叶变换
长度为N的有限长序列
x
(
n
)
x(n)
x(n)可以看作周期序列
x
~
(
n
)
\tilde{x}(n)
x~(n)的主值序列,同样的
x
~
(
n
)
\tilde{x}(n)
x~(n)可以看作
x
(
n
)
x(n)
x(n)的周期延拓。
由于无频率混叠,则时域中的一个周期长的主值序列对应于频域中的一个周期长的主值序列。从DFS的时域和频域中各取出一个周期,即可得到有限长度的离散序列的时域和频域傅里叶变换。
{
X
(
k
)
=
[
∑
n
=
0
N
−
1
x
~
(
n
)
W
N
n
k
]
R
N
(
k
)
=
X
~
(
k
)
R
N
(
k
)
x
(
n
)
=
[
1
N
∑
k
=
0
N
−
1
X
~
(
k
)
W
N
−
n
k
]
R
N
(
n
)
=
x
~
(
n
)
R
N
(
n
)
\left\{\begin{array}{l}{X(k)=\left[\sum_{n=0}^{N-1} \tilde{x}(n) W_{N}^{n k}\right] R_{N}(k)=\tilde{X}(k) R_{N}(k)} \\ {x(n)=\left[\frac{1}{N} \sum_{k=0}^{N-1} \tilde{X}(k) W_{N}^{-n k}\right] R_{N}(n)=\tilde{x}(n) R_{N}(n)} \end{array}\right.
⎩⎨⎧X(k)=[∑n=0N−1x~(n)WNnk]RN(k)=X~(k)RN(k)x(n)=[N1∑k=0N−1X~(k)WN−nk]RN(n)=x~(n)RN(n)
其中
R
N
(
k
)
R_{N}(k)
RN(k)和
R
N
(
n
)
R_{N}(n)
RN(n)均为窗函数,负责从时域与频域序列中取出主值序列。即可得到:
{ X ( k ) = D F T [ x ( n ) ] = ∑ n = 0 N − 1 x ( n ) W N n k 0 ≤ k ≤ N − 1 x ( n ) = IDFT [ X ( k ) ] = 1 N ∑ k = 0 N − 1 X ( k ) W N − n k 0 ≤ n ≤ N − 1 \left\{\begin{array}{l} {X(k)=D F T[x(n)]=\sum_{n=0}^{N-1} x(n) W_{N}^{n k} \quad 0 \leq k \leq N-1} \\ {x(n)=\operatorname{IDFT}[X(k)]=\frac{1}{N} \sum_{k=0}^{N-1} X(k) W_{N}^{-n k} \quad 0 \leq n \leq N-1} \end{array}\right. {X(k)=DFT[x(n)]=∑n=0N−1x(n)WNnk0≤k≤N−1x(n)=IDFT[X(k)]=N1∑k=0N−1X(k)WN−nk0≤n≤N−1
事实上,DFS与DFT的表达式没有本质区别。