Matlab---傅里叶变换---通俗理解(二)

1、用Matlab进行傅立叶变换

FFT是离散傅里叶变换的高速算法,能够将一个信号变换到频域。有些信号在时域上是非常难看出什么特征的,可是假设变换到频域之后,就非常easy看出特征了。这就是非常多信号分析採用FFT变换的原因。

另外,FFT能够将一个信号的频谱提取出来。这在频谱分析方面也是经经常使用的。

FFT结果的详细物理意义。

一个模拟信号。经过ADC採样之后,就变成了数字信号。採样定理告诉我们,採样频率要大于信号频率的两倍。

採样得到的数字信号,就能够做FFT变换了。N个採样点,经过FFT之后,就能够得到N个点的FFT结果。

为了方便进行FFT运算,通常N取2的整数次方。

如果採样频率为Fs。信号频率F。採样点数为N。那么FFT之后结果就是一个为N点的复数。每一个点就相应着一个频率点。这个点的模值,就是该频率值下的幅度特性。详细跟原始信号的幅度有什么关系呢?如果原始信号的峰值为A,那么FFT的结果的每一个点(除了第一个点直流分量之外)的模值就是A的N/2倍。而第一个点就是直流分量,它的模值就是直流分量的N倍。

而每一个点的相位呢。就是在该频率下的信号的相位。第一个点表示直流分量(即0Hz),而最后一个点N的再下一个点(实际上这个点是不存在的,这里是如果的第N+1个点。也能够看做是将第一个点分做两半分,还有一半移到最后)则表示採样频率Fs,这中间被N-1个点平均分成N等份,每一个点的频率依次添加。比如某点n所表示的频率为:Fn=(n-1)*Fs/N。

由上面的公式能够看出,Fn所能分辨到频率为为Fs/N,如果採样频率Fs为1024Hz,採样点数为1024点,则能够分辨到1Hz。1024Hz的採样率採样1024点。刚好是1秒,也就是说,採样1秒时间的信号并做FFT,则结果能够分析到1Hz,如果採样2秒时间的信号并做FFT。则结果能够分析到0.5Hz。如果要提高频率分辨力。则必须添加採样点数,也即採样时间。频率分辨率和採样时间是倒数关系。

如果FFT之后某点n用复数a+bi表示,那么这个复数的模就是An=根号a*a+b*b。相位就是Pn=atan2(b,a)。依据以上的结果。就能够计算出n点(n≠1,且n<=N/2)相应的信号的表达式为:An/(N/2)*cos(2*pi*Fn*t+Pn)。即2*An/N*cos(2*pi*Fn*t+Pn)。对于n=1点的信号,是直流分量,幅度即为A1/N。

因为FFT结果的对称性。通常我们仅仅使用前半部分的结果,即小于採样频率一半的结果。

2、以下以一个实际的信号来做说明

如果我们有一个信号,它含有2V的直流分量,频率为50Hz、相位为-30度、幅度为3V的交流信号。以及一个频率为75Hz、相位为90度、幅度为1.5V的交流信号。用数学表达式就是例如以下:S=2+3*cos(2*pi*50*t-pi*30/180)+1.5*cos(2*pi*75*t+pi*90/180)。式中cos參数为弧度。所以-30度和90度要分别换算成弧度。我们以256Hz的採样率对这个信号进行採样,总共採样256点。依照我们上面的分析,Fn=(n-1)*Fs/N,我们能够知道。每两个点之间的间距就是1Hz,第n个点的频率就是n-1。

我们的信号有3个频率:0Hz、50Hz、75Hz。应该分别在第1个点、第51个点、第76个点上出现峰值,其他各点应该接近0。

实际情况怎样呢?我们来看看FFT的结果的模值如图所看到的。

从图中我们能够看到,在第1点、第51点、和第76点附近有比較大的值。我们分别将这三个点附近的数据拿上来细看:

1点: 512+0i

2点: -2.6195E-14 - 1.4162E-13i

3点: -2.8586E-14 - 1.1898E-13i

50点:-6.2076E-13 - 2.1713E-12i

51点:332.55 - 192i

52点:-1.6707E-12 - 1.5241E-12i

75点:-2.2199E-13 -1.0076E-12i

