基于stm32的软件音频解码库libmad移植手册

合集下载

基于stm32的软件音频解码库libmad移植手册

基于stm32的软件音频解码库libmad移植手册

/* [ch][eo][peo][s][v] */
unsigned int phase;
/* current processing phase */
struct mad_pcm pcm;
/* PCM output */};
此数据结构存放解码合成滤波后的 PCM 数据,pcm 域比较重要:
struct mad_pcm {
FrameSize = (((MpegVersion == MPEG1 ? 144 : 72) * Bitrate) / SamplingRate) + PaddingBit
例如: Bitrate = 128000, a SamplingRate =44100, and PaddingBit = 1
原创教程
UP MCU 工作室
Libmad 音频解码库移植手册
本手册由 UP MCU 工作室编写,若要转载请注明出处 2012-8-12
UP MCU 工作室 淘宝店:
1
原创教程
UP MCU 工作室
前言
目前,网络上绝大都数关于 MP3 播放器的例子,大都采用 vs1003 这颗硬件解码芯片或 者使用 AT89C51SND1C 这颗含有内部音频解码电路的 NB 单片机,软件音频解码的例子少之又 少。UP MCU 工作室的相关人员花了些时间、精力,研究了目前 linux 领域很常用的一个开 源音频解码库——libmad 的解码流程,并将其成功移植到裸奔的 stm32 平台上。本着资源 共享的奉献精神,本工作室将移植过程整理成手册,发布于网络,希望对大家有用。
3. Libmad 移植
从前面的解码框图中我们知道,使用 libmad 解码,我们只需要把音频文件流读入 给 libmad,然后把解码得到的 PCM 数据进行播放就可以。

用Direct Sound为MP3解码器libmad播放输出

用Direct Sound为MP3解码器libmad播放输出

用Direct Sound为MP3解码器libmad播放输出WIN32平台下madplay默认采用WaveOut播放输出,本文实现为其增加Direct Sound输出。

在Windows XP,VC++ 6.0测试通过。

(一)优秀的MP3解码器libmad简介libmad是跨平台的基于命令行的MP3播放解码器,使用定点解码,可用于没有浮点运算的嵌入式系统。

(二)下载及测试1、从官方网站下载madplay-0.15.2b.tar.gz,libmad-0.15.1b.tar.gz,libid3tag-0.15.1b.tar.gz,还要从下载libz-1.1.4.tar.gz,共四个文件。

将四个压缩包保存在同一目录,例如d:\madplay。

2、用WINRAR“解码压到当前目录”方法将四个压缩包解压,在d:\madplay下将有四个文件夹:madplay-0.15.2b,libmad-0.15.1b,libid3tag-0.15.1b,libz-1.1.4。

3、用VC++ 6.0打开D:\madplay\madplay-0.15.2b\msvc++下的madplay工程。

修改VC++ 6.0的编译环境:Tools -> Options -> Directories标签 -> Directories框下增加如下两行:D:\MADPLAY\LIBMAD-0.15.1B\MSVC++D:\MADPLAY\LIBID3TAG-0.15.1B点击OK保存设置退出。

再为编译连接后的可执行文件指定运行参数:Project -> settings -> 点中左侧madplay -> 右侧Program arguments框内填入你硬盘上保存的一个MP3文件,例如:D:\MP3\test.mp3,单击OK保存设置退出。

按Ctrl+F5编译连接运行,就可以听到播放你选择的MP3歌曲了。

(三)为madplay增加Direct Sound输出madplay采用WaveOut作为播放输出,用DS输出的优点不再我说了吧。

【STM32H7的DSP教程】第6章ARMDSP源码和库移植方法(MDK5的AC5和AC6)

【STM32H7的DSP教程】第6章ARMDSP源码和库移植方法(MDK5的AC5和AC6)

【STM32H7的DSP教程】第6章ARMDSP源码和库移植⽅法(MDK5的AC5和AC6)第6章 ARM DSP源码和库移植⽅法(MDK5的AC5和AC6)本期教程主要讲解ARM官⽅DSP源码和库的移植以及⼀些相关知识的介绍。

6.1 初学者重要提⽰6.2 DSP库的下载和说明6.3 DSP库版本的区别6.4 DSP库的⼏个重要的预定义宏含义6.5 使⽤MDK的AC6编译器优势6.6 DSP库在MDK上的移植(AC5源码移植⽅式)6.7 DSP库在MDK上的移植(AC5库移植⽅式)6.8 DSP库在MDK上的移植(AC6源码移植⽅式)6.9 DSP库在MDK上的移植(AC6库移植⽅式)6.10 升级到最新版DSP库的⽅法6.11 简易DSP库函数验证6.12 总结6.1 初学者重要提⽰1. MDK请使⽤5.26及其以上版本,CMSIS软件包请使⽤5.6.0及其以上版本。

2. MDK的⼯程创建,下载和调试⽅法,在V7⽤户⼿册有详细说明:。

3. 鉴于MDK的AC6(ARM Compiler 6.X)编译器在浮点处理上的强劲性能,每个例⼦将必做⼀个AC6版,⽽且ARM编译好的DSP库也开始直接采⽤AC6。

4. MDK AC6有两个地⽅在使⽤的时候要注意:⼯程⽬录切记不要有中⽂路径,⽽且不要太长,否则会导致⽆法使⽤go to def以及调试的时候不正常。

MDK AC6⼯程模板的汉字编码问题,在本章6.8⼩节有详细说明。

6.2 DSP库的下载和说明下⾯详细的给⼤家讲解⼀下官⽅DSP库的移植。

6.2.1 DSP库的下载DSP库是包含在CMSIS软件包(Cortex Microcontroller Software Interface Standard)⾥⾯,所以下载DSP库也就是下载CMSIS软件包。

这⾥提供三个可以下载的地⽅:⽅式⼀:STM32CubeH7软件包⾥⾯。

每个版本的Cube软件包都会携带CMSIS⽂件夹,只是版本⽐较⽼,不推荐。

STM32中文参考手册

STM32中文参考手册
9 DMA 控制器(DMA)
9.1 DMA简介
9.2 DMA主要特性
9.3 功能描述
STM32F10xxx参考手册
75
75 75 76 76 77 77 77
78
78 78 79 79 80 80 81 82 82
83
83 83 86 86 87 87
88
89
89
89 89
91
91 92 92 92 94
108
9.4.3 DMA通道x配置寄存器(DMA_CCRx)(x = 1…7)
108
9.4.4 DMA通道x传输数量寄存器(DMA_CNDTRx)(x = 1…7)
110
9.4.5 DMA通道x外设地址寄存器(DMA_CPARx)(x = 1…7)
110
9.4.6 DMA通道x存储器地址寄存器(DMA_CPARx)(x = 1…7)
16
1.3 可用的外设
16
2 存储器和总线构架
17
2.1 系统构架
17
2.2 存储器组织
18
2.3 存储器映像
19
2.3.1 嵌入式SRAM
20
2.3.2 位段
20
2.3.3 嵌入式闪存
21
2.4 启动配置
23
3 CRC计算单元(CRC)
25
3.1 CRC简介
25
3.2 CRC主要特性
25
3.3 CRC功能描述
STM32F10xxx参考手册
38
38 39
39
39 39 40 40 42
45
45
45 45 46
46
48 48 49 49 49 50 50 50 50 50

STM32固件库之DAC

STM32固件库之DAC

void DAC_StructInit(DAC_InitTypeDef* DAC_InitStruct) 用默认值填充 DAC_InitStruct 结构的每一个成员 - DAC_InitStruct : 指向将要被初始化的 DAC_InitTypeDef 结构指针 无 无 DAC_Trigger_None DAC_WaveGeneration_None DAC_LFSRUnmask_Bit0 DAC_OutputBuffer_Enable
输出参数: 返回参数: typedef struct {
无 无
uint32_t DAC_Trigger;
uint32_t DAC_WaveGeneration; uint32_t DAC_LFSRUnmask_TriangleAmplitude; uint32_t DAC_OutputBuffer; }DAC_InitTypeDef; DAC_Trigger DAC 通道 2 触发选择 DAC_Trigger DAC_Trigger_None DAC_Trigger_T6_TRGO DAC_Trigger_T8_TRGO DAC_Trigger_T3_TRGO DAC_Trigger_T7_TRGO DAC_Trigger_T5_TRGO DAC_Trigger_T15_TRGO DAC_Trigger_T2_TRGO DAC_Trigger_T4_TRGO DAC_Trigger_Ext_IT9 DAC_Trigger_Software DAC_WaveGeneration DAC 通道噪声/三角波生成使能 DAC_WaveGeneration DAC_WaveGeneration_None DAC_WaveGeneration_Noise DAC_WaveGeneration_Triangle DAC_LFSRUnmask_TriangleAmplitude DAC 通道屏蔽/幅值选择器 DAC_LFSRUnmask_TriangleAmplitude DAC_LFSRUnmask_Bit0 DAC_LFSRUnmask_Bits1_0 DAC_LFSRUnmask_Bits2_0 DAC_LFSRUnmask_Bits3_0 DAC_LFSRUnmask_Bits4_0 DAC_LFSRUnmask_Bits5_0 DAC_LFSRUnmask_Bits6_0 DAC_LFSRUnmask_Bits7_0 DAC_LFSRUnmask_Bits8_0 DAC_LFSRUnmask_Bits9_0 DAC_LFSRUnmask_Bits10_0 DAC_LFSRUnmask_Bits11_0 DAC_TriangleAmplitude_1 描述 对噪声波屏蔽 DAC 通道 LFSR 位 0 对噪声波屏蔽 DAC 通道 LFSR 位[1:0] 对噪声波屏蔽 DAC 通道 LFSR 位[2:0] 对噪声波屏蔽 DAC 通道 LFSR 位[3:0] 对噪声波屏蔽 DAC 通道 LFSR 位[4:0] 对噪声波屏蔽 DAC 通道 LFSR 位[5:0] 对噪声波屏蔽 DAC 通道 LFSR 位[6:0] 对噪声波屏蔽 DAC 通道 LFSR 位[7:0] 对噪声波屏蔽 DAC 通道 LFSR 位[8:0] 对噪声波屏蔽 DAC 通道 LFSR 位[9:0] 对噪声波屏蔽 DAC 通道 LFSR 位[10:0] 对噪声波屏蔽 DAC 通道 LFSR 位[11:0] 设置三角波振幅为 1 关闭波形生成 使能噪声波形发生器 使能三角波发生器 描述 关闭 DAC 通道触发 TIM6TRGO 事件 TIM8TRGO 事件 ,适用于大容量产品 TIM3TRGO 事件适用于互联型产品 TIM7TRGO 事件 TIM5TRGO 事件 TIM15TRGO 事件,适用于中、小容量产品 TIM2TRGO 事件 TIM4TRGO 事件 外部中断线 9 使能 DAC 通道软件触发 描述

基于STM32芯片的音频播放器设计

基于STM32芯片的音频播放器设计

基于STM32芯片的音频播放器设计作者:吴社民来源:《科技视界》2014年第07期【摘要】本方案提出一种基于STM32F10X系列芯片的MP3解决方案。

STM32F10x系列芯片是ST公司基于ARM公司的Cortex-M3内核设计的一款低功耗、高性能、低门数、多接口的嵌入式微处理器芯片【关键词】STM32;SD Card;FAT32;MP30 引言本方案采用ST公司的STM32F103VBT6芯片完成MP3/WMA音频文件的解码播放功能。

其中STM32F103VBT6为主控芯片,采用VS1003芯片进行硬件解码,MP3/WMA格式音频文件存储在SD卡中。

由于采用新的数据压缩标准,MP3文件具有良好的音效和始于传输的体积大小。

本方案完成的功能包括:(1)SD卡文件的读写(2)FAT32文件系统的读写(3)支持“上一曲/下一曲”、“顺序播放”功能(4)支持歌词同步1 硬件设计1.1 器件介绍1.1.1 Cortex-M3内核Cortex-M3是ARM公司推出的新一代32位嵌入式微处理器内核。

它采用ARM-V7-M架构,具有高性能、低功耗、少门数的特点;因此,非常适合嵌入式系统领域的设计和应用。

Cortex-M3具有一个与内核系统紧密耦合的嵌套向量终端控制器NVIC(Nested Vectored Interrupt Controller)。

该NVIC可配置8级抢占式、256级优先级的1—240个外部中断,同时支持咬尾中断、迟到中断技术,大大缩短了中断响应时间。

1.1.2 STM32芯片STM32xxx系列芯片是ST公司基于ARM Cortex-M3设计的一个32位微处理器系列。

该系列处理器在继承ARM Cortex-M3内核优点的基础上,扩展了其外部接口、增强其定时器功能、增加了A/D、D/A模块。

1.1.3 VS1003音频解码芯片VS1003是VSL公司生产的一款单片MP3/WMA/MIDI音频解码和ADPCM编码芯片。

MP3软解码库Libmad详细解释


第1章
声明
本文档版权归属于 西安交通大学人工智能与机器人研究所 作者: 李国辉 g h l i @ a i a r . x j t u . e d u . c n
第2章 Mp3 解码算法流程
MP3 的全称为 MPEG1 Layer-3 音频文件, MPEG 音频文件是 MPEG1 标准中的声音部 分,也叫 MPEG 音频层,它根据压缩质分别对应 MP1、MP2、MP3 这三种声音文件,并根据不同的用途,使用不同层 次的编码。MPEG 音频编码的层次越高,编码器越复杂,压缩率也越高,MP1 和 MP2 的压 缩率分别为 4:1 和 6:1-8:1,而 MP3 的压缩率则高达 10:1-12:1。一分钟 CD 音质的音 乐,未经压缩需要 10MB 的存储空间,而经过 MP3 压缩编码后只有 1MB 左右。不过 MP3 对音频信号采用的是有损压缩方式,为了降低声音失真度,MP3 采取了“ 心理声学模型”, 即编码时先对音频文件进行频谱分析,然后再根据心理声学模型把谱线分成若干个阈值分 区,并计算每个阈值分区的阈值,接着通过量化和熵编码对每个谱线进行编码,最后形成具 有较高压缩比的 MP3 文件,并使压缩后的文件在回放时能够达到比较接近原音源的声音效 果。
2.1. Mp3 文件格式
MP3 文件以一帧为一个编码单元, 各帧编码数据是独立的。 为了清晰而准确地描述 mp3 文件格式,下面采用位流语法描述,这种语法格式与 c 语言近似,易于理解,且描述清晰。 其中粗体表示码流中的数据项,bslbf 代表位串,即“Bit string, left bit first ”,uimsbf 代表无 符号整数,即”unsinged integer, most significant bit first”,数字表示该数据项所占的比特数。

基于STM32的MP3播放器设计与实现

基于STM32的MP3播放器设计与实现设计和实现基于STM32的MP3播放器需要完成以下几个主要步骤:硬件设计、软件编程以及调试。

以下将详细描述每个步骤,并提供基于Keil MDK的完整源代码。

硬件设计:1.硬件平台选择:选择适合于MP3播放器的STM32系列单片机,如STM32F4系列。

2.音频芯片选择:选择具有I2S或SPI接口的音频解码芯片,如VS1053芯片。

3.外设选择:选择适当的外设来控制用户输入(如按键)、显示屏幕和存储介质(如SD卡)。

4.硬件连接:按照芯片和外设的接口要求,连接单片机、音频解码芯片、按键、显示屏幕和SD卡等。

软件编程:1.硬件初始化:初始化单片机和外设的引脚配置、时钟和中断等。

2.外设驱动编写:编写外设的驱动程序,包括音频解码芯片驱动、SD 卡驱动、按键驱动、显示屏幕驱动等。

3.MP3解码器:基于音频解码芯片的通信协议,编写MP3解码器的相关程序,实现文件的解码和音频数据的播放。

4.用户接口:编写用户界面程序,实现按键控制、显示屏幕显示、菜单操作等功能,以便用户操作音乐播放器。

5.文件系统:编写文件系统程序,实现对SD卡中音乐文件的读取和管理。

调试:1. 编译:使用Keil MDK进行编译,检查程序是否能够正确编译通过。

3.调试:通过串口或调试器连接STM32单片机,查看程序运行过程中的输出信息,检查是否存在问题并进行调试。

以下是一个基于STM32F4系列的MP3播放器的部分源代码,完成了初始化、外设驱动、MP3解码器和用户接口的编写。

```c#include "stm32f4xx.h"#include "vs1053.h"#include "sdcard.h"#include "lcd.h"#include "key.h"void Delay(uint32_t nCount)for(; nCount != 0; nCount--);int main(void)LCD_Init(;Key_Init(;VS1053_Init(;SD_Init(;while(1)if (Key_Scan( == KEY_PLAY)SD_Play(;}}void EXTI0_IRQHandler(void)if (EXTI_GetITStatus(EXTI_Line0) != RESET)VS1053_TriggerInterrupt(;EXTI_ClearITPendingBit(EXTI_Line0);}```以上代码只是一个简单的示例,具体实现需要根据所选择的硬件平台和外设来编写相应代码,例如音频解码芯片的驱动程序、SD卡的读写程序等。

基于Qtopia Core的MP3播放器在ARM-Linux平台上的设计与实现

Design and Realization of MP3 Player Based on Qtopia Core in ARM - Linux
作者: 汪英[1] 余展然[2] 彭楚武[2]
作者机构: [1]长沙通信职业技术学院,湖南长沙410015 [2]湖南大学电气与信息工程学院,湖南长沙410082
出版物刊名: 湖南工业职业技术学院学报
页码: 13-15页
主题词: 嵌入式Linux Qtopia Core libmad MP3播放器
摘要:介绍了嵌入式GUI开发环境Qtopia Core和基于定点运算的高精度MPEG音频解码库libmad的移植,然后设计和实现了以ARM-Linux和Qtopia Core为平台的MP3播放器。

该播放器效率高,支持播放列表和均衡器,界面友好,具有全中文界面,能够满足中高端嵌入式产品的需求,在嵌入式产品的应用中具有一定的价值。

大学毕业设计---基于stm32的mp3音频播放器制作

在系统实现的过程中,硬件选择是非常重要的一部分,主控芯片已经确定好了,接下来就是其他芯片的选取,来实现其相对应的功能,下面我们重点分析以下几个芯片的选型。
2.2.1 MP3解码芯片选择
使用STM32主控芯片解码有两种方法,第一是通过处理器的软件解码,第二是通专用芯片解码,第一种方法要求芯片运算速度非常高,而且声音不是很流畅,对播放的采样有极大要求,故选择第二种专用芯片解码。
本设计使用解码MP3的芯片是VS1003,它支持WAV格式、MP3格式、MIDI格式、WMA格式等,同时可以设置调整音量高低等,而且还有一个功能是可以支持MICI,此外还可以扩展录音功能。
2.2.2 收音机芯片选择
本设计的收音功能只适用于FM收音,选用TEA5767芯片来实现,TEA芯片是飞利浦公司生产的一款低功耗电调谐调的立体声收音机芯片,该芯片通过IIC总线协议可以直接控制。可以实现调频接收,频率的范围在76MHZ~108MHZ,而且接收的是立体声,带信号强弱指示,但由于芯片体积较小,焊接困难,所以直接采用模块来实现,使用非常方便,可以提高本设计效果,节约时间以及成本。
2.2.4电源芯片选择
本设计要求系统电压输入: 2.5V, 3.3V,5V.所以对电源的处理需要满足能输出以上电压,
系统电源主要包括给数字芯片供电,这些电源需要的功率小,可以选用REG1117-2.5和REG1117-3.3V稳压芯片供给2.5V和3.3V的电压。REG1117的输出电流为800ma,符合设计要求。
图2.4 收音机模块电路
需要注意的是,收音机模块对电源敏感,同时对外部电路的干扰也较大,所以在这里,对模块电源的处理采用了RC滤波加大电容的方式,能有效的降低收音机模块对外部电源的干扰。也能保证收音机模块电源的稳定。图中ANT为天线接口,通过外接天线,可以提高收音机的灵敏度。
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
下图大致展示了 MP3 解码的流程:
其中同步及差错检查包括了头解码模块,在主控模块开始运行后,主控模块将比特流的 数据缓冲区交给同步及差错检查模块,此模块包含两个功能,即头信息解码及帧边信息解码, 根据它们的信息进行尺度因子解码及哈夫曼解码,得出的结果经过逆量化,立体声解码,混 淆缩减,IMDCT,频率反转,合成多相滤波这几个模块之后,得出左右声道的 PCM 码流,再 由主控模块将其放入输出缓冲区输出到声音播放设备。
FrameSize = (((MpegVersion == MPEG1 ? 144 : 72) * Bitrate) / SamplingRate) + PaddingBit
例如: Bitrate = 128000, a SamplingRate =44100, and PaddingBit = 1
enum mad_layer layer;
/* audio layer (1, 2, or 3) */
enum mad_mode mode;
/* channel mode (see above) */
int mode_extension;
/* additional mode info */
enum mad_emphasis emphasis;
3. Libmad 移植
从前面的解码框图中我们知道,使用 libmad 解码,我们只需要把音频文件流读入 给 libmad,然后把解码得到的 PCM 数据进行播放就可以。
移植前,我们需要准备好已经能进行文件系统读写的工程模板,相信对文件系统的 应用,大家都不陌生,我采用的是 FatfsR0.09,从 SD 卡中读入 MP3 数据给 libmad 解 码,最后使用 PCM1770 进行 DA 转换。如果有对文件系统移植不熟悉的童鞋,可以参考 我例程中的文件系统移植模板的源码。
unsigned int samplerate;
/* sampling frequency (Hz) */
unsigned short channels;
/* number of channels */
unsigned short length;
/* number of samples per channel */
1.Libmad 简介
LIBMAD 是一个高质量的音频解码库,MAD 的全称是 MPEG Audio Decoder。LIBMAD 目前 支持 MPEG-1、低采样率的 MPEG-2 和 MPEG2.5 格式的 LayerⅠ、LayerⅡ、LayerⅢ(即 MP3) 的解码。
MAD 具有如下特性:
●高精度的 24-BIT PCM 输出;
本手册移植工作所对应的软硬件平台如下: 操作系统:windows XP 开发环境:MDK V4.23 STM 固件库版本号:V3.5.0 主芯片 :STM32F103RET6(512K flash 64KRAM)运行于 72M DA 芯片 :PCM1770PW
由于本人水平有限,文中若有不对的地方,欢迎拍砖。拍砖地址 447926737wangkai@
/* [ch][eo][peo][s][v] */
unsigned int phase;
/* current processing phase */
struct mad_pcm pcm;
/* PCM output */};
此数据结构存放解码合成滤波后的 PCM 数据,pcm 域比较重要:
struct mad_pcm {
●100%使用定点运算;
●完全基于 ISO/IEC 标准;
●支持 GNU GPL 协议。
MAD 完全采用 C 语言编写(里面的 IMDCT 部分和乘法运算可根据平台不同使用汇编来加 快运算速度),它对 MP3 解码算法做了很多优化,非常适合在没有浮点支持的嵌入式环境下 使用。利用 MAD 提供的 API,我们可以很容易的实现音频解码。
enum mad_error error;
/* error code (see above) */};
此数据结构存放解码前的位流数据。
struct mad_synth {
mad_fixed_t filter[2][2][2][16][8]; /* polyphase filterbank outputs */
struct mad_header header;
/* MPEG audio header */
int options;
/* decoding options (from stream) */
mad_fixed_t sbsample[2][36][32];
/* synthesis subband filter samples */
};
我们可以在 layer 这个域中得到音频数据所采的层,在 mode 域中得到音频数据的声道 个数,在 birrate 和 samplerete 中得到音频数据的位率(128kbps、384kbps 等等)和采样 率(22KHZ、44.1KHZ、48KHZ 等等)
Libmad 解码分同步方式和异步方式两种,所谓同步方式是指解码函数在解码完一帧 后才返回并带回出错信息,异步方式是指解码函数在调用后立即返回,通过消息传递解码状 态信息。我们采用裸奔的方式,当然只能使用同步解码。
Ok,废话少说,下面我们真正的开始移植
u 添加源码到工程
解压源码包内 libmad-0.15.1b.rar,然后将 libmad-0.15.1b 文件夹复制到工 程目录,把里面所有.c 文件都加入到 MDK 工程,并设置好包含路径,防止.h 和 .bat 文件在编译时被提示找不到,加入后如下图:
UP MCU 工作室 淘宝店:
原创教程
UP MCU 工作室
Libmad 音频解码库移植手册
本手册由 UP MCU 工作室编写,若要转载请注明出处 2012-8-12
UP MCU 工作室 淘宝店:
1
原创教程
UP MCU 工作室
前言
目前,网络上绝大都数关于 MP3 播放器的例子,大都采用 vs1003 这颗硬件解码芯片或 者使用 AT89C51SND1C 这颗含有内部音频解码电路的 NB 单片机,软件音频解码的例子少之又 少。UP MCU 工作室的相关人员花了些时间、精力,研究了目前 linux 领域很常用的一个开 源音频解码库——libmad 的解码流程,并将其成功移植到裸奔的 stm32 平台上。本着资源 共享的奉献精神,本工作室将移植过程整理成手册,发布于网络,希望对大家有用。
下面我们主要分析一下 libmad 里面用到的一些重要数据结构,这些都定义在 mad.h 文 件中。
struct mad_stream { unsigned char const *buffer; unsigned char const *bufend; unsigned long skiplen; int sync; unsigned long freerate; unsigned char const *this_frame; unsigned char const *next_frame; struct mad_bitptr ptr;
MAD 的源码我们可以在 /projects/mad/files/下载到。
UP MCU 工作室 淘宝店:
2
原创教程
UP MCU 工作室ห้องสมุดไป่ตู้
/products/mad 有关于 libmad 的介绍和其他相关的资料, 其中 madlld 这个项目是一个 libmad 低层 API 的 demon,我的解码工作就是移植 libmad 和 利用 madlld 搭好的框架解析 MP3 数据得到 PCM 格式的数据。
unsigned char (*main_data)[MAD_BUFFER_MDLEN];
/* Layer III main_data() */
unsigned int md_len;
/* bytes in main_data */
int options;
/* decoding options (see below) */
mad_fixed_t (*overlap)[2][32][18]; /* Layer III block overlap data */};
上面数据结构记录 MPEG 帧解码后 PCM 数据的数据结构,其中 mad_header 这个结 构体比较重要,它的内容如下:
struct mad_header {
mad_fixed_t samples[2][1152];
/* PCM output samples [ch][sample]
*/};
它定义了音频的采样率,声道个数和 PCM 采样数据, 我们用这里面的信息来初始化音 频设备。libmad 是以桢(frame)为单位对 MP3 进行解码的,当正确的解码完一帧数据可 以得到(每声道)1152 个 PCM 数据。那么一帧数据量到底有多少呢?——这个值是变化 的,我们可以用下面的公式来计算:
/* sampling frequency (Hz) */ /* frame CRC accumulator */ /* final target CRC checksum */ /* flags (see below) */ /* private bits (see below) */ /* audio playing time of frame */
/* input bitstream buffer */ /* end of buffer */ /* bytes to skip before next frame */ /* stream sync found */ /* free bitrate (fixed) */ /* start of current frame */ /* start of next frame */ /* current processing bit pointer */
相关文档
最新文档