注册登录APP
钱包APP

8x8dot点阵屏制作音乐频谱显示器(原理图,源代码开源)

在开始制作前,咱们还是来谈谈这个音乐显示器的具体的原理吧。说是音乐显示器,其实更具象的说,应该是声音信号频谱显示器,首先来普及几个小知识:声音信号,其有三大特性,分别是响度、音调、音色,响度是声音的波形振幅(就是我们所说的音量),当我们采集声音信号时所得到的是波形的幅值,音调是声音的频率,频率越高音调越高,而音色是声音的波形的类型,在咱们这个制作中,没有特别多的联系,不做深入探讨。当我们通过单片机AD模块采集由数码播放机(如:PC声卡、MP3播放器)输出端的模拟电压信号时,将其转化成一串数字信号,然后通过FFT(快速傅氏变换)运算,得出声音信号的频率分布关系,这个也就是我们常说的频谱图,我通过一台虚拟示波器采集了一首歌某个时刻的声音信号,通过模块自带的线性频谱显示功能,得到(如图1),图中的横轴是这组音频信号中的频率分布,纵轴是由傅里叶变换后,换算成不同频率的正弦信号后的幅值。在这里又看见一个比较专业的名词——FFT,即为快速傅里叶变换,是离散傅里叶变换的快速算法,它是根据离散傅氏变换的奇、偶、虚、实等特性,对离散傅立叶变换的算法进行改进获得的。根据傅里叶变换认为任何连续周期信号都可以由一组适当的正弦曲线组合而成。在实际工程实践中,频谱图用于机械故障诊断系统,用于回答故障的部位、类型、程度等问题,是分析振动参数的主要工具,仅需观察相关的被检测设备的声音震动情况,根据历史数据作比对,就能找到某个问题产生的原因所在(说到这,想起以前做过一个轴系扭震试验台,在线监测轴系轴的扭转震动噪声,分析噪声,实时预测轴系运行状态,在必要时更换轴,避免损失,也就是说频谱分析是有着良好的实践应用的),这个有些像有些老修车师傅,只要让发动机转两下就能听出是那块出问题了,虽然他们可能不懂FFT,不懂频域分析,但他们的大脑中存了一张巨大的数据表,能够迅速的搜索出问题的原因。在咱们的设计中,其实就是需要将一个音频信号进行FFT变换后,得到的那张频谱图,然后用我们的点阵屏上的小灯来显示出音频信号的频率分布与幅值的关系,在横轴上的小灯用于显示几个频率段,而纵轴的小灯用于显示该频段信号幅值。

1

图1 线性频谱分析

硬件篇

有了前面的铺垫,我们大概了解了音乐显示器的原理,接下来是构建其硬件基础了,首先还是来看看我所淘到的点阵屏吧(如图2),其型号为LDM-2388SRGA,88红绿双色,5mm点阵屏,内部原理图(如图3)。对于本制作的核心——单片机选型,分析一下系统的功能需求,2路模拟信号采集(ADC),用于采集音频信号,将其转化成一串数字信号24个及以上的通用输出输入端口(I/O),用于直接连上点阵屏的LED,驱动其显示稍大点的RAM空间和ROM空间,因为进行FFT变换会消耗大量的RAM,便于缓存数据帧,同时也有必要选取大点ROM,为多种动画的酷炫效果升级提供坚实的硬件基础较高的执行指令和运算速率。于是乎,我一览我现在学习过的芯片,刚开始想选一片32位的如STM32F103,但思前想后,感觉用32位的去完成如此制作,还是有些大材小用,于是选择了一片STC系列的1T单片机12C5A60S2,有60K-bit的flash(现在的ROM一般都被闪存芯片替代了),1280Byte的SRAM(根据一些网友的作品,取64个点做变换,已经足够了),8路10位精度的(实在是太够了),同时还带2路PWM,为此我在设计中还添加了一个全彩呼吸灯,用来指示动画切换后的状态。(如图4)是我最后定稿的图纸,(如图5)是其PCB效果图,元器件清单见(表1)在电路图中大家可以看见整个原理图中非常简洁。

2                                 图2  点阵屏实物                                                             图3内部电路实物


3

图4 电路原理图


软件调试篇

