制作频谱应用FFT心得

    生活中充斥着各种各样的信号,甚至包括我们所熟知的220VAC交流电,都属于一种交流信号,只不过信号强度较大,会要人的命,网上关于fft的应用,例程,硬件电路已经很多了,个人纯属爱好做个总结,各位大佬勿喷。
    先上两张图,大家体会一下傅里叶变换的奇妙之处: ![在这里插入图片描述](https://img-blog.csdnimg.cn/20190712171720792.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDA4MDMwNA==,size_16,color_FFFFFF,t_70)
    我敢说好多强迫症的人看到这张图片一定疯了,但是这确实是从示波器上显示出来的信号,你可能耐心观看会发现波形在发生重复,只不过重复的过程稍微复杂一点,当你发现波形的重复并且可以联想到这是一个周期变换的信号,恭喜你离理解傅里叶变换又近了一步。
    ![在这里插入图片描述](https://img-blog.csdnimg.cn/20190712172107279.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDA4MDMwNA==,size_16,color_FFFFFF,t_70)
    如果我说这个信号和上面的信号是一个,恐怕很多人不敢相信自己的眼睛,乱七八糟的一坨恶心粑粑的波,怎么可能这么规规矩矩,其实学过高数下和工程数学的同学对这个应该不会非常意外,因为根据傅里叶级数,任意周期变换的数学函数,都是由不同周期不同幅值的正弦函数经过叠加形成的(这是我个人对傅里叶变换的理解,大佬勿喷),第一张图乱七八糟的波形就是由**0hz 1280mv左右的直流分量**、**50hz 1280mv左右的正弦交流分量**、**160hz 650mv左右的正弦交流分量**、**210hz 1280mv左右的正弦交流分量**(关于频率和峰值纯属凭借个人估计,不要较真)在一起叠加而成的,没接触过高数下和工程数学的同学们可能会觉得莫名其妙,当你能明白以上所说的,就基本上理解到fft(快速傅里叶变换)的精髓了。
    举个例子吧,个人觉得看图更真实:
    ![在这里插入图片描述](https://img-blog.csdnimg.cn/20190712173745359.png)
    ![在这里插入图片描述](https://img-blog.csdnimg.cn/20190712173843102.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDA4MDMwNA==,size_16,color_FFFFFF,t_70)
    以上是两个正弦波的图像,本人无能,不知道怎么上传动态图片(大家有兴趣可以去网上看,这样的资料非常非常非常多),这两张图可以直观的理解成咱们平时常见的220/380VAC,家用工业用交流电,很简单很美妙,就是一个圆在以一个固定的速度转,转一圈画出来一个完整的正弦图像周期,就像这样,用1s/转动一圈所用的时间就是它的频率,单位是hz。
    ![在这里插入图片描述](https://img-blog.csdnimg.cn/20190712174442467.png)

当然一个圆转起来理解起来非常简单,但是本着傅里叶的思想,所有带有周期变换的波,都是由不同的正弦波叠加而来的思想制作频谱应用FFT心得_第1张图片制作频谱应用FFT心得_第2张图片,不是动态的图不是很直观,这两张图网络上都有的,而且其他博主写的比我要好的多,大家可以去看看,没错这就是我们平时看到的见棱见角的方波的诞生的方法,根据上图小圆叠加的越多,方波越方,我觉得方波是除了正弦波之外最让强迫症患者舒服的了,因为方波真的好方。
终于找到经典图了,现在奉上:
制作频谱应用FFT心得_第3张图片
这个图,没错又是方波,这是时域频域关系图,更加形象生动的阐释了,方波是由如此多的正弦波叠加而成的。
没错在认识到傅里叶变换的基本原理之后,就该想想怎么用这个美妙的算法了,自报专业是机械电子,专业课里面根本与信号分析没有交界,上述言论纯属一家之言,不要过分计较,谢谢各位大佬。当然现在比较流行编程,现在很多娃娃已经开始学习编程了,我知道的有的从幼儿园就已经开始学习了。对于一个20岁的理工直男来说,10几年前,编程并没有像现在这样普及,我是在上了大学之后才接触的单片机和C语言,个人推荐使用STM32系列的单片机,主要是因为运算速度比51快几十倍,能至少满足1024点的快速傅里叶变换运行,不推荐使用arduino,因为对于大学生来说,模块化编程固然是上手快,但是对你了解单片机内部工作原理,单片机的各种特性(定时器,ADC,I/O口,IIC,UART等)没有什么帮助,毕竟有句话说得好,生于忧患死于安乐,人就是应该打破舒适圈,挑战自己。
我并没有像其他大佬一样把fft的算法写出来,并加以自己的看法,因为自身觉得没必要从底层写自己的快速傅里叶变换,因为这个真的真的需要相当的数学知识以及C语言基础,并且个人觉得现在网上资料如此丰富,为什么不像牛顿说的站在巨人的肩膀上,下面我来简单的说一下自己第一个基本上像样的频谱是怎么制作成功的,勉强能看。
1、熟练使用STM32F1系列单片机的定时器使用方法(特指定时器输入捕获PWM波)
2、熟练使用ADC定时器中断采集方法,不是简单的那种用定时器中断读取ADC的数值,而是真正的可以按照固定的采集频率进行采集,一般采集的速度要比采集信号的频率,也就是说是采集信号的最高频的二倍
3、熟练使用一种屏幕,推荐屏幕的反应速度越快越好,这样你的频谱动起来效果更好(当然跟个人的程序优化关系也很大),个人推荐使用OLED屏,用SPIO工作模式,SPIO反应速度比IIC要快好多。我是觉得挺好用的,而且网上资料真的多。
制作频谱应用FFT心得_第4张图片
4、了解STM32自带的DSP库,以及STM32库中的fft算法函数使用的方法,(这也是我说的为什么没有必要自己从0开始写,因为很少有人能写的比人家芯片厂家自己根据自己的芯片写出来的算法好用)。
5、注意一点STM32的IO口ADC采集只能采集正电压,无法采集负电压,因此个人推荐使用秉火关于STM32F10系列教程中有个用纯电阻搭出来的电路,可以把-10—+10V的交流信号转换成0–3.3V的直流信号,个人使用起来非常开心,当然如果你想做一个能显示音乐的频谱,推荐本站某位大佬的博客链接:https://blog.csdn.net/mc_li/article/details/81364766。(这是巨佬巨佬巨佬)
6、耐心,一定要耐心。
下面是程序截图:
制作频谱应用FFT心得_第5张图片
没错看起来就这么简单再加一个屏显程序
在这里插入图片描述
本人水平有限,以上程序屏幕刷新衔接起来并不是特别好,如果想要源码可以在博客底下留言。
经过一晚上的调整终于找到能足够的显示速度:
制作频谱应用FFT心得_第6张图片
以上的程序可以获得和音乐频谱一样的视觉效果。

你可能感兴趣的:(程序员,信号分析)