基于PWM的音乐回放设计原理首先将音乐数据通过软件工具,按照一定的采样率进行提取,然后将声音幅度信号转换成频率固定,占空比随着音乐幅度变化的PWM输出。输出模块采用硬件滤波后,经过喇叭对声音进行还原。下面介绍一下,具体的步骤。实现步骤1、选取音乐文件要求音乐文件最好是声音效果比较清晰的文件。2、将音乐文件转换为包含声音幅度信息的txt文档此处用到GoldWave软件。(1)启动GoldWave软件,打开选择的音乐文件。如下图所示,一般支持mp3和wav格式的音乐。(2)由于图中给出的声音是双通道的,而实际还原为单通道的声音,于是需要将立体声转换为单通道。可以选择文件-另存为,弹出如下弹窗。保存类型,依然设置为原声音文件格式,音质采用PCM8位量化,momo(单声道)式样。由于PWM输出的精度为8位的,所以这里设置为8位(可以设置为更高精度)。然后点击保存。(3)再次打开上面保存的文件,由于该波形存在负半周。因此需要整体的波形上移,以去掉负的波形。但是此处平移可能引起声音的最大值失真。上移波形的步骤为:点击效果-偏移,弹出上图所示弹框。在预置中选择向上移位。位移效果如下图:从上图可以看出声音波形有很大的失真,可以在移动前将声音的幅值进行缩放。选择效果-音量-更改音量弹出如下框图:可以再预置中设置一半。将原声音幅度减小为1半,设置后如下图:此时可以看到声音的最大幅值,已经降到原来的一半。再次将声音进行向上平移,得到如下效果:从上图可以看出,声音的幅度变化,比没有进行幅度缩放前,变化明显的多。(4)提取声音幅度值点击文件-另存为,弹出如下弹框:一次输入保存文件名,保存类型选择为NumericalText(*.txt)格式。音乐质量选择为ASCII16bitinteger,momo(5)如果保存的txt文件过大,可以重新设置采样率。设置过程为:编辑-效果-重新采样在上图的右边框中设置采样速率。(6)由于单片机中,采用中断控制PWM输出每个声音的幅度,中断频率不能太高,否则影响系统的运行,我们把中断时间设置为125us.即播放频率为8KHZ。则采样频率设置为8KHZ即可。当采样频率提高后,此处的中断时间要降低,可以适当作出调整。3、通过代码读取txt文件可以直接将先前处理好的声音文件以TXT文件形式放在代码中,注意需要将第一行屏蔽,且在每个数字后面加上逗号。如下截图:(1)由于此处的数据与PWM的占空比没有对应关系,还需要进行归一化处理。将上面所有的数据转换为占空比在0-100之间的数据。若适当提高PWM占空比的分辨率,即可以提高声音的音质。(2)代码中采用如下形式,以数组形式访问TXT文件数据。#defineMUSIC_DATA_NUM20425staticconstU8g_nMusicDataDuty[MUSIC_DATA_NUM]={#includemusic_7.txt};这样只要通过下标就可以访问g_nMusicDataDuty标示的声音数据。4、PWM输出,进行声音还原通过定时调用HalPWMStart(U8channel,U16freq,U8duty)函数,既可实现声音的还原。此处freq必须大于采样频率,当采样频率为8K时,经过试验,此处freq设置为40K,声音效果比较好。优点:用该方法可以很方便的实现任意音乐的回放。缺点:1、txt文档数据量加大,声音效果越好,数据量越大。2、PWM输出控制频率较大,系统占用较高。3、需要另外添加滤波电路,负责砸音比较大。应用:该方案应该用在A60EV仪表项目的开机启动的音乐上。