76点:3.4315E-12 + 192i

77点:-3.0263E-14 +7.5609E-13i

非常明显,1点、51点、76点的值都比較大。它附近的点值都非常小。能够觉得是0,即在那些频率点上的信号幅度为0。接着,我们来计算各点的幅度值。分别计算这三个点的模值。结果例如以下:

1点: 512

51点:384

76点:192

依照公式。能够计算出直流分量为:512/N=512/256=2;50Hz信号的幅度为:384/(N/2)=384/(256/2)=3。75Hz信号的幅度为192/(N/2)=192/(256/2)=1.5。可见,从频谱分析出来的幅度是正确的。

然后再来计算相位信息。直流信号没有相位可言,不用管它。先计算50Hz信号的相位,atan2(-192, 332.55)=-0.5236,结果是弧度,换算为角度就是180*(-0.5236)/pi=-30.0001。再计算75Hz信号的相位,atan2(192,
3.4315E-12)=1.5708弧度,换算成角度就是180*1.5708/pi=90.0002。

可见,相位也是对的。依据FFT结果以及上面的分析计算。我们就能够写出信号的表达式了。它就是我们開始提供的信号。

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZ3VvbXV0aWFuOTEx/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" >

相应上图2中的FFT模值

三、总结

如果採样频率为Fs,採样点数为N,做FFT之后,某一点n(n从1開始)表示的频率为:Fn=(n-1)*Fs/N;该点的模值除以N/2就是相应该频率下的信号的幅度(对于直流信号是除以N)。该点的相位即是相应该频率下的信号的相位。

相位的计算可用函数atan2(b,a)计算。atan2(b,a)是求坐标为(a,b)点的角度值,范围从-pi到pi。

要精确到xHz,则须要採样长度为1/x秒的信号,并做FFT。

要提高频率分辨率。就须要添加採样点数,这在一些实际的应用中是不现实的,须要在较短的时间内完毕分析。

解决问题的方法有频率细分法,比較简单的方法是採样比較短时间的信号,然后在后面补充一定数量的0,使其长度达到须要的点数,再做FFT,这在一定程度上可以提高频率分辨力。

详细的频率细分法可參考相关文献。

时间: 2024-10-11 23:08:02

Matlab---傅里叶变换---通俗理解(二)的相关文章

傅里叶变换通俗解释及快速傅里叶变换的python实现

通俗理解傅里叶变换,先看这篇文章傅里叶变换的通俗理解! 接下来便是使用python进行傅里叶FFT-频谱分析: 一.一些关键概念的引入 1.离散傅里叶变换(DFT) 离散傅里叶变换(discrete Fourier transform) 傅里叶分析方法是信号分析的最基本方法,傅里叶变换是傅里叶分析的核心,通过它把信号从时间域变换到频率域,进而研究信号的频谱结构和变化规律.但是它的致命缺点是:计算量太大,时间复杂度太高,当采样点数太高的时候,计算缓慢,由此出现了DFT的快速实现,即下面的快速傅里叶

通俗理解数据库隔离机制

=========================================== 原文链接: 通俗理解数据库隔离机制   转载请注明出处! =========================================== 在理解数据库隔离机制的时候发现网上很多文章都是千篇一律,解释语言太过于标准书面化,描述的晦涩难懂,因果关系模糊.在这里将自己对隔离机制的理解描述一下,力争做到能够通过浅显的语言描述出来. 数据库隔离机制是对于多线程同时操作数据库而言的.对于单线程操作数据库不存在所谓

分布式理论之一:Paxos算法的通俗理解

维基的简介:Paxos算法是莱斯利·兰伯特(Leslie Lamport,就是 LaTeX 中的"La",此人现在在微软研究院)于1990年提出的一种基于消息传递且具有高度容错特性的一致性算法. Paxos算法目前在Google的Chubby.MegaStore.Spanner等系统中得到了应用,Hadoop中的ZooKeeper也使用了Paxos算法,在上面的各个系统中,使用的算法与Lamport提出的原始Paxos并不完全一样,这个以后再慢慢分析.本博文的目的是,如何让一个小白在半

spring深入理解二(关于容器工作源码)

