前言 本应用笔记描述了 ADPCM 音频固件编解码器,并提供了演示固件来说明如何在使用STM32F103xxI2S 时,利用外部的 DAC 来播放 ADPCM 文件。 本应用笔记基于 “AN2739:如何利用具有外部 I2S 音频编解码器的高容量 STM32F103xx 微控制器播放音频文件 ”。由于关于 SPI、I2S 和外部 DAC 的部分在 AN2739 中已有说明,此处不再赘述。因此,为了能充分理解本应用笔记,建议您参考 AN2739。 : C% g A# N$ k u8 i+ W* H/ d 1 ADPCM 算法 1.1概述 自适应差分脉冲编码调制 , 或简称为 ADPCM, 是波形编码的音频算法 , 它通过以前的信号值预测当前的信号值 , 并且仅发送真实值和预测值的差值。 在普通的脉冲编码调制 (PCM)中,发送的是真实或实际信号值。: _/ W0 b1 J. v! p, R/ v, D/ f3 I ADPCM 的优势在于通常预测信号值和真实信号值的差值相当小,这意味着与相应的 PCM 值相比,它可以用更少的位数来表示。% e) |4 A+ M+ v$ J" S/ @% l 根据需要的质量和压缩比,差分信号按照 4 (2 位)、 8 (3 位)、 16 (4 位)或 32 (5 位)水平量化。% z% g" B6 B2 d7 T ADPCM 算法的实现方法有很多。它们在量化和预测模式上有所不同。5 \" T$ v0 k' p: p- f5 v# \ 在本应用笔记中,我们提供了由交互式多媒体协会(IMA)开发的4位量化算法IMA ADPCM。 选择 IMA ADPCM 有多种原因: ●它可以应用于 8 kHz 到 44.10 kHz 之间的不同采样率; |4 D* c3 X$ }; E# w) h$ `8 F' C ●它能在较低的 CPU 的使用率和较少的内存占用情况下保证音频的播放质量, X' b, w \# i/ W, K5 x ●它具有广泛的实现方式,例如在 Windows 和 Mac 操作系统中3 ?$ c2 [3 k$ p- f; x' F9 u IMA 数字音频对焦和技术工作组公布的一份文件对 IMA ADPCM 算法进行了充分说明:“ 在多媒体系统中增强数字音频兼容性的建议措施 ” 版本 3。+ N h: |: Q) H" A" M / m8 E3 ~& S6 k( G, ^5 M 1.2 ADPCM 算法实现 本应用笔记提供的 IMA ADPCM 算法用于对具有下述规范的音频文件进行编码: ●音频格式:PCM ●音频采样大小:16 位 ●通道 : 1 ( 单声道 ) ●音频采样率:8 kHz 到 44.1 kHz 每个 16 位 PCM 采样被编码为 4 位 ADPCM 采样,压缩比达到 1/4。5 |2 T' \- g {& Q6 B IMA ADPCM 算法实现包含两个函数,一个函数编码音频采样,另一个函数解码音频采样。 ADPCM 固件由两个文件组成:* S' R( E! O7 Y9 }; v0 N. i a) adpcm.c:它包括执行编码和解码的两个 ADPCM 函数的源代码。. k" |) S; Q1 d b) adpcm.h:它是 adpmc.c 的头文件。它应该包含在调用 ADPCM 函数的文件中。4 V! L" i7 @- N& o: L) D7 o9 p % _- M l6 z% l4 j 1.3 ADPCM 算法函数 表 1 描述了 ADPCM 函数。 1 t4 Y" q3 j( B4 X% t( g - m3 H" f% ^8 Z! {8 [& @6 X. T 0 Y3 T5 v, b- n+ I8 P# R! | R ( h* R7 L4 j! | K: K6 @# ]. V* E) Z 1.3.1ADPCM_Encode 函数 ~- Y; o7 X$ b' v1 M+ q3 `9 S 表 2 描述了 ADPCM_Encode 函数。* G; O/ q2 m5 J' ?: B6 w' K. O; A ' a- p5 S9 ~8 v/ M: Y % S5 p$ a" p% L8 L, G ADPCM_Encode 函数返回一个包含 4 位 ADPCM 采样值的字节。软件将 2 个 ADPCM 采样值存入一个字节以便节约内存空间。 . J/ W6 l4 J" F! ^; ^* X) _ % S5 e8 I( O4 B0 b6 s7 d8 R 示例:% s w I9 |" U' @. Y // 输入:pcm_sample1 和 pcm_sample2 ; 2 个 16 位 PCM 采样值。 // 输出:adpcm_byte ;存入一个字节的两个 4 位 ADPCM 采样值。% L: E$ b' Y. U' T4 x uint8_t code;; [; Q' M9 |6 f! d: M) t /* 编码第一个 16 位采样值 */ code = ADPCM_Encode(pcm_sample1);; `3 H, @, y' G9 g9 ?# o /* 存储第一个 4 位采样值 */ adpcm_byte = code; w3 u6 l) j# Y1 a8 e. _4 B /* 编码第二个 16 位采样值 */ code = ADPCM_Encode(pcm_sample2); /* 存储第二个 4 位采样值 */ adpcm_byte |= (code << 4);/* adpcm_byte 包含两个 4 位 ADPCM 采样值 */; ~9 s* S$ h1 M- I1 t. d 1.3.2ADPCM_Decode 函数 表 3 描述了 ADPCM_Decode 函数。 5 q8 u ]) B$ @! U6 ] 0 g d. F1 R6 L. [7 i2 W; ~6 ] W " y+ k& T4 e1 Z" w9 p ADPCM_Encode函数的输入是一个包含4位ADPCM采样值的字节。在调用ADPCM_Decode函数之前,该软件必须提取出 4 位 ADPCM 数据并将其存入一个字节。 . i D B# w0 P% o/ I' t + T7 O! M8 n9 k4 O, l# ] 示例: // 输入:adpcm_byte ;存入一个字节的两个 4 位 ADPCM 采样值。6 U' ]& Z1 o) { // 输出:pcm_sample1 和 pcm_sample2 ; 2 个 16 位 PCM 采样值。 uint8_t code; /* 提取第一个 ADPCM4 位采样值 */ z, Y$ O" K! a3 y code = (adpcm_byte & 0x0F);. W i1 Q1 {* p /* 解码第一个 ADPCM 采样值 */ pcm_sample1 = ADPCM_Decode(code); /* 提取第二个 ADPCM 采样值 */, J1 R( X( ~# E code = (adpcm_byte >> 4); /* 解码第二个 ADPCM 采样值 */7 n) e1 t5 h# W- F pcm_sample2 = ADPCM_Decode(code); 2实现示例2 j! Q5 B! _' E$ m, K 2.1说明 可以在 STM3210E-EVAL 板上运行提供的例子。它是一个典型的音频应用,包括: ●首先用 PC 软件将一个 PCM 文件编码为 ADPCM 格式(这个软件名为 muse.exe,是由ST 开发的。它实现了与 STM32F103xx 增强型系列产品相同的 ADPCM 算法编码器。 muse.exe 在本应用笔记附带的压缩软件包中:请参考 第 2.2 章节了解如何应用这个工具。) ●然后将编码文件加载到 Flash ●使用高容量 STM32F103xx 微控制器解码文件,驱动 DAC 播放音频。$ o! m9 ^4 t: O! W6 ~ 在 STM3210E-EVAL 板上,128 兆位 NOR Flash 存储 ADPCM 文件和 STM32F103xx 器件上运行的固件解码器。然后用它解码该数据流,并且通过应用 I2S 外部 DAC 回放音频采样。+ k$ i( B& s9 M# O1 T 硬件环境基于应用笔记 “AN2739:如何使用高密度 STM32F103xx 微控制器与外部 I2S 音频编解码器播放音频文件 ”,请参考该应用笔记以获得更多信息。 要运行这个演示示例,需要进行三个步骤:! \3 `% w0 ?- b, f. k1 q" ] 1. 生成 ADPCM 文件" [) q" d% \$ J0 i6 A9 ~( P( H 2. 将 ADPCM 文件载入 NOR Flash 3. 播放 ADPCM 文件* l. W& `0 T' @! {; N, ^ ~4 C9 H# L' v( p( o 完整版请查看:附件 $ W4 n* l* L* T- _" R5 |& C0 G |
CD00224093_ZHV2.3.pdf
下载217.52 KB, 下载次数: 7
小马哥STM32F103开源小四轴RoboFly全部资料大放送
游名科技:STM32F103+TMC2160:86步进电机和驱动一体原理图/PCB...
STM32F103标准库开发---SPI实验---读写 W25Q128 外部 Flash
RT-Thread在STM32F103RC上移植
【MCU实战经验】+STM32F103的uCOSII详细移植
STM32固件库分享,超全系列整理
【原创】STM32F103的SPI2的配置函数,DMA发送和接收!
【源代码】STM32F103C8T6最小板搞定CMSIS-DAP和SWO功能
【福利】用STM32库的朋友有福了:STM32F10x_StdPeriph_Lib_V3.5.0chm...
基于STM32F103做CAN的收发通信经验分享
111111111111111111111111111111