
前言, K. L6 b5 w% A, _. I 本应用笔记描述了 ADPCM 音频固件编解码器,并提供了演示固件来说明如何在使用STM32F103xxI2S 时,利用外部的 DAC 来播放 ADPCM 文件。 本应用笔记基于 “AN2739:如何利用具有外部 I2S 音频编解码器的高容量 STM32F103xx 微控制器播放音频文件 ”。由于关于 SPI、I2S 和外部 DAC 的部分在 AN2739 中已有说明,此处不再赘述。因此,为了能充分理解本应用笔记,建议您参考 AN2739。# M. m$ f2 q) j$ D4 p : R# d9 B* q, J* z( O5 e4 K J# U; V+ H- Z$ t4 t: M/ v 1 ADPCM 算法 1.1概述 自适应差分脉冲编码调制 , 或简称为 ADPCM, 是波形编码的音频算法 , 它通过以前的信号值预测当前的信号值 , 并且仅发送真实值和预测值的差值。 在普通的脉冲编码调制 (PCM)中,发送的是真实或实际信号值。 ADPCM 的优势在于通常预测信号值和真实信号值的差值相当小,这意味着与相应的 PCM 值相比,它可以用更少的位数来表示。 根据需要的质量和压缩比,差分信号按照 4 (2 位)、 8 (3 位)、 16 (4 位)或 32 (5 位)水平量化。8 K/ n& |' p$ x: g1 e1 Z ADPCM 算法的实现方法有很多。它们在量化和预测模式上有所不同。% I+ X8 O, f: `: } 在本应用笔记中,我们提供了由交互式多媒体协会(IMA)开发的4位量化算法IMA ADPCM。: B$ C1 D" a& T( J 选择 IMA ADPCM 有多种原因: ●它可以应用于 8 kHz 到 44.10 kHz 之间的不同采样率: o/ Q6 E/ ?, W8 ^" A+ @ ●它能在较低的 CPU 的使用率和较少的内存占用情况下保证音频的播放质量 ●它具有广泛的实现方式,例如在 Windows 和 Mac 操作系统中' k/ l j6 Q/ G9 \. {- V IMA 数字音频对焦和技术工作组公布的一份文件对 IMA ADPCM 算法进行了充分说明:“ 在多媒体系统中增强数字音频兼容性的建议措施 ” 版本 3。 9 _* }3 r0 N4 f+ D 1.2 ADPCM 算法实现3 o9 t( Z; S. E5 y4 V1 o/ M; x( _5 { 本应用笔记提供的 IMA ADPCM 算法用于对具有下述规范的音频文件进行编码:4 }" _/ G' _) Z; Q! Q L, @3 L ●音频格式:PCM% G) [# B5 l, ~3 v; N: y" r ●音频采样大小:16 位 ●通道 : 1 ( 单声道 )- @5 U$ j2 v) o ●音频采样率:8 kHz 到 44.1 kHz 每个 16 位 PCM 采样被编码为 4 位 ADPCM 采样,压缩比达到 1/4。+ h ]8 F: N9 o9 c IMA ADPCM 算法实现包含两个函数,一个函数编码音频采样,另一个函数解码音频采样。3 r- V2 D8 t& U) p f9 t ADPCM 固件由两个文件组成:7 F% R& {2 n. k9 `5 z# I a) adpcm.c:它包括执行编码和解码的两个 ADPCM 函数的源代码。& ]0 f$ W2 o" ^% L7 d) n/ I& ? b) adpcm.h:它是 adpmc.c 的头文件。它应该包含在调用 ADPCM 函数的文件中。 0 ^* h# J! [& k7 s& Z1 j' N3 _ 1.3 ADPCM 算法函数 表 1 描述了 ADPCM 函数。 4 ^5 M) t, ~& I5 i, X, E2 n+ A ![]() 4 H7 A& G2 g* Z$ e* @% p* m! T & F7 s4 e2 ~7 u0 f. h* H 1.3.1ADPCM_Encode 函数2 a& ^- B* z2 ~& A! {6 z& L 表 2 描述了 ADPCM_Encode 函数。 ![]() ADPCM_Encode 函数返回一个包含 4 位 ADPCM 采样值的字节。软件将 2 个 ADPCM 采样值存入一个字节以便节约内存空间。/ s1 _& J9 G( u0 W. d3 k% Y" q9 h- o+ c 6 u1 E4 V+ T: f3 M1 ]+ }& ] 示例:7 T! f! Y/ T' J) R# d H // 输入:pcm_sample1 和 pcm_sample2 ; 2 个 16 位 PCM 采样值。( c* q% U# ^+ s // 输出:adpcm_byte ;存入一个字节的两个 4 位 ADPCM 采样值。2 i% B$ X3 Z C1 A/ g! H uint8_t code; /* 编码第一个 16 位采样值 */1 A& z F2 G4 P* ^ code = ADPCM_Encode(pcm_sample1); /* 存储第一个 4 位采样值 */" k3 M/ [: y$ z3 G adpcm_byte = code; /* 编码第二个 16 位采样值 */% Q" l. [1 H6 Y1 j" p code = ADPCM_Encode(pcm_sample2);" r+ u( P$ P9 k1 v3 G1 Y) q$ F9 y /* 存储第二个 4 位采样值 */+ ^+ ^) c' d, X. R# z adpcm_byte |= (code << 4);/* adpcm_byte 包含两个 4 位 ADPCM 采样值 */; E) }9 ? J0 u3 q+ C0 Q * C/ q; a0 H' x) w9 E6 Q 1.3.2ADPCM_Decode 函数2 w* K2 o+ q+ x& i; p 表 3 描述了 ADPCM_Decode 函数。3 V9 a) {7 J& W* x# k ![]() " }% {! w4 Y$ T ADPCM_Encode函数的输入是一个包含4位ADPCM采样值的字节。在调用ADPCM_Decode函数之前,该软件必须提取出 4 位 ADPCM 数据并将其存入一个字节。 6 A& u. a" a3 b7 _6 f1 m4 N9 t 8 A0 @& y2 }0 @( D, F 示例:' ?7 w' t: J+ `; \: \" Q // 输入:adpcm_byte ;存入一个字节的两个 4 位 ADPCM 采样值。 // 输出:pcm_sample1 和 pcm_sample2 ; 2 个 16 位 PCM 采样值。 uint8_t code; /* 提取第一个 ADPCM4 位采样值 */ code = (adpcm_byte & 0x0F); /* 解码第一个 ADPCM 采样值 */" y2 s8 L0 M2 O* z pcm_sample1 = ADPCM_Decode(code);: h3 {; \2 m) r2 C$ K" K: U /* 提取第二个 ADPCM 采样值 */2 u5 ]6 H- S3 |' d* D9 p code = (adpcm_byte >> 4); /* 解码第二个 ADPCM 采样值 */ pcm_sample2 = ADPCM_Decode(code);& k) X3 ?3 T) r* N3 G5 |, Z0 { - X6 p! l# [9 n+ P% [5 U( X2 ^) K 2实现示例8 t2 o9 g# K7 P$ p7 B8 p k. @" A. S 2.1说明 可以在 STM3210E-EVAL 板上运行提供的例子。它是一个典型的音频应用,包括:' f |2 j+ y! q) j2 I; G8 d& r ●首先用 PC 软件将一个 PCM 文件编码为 ADPCM 格式(这个软件名为 muse.exe,是由ST 开发的。它实现了与 STM32F103xx 增强型系列产品相同的 ADPCM 算法编码器。 muse.exe 在本应用笔记附带的压缩软件包中:请参考 第 2.2 章节了解如何应用这个工具。) ●然后将编码文件加载到 Flash7 p5 |4 d& [5 i0 C! O3 r2 L) l% S ●使用高容量 STM32F103xx 微控制器解码文件,驱动 DAC 播放音频。) C! v1 D- t) j: v2 a 在 STM3210E-EVAL 板上,128 兆位 NOR Flash 存储 ADPCM 文件和 STM32F103xx 器件上运行的固件解码器。然后用它解码该数据流,并且通过应用 I2S 外部 DAC 回放音频采样。( ~0 v. X7 ]8 A( I 硬件环境基于应用笔记 “AN2739:如何使用高密度 STM32F103xx 微控制器与外部 I2S 音频编解码器播放音频文件 ”,请参考该应用笔记以获得更多信息。 要运行这个演示示例,需要进行三个步骤:& {+ m3 T9 h+ ]) H, V: C: i 1. 生成 ADPCM 文件 2. 将 ADPCM 文件载入 NOR Flash( A$ C' A8 _2 L3 T$ ?" b! N e 3. 播放 ADPCM 文件 - a. d# v5 V" @) i ]' I! s, g5 B+ |2 g N/ @) z . z2 o F5 Q% d6 i5 v. p0 g 完整版请查看:附件 3 I# h" M3 J' T5 N2 _& N0 r8 | 6 h6 Q* Q- d0 R2 r 4 K; K2 w* ^2 P" q, R% w; D |
CD00224093_ZHV2.3.pdf
下载217.52 KB, 下载次数: 9
111111111111111111111111111111