这几天状态有点差,手头的两个电机驱动程序也基本调试完毕,暂时不打算开展新的程序调试了,以前是凭着热爱在学习FPGA,现在成了全天候主攻FPGA后,反而逐渐有点厌倦和不耐烦了,主要是这几天的休息也不太好,脑袋经常都是一团浆糊似的,觉得是时候对FPGA的一些重要IP核进行总结了!
对于FFT这个IP核,我陆陆续续研究了基本大半年的时间,一点点地深挖它IP核配置的每一个参数配置,其实对它真的是又爱又恨,因为它真的耗费了我太多时间,但是随着研究的深入,这个IP核真的挺有意思的,真的,我现在对它的熟练掌握程度估计博客园都找不到第二个博主了。
有时候真的挺佩服自己的,遇到不懂的,不了解的,真的不允许自己留一点疑惑,必须深挖到底,一点含糊都不留给自己,其实,不知道大家有没有这样的疑惑,现在不懂的,懒得去研究的,估计过不了多久这个知识点又会兜回来找你的。我有时候,也会侥幸这样的任务不是落在我头上,因为不会啊,但是真的过不了多久,我越是不会的东西就越是会来找我,感觉今天的话有点多,估计脑袋的浆糊塞得有点多了!
FFT是什么?我也花了大半个月的时间去研究过它的原理,还手写代码不调用IP核去实现过它的实现方式,当然我没有具体去验证我这手写实现的方式是否正确,但是真的,大家还是好好学会调用IP核吧,这个IP核真的忒好用呢。
FFT其实本质上就是用来分析频谱成分的,我给你一堆混杂的频谱,你知道里面有哪些频率吗?你不知道,但是FFT知道,它能帮你分析混杂频谱中有哪些频率成分。说得官方一点就是:FFT是离散傅立叶变换的快速算法,可以将一个信号变换到频域,有些信号在时域上是很难看出什么特征的,但是如果变换到频域之后,就很容易看出特征了,这就是很多信号分析采用FFT变换的原因。简单来说,FFT的作用就是:对信号进行频谱分析。
我们首先结合MATALB这个强大的数学分析软件来生动阐释下FFT这个概念,它可以拿来做什么?它是如何实现频谱分析的?
一个模拟信号,经过ADC采样之后,就变成了数字信号,我们就可以拿采样得到的数字信号,做FFT变换。N个采样点,经过FFT之后,就可以得到N个点的FFT结果。为了方便进行FFT运算,通常N取2的整数次方。 例如某点n所表示的频率为:Fn=(n-1)*Fs/N。由这条公式可以看出,Fn所能分辨到的频率为Fs/N,举例来说如果采样频率Fs为1024Hz,采样点数为1024点,则可以分辨到1Hz。1024Hz的采样率采样1024点,刚好是1秒,也就是说,采样1秒时间的信号并做FFT,则结果可以分析到1Hz,如果采样2秒时间的信号并做FFT,那这个对应的时间序列点数就是2048,则结果可以分析到0.5Hz。所以如果要提高频率分辨力,则必须增加采样点数,也即采样时间。频率分辨率和采样时间是倒数关系。由于FFT结果的对称性,通常我们只使用前半部分的结果,即小于采样频率一半的结果。
2)信号幅值对比:
预测猜想:按照我们的原始频率输入,第1个点、第51个点、第76个点的幅度值分别是2、3、1.5;
Matlab输出结果:
3)相位输出验证:
预测猜想:第1个点直流分量没有相位输出,不管,第51个点、第76个点的幅度值分别是-30,90;
Matlab输出结果: