
前言 本应用笔记描述了 ADPCM 音频固件编解码器,并提供了演示固件来说明如何在使用STM32F103xxI2S 时,利用外部的 DAC 来播放 ADPCM 文件。! |/ d4 z5 _" x2 q; ]9 d 本应用笔记基于 “AN2739:如何利用具有外部 I2S 音频编解码器的高容量 STM32F103xx 微控制器播放音频文件 ”。由于关于 SPI、I2S 和外部 DAC 的部分在 AN2739 中已有说明,此处不再赘述。因此,为了能充分理解本应用笔记,建议您参考 AN2739。& `( S- N/ z; {, k% ` 9 F3 |: {1 F: J" T ?3 t ! G$ a1 m z1 I1 s 1 ADPCM 算法 1.1概述7 d! V1 j7 K! {0 ~# P: C+ C 自适应差分脉冲编码调制 , 或简称为 ADPCM, 是波形编码的音频算法 , 它通过以前的信号值预测当前的信号值 , 并且仅发送真实值和预测值的差值。 在普通的脉冲编码调制 (PCM)中,发送的是真实或实际信号值。 h" K- L& {: u& J* \ ADPCM 的优势在于通常预测信号值和真实信号值的差值相当小,这意味着与相应的 PCM 值相比,它可以用更少的位数来表示。2 _& {& [# n5 P 根据需要的质量和压缩比,差分信号按照 4 (2 位)、 8 (3 位)、 16 (4 位)或 32 (5 位)水平量化。! e- ^$ w H, H3 t% ^5 @; T( o2 ] ADPCM 算法的实现方法有很多。它们在量化和预测模式上有所不同。- ~9 d- m! K# h( P5 J0 x1 S7 x 在本应用笔记中,我们提供了由交互式多媒体协会(IMA)开发的4位量化算法IMA ADPCM。 选择 IMA ADPCM 有多种原因:& _& n" L- V# q' t7 s ●它可以应用于 8 kHz 到 44.10 kHz 之间的不同采样率4 G2 S% a- Z* X3 u6 c" }) z+ v9 @ ●它能在较低的 CPU 的使用率和较少的内存占用情况下保证音频的播放质量 F" R* [. T8 f4 r ●它具有广泛的实现方式,例如在 Windows 和 Mac 操作系统中+ {' h! `6 x) K) c2 e/ e* c, u IMA 数字音频对焦和技术工作组公布的一份文件对 IMA ADPCM 算法进行了充分说明:“ 在多媒体系统中增强数字音频兼容性的建议措施 ” 版本 3。, C2 H2 t6 G+ M- B" f# n L * ]) V$ n0 r7 E: l! X! ]7 U 8 P, j# Q T* {; m 1.2 ADPCM 算法实现 本应用笔记提供的 IMA ADPCM 算法用于对具有下述规范的音频文件进行编码: ●音频格式:PCM ●音频采样大小:16 位0 }3 B6 n, R8 ^" o3 f/ N0 h* Y b( G, e ●通道 : 1 ( 单声道 )% I+ q% p0 c/ i( [4 V ●音频采样率:8 kHz 到 44.1 kHz9 _5 V8 S, G' M 每个 16 位 PCM 采样被编码为 4 位 ADPCM 采样,压缩比达到 1/4。9 s7 [' N+ @ t) y IMA ADPCM 算法实现包含两个函数,一个函数编码音频采样,另一个函数解码音频采样。: y+ G1 j8 M3 w$ V# M2 {9 w* W ADPCM 固件由两个文件组成:" v' P( [6 P$ J( Y& s7 O: t a) adpcm.c:它包括执行编码和解码的两个 ADPCM 函数的源代码。 b) adpcm.h:它是 adpmc.c 的头文件。它应该包含在调用 ADPCM 函数的文件中。) l3 \# J7 i" v$ g x. a7 v8 @ + P2 U* p/ V$ I* l 1.3 ADPCM 算法函数, v& i0 l! x# C/ w 表 1 描述了 ADPCM 函数。 k8 V& @% L; m: Q g ^9 z ![]() - c% r- Y: k, a! m Q% b& s/ c7 W' n! X9 {2 A 4 Q! u6 ?7 h1 h& T: n& v 1.3.1ADPCM_Encode 函数2 k# N, Z" Q5 z! ]3 v 表 2 描述了 ADPCM_Encode 函数。 ( {: d! Z! l$ a p* y9 A4 y# N9 Y9 r ![]() ADPCM_Encode 函数返回一个包含 4 位 ADPCM 采样值的字节。软件将 2 个 ADPCM 采样值存入一个字节以便节约内存空间。 6 Z2 l k3 R+ ~' W# Q ( r, |* [1 [) \( k0 S 示例:5 T- N7 q! j4 T, N; ?5 |& R9 z // 输入:pcm_sample1 和 pcm_sample2 ; 2 个 16 位 PCM 采样值。, g2 R4 B {8 I+ l- p, H // 输出:adpcm_byte ;存入一个字节的两个 4 位 ADPCM 采样值。1 x* n& C8 \8 A3 A4 g3 `- I) e uint8_t code; /* 编码第一个 16 位采样值 */ code = ADPCM_Encode(pcm_sample1);$ |& D; ~ F/ f9 ~8 m1 G1 \, ?$ X /* 存储第一个 4 位采样值 */" v/ D$ t9 N m adpcm_byte = code; /* 编码第二个 16 位采样值 */: ]9 W/ q+ n0 Q( `- P0 P8 y; E1 m code = ADPCM_Encode(pcm_sample2);# [+ Q3 ]2 ^( d& m( F M5 b4 a9 @( N8 H+ ` /* 存储第二个 4 位采样值 */! f+ x! Z/ n, G. o( o9 q adpcm_byte |= (code << 4);/* adpcm_byte 包含两个 4 位 ADPCM 采样值 *// u) f9 s$ u% h1 j, U 1.3.2ADPCM_Decode 函数2 V5 d: O6 b3 E0 @" p 表 3 描述了 ADPCM_Decode 函数。 ( J) `$ k5 j! ^4 L! a* l2 C / u" Y3 A1 b* M/ e4 k. @ ![]() $ Q+ _7 k2 Y0 p ADPCM_Encode函数的输入是一个包含4位ADPCM采样值的字节。在调用ADPCM_Decode函数之前,该软件必须提取出 4 位 ADPCM 数据并将其存入一个字节。& U. L+ Z: j3 ~ H4 Y 5 m) e0 H) B0 C1 a! L- ^ 示例:; z% J2 ~! G5 ~& p# k; } // 输入:adpcm_byte ;存入一个字节的两个 4 位 ADPCM 采样值。, I/ O) O' E& S7 @5 R# f" g3 N // 输出:pcm_sample1 和 pcm_sample2 ; 2 个 16 位 PCM 采样值。 uint8_t code; /* 提取第一个 ADPCM4 位采样值 */$ R7 l6 y) L' v: _ code = (adpcm_byte & 0x0F);/ O; ~+ l/ J! l /* 解码第一个 ADPCM 采样值 */ pcm_sample1 = ADPCM_Decode(code);2 M9 P9 v/ O+ J: M6 a; i- @. S0 c /* 提取第二个 ADPCM 采样值 */' a8 l$ R" e8 y' r code = (adpcm_byte >> 4); /* 解码第二个 ADPCM 采样值 */ pcm_sample2 = ADPCM_Decode(code);6 @- | \) o, L0 ]8 T: q: ` 2实现示例! U5 H' b( L7 L& w 2.1说明! [4 x. U5 }2 f2 A) ` 可以在 STM3210E-EVAL 板上运行提供的例子。它是一个典型的音频应用,包括:4 ]6 A) _; O* z$ @+ _2 ^ ●首先用 PC 软件将一个 PCM 文件编码为 ADPCM 格式(这个软件名为 muse.exe,是由ST 开发的。它实现了与 STM32F103xx 增强型系列产品相同的 ADPCM 算法编码器。( P' H/ q. F4 `3 C( c2 o5 J4 q6 _ muse.exe 在本应用笔记附带的压缩软件包中:请参考 第 2.2 章节了解如何应用这个工具。)3 i7 ~# G8 k, \$ |; n ●然后将编码文件加载到 Flash+ N" @4 K0 k# e& J" R8 P, [ ●使用高容量 STM32F103xx 微控制器解码文件,驱动 DAC 播放音频。/ v4 F, F4 D! \0 }1 Q 在 STM3210E-EVAL 板上,128 兆位 NOR Flash 存储 ADPCM 文件和 STM32F103xx 器件上运行的固件解码器。然后用它解码该数据流,并且通过应用 I2S 外部 DAC 回放音频采样。 硬件环境基于应用笔记 “AN2739:如何使用高密度 STM32F103xx 微控制器与外部 I2S 音频编解码器播放音频文件 ”,请参考该应用笔记以获得更多信息。 要运行这个演示示例,需要进行三个步骤: 1. 生成 ADPCM 文件 2. 将 ADPCM 文件载入 NOR Flash/ a( O1 Z3 O4 j6 f 3. 播放 ADPCM 文件 - b2 M5 D5 L& U * f- m" m1 W$ |# u( N & a( C$ s* p4 v0 m( N) m; k 完整版请查看:附件 |
CD00224093_ZHV2.3.pdf
下载217.52 KB, 下载次数: 9
STM32ADC过采样及几种ADC采样的处理方法
STM32的启动模式配置与应用
小马哥STM32F103开源小四轴RoboFly全部资料大放送
STM32固件库分享,超全系列整理
STM32F10xxx 正交编码器接口应用笔记 及源代码
分享一个STM32F103的硬件IIC代码库,完美解决IIC问题!
OpenBLT移植到STM32F103战舰开发板上适用于所有STM32F103系列的Bootloader
MultiButton移植到STM32F103战舰开发板
UDS诊断服务
使用Nano板验证驱动SPI串口屏的颜色显示
111111111111111111111111111111