傅里叶变换与Matlab
前言
很多初学者学习了傅里叶变换之后,只是对其公式死记硬背,从而达到做题的目的,但并不理解其原理,对于很多时频分析问题的理解不够透彻。之前自己也是如此,在经过深入学习之后,对变换公式的的本质进行探讨,理解变换的原理及意义所在,同时将傅里叶变换和时频分析结合起来,运用理论和实际相结合的方式,形成一个较为系统的概念,可以从而这个系统从而引伸到其他方面,也加深自己的理解。
同时,将对在Matlab中进行FFT变换进行简要分析,解决一些相关问题,加深理解。
本文采用正弦信号作为FFT变换演示。如有不足之处,希望大家指出。
一、背景
1、如果大家已经学习了傅里叶变换,那么大家肯定也从老师或者相关书籍了解到了它对重要性。在信号分析领域,它的重要性就类比于正余弦信号在数学中重要性。但是如果只是经过初始的学习,不能够将所学串联起来,很难建立一个系统的概念。
2、在使用Matlab中的FFT变换进行信号的频域分析,但是对FFT变换Matlab代码中的一些基本构成却不是很明白。
二、原理
傅里叶告诉我们,现实中的所有信号波形都可以视为一系列正弦信号的叠加。而傅里叶变换则是将原始波形分解为一系列的正弦频率。
傅里叶变换:
连续时间傅里叶变换:
F
(
j
w
)
=
∫
−
∞
+
∞
x
(
t
)
e
−
j
w
t
d
t
F(jw) = \int_{-\infty}^{+\infty}x(t)e^{-jwt}dt
F(jw)=∫−∞+∞x(t)e−jwtdt
离散时间傅里叶变换:
X
(
e
j
w
)
=
∑
i
=
−
∞
+
∞
x
[
n
]
e
−
j
w
n
X(e^{jw})=\sum_{i=-\infty}^{+\infty}x[n]e^{-jwn}
X(ejw)=i=−∞∑+∞x[n]e−jwn
根据欧拉公式:
e
j
θ
=
c
o
s
(
θ
)
+
j
s
i
n
(
θ
)
e^{j\theta}=cos(\theta)+jsin(\theta)
ejθ=cos(θ)+jsin(θ)
可以知道傅里叶变换的本质就是将原始信号表示为一系列正弦信号的叠加。分别从时间方向和频率方向仔细观察下图。可知,在时间方向上,原始信号波形被分解为一系列正弦波形;在频率方向上,原始波形被分解为对应的单一正弦频率。
二、Matlab演示
此代码中我们运用matlab产生一个频率分布为30Hz和100Hz正弦信号叠加而成的一个信号:
x
(
t
)
=
0.5
∗
s
i
n
(
2
∗
p
i
∗
30
∗
t
)
+
s
i
n
(
2
∗
p
i
∗
100
∗
t
)
x(t) = 0.5*sin(2*pi*30*t) + sin(2*pi*100*t)
x(t)=0.5∗sin(2∗pi∗30∗t)+sin(2∗pi∗100∗t)。然后对信号添加均值为0,方差为4的噪声:
w
(
t
)
=
2
∗
r
a
n
d
n
(
s
i
z
e
(
t
)
)
w(t)=2*randn(size(t))
w(t)=2∗randn(size(t))(也可使用awgn函数添加噪声)。和信号为
s
(
t
)
=
x
(
t
)
+
w
(
t
)
s(t)=x(t)+w(t)
s(t)=x(t)+w(t)
然后我们对信号
s
(
t
)
s(t)
s(t)进行FFT变换,分别得到双边谱和单边谱信息。Matlab代码如下:
首先生成信号并添加噪声:
Fs = 1000; % 采样率(HZ)
T = 1/Fs; % 采样间隔(秒/S)
L = 1500; % 信号长度(毫秒/ms)
t = (0:L-1)*T; % 时间向量
x = sin(2*pi*30*t) + sin(2*pi*100*t); %频率分别为50Hz和120Hz的合成信号
%原始信号时域表示图
figure(1)
plot(1000*t(1:500),x(1:500)) %原始长度1500s,为方便观察,取500ms显示
title('原始信号时域表示')
xlabel('t (毫秒)')
ylabel('x(t)')
添加均值为0,方差为4的噪声: w ( t ) = 2 ∗ r a n d n ( s i z e ( t ) ) w(t)=2*randn(size(t)) w(t)=2∗randn(size(t));含噪信号: s ( t ) = x ( t ) + w ( t ) s(t)=x(t)+w(t) s(t)=x(t)+w(t):
%加噪
s = x + 2*randn(size(t)); %添加均值为0,方差为4的随机噪声
%含噪信号时域表示图
figure(2)
plot(1000*t(1:500),s(1:500))
title('含噪信号时域表示:')
xlabel('t (毫秒)')
ylabel('x(t)')
生成原始信号和加噪信号时域图:
然后我们对信号进行FFT变换,得到双边谱和单边谱:
%计算频域信息
y = fft(s); %计算信号的傅里叶变换。
P2 = abs(y/L); %取绝对值
P1 = P2(1:L/2+1); %单侧谱
P1(2:end-1) = 2*P1(2:end-1);
f = Fs*(0:L-1)/L;
f1 = Fs*(0:(L/2))/L; %横坐标坐标变换
%信号频谱图
figure(3)
plot(f,P2)
title('含噪信号s(t)的双边谱')
xlabel('f (Hz)')
ylabel('|P1(f)|')
figure(4)
plot(f1,P1)
title('含噪信号s(t)的单边谱')
xlabel('f (Hz)')
ylabel('|P1(f)|')
生成单边谱和双边谱图像:
二、问题分析
1.单边谱和双边谱
在Matlab中对信号进行FFT变换时,如果不加处理,变换出来的频谱就和上图的双边谱一样,会产生一个镜像频谱,但是这个镜像频谱不是我们所需要的,就需要对变换的频谱进行处理,从而得到信道得单边频谱。我们可以对频域生成图像进行处理,只显示频域图像正半轴的信号,以方便我们的观察。
1.变换后的频域坐标讨论
对于这个问题,当时自己也不明白在变换后的代码中为何要加入下面这段代码,只知道是时域与频域的一个对应关系。
f1 = Fs*(0:(L/2))/L; %横坐标坐标变换
下面,结合查阅资料,理解如下。
由于机器只能处理数字信号,在Matlab中,我们所观察到的连续的时间信号其实是由一个个足够密的采样点连接而成,而不是我们所认为的连续信号,不过当采样点足够密时,可以在一定程度上认为它是连续信号。那么,在Matlab中信号的组成就是由一个个(x,y)点。有了这个理解就不难领悟下面的解释。首先,要说这个频域横坐标的来源,得涉及一个频域的参数:频率分辨率(
Δ
f
=
Δf =
Δf=
F
s
N
\frac{Fs}{N}
NFs);在Matlab中时域有时间分辨率,那么频域自然也有对应的频率分辨率。
由于是显示的单边谱,那么就只显示信号一边的频谱,那么结合频域长度和频域的分辨率,就自然可以得到频域的横坐标来源了。文章来源:https://www.toymoban.com/news/detail-809044.html
点数 | 0 | 1 | 2 | 3 | 4 | … | L 2 \frac{L}{2} 2L |
---|---|---|---|---|---|---|---|
横坐标表示 | 0 ∗ F s N 0*\frac{Fs}{N} 0∗NFs | 1 ∗ F s N 1*\frac{Fs}{N} 1∗NFs | 2 ∗ F s N 2*\frac{Fs}{N} 2∗NFs | 3 ∗ F s N 3*\frac{Fs}{N} 3∗NFs | 4 ∗ F s N 4*\frac{Fs}{N} 4∗NFs | … | L 2 ∗ F s N \frac{L}{2}*\frac{Fs}{N} 2L∗NFs |
对应值 | 0.6667 | 1.3333 | 2 | 2.6667 | 3.3333 | … | 500 |
三、总结
综上所述,本文通过对傅里叶变换公式本质的讨论,得到傅里叶变换的本质就是将原始信号分解为一系列正弦信号的组合,通过傅里叶变换,我们可以得到原始信号的频率组成,以便于对信号在频域进行滤波等处理。例如,假如原始信号的频率范围为100~200HZ,而且其中添加了其它频率成分的噪声,那么我就可以通过一个带通滤波器,过滤之后保留100·200HZ的信号,从而实现原始信号的恢复。同时,利用matlab对FFT变换之后的频域单边谱、双边谱以及坐标组成进行了演示。将理论与实际相结合,以便于更深的理解及运用。文章来源地址https://www.toymoban.com/news/detail-809044.html
到了这里,关于傅里叶变换与Matlab的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!