spring基本工作原理如下: 1.查找bean配置文件 2.加载bean配置文件并解析生成中间表示BeanDefinition 3.注册beanDefinition 4.如果是单例或lazy-init=false,则直接生成bean spring将 1.查找bean配置文件 2.加载bean配置文件并解析生成中间表示BeanDefinition 3.注册beanDefinition 这三部分开,可以提供更多的定制给用户. spring将配置文件之类的文件资源抽象成一个Resource,封装了g

Activity生命周期的通俗理解

一般一个Activity有三种状态: 1.在屏幕上是可见的且可操作的,他是活跃或运行状态,负责响应用户操作. 2.失去焦点但仍然可见时,他处于暂停状态.也就是说未被完全遮蔽,所以该Activity仍对用户可见,但是当系统处于繁忙的时候下,有肯会杀死该Activity. 3.完全被另一个Activity覆盖时处于停止状态.也有可能被杀死. Activity生命周期中各方法的调用情况 1.onCreate(Bundle savedStatus):第一次创建时调用,只调用一次. 2.onStart()

SSL服务器认证过程通俗理解!

理解有错误的地方,请高手指正! 1,CA中心,有一套自己的公钥和私钥,服务器用自己的私钥去生成一个自认证的证书 2,CA中心的自认证证书是有公信力的,一般被客户端所熟知,发放到每个客户端! 3,客户端需要将CA中的自认证证书加入信任列表! 4,服务器要加入CA体系,要向CA中心申请,CA中心验证了服务器的资料后,向server发放一个证书(key),里面包含了一个秘钥 5,CA发给server的证书是用CA自己的秘钥和申请者的秘钥(key)加密过的, 6,证书里面包含:申请者的身份信息.申请者公

关于面对对对象之接口的通俗理解

一些人写代码,按照计算机思考的那个模式写,写出来的代码,能实现功能,但是拓展性不好,而有些人写代码,是按照人看世界的那些思路去写,写出来的代码 看起来像那么回事儿,而且也非常的符合逻辑,这是为什么?为什么同样是写代码,为什么写出来的东西会完全不一样了? 最近一直在反思自己写的代码,以前写,都是为了完成某项功能而写,写完了也就完事儿了,可是最近却不是这样了,最近想打问题是,写代码是不是只要在实现功能的层面上就可以了了?后来得出的答案是,代码其实还可以写的更加的灵活多变一点的 那么今天我们就来谈谈关

网络七层协议的通俗理解

OSI七层模式简单通俗理解 这个模型学了好多次,总是记不住.今天又看了一遍,发现用历史推演的角度去看问题会更有逻辑,更好记.本文不一定严谨,可能有错漏,主要是抛砖引玉,帮助记性不好的人.总体来说,OSI模型是从底层往上层发展出来的. 这个模型推出的最开始,是是因为美国人有两台机器之间进行通信的需求. 需求1: 科学家要解决的第一个问题是,两个硬件之间怎么通信.具体就是一台发些比特流,然后另一台能收到. 于是,科学家发明了物理层: 主要定义物理设备标准,如网线的接口类型.光纤的接口类型.各种传输介

矢量控制的通俗理解

关于矢量控制,通俗理解是: 1. 先把电机想像成2块飞速旋转磁铁,定子磁铁和转子磁铁.进一步可以引申为定子磁场和转子磁场. 2. 电机的电磁转矩与定子磁场强度.转子磁场强度.2块磁铁之间的夹角的正弦成正比.关于这一点不难理解,两块磁铁对齐的时候(0度,sin0=0;),不存在电磁转矩:两块磁铁相差90度的时候(sin90=1;),电磁转矩达到顶峰:  3. 接下来控制的目标就是: 1)稳定其中的一个旋转磁场的强度(恒定磁场):  2) 控制磁铁之间角度为90度(磁场定向FOC): 3) 控制另一

vue-cli 目录理解二

|-- build // webpack配置文件 |-- config // 项目打包路径 |-- src // 源码目录 | |-- components // 组件 | |-- App.vue // 页面入口文件 | |-- main.js // 程序入口文件,加载各种公共组件 |-- .babelrc // ES6语法编译配置 |-- .editorconfig // 代码编写规格 |-- .gitignore // 忽略的文件 |-- index.html // 入口html文件 |--