低成本使用MCU播放提示音方式
1、音频产生原理
物体的振动产生声音,下图是一段音频波形,可以从这张图片中了解一下声音的关键参数
- 采样率:一秒钟有多少个采样点,常见的有8K,16K、32K、44.1K等,可以说采样率越高,音质越高
- 采样位深:一个采样点的音频深度,常见的有8bit或者16bit,震动引起声音,同样是3.3V的电平变化,8bit位深的变化范围是0~255,16bit位深的变化范围是0~65535,位深越高,能表达的音频变化越细腻
- 单双声道:一段音频包含几个声道,常见的有单声道、双声道,在某些对音频要求更高的场景下可以达到5.1甚至7.1声道,简单来讲,几个声道就是有几个发声单元,单声道无法体现出声源的位置信息,但是多声道就可以模拟出声源的位置信息
幅值:通常标识了音频的音量等级,幅值越大,信号强度越高,声音越大
如果使用一个玻璃棒与鼓面垂直硬连接,并且按照以采样率的频率、每个样点的幅值来纵向移动玻璃棒,就可以在鼓面上还原出声音
2、常见的MCU播音方式
- 模拟输出 + 定时器
这是一种成本较低的音频实现方式,外部只用连接一个音频放大器和喇叭就可以实现音频播放 - 数字音频接口
成本较高,处理器需要带有IIS接口,并且外部需要一个音频处理芯片(codec),并且仍然需要音频放大器与喇叭
3、使用DAC+TIM播放声音
音频处理流程
- 音频预处理,按照需求修改音频的采样率、单双声道、位深等信息,推荐使用GoldWave软件批处理
音频固件存储
- 将音频统一打包,生成bin文件
- 将音频烧录到外部flash中
- 制定一个目录表,告诉CPU要播放的音频在flash的哪个位置存放着
双缓冲播放流程
- 因为读取flash需要时间,因此需要创建两个音频缓冲区,在音频播放过程中,永远是一个缓冲区处于播放状态,另一个缓冲区处于数据填充状态或者就绪态
状态管理
- 在播放音频前先使用音频数据填充缓冲区,打开音频PA,并且使能TIM与DAC,在开始播放一个缓冲区的数据时,发送填充另一个缓冲区的请求。在定时器中断中给DAC赋值,在主线程中给缓冲区填写数据。可能需要考虑音频停止,音频拼接,音频抢占等状态。
4、其他优化点
降低pop音
如果没有音频处理经验,在音频播放过程中很容易引起pop音,所有的pop音都是信号变化过大引起的,降低pop音的策略有以下两种:- 因为头尾进行平滑处理(淡入淡出)
- 合理控制开关PA的时间,不要在幅值过大的时候开关PA
降低内存占用
- 音频在flash中存储,考虑到音频的空间问题,为了降低音频占用空间的大小,可以将音频压缩编码后放在flash内部,然后在放入缓冲区前进行解码,常见的低性能编码器有SBC、ADPCM等
本作品采用 知识共享署名-相同方式共享 4.0 国际许可协议 进行许可。
真棒!