本帖最后由 zhanzr21 于 2016-12-30 23:27 编辑
对于能跑216MHz的F769, 单单只是播放Wave, 还是很浪费的. 花了一点时间, 终于把MP3解码在F769板子上基本搞通了, 这里跟大家分享一下.
首先简介一下MP3.
MP3算是音频格式中的明星, 可谓家喻户晓. 最大特点是压缩比高, 这对于存储与传输来讲,压力减轻了许多. 简当讲一首四分钟的歌曲,按照CD音质的44.1KHz, 双声道16bit的配置来, 不经压缩的PCM数据是44.1K*2*2*60*4 = 42336KB, 四十多兆, 在线播放的话一秒钟176KB, 就算对于今天的网络与硬盘配置来讲, 也不是个小数目. 从嵌入式系统角度来说, 压力更加大.
那么采用128Kb的码率进行MP3编码后, 硬盘存储与网络带宽一下子缩减11倍, 分别是4MB与17KB/s, 这样的话绝大多数的PC系统与大多数嵌入式系统都可以达到. 而且MP3编码率还可以更低.
音质方面, MP3的128Kb码率编码后, 音质基本上没有什么损失. (比较挑的人除外)
下面来看个简单例子, 1秒钟的44.1KHz,双声道声音文件. 两个通道的声音分别是450Hz的正弦波与方波,生成代码请参照这个系列帖子之前**. 波形如下:
经过128K编码解码之后的波形如下:
经过32K编码解码之后的波形如下:
经过11K编码解码之后的波形如下:
可以看出来128K编码解码之后对于音质的影响是非常小的. 相比较而言11K编解码后音质变形有点明显但是基本的音质没有损失.
至于文件大小,原wave大小是:173KB, 三种编码之后的MP3文件大小分别是:17KB, 5KB, 2KB. 这还是比较短的文件,如果是比较长的音频, 开销平摊之后, 压缩比更大.
MP3编码的最主要的原理是听觉屏蔽, 也就是把人听觉感应不到或者很难感应的频谱分量给删除了, 编码率越小,删除的频谱分量越大, 这一点通过上面的图型可以看出来, 11K编码时,方波快削减成正弦波了, 而纯频音调则几乎没有损失. 这样做的原理就是当人耳朵同时接收几个频谱的声音时, 只能感觉到某一种或者某几种, 那么把不能感觉到的频谱删除或者削减之后对音质影响很小或者说没有. 所以对于变化复杂平滑的声音文件, MP3编码的效果更好(更低的码率达到好效果). 而对于突变的声音, MP3编解码效果差一点.
MP3的全称是:MPEG-1 或者 MPEG-2 音频 III层, 事实上还有一个MPEG-2.5的补充. 这三个是比较通行的标准, 此外还有一些软件有许多标准之外的扩展功能.
MPEG-2,MPEG-2.5对于MPEG-1的改动属于添加性质, 主要是添加编码率与采样率.
MPEG-1支持的编码率: 32, 40, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320 kbit/s
MPEG-2增加了三种: 8, 16, 24
MPEG-3没有增加编码率.
MPEG-1支持的采样率: 48K, 44.1K, 32K
MPEG-2支持的采样率: 24K, 22.05K, 16K
MPEG-2.5支持的采样率: 12K, 11.025K, 8K
此外MPEG-2.5对同步头那里简化了一点.
MP3文件结构如下:
回到解码上面来, 之前很多人在STM32上做过, 有的是移植helix, 有的是移植libmad的, 我感觉这两个库过于复杂为了方便实验, 另外找了一个更简单的库进行移植:minimp3, 主要是把里面一个浮点运算的表格做成了预先计算好,用的时候直接查找, 其实对于F769来说, 这个表格即时运算也来得及. 代码没有清理, 也没有很详细的测试, 后面有时间再慢慢体会研究, 先传上来给大家做个参考.
工程文件:
F769_SAI_MP3_Decode.zip
(1.04 MB)
表格文件:
table_43_81D0000.zip
(164.59 KB)
测试用的MP3文件:
city_of_sky_reduce.zip
(779 KB)
因为没有使用文件系统, 先将就一下, 把mp3烧写到Flash中去吧.
目前我对MP3研究只是皮毛,后面有时间再来细细研究发帖.
|
|