录音是VS1003的另一个大的功能,但据我了解,很多人都没有真正把录音功能调试出来!
主要原因有几点:
1、VS1003对于SPI的速度是有一定限制的,SPI速度不能太快,一般SPI时钟要低于500kbps。这一点是导致VS1003驱动失败,尤其是录音数据读取失败最主要的原因(播放的时候,向VS1003送数时SPI速度快点似乎还影响不大,但是读取录音数据时,SPI高一些则直接导致读取错误,这一点振南经过实验已经得到验证!!)。
2、VS1003录音向外输出的不是简单的原始音频PCM数据,而是经过了简单的编码的ADPCM数据(自适应差分脉码调制,是不是感觉很高深,没什么,很简单,振南会在后面详细讲解!!)。这些数据是不能直接用来播放的,而是需要解码的。要把他们存为WAV文件,不需要给它配上一个RIFF数据头,RIFF数据头里对音频数据的信息进行了描述,比如采样率多少、双声道还是单声道、位数多少、编码算法是哪种、音频数据有多长。。。等等。这样WAV就可以用常用的播放器来直接播放了!!很多人并不知道这一点,或者RIFF数据头写错了,从而导致录音后的WAV文件播放不正常。
在前面的测试实验中,振南只是使用LOOPBACK录音回放来对VS1003的音频采集通道进行了简单的测试。并没有真正实现录音数据的存储以及回放。这似乎有些牵强,不能算是真正的录音!!
这里振南将把录音实验作得更加深入,读取VS1003的录音数据,并真正把它打包封装为WAV文件,可以使用常用的播放器(暴风、WMP等)进行播放。
这里我们将遇到两个问题:
1、把录音音频数据读出后,存在哪里?(录音数据量是比较大的,而且数据速率是很快的,我们不光需要一个大容量的存储器,同时数据写入速率也要快!)
2、最终产生的WAV数据应该如何上传到PC,使用播放器来播放?
振南ZN-X开发板(51版)上使用的单片机为STC15L2K60S2,它虽然是一种增强型的51单片机,但是它的内存资源仍然是极为有限的,只有2KB(其实这已经算是比较大的了!)。所以录音数据想放在内存里暂存,是不可能的!我们唯一的选择是把它存在AT45DB161中(我们的好几个实验中都使用到AT45DB161,可见FlashROM是很有用的),它的容量为2MB(2048KB)。如果按录音采样率8KHz、采样位数16位计算,每秒我们从VS1003中读取的音频数据量大约为4KB(似乎不对吧,应该是16KB吧?!前面我已经说了,VS1003输出的不是纯音频数据,而是经过ADPCM编码后的压缩数据,ADPCM的压缩率为1:4!!)
既然音频数据被存到AT45DB161中,那我们就可以使用上传命令很方便地完成数据的上传 命令:at45db161test up 0xaddres len ,通过超级终端存为WAV文件,即可直接进行播放!!
振南设计了专门的命令来测试这个录音功能: mp3test record 0xaddres (0xaddres是AT45DB161的开始地址(字节地址))
SHELL命令实验截图:
还记得在前面AT45DB161的测试中,使用的数据上传命令吗? at45db161test up 0xaddres len
通过超级终端的XMODEM传输,把数据存为WAV文件,即可直接播放!