在完成整体的硬件架构后,开始对音乐显示器的软件部分进行构想,首先对整个小系统的软件框架做个简析,(如图6)使用一个单片机,免不了对单片机硬件模块的初始化操作,下面我就初始化的几个部分做个简述,I/O状态的初始化:由于是使用单片机I/O直接驱动LED点阵,所以为了保证点阵屏的亮度和驱动能力,将单片机的I/O设置是强推挽输出,PxM1=0x00, PxM0=0xff;ADC初始化:在这里只涉及对ADC_CONTR(ADC控制寄存器)这个寄存器初始化,设置开启电源,以及转换速度为70个时钟周期/次;PWM初始化:主要设置CMOD(PCA模式寄存器)以及(CCAPM1(PCA模块1模式寄存器),同时对相应的定时计数器清零(我将所有的代码公布在我的博客上,供下载参考)。

5

图6 软件框架


在完成对单片机初始化后接下了就是程序算法的活了,从原理框图中可以看出程序主要分作两大块,一块是主循环里边的数据处理,还有一块是中断服务函数中的LED刷新操作。 主循环中,通过ADC采集65个当前音频数据(由于做FFT变换时需要有个上次参考值,所以多添加一个数,用于替代参考值),为了获得立体声的频谱,分别采集两个左右声道声道的数据,求和做均值运算;接下来就要对数据进行增益计算,由于咱们的播放音乐时会调节播放的音量的大小,即会改变波形的幅值,这样一来会是纵轴的显示在非合适的音量下出现空屏或者满屏的现象,所以我们需要实时对采集来的数据进行软件上的增益调节,即对本次采集数据根据上次采集的音量大小计算所得的增益系数对数据进行适当缩小放大;完成上述任务后,需要进行本设计的最重点的FFT做个介绍了,我在设计之初也感觉对这编程挺伤脑筋的,后来学习鲁迅先生所说的“拿来主义”,找了几位网友分享的算法实例,将其移植过来,用时只要对好相关参数,就能直接得出结果;通过以上几步的操作我们可以得出上述64个频段的纵轴值,这个就是下一步用来显示纵轴小灯闪烁的参考值,为下面做多种动画效果做铺垫;讲到这里,对于计算的部分已经差不多了,接下来就是一些细节和收尾的活,为了方便对显示动画效果和彩灯颜色的切换,我设计通过一个按键来触发,同时为了保持对增益进行自动调节,所以需要每一次采集运算数据后,计算一次增益系数,由于我们要求的精度不是很高,可以将某个频段作为观察点,设置几个阈值,在不同的阈值范围内,使用不同的增益系数。在文章的标题中大家看到“酷炫”二字,为了对得起这个称呼,于是乎,我设计了多种动画显示,我将就动画做出编程说明。快闪双色16频段,即前8频段用绿色点阵显示,后8频段用红色点阵显示,通过前面的数据处理,可以获得64个频段的值,由于本制作中纵轴上只能显示8个点,参考(图1)的频谱分析,通常音乐的频谱的动态性较好的区间分布在前半段频段区,所以为了使显示的动画能够饱满并且动态性较好,所以舍弃了64个频段后面的32个,只取前32个点,实际显示时采取间隔一个频段显示,得到最终的16个点用于显示(相应的得到8频段或3频段都是一个道理),由于FFT变换后得到值的范围0~255,所以需要对其进行比例换算,接下来就是对显示的缓冲区进行刷新,然后在中断服务函数中显示刷新,用于更新显示的缓存,此时就能看见小灯随着音乐的闪烁。


6 

外形结构设计

为了让88MD更加完美,在原有电路硬件的基础上我设计了一个透明的亚克力外壳,保护电路,起到防尘、防潮的作用,整个外壳不需要螺钉,通过卡扣就能拼接,如果对拼接后的强度不满意,可以在拼接处加502胶水,做适当的粘接。在88MD的背面,需要注意的是在呼吸灯处必须开一个圆孔,这样能保证灯光通过圆孔的截面处,折射进整个有机玻璃面,在夜晚观赏时有比较炫的效果。

7


结语

至此,这个制作告一段落,在此感谢各位网友的分享的相关资料,同样我将所有的设计文件分享给大家,大家可以上我的新浪博客下载学习,给88MD赋予新的概念。通过一次又一次的DIY旅程,让我明白,其最大的乐趣是将我们的创意转化为我们的设计,呈现给你一次奇妙的体验。

0条回复

作者
用户头像
文章 0关注 0粉丝 0
相关文章
联系客服