折腾了一个月,终于搞成了音乐频谱,与大家分享。

2020-01-04 18:47发布

本帖最后由 rjx 于 2018-2-1 15:42 编辑

折腾了一个月,终于搞成了音乐频谱,分别形成了在OLED和LCD彩屏上显示的两个版本。
STM32单片机从大半年前才开始自学的(前几年曾陆续自学了PIC和AVR.)。老朽已过古稀之年,自学中的酸甜苦辣只有自己知道。
现将这个音乐频谱的资料分享给大家,望提出宝贵的意见。

      关于代码的几点说明:
      一、OLED屏是用的中景园的1.3寸屏和STM32F103C8T6的小系统板。LCD是用的是普中的屏和实验板(STM32F103ZET6),屏是ILI9341的3.2寸屏。各位移植时管脚连接可能不同,要注意修改相关的代码!
      二、FFT转换使用的是ST提供的DSP_LIB的库函数。本例中采样频率为40KZ,采样点数是256点。但实际显示时,各柱条的频点的却是从256点中挑选出来的,因为音频的范围虽然是10Z-20KZ,但人声和乐器的频率主要集中在0-4KZ,4KZ-8KZ次之,而8KZ-20KZ段主要是高次谐波。
     三、经FFT变换取模后,越是频率高的频点,其模值幅度越小,所以显示效果不好。且经FFT变换后,虽有256个频点,但后面的128个频点是和前面的128个频点成镜像的,所以只要从前面的128个频点里挑选就可以了。同时还要去掉第一个频点,因为第一个频点是直流分量,是不会跳动的,所以如果保留了第一个频点,那么在屏的最左边始终有一根不动的且满幅度的柱条,显得十分呆板,大煞风景。
     四、ADC采样软件触发方式,同时用TIM2定时器的溢出中断来设置一个标志位,当256点采集完成后,该标志位置位,再开始做FFT变换、计算幅值和显示。
     五、低频段的幅值一般较大,频率越高幅值越小,为了提高显示效果,使各柱条跳动的幅度较为均衡,我在程序里安排了用软件方式对增益做些适当的调整,即压缩较大的幅值,加大较小的幅值。
     六、如果实际使用在音响电路里,ADC的取样点可以是前级放大器,也可以取自功放。这时最好加上自动增益控制电路,以均衡采样的幅度;为了克服混叠效应和栅栏泄漏,最好要加上低通滤波电路(最好是2-4阶,以达到衰减较为陡峭的目的。);同时还要加上电平平移电路,因为单片机采样时是不接受负电压的。这些内容我之前曾发过一个帖子,有相关的电路图和PCB的图,各位如需要可移步查看。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
99条回答
rjx
1楼-- · 2020-01-13 19:13
本帖最后由 rjx 于 2018-2-2 12:24 编辑
yht0312 发表于 2018-2-2 08:30
膜拜老前辈!厉害厉害!
有一点不明,请教一下,采样率40K,256点,那么频率分辨率是156.25Hz,为什么选择 ...


选256点,开始考虑是觉得F103系列没有浮点计算能力,怕MCU的负担太重,速度跟不上。如改为1024点,分辨率可以到39HZ,就好多了。昨晚试了一下,改成1024后,也跑得很顺畅。这样低频段可以向下很多了。
如有条件,上F4系列,有强大的浮点计算能力,就不必有这个担心了。
shuiluo2
2楼-- · 2020-01-13 23:33
膜拜,学无止境啊,希望我古稀时还有学习的心态,不过,首先要活到那个岁数,现在的环境食品估计够呛

齐白石:老朽七十几岁,要不要教一教你如何搞定小护士?
su33691
3楼-- · 2020-01-14 01:35
我也是50岁才开始学C51,至今有2年半。我学编程的目的就是为了打发时间和预防老年痴呆。前段时间刚刚理解了结构体和指针,就转向STM32。
向楼主学习,继续努力。
xuezubo
4楼-- · 2020-01-14 02:38
我等小辈,膜拜
xiao_he
5楼-- · 2020-01-14 04:55
 精彩回答 2  元偷偷看……
touch_mcu
6楼-- · 2020-01-14 08:43
致敬,致敬。

一周热门 更多>