你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

在高容量 STM32F103xx 微控制器中实现 ADPCM 算法

[复制链接]
STMCU小助手 发布时间:2022-7-15 23:14
前言
2 d7 E! T" P1 h9 u0 g) i, o" z! ~本应用笔记描述了 ADPCM 音频固件编解码器,并提供了演示固件来说明如何在使用STM32F103xxI2S 时,利用外部的 DAC 来播放 ADPCM 文件。! |/ d4 z5 _" x2 q; ]9 d
本应用笔记基于 “AN2739:如何利用具有外部 I2S 音频编解码器的高容量 STM32F103xx 微控制器播放音频文件 。由于关于 SPII2S 和外部 DAC 的部分在 AN2739 中已有说明,此处不再赘述。因此,为了能充分理解本应用笔记,建议您参考 AN2739& `( S- N/ z; {, k% `
9 F3 |: {1 F: J" T  ?3 t
! G$ a1 m  z1 I1 s
1 ADPCM 算法
4 o" Y7 o  z6 {# D4 Y1.1概述7 d! V1 j7 K! {0 ~# P: C+ C
自适应差分脉冲编码调制 , 或简称为 ADPCM, 是波形编码的音频算法 , 它通过以前的信号值预测当前的信号值 , 并且仅发送真实值和预测值的差值。
, ?/ w- m$ @; O  [- e: r0 z" f在普通的脉冲编码调制 (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。
4 [/ ^8 w# u/ W% C  o选择 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 算法实现
! V: ~5 B" A0 B1 U) y/ z本应用笔记提供的 IMA ADPCM 算法用于对具有下述规范的音频文件进行编码:
; B5 Y! J! B2 L3 C6 A) F& u( p音频格式:PCM
5 P- J2 G" x1 \' j& r9 k3 k& f- H$ \音频采样大小: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 函数的源代码。
" }! g& P! `5 Z' ^! I! }b) adpcm.h:它是 adpmc.c 的头文件。它应该包含在调用 ADPCM 函数的文件中。) l3 \# J7 i" v$ g  x. a7 v8 @
+ P2 U* p/ V$ I* l

9 e) N- `8 K: M6 M7 r+ j1.3 ADPCM 算法函数, v& i0 l! x# C/ w
1 描述了 ADPCM 函数。
  m# O) _% [3 J6 o* W5 Y. N6 a' E
4 O" i, F# O/ Q* @" X, ]
  k8 V& @% L; m: Q  g  ^9 z
Z61$J~~%L(M)1QQK~}1HM`A.png ! x1 }0 D  l7 ]5 U5 K4 r2 g
- 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 函数。
$ s" k! s/ S8 C( {: d! Z! l$ a  p* y9 A4 y# N9 Y9 r

  p2 V6 L3 V9 ]- n( K `7RG3Q1%G%}{]S7]0(}C36K.png & t& T: X7 N6 Z; a: w

1 \0 G  ~( Y6 s8 s0 A" w* SADPCM_Encode 函数返回一个包含 4 位 ADPCM 采样值的字节。软件将 2 个 ADPCM 采样值存入一个字节以便节约内存空间。
: ]. x% U+ s$ S6 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;
9 k. [9 d# M2 T/* 编码第一个 16 位采样值 */
0 x; b; k) l: vcode = ADPCM_Encode(pcm_sample1);$ |& D; ~  F/ f9 ~8 m1 G1 \, ?$ X
/* 存储第一个 4 位采样值 */" v/ D$ t9 N  m
adpcm_byte = code;
5 s3 Y1 S: ^* t4 F% x- B( |* {+ x/* 编码第二个 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

, E8 J0 P2 ?) r; c0 X6 U$ P# W; j3 L

, u8 q- v0 U% T. U6 s9 X: g  ~1.3.2ADPCM_Decode 函数2 V5 d: O6 b3 E0 @" p
3 描述了 ADPCM_Decode 函数。
9 X. H2 s) S* l3 }/ M  v. ~3 I( J) `$ k5 j! ^4 L! a* l2 C
/ u" Y3 A1 b* M/ e4 k. @
UK~@G$BI`TF`POQ}6M9}OIE.png
* l3 E4 Y5 x/ |# {) t
3 t: @7 L+ U/ N* z) Y3 U% y7 q% U

! p# E% R0 H; M: m( e/ `$ Q+ _7 k2 Y0 p
ADPCM_Encode函数的输入是一个包含4位ADPCM采样值的字节。在调用ADPCM_Decode函数之前,该软件必须提取出 4 ADPCM 数据并将其存入一个字节。& U. L+ Z: j3 ~  H4 Y

: C; o- `! c4 n* u% n0 S2 Y8 H/ T7 ]5 D
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 采样值。
1 }" X8 H' [  M) n" x0 b6 d: \uint8_t code;
- R: j2 b8 o( K0 \/* 提取第一个 ADPCM4 位采样值 */$ R7 l6 y) L' v: _
code = (adpcm_byte & 0x0F);/ O; ~+ l/ J! l
/* 解码第一个 ADPCM 采样值 */
: {" Y; [' j% m1 ?6 Y( W9 z# ?9 xpcm_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);
+ V: b# F' ]) S: x/* 解码第二个 ADPCM 采样值 */
6 L8 e1 h6 I- I$ r) lpcm_sample2 = ADPCM_Decode(code);6 @- |  \) o, L0 ]8 T: q: `

. x& Z4 H9 ?9 P9 s" g2实现示例! 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 回放音频采样。
7 p' v$ A- ^5 E( A) y硬件环境基于应用笔记 “AN2739:如何使用高密度 STM32F103xx 微控制器与外部 I2S 音频编解码器播放音频文件 ,请参考该应用笔记以获得更多信息。
. _$ p. G1 b& N1 E5 M要运行这个演示示例,需要进行三个步骤:
6 @# \8 [8 x9 U% ^* B7 X6 i9 J% a1. 生成 ADPCM 文件
; ~, F/ M0 g9 K0 f0 p2. 将 ADPCM 文件载入 NOR Flash/ a( O1 Z3 O4 j6 f
3. 播放 ADPCM 文件
2 P* v( S5 x, y$ H, p3 e- b2 M5 D5 L& U
* f- m" m1 W$ |# u( N
& a( C$ s* p4 v0 m( N) m; k
完整版请查看:附件
+ e# @6 N" F6 b
6 U, `6 `6 ~- l2 u+ S

4 ~$ W8 Q0 V, p5 v! t+ N
$ J0 {3 @: T  D# A

CD00224093_ZHV2.3.pdf

下载

217.52 KB, 下载次数: 9

收藏 评论1 发布时间:2022-7-15 23:14

举报

1个回答
Or-wu 回答时间:2024-10-22 15:32:11

111111111111111111111111111111

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版