FFT与MATLAB实现
DFT虽然好,但由于计算的次数太多,数据量一大就显得相当复杂 最后将DFT进行改进成FFT,即FFT是DFT的快速算法,本质上仍然是DFT。 MATLAB中提供“fft”函数,可以直接对数据进行快速傅里叶变换。但是由于FFT的本质仍然是DFT,则得到的频谱是用功率谱密度(PSD)定义的,也就是它的幅值表示的是单位带宽的幅值。 N:样本点
:采样频率 FFT变换之后的横轴为频率轴,频谱图横坐标显示的最大频率点为
(奈奎斯特采样定理),频率的坐标间隔(频率分辨率)为
,也就是说最小能分辨的两个频率之间的差值要大于
。 横轴的频率点为:(0:1
:
)。(经过FFT之后,频谱是关于中间位置对称的,只需要观察0~
即可) 对于实数信号而言,N(先假设N为偶数,其实最好的情况是为2的n次幂个)个离散点的DFT将产生
+1个频率点(因为无论怎样都会有0频率),频率的序号从0~
。故而N个实数点经过DFT之后的频谱带宽为
,每一个频率点所占的带宽为
,所以经过FFT之后的频率对应的幅值并不是真实的幅值,想要将FFT之后的频谱图跟实际的幅值对应,就要进行相应的转换。 (补充:频率为0意味着是FFT之后的一个实数,也就是直流分量) 那么,重点来了,怎么转化呢? 上边我们说的就是每一个频率点所占的带宽是
,将带宽跟FFT之后得到的幅值相乘即可对应到原本的幅值。但是,需要特别注意的一点: 频率序号为0和
的两个点的带宽只占中间频率点的一半,也就是占
的带宽,因此只需要将幅值乘以
即可。 到这,也许有细心的童鞋发现了,
这个数据对应的N为偶数是最好的,那如果恰好N为奇数又该怎么解决呢? 事实上,当我们的样本点N为奇数时,只有0频率占
带宽,其余的
个频率点仍然是对应幅值乘以
得到真实的幅值。 以上都是基于实数信号,对于复数信号而言(生活中大部分的模拟信号转化为数字信号都是实数信号,很少遇到复数信号),处理方法则相对简单多了。对于复数信号,N个点FFT之后会产生N个频率点,频谱的带宽为N,每个点所占的带宽为
,将每个幅值都乘以
即可得到真实的频率幅值。 以下为MATLAB实操:
以这个题目为例 1、不进行幅值修正的情况:
时域信号
傅里叶变换之后的频谱图 可以看到无论是幅值还是频率,跟我们所给的时域信号是对应不上的,并且同样也证实了关于中心点对称的观点,因此我们接下来只需观察从0到N/2的频率点即可。 2、对幅值进行修正的情况:
不用担心相位图杂乱无章,在没有频率处的相位是没有意义的,我们只需要有幅值处的相位即可
将图放大可以看到,修正后的幅频图跟时域对应相当好。 过程中如有任何问题,欢迎各位大佬在评论区讨论以及指出错误。
2024最新激活全家桶教程,稳定运行到2099年,请移步至置顶文章:https://sigusoft.com/99576.html
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。 文章由激活谷谷主-小谷整理,转载请注明出处:https://sigusoft.com/41570.html