
前言/ G8 I" h/ |! r" `& z% ? 本应用笔记描述了 ADPCM 音频固件编解码器,并提供了演示固件来说明如何在使用STM32F103xxI2S 时,利用外部的 DAC 来播放 ADPCM 文件。0 c) i1 G: |& r+ ~' B1 P% Z 本应用笔记基于 “AN2739:如何利用具有外部 I2S 音频编解码器的高容量 STM32F103xx 微控制器播放音频文件 ”。由于关于 SPI、I2S 和外部 DAC 的部分在 AN2739 中已有说明,此处不再赘述。因此,为了能充分理解本应用笔记,建议您参考 AN2739。# V: I, J/ H6 ?6 ^ # P/ f/ I- {0 t4 D4 s2 K 1 ADPCM 算法 1.1概述 自适应差分脉冲编码调制 , 或简称为 ADPCM, 是波形编码的音频算法 , 它通过以前的信号值预测当前的信号值 , 并且仅发送真实值和预测值的差值。 在普通的脉冲编码调制 (PCM)中,发送的是真实或实际信号值。 ADPCM 的优势在于通常预测信号值和真实信号值的差值相当小,这意味着与相应的 PCM 值相比,它可以用更少的位数来表示。& R( T! l% O t9 r- G* w. r1 F 根据需要的质量和压缩比,差分信号按照 4 (2 位)、 8 (3 位)、 16 (4 位)或 32 (5 位)水平量化。 ADPCM 算法的实现方法有很多。它们在量化和预测模式上有所不同。 在本应用笔记中,我们提供了由交互式多媒体协会(IMA)开发的4位量化算法IMA ADPCM。" O, h x) f. d8 K6 | @7 M 选择 IMA ADPCM 有多种原因:1 x; X' M* v$ G8 k* \ ●它可以应用于 8 kHz 到 44.10 kHz 之间的不同采样率 ●它能在较低的 CPU 的使用率和较少的内存占用情况下保证音频的播放质量2 O3 I" M8 x& |( V; _0 u2 ` ●它具有广泛的实现方式,例如在 Windows 和 Mac 操作系统中% O6 R; K. e% v3 k! ?/ A$ r IMA 数字音频对焦和技术工作组公布的一份文件对 IMA ADPCM 算法进行了充分说明:“ 在多媒体系统中增强数字音频兼容性的建议措施 ” 版本 3。 1.2 ADPCM 算法实现! F: @, A& x2 h* i 本应用笔记提供的 IMA ADPCM 算法用于对具有下述规范的音频文件进行编码:# J$ z6 @+ W: ?* { C: L: o# l& ?) L ●音频格式:PCM8 e/ g: x% \3 V ●音频采样大小:16 位- I3 R) X9 D8 X, Y) y- ]$ r7 X ●通道 : 1 ( 单声道 ) ●音频采样率:8 kHz 到 44.1 kHz6 w( ^' c5 y: r- k 每个 16 位 PCM 采样被编码为 4 位 ADPCM 采样,压缩比达到 1/4。 IMA ADPCM 算法实现包含两个函数,一个函数编码音频采样,另一个函数解码音频采样。6 G! q: X- ~! I/ p' O ADPCM 固件由两个文件组成:) b5 j$ ~% |+ V8 p1 l a) adpcm.c:它包括执行编码和解码的两个 ADPCM 函数的源代码。 b) adpcm.h:它是 adpmc.c 的头文件。它应该包含在调用 ADPCM 函数的文件中。2 {, ^( [/ f9 N7 O 6 g: z5 X3 o4 [% ? 0 h$ n0 c% H3 y# X 1.3 ADPCM 算法函数7 R5 C8 e8 |$ Q+ b/ } 表 1 描述了 ADPCM 函数。+ `9 ~4 \( ]2 h5 a$ d5 K# y ; k) o! R( x% Q7 F+ f$ {! ]! s ![]() 9 m0 |2 r s: g 1 x, P/ S* u$ e& x 1.3.1ADPCM_Encode 函数/ h* o$ ?9 A$ k i( p 表 2 描述了 ADPCM_Encode 函数。 . O8 ^: ~9 L5 V9 s2 T: B ![]() 3 |4 |! A, Q! E6 m$ Z% F ADPCM_Encode 函数返回一个包含 4 位 ADPCM 采样值的字节。软件将 2 个 ADPCM 采样值存入一个字节以便节约内存空间。" P. [# c- _# [/ n! q( @* f 示例: // 输入:pcm_sample1 和 pcm_sample2 ; 2 个 16 位 PCM 采样值。 // 输出:adpcm_byte ;存入一个字节的两个 4 位 ADPCM 采样值。 uint8_t code;& [7 Q) \ ~, p- i/ s. O# I /* 编码第一个 16 位采样值 */2 V1 u' b3 ?- u0 s code = ADPCM_Encode(pcm_sample1); A( }0 s1 E, P8 Q, c /* 存储第一个 4 位采样值 */ adpcm_byte = code;* o7 K" l* W0 }( Z /* 编码第二个 16 位采样值 */) G2 K& b" C! j' y: v! U* I+ X! S code = ADPCM_Encode(pcm_sample2);2 Y8 r4 S u" r) E. B5 f /* 存储第二个 4 位采样值 */0 r% n* r8 {1 N8 J adpcm_byte |= (code << 4);/* adpcm_byte 包含两个 4 位 ADPCM 采样值 */ * X* {( b& G$ r( W6 J$ n% J9 Y 0 h# x% z9 N b1 s* T 1.3.2ADPCM_Decode 函数# ~/ k! N& T" A S 表 3 描述了 ADPCM_Decode 函数。: x: G# y8 y! b ![]() 5 j4 f u0 U4 y9 e 7 q0 b3 N2 i5 V' d' s& l ADPCM_Encode函数的输入是一个包含4位ADPCM采样值的字节。在调用ADPCM_Decode函数之前,该软件必须提取出 4 位 ADPCM 数据并将其存入一个字节。 # L- X3 W. E6 |: C: p/ E . d+ x5 t- U; e9 g5 z 示例: // 输入:adpcm_byte ;存入一个字节的两个 4 位 ADPCM 采样值。, G# M; ?9 D# f* R0 c3 w // 输出:pcm_sample1 和 pcm_sample2 ; 2 个 16 位 PCM 采样值。 uint8_t code; /* 提取第一个 ADPCM4 位采样值 */: i7 {, E3 Z1 {) f/ m% h code = (adpcm_byte & 0x0F); /* 解码第一个 ADPCM 采样值 */1 w1 `( X5 G6 }! |% ~3 ? pcm_sample1 = ADPCM_Decode(code); /* 提取第二个 ADPCM 采样值 */ code = (adpcm_byte >> 4); /* 解码第二个 ADPCM 采样值 */- [1 w+ k% n4 n& H0 X( S pcm_sample2 = ADPCM_Decode(code); 2实现示例2 x% s; N7 f: |7 { 2.1说明 可以在 STM3210E-EVAL 板上运行提供的例子。它是一个典型的音频应用,包括: ●首先用 PC 软件将一个 PCM 文件编码为 ADPCM 格式(这个软件名为 muse.exe,是由ST 开发的。它实现了与 STM32F103xx 增强型系列产品相同的 ADPCM 算法编码器。 muse.exe 在本应用笔记附带的压缩软件包中:请参考 第 2.2 章节了解如何应用这个工具。): y5 b- u$ U$ ^- P4 o ●然后将编码文件加载到 Flash z! o7 W& G* x ●使用高容量 STM32F103xx 微控制器解码文件,驱动 DAC 播放音频。+ J+ T1 m' u! Z. Q! r$ y% d 在 STM3210E-EVAL 板上,128 兆位 NOR Flash 存储 ADPCM 文件和 STM32F103xx 器件上运行的固件解码器。然后用它解码该数据流,并且通过应用 I2S 外部 DAC 回放音频采样。 硬件环境基于应用笔记 “AN2739:如何使用高密度 STM32F103xx 微控制器与外部 I2S 音频编解码器播放音频文件 ”,请参考该应用笔记以获得更多信息。& F3 Z, q6 _9 r1 G) p& \( O 要运行这个演示示例,需要进行三个步骤: 1. 生成 ADPCM 文件 2. 将 ADPCM 文件载入 NOR Flash 3. 播放 ADPCM 文件/ L0 U1 P- ^& k* _ I5 a. w' m . |8 e" B% L1 W" |+ E # `+ N: N, v: i! z& c 完整版请查看:附件 4 K- R8 X" q, d" E4 x0 _ ( a' v+ ^" ]" J: w y' u( L7 g |
CD00224093_ZHV2.3.pdf
下载217.52 KB, 下载次数: 9
111111111111111111111111111111