捣鼓51音频的小心得
陆陆续续捣鼓了好一段音频,不为别的,就为了好玩。从调通例程里的“播放8bitwav”的,到简易wav播放器,
录音机,扩音机,变声器,再到现在正在搞的wifi音频传输,
摸索前进的同时也收获了不少,就此分享出来支持一波8051音频,
给想玩这方面的同志避避险,踩踩雷。
一下内容纯属个人观点---
51玩音频还得看 Ai8051U, Ai8052U
【新提醒】AI8051U 实现USB声卡,读TF卡/SD卡 音频播放器,32位8051,重磅开源 - 51 发烧友,UAC,极致音频,大国工匠,艺术人生,乐林漫步 国芯技术交流网站 - AI32位8051交流社区 (stcaimcu.com)
本帖最后由 DebugLab 于 2024-10-1 13:02 编辑
好玩
玩腻了蜂鸣音乐?下一步,就可以搞搞dac了。
这里的dac可以是t型电阻网
--如果你用的还是89系列老古董--你喜欢了话也不是不可以。
本人还是推荐跟紧时代潮流,直接走上1T8051的快车道,
用8h8k64u(当时的最新款,现在当然是首选8051u了)。
充分享受它的pwm,大ram和高主频
当你玩熟了定时器中断,并弄会了最最基础的pwm,就可以打开8h8k64u官方例程,找到“播放8bitwav”项目了。
这个程序是播放pwm音频的小demo,把一段6秒的音频数据放在代码里,用pwm和定时器中断给播出来。
通过这个程序你就不难理解pwm播放音乐的核心原理了:不断读取音频数据,按照音乐的采样率,每隔一小段时间,在中断里用播放一个采样点(对应输出一个模拟电压值)。
“没有情人的情人节”独特的8bit音调立刻使蜂鸣音乐黯然失色 玩明白了例程,那就可以播放其他储存介质里的音频了。
用定时器产生中断,在里面把采样点给pwm出来,不论你播放什么储存介质里的音乐,这步都丢不了,固定套路。问题在于,读取音频数据。
为了让播放不卡顿,你的读取要能跟得上你的输出。例程里因为是播放芯片flash中的音乐,就不用考虑读取速度,更不用搞什么缓冲,读一个字节,就放一个字节,不急不慢。但你要是播放spiflash里的数据,这样就不行,你必须得缓冲,还得双缓冲(在播放一个缓冲区的同时,赶紧填充另一个缓冲区,彼此交替),不然你的音乐就会卡出电音,甚至直接间断播放
双缓冲的代码很简单,在这里就不详细展开了。后边分享的程序里就有,固定套路,也贯穿51音频得始终。
如果你用了文件系统了话,速度方面你需要格外小心。因为你的物理读取速度在套上个文件系统之后会狠狠的打上一折。是时候考验你的文件系统方案够不够格了。如果你播放spiflash里的wav,恰好用的还是fatfs了话,温馨提示你的ram和rom可能会不够,
(别忘了你读spiflash了话可是要开4096的超大缓冲区的,而且即便裁剪阉割编译出来也得动辄10几k,阉割完性能还发挥的不好。当时我用fatfs试了,播44k8bitwave竟然会卡。。)
总之,小心,小心呐! 软件功夫做足了,默认的是你的硬件加速都用好了。卡顿之时,先问问自己hspi用了吗,2T上了吗?dma开了吗?
关于速度,最后就是想说一点:sd卡比spiflash快很多! 把例程削微改改,不用什么文件系统,就加个双缓冲来读spiflash里的数据直接放,这是最容易迈出的一步。。。诶,等等,你的音乐是怎么放进flash里的?! 这个也得说一下,就是spiflash的基本操作默认你是熟悉的。8h8k64u了话我是让它运行一个usbmsc程序(例程里有,msc范例,底层读写函数稍微改改就好了),把flash模拟成一个磁盘,连电脑再用winhex往里写数据。
当然在今天我那个方法可能也落伍了,因为stcisp好像新出了一个flash编程器,还没用过,但看样子比我那个好使多了,建议大家尝尝鲜。
Wav文件写进去之后,它里边怎么都是一堆十六进制数字啊,哪些是采样点?按什么顺序存的?每个数字都是音频数据吗。。。
Wav文件的结构,你是得了解的。