STMCU小助手
发布时间:2022-7-15 23:14
|
前言; Q P1 F: u: y* ^! B! m 本应用笔记描述了 ADPCM 音频固件编解码器,并提供了演示固件来说明如何在使用STM32F103xxI2S 时,利用外部的 DAC 来播放 ADPCM 文件。 本应用笔记基于 “AN2739:如何利用具有外部 I2S 音频编解码器的高容量 STM32F103xx 微控制器播放音频文件 ”。由于关于 SPI、I2S 和外部 DAC 的部分在 AN2739 中已有说明,此处不再赘述。因此,为了能充分理解本应用笔记,建议您参考 AN2739。9 d/ X2 P: Z- Z2 f! Y; | ! o1 k+ Q) C% q: s" h6 K" v % v+ @2 P2 w) h# Y2 i 1 ADPCM 算法 1.1概述4 Z0 c$ f/ t( ]& g 自适应差分脉冲编码调制 , 或简称为 ADPCM, 是波形编码的音频算法 , 它通过以前的信号值预测当前的信号值 , 并且仅发送真实值和预测值的差值。 在普通的脉冲编码调制 (PCM)中,发送的是真实或实际信号值。 ADPCM 的优势在于通常预测信号值和真实信号值的差值相当小,这意味着与相应的 PCM 值相比,它可以用更少的位数来表示。$ @- f" w k; C: s8 Z 根据需要的质量和压缩比,差分信号按照 4 (2 位)、 8 (3 位)、 16 (4 位)或 32 (5 位)水平量化。1 n; J e7 a& d* V. u ADPCM 算法的实现方法有很多。它们在量化和预测模式上有所不同。- O K, c9 `( ?# s8 v/ n 在本应用笔记中,我们提供了由交互式多媒体协会(IMA)开发的4位量化算法IMA ADPCM。" y; r+ Y, x/ n6 J3 W 选择 IMA ADPCM 有多种原因:( i1 a* l; Q2 q ●它可以应用于 8 kHz 到 44.10 kHz 之间的不同采样率# X3 H: t% ]9 [ ●它能在较低的 CPU 的使用率和较少的内存占用情况下保证音频的播放质量 ●它具有广泛的实现方式,例如在 Windows 和 Mac 操作系统中+ {' E2 J8 {, e7 e IMA 数字音频对焦和技术工作组公布的一份文件对 IMA ADPCM 算法进行了充分说明:“ 在多媒体系统中增强数字音频兼容性的建议措施 ” 版本 3。 1.2 ADPCM 算法实现' ?& H' V) f+ d% z/ o 本应用笔记提供的 IMA ADPCM 算法用于对具有下述规范的音频文件进行编码: ●音频格式:PCM2 d* }+ u& m) d4 y' ^ ●音频采样大小:16 位 ●通道 : 1 ( 单声道 )* [4 G% I2 @6 N2 `- T- h4 v6 W( W ●音频采样率:8 kHz 到 44.1 kHz 每个 16 位 PCM 采样被编码为 4 位 ADPCM 采样,压缩比达到 1/4。9 K, b7 l z* W IMA ADPCM 算法实现包含两个函数,一个函数编码音频采样,另一个函数解码音频采样。 ADPCM 固件由两个文件组成:+ p1 Y5 M8 ?. J3 R& y( v, L a) adpcm.c:它包括执行编码和解码的两个 ADPCM 函数的源代码。 b) adpcm.h:它是 adpmc.c 的头文件。它应该包含在调用 ADPCM 函数的文件中。0 x+ a3 P; q# F3 j6 E7 Y# | : w, ^1 l3 b6 h( T 1.3 ADPCM 算法函数8 s' t3 J+ [+ W, { H& x# ^2 D# F 表 1 描述了 ADPCM 函数。 . m |( f6 b* Z+ d* A
1.3.1ADPCM_Encode 函数 表 2 描述了 ADPCM_Encode 函数。 2 N5 f- Z% Q* z) w
; o8 Q' ]- O( f ADPCM_Encode 函数返回一个包含 4 位 ADPCM 采样值的字节。软件将 2 个 ADPCM 采样值存入一个字节以便节约内存空间。; H6 C- G( u9 Y * b$ k, k- V# l# Z, s 示例: // 输入:pcm_sample1 和 pcm_sample2 ; 2 个 16 位 PCM 采样值。& o. H+ a! ?8 k. ?( m // 输出:adpcm_byte ;存入一个字节的两个 4 位 ADPCM 采样值。 uint8_t code;+ L0 D* h5 l! A( b& s /* 编码第一个 16 位采样值 */ code = ADPCM_Encode(pcm_sample1);2 V, g6 `0 I Y9 z3 h /* 存储第一个 4 位采样值 */ adpcm_byte = code; /* 编码第二个 16 位采样值 */1 v4 [$ h% H' h3 Z3 | code = ADPCM_Encode(pcm_sample2); /* 存储第二个 4 位采样值 */5 W; h: L0 R8 a0 n3 \$ n; G adpcm_byte |= (code << 4);/* adpcm_byte 包含两个 4 位 ADPCM 采样值 */0 @' n4 N0 v/ L+ h & U9 c' B: Q3 A& I4 x/ X7 R1 C 1.3.2ADPCM_Decode 函数$ \5 M" N2 W" [ 表 3 描述了 ADPCM_Decode 函数。 " ^, q3 h6 p+ h! q Y / k, k1 J, @& c r( ]3 H
/ \9 P- n' C0 s. _ ADPCM_Encode函数的输入是一个包含4位ADPCM采样值的字节。在调用ADPCM_Decode函数之前,该软件必须提取出 4 位 ADPCM 数据并将其存入一个字节。' z- _; e5 [7 J% } ' \4 f! Z" F2 v+ I( S) Z5 I& | + N. Y' f6 M$ S2 t2 F- \& q 示例:. z$ W! ]* S1 `* W, K+ S( Y% { // 输入:adpcm_byte ;存入一个字节的两个 4 位 ADPCM 采样值。 |2 O ?5 U7 a // 输出:pcm_sample1 和 pcm_sample2 ; 2 个 16 位 PCM 采样值。( c+ j% d6 s0 @, e% k, D0 m; e uint8_t code; /* 提取第一个 ADPCM4 位采样值 */ code = (adpcm_byte & 0x0F); /* 解码第一个 ADPCM 采样值 */ pcm_sample1 = ADPCM_Decode(code); /* 提取第二个 ADPCM 采样值 */' ~0 ~. {- m0 I$ }5 @ code = (adpcm_byte >> 4);+ |. t: y1 e( d& u$ d /* 解码第二个 ADPCM 采样值 */- g& C- Q# u( b- R pcm_sample2 = ADPCM_Decode(code); - g, ?& d* ~% A* A! |( Y 2实现示例 2.1说明" u+ J0 \* [/ H. e: D 可以在 STM3210E-EVAL 板上运行提供的例子。它是一个典型的音频应用,包括: ●首先用 PC 软件将一个 PCM 文件编码为 ADPCM 格式(这个软件名为 muse.exe,是由ST 开发的。它实现了与 STM32F103xx 增强型系列产品相同的 ADPCM 算法编码器。 muse.exe 在本应用笔记附带的压缩软件包中:请参考 第 2.2 章节了解如何应用这个工具。) L1 a9 w" ~) n& p( u ●然后将编码文件加载到 Flash ●使用高容量 STM32F103xx 微控制器解码文件,驱动 DAC 播放音频。( g8 h! `2 a% L: M! Z6 g 在 STM3210E-EVAL 板上,128 兆位 NOR Flash 存储 ADPCM 文件和 STM32F103xx 器件上运行的固件解码器。然后用它解码该数据流,并且通过应用 I2S 外部 DAC 回放音频采样。, z1 n- N$ B: ?8 h- v& ]3 | 硬件环境基于应用笔记 “AN2739:如何使用高密度 STM32F103xx 微控制器与外部 I2S 音频编解码器播放音频文件 ”,请参考该应用笔记以获得更多信息。/ v! ?3 a" A# _" O; I6 l" l$ G& n p 要运行这个演示示例,需要进行三个步骤:8 b# T' X6 I$ C/ a" z7 T 1. 生成 ADPCM 文件 2. 将 ADPCM 文件载入 NOR Flash+ f; `2 ?: s7 s! L) W, r$ h6 w 3. 播放 ADPCM 文件6 z. \. D+ |3 {: l# J, ?/ x; {& @ $ B% y5 v3 x6 n# [6 v8 o 5 Z1 L/ A7 C: }' R% X3 I 完整版请查看:附件- P5 b4 N1 N- {6 X% N$ a1 t" y |
CD00224093_ZHV2.3.pdf
下载217.52 KB, 下载次数: 38
DMA 原理从 0 到 1:为什么它能解放 CPU?一文讲透 DMA 的工作流程
【福利三:雨露均沾·逢7狂欢】之五:STM32系统时钟PLL故障排除1例
【福利三:雨露均沾·逢7狂欢】之三:AI帮我查BUG
福利三:雨露均沾·逢7狂欢】之二:STM32F407VG串口通信乱码故障的排除
基于STM32F103的I2C主从机通信
OpenBLT移植到STM32F103战舰开发板上适用于所有STM32F103系列的Bootloader
TFT LCD 与 FSMC 的硬件连接大容量 STM32F10xxx FSMC 接口
单片机:初学者该了解的STM32F103基础知识
2025软件工具兔哥知道
STM32之继电器模块
微信公众号
手机版
111111111111111111111111111111