前言 本应用笔记描述了 ADPCM 音频固件编解码器,并提供了演示固件来说明如何在使用STM32F103xxI2S 时,利用外部的 DAC 来播放 ADPCM 文件。" \+ ]/ O1 I9 A& f 本应用笔记基于 “AN2739:如何利用具有外部 I2S 音频编解码器的高容量 STM32F103xx 微控制器播放音频文件 ”。由于关于 SPI、I2S 和外部 DAC 的部分在 AN2739 中已有说明,此处不再赘述。因此,为了能充分理解本应用笔记,建议您参考 AN2739。 ! D* Z3 \7 C b$ C 1 ADPCM 算法; _& I7 J: }/ { 1.1概述& k9 n& E' y# G& J6 L$ i 自适应差分脉冲编码调制 , 或简称为 ADPCM, 是波形编码的音频算法 , 它通过以前的信号值预测当前的信号值 , 并且仅发送真实值和预测值的差值。 在普通的脉冲编码调制 (PCM)中,发送的是真实或实际信号值。 ADPCM 的优势在于通常预测信号值和真实信号值的差值相当小,这意味着与相应的 PCM 值相比,它可以用更少的位数来表示。 根据需要的质量和压缩比,差分信号按照 4 (2 位)、 8 (3 位)、 16 (4 位)或 32 (5 位)水平量化。 ADPCM 算法的实现方法有很多。它们在量化和预测模式上有所不同。 在本应用笔记中,我们提供了由交互式多媒体协会(IMA)开发的4位量化算法IMA ADPCM。 选择 IMA ADPCM 有多种原因: ●它可以应用于 8 kHz 到 44.10 kHz 之间的不同采样率; {( t Z, x2 k6 b& O) s R- [4 P ●它能在较低的 CPU 的使用率和较少的内存占用情况下保证音频的播放质量5 f7 t; T. b/ [ ●它具有广泛的实现方式,例如在 Windows 和 Mac 操作系统中 IMA 数字音频对焦和技术工作组公布的一份文件对 IMA ADPCM 算法进行了充分说明:“ 在多媒体系统中增强数字音频兼容性的建议措施 ” 版本 3。0 Y. a6 h9 p9 ~2 ~& [ . P# o) {4 s4 {! `6 u 1.2 ADPCM 算法实现 本应用笔记提供的 IMA ADPCM 算法用于对具有下述规范的音频文件进行编码: ●音频格式:PCM# j+ C' W: n3 p3 g. R5 a ●音频采样大小:16 位% X5 \/ n" u6 a: V ●通道 : 1 ( 单声道 ) E+ T; t9 V5 k ●音频采样率:8 kHz 到 44.1 kHz 每个 16 位 PCM 采样被编码为 4 位 ADPCM 采样,压缩比达到 1/4。 IMA ADPCM 算法实现包含两个函数,一个函数编码音频采样,另一个函数解码音频采样。& \' X# B; l M ADPCM 固件由两个文件组成: a) adpcm.c:它包括执行编码和解码的两个 ADPCM 函数的源代码。 b) adpcm.h:它是 adpmc.c 的头文件。它应该包含在调用 ADPCM 函数的文件中。+ M3 t8 y7 w, F1 U) f + v* b/ Z7 @, {( P" `% u 1.3 ADPCM 算法函数 表 1 描述了 ADPCM 函数。 0 e* S: _) a2 h7 r7 p) P0 V $ N* c4 g$ g1 s2 @8 m( R C9 M 1.3.1ADPCM_Encode 函数( Z4 |- e$ L* j5 l) R2 X 表 2 描述了 ADPCM_Encode 函数。6 ^! E! |* F5 [+ s" x7 Z- a H0 u1 m$ A( @% R ADPCM_Encode 函数返回一个包含 4 位 ADPCM 采样值的字节。软件将 2 个 ADPCM 采样值存入一个字节以便节约内存空间。 & s! b2 Z: ~% [' M 3 e7 |6 r2 E* v+ }: ]8 V 示例:5 i$ f k8 t' j // 输入:pcm_sample1 和 pcm_sample2 ; 2 个 16 位 PCM 采样值。3 ?" V3 ]. d! q& p }4 F7 z // 输出:adpcm_byte ;存入一个字节的两个 4 位 ADPCM 采样值。 }9 O U3 m4 j" z$ [& f- P uint8_t code;% O0 c3 s. }7 v' y$ H /* 编码第一个 16 位采样值 */4 d) c" N4 L" C* W3 d' I: m code = ADPCM_Encode(pcm_sample1);& B1 X/ h# ]% M, _! ? /* 存储第一个 4 位采样值 */ adpcm_byte = code;1 [. U/ @+ m' g9 s/ E1 c3 S) K9 O; F /* 编码第二个 16 位采样值 */2 S' @& ~& F% t8 c' d' B code = ADPCM_Encode(pcm_sample2); /* 存储第二个 4 位采样值 */ adpcm_byte |= (code << 4);/* adpcm_byte 包含两个 4 位 ADPCM 采样值 */8 l0 K7 L. {. Q/ t. |# O( Y ( f/ a/ X2 K9 q+ ? 1.3.2ADPCM_Decode 函数8 V' m+ X H) D2 n) ?, C1 g! d. j 表 3 描述了 ADPCM_Decode 函数。& {& G6 J4 ~- u; s . n1 g: G4 P2 n' ^4 e ' j6 q; V% K9 U2 P5 [ 7 Q+ b6 ]; M: f2 q; w. H ADPCM_Encode函数的输入是一个包含4位ADPCM采样值的字节。在调用ADPCM_Decode函数之前,该软件必须提取出 4 位 ADPCM 数据并将其存入一个字节。 . L( p! W/ @7 W; {3 j8 } 示例:! H8 J6 n2 A1 g# y& p7 ?9 n d // 输入:adpcm_byte ;存入一个字节的两个 4 位 ADPCM 采样值。. `6 o5 F4 w% q6 w2 \% Z' y8 L // 输出:pcm_sample1 和 pcm_sample2 ; 2 个 16 位 PCM 采样值。 uint8_t code; /* 提取第一个 ADPCM4 位采样值 */" |& N- T- c2 n% f& ]- o& O; d; _ code = (adpcm_byte & 0x0F);' R3 C0 J$ f# l" t /* 解码第一个 ADPCM 采样值 */ pcm_sample1 = ADPCM_Decode(code); /* 提取第二个 ADPCM 采样值 */8 ]- m$ N( @ t/ ?" d8 B code = (adpcm_byte >> 4); /* 解码第二个 ADPCM 采样值 */7 s% a+ U3 A, T. i9 F. S! u pcm_sample2 = ADPCM_Decode(code); 2实现示例 `! \ t# J4 r# j 2.1说明4 T( |, G# T. e z9 T( B9 u 可以在 STM3210E-EVAL 板上运行提供的例子。它是一个典型的音频应用,包括: ●首先用 PC 软件将一个 PCM 文件编码为 ADPCM 格式(这个软件名为 muse.exe,是由ST 开发的。它实现了与 STM32F103xx 增强型系列产品相同的 ADPCM 算法编码器。 muse.exe 在本应用笔记附带的压缩软件包中:请参考 第 2.2 章节了解如何应用这个工具。), Y9 S! L, j) v* x7 _; j+ b5 O# c ●然后将编码文件加载到 Flash ●使用高容量 STM32F103xx 微控制器解码文件,驱动 DAC 播放音频。 在 STM3210E-EVAL 板上,128 兆位 NOR Flash 存储 ADPCM 文件和 STM32F103xx 器件上运行的固件解码器。然后用它解码该数据流,并且通过应用 I2S 外部 DAC 回放音频采样。 硬件环境基于应用笔记 “AN2739:如何使用高密度 STM32F103xx 微控制器与外部 I2S 音频编解码器播放音频文件 ”,请参考该应用笔记以获得更多信息。 要运行这个演示示例,需要进行三个步骤:. f; S! s5 D5 v$ L! D 1. 生成 ADPCM 文件5 _% g- Q4 P! w7 k$ w7 } 2. 将 ADPCM 文件载入 NOR Flash" ~! p% y# l' E 3. 播放 ADPCM 文件, U9 M$ @5 y( y. k# m 完整版请查看:附件4 q, B H9 f t! b 4 {: }: G, I0 [ O5 _ |
CD00224093_ZHV2.3.pdf
下载217.52 KB, 下载次数: 7
【MCU实战经验】+STM32F103的uCOSII详细移植
游名科技:STM32F103+TMC2160:86步进电机和驱动一体原理图/PCB...
小马哥STM32F103开源小四轴RoboFly全部资料大放送
STM32F103标准库开发---SPI实验---读写 W25Q128 外部 Flash
RT-Thread在STM32F103RC上移植
STM32固件库分享,超全系列整理
【原创】STM32F103的SPI2的配置函数,DMA发送和接收!
【源代码】STM32F103C8T6最小板搞定CMSIS-DAP和SWO功能
【福利】用STM32库的朋友有福了:STM32F10x_StdPeriph_Lib_V3.5.0chm...
基于STM32F103做CAN的收发通信经验分享
111111111111111111111111111111