1.项目介绍
MAX78000微控制器,MAX78000FTHR这款板卡集成了MAX9867超低功耗立体声声音频编解码器,非常适合语音方面应用。Cortex® M4F核心,片内512KB闪存 128KB SRAM,通过软件解码,大约需要50DMIPS的运算性能和20K以上RAM,MAX78000可以满足MP3软件解码要求。
2.项目设计思路
2.1系统框图
2.2 MP3文件结构
MP3文件大致分为3个部分:TAG_V2(ID3V2),音频数据,TAG_V1(ID3V1)。详细信息如下图,MP3 ID3V2和ID3 V1需要通过编程读取,音频数据即数据帧通过解码器处理,输出PCM到MAX9867 DAC实现声音的播放。
2.3选择合适解码器
适合嵌入式的解码器有helix和libmad,其中helix对资源占用更少,Helix解码库支持浮点和定点计算实现,移植到MAX78000控制器运行使用定点计算实现,它支持MPEG-1、MPEG-2以及MPEG-2.5标准的Layer3解码。 Helix解码库支持可变位速率、恒定位速率,以及立体声和单声道音频格式。
helix解码器文件结构如下,其中有优化解码速度,部分解码过程使用汇编实现,因此只需要大约50DMIPS即可完成对MP3解码。
3.程序
3.1文件系统
初始化SD卡,挂载文件系统,读取文件主要函数。
result = f_mount(&fs,"0:",1);
if(result!=FR_OK)
{
printf("\n SD FAIL\n");
while(1);
}
result=f_open(&file,mp3file,FA_READ);
3.2Helix主要函数
MP3InitDecoder:初始化解码器函数
MP3FreeDecoder:关闭解码器函数
MP3FindSyncWord:寻找帧同步函数
MP3Decode:解码MP3帧函数
MP3GetLastFrameInfo:获取帧信息函数
数据帧信息结构体
typedef struct _MP3FrameInfo {
int bitrate; //位率
int nChans; //声道数
int samprate; //采样率
int bitsPerSample; //采样位数
int outputSamps; //PCM 数据数
int layer; //层级
int version; //版本
} MP3FrameInfo;
4.总结
MP3 文件是经过压缩算法压缩而存在的,为得到 PCM 信号,需要对 MP3 文件进行解码,整个过程涉及很多算法计算,要自己编程实现不是一件现实的事情,最好参考现有的demo先实现了在深入了解。
现阶段只是对资料整合,接下来需要对所有的函数进行整合,调试,完成项目。