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

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

[复制链接]
STMCU小助手 发布时间:2022-7-15 23:14
前言
0 _( W$ A9 X! L本应用笔记描述了 ADPCM 音频固件编解码器,并提供了演示固件来说明如何在使用STM32F103xxI2S 时,利用外部的 DAC 来播放 ADPCM 文件。" \+ ]/ O1 I9 A& f
本应用笔记基于 “AN2739:如何利用具有外部 I2S 音频编解码器的高容量 STM32F103xx 微控制器播放音频文件 。由于关于 SPII2S 和外部 DAC 的部分在 AN2739 中已有说明,此处不再赘述。因此,为了能充分理解本应用笔记,建议您参考 AN2739
. y$ Z3 J) x% O7 e1 Y
$ Q3 ^& v* [3 q
! D* Z3 \7 C  b$ C
1 ADPCM 算法; _& I7 J: }/ {
1.1概述& k9 n& E' y# G& J6 L$ i
自适应差分脉冲编码调制 , 或简称为 ADPCM, 是波形编码的音频算法 , 它通过以前的信号值预测当前的信号值 , 并且仅发送真实值和预测值的差值。
& N) R8 Q4 }+ y8 l; {在普通的脉冲编码调制 (PCM)中,发送的是真实或实际信号值。
; |- r8 _2 u$ I+ Y1 T8 f3 {) rADPCM 的优势在于通常预测信号值和真实信号值的差值相当小,这意味着与相应的 PCM 值相比,它可以用更少的位数来表示。
6 |4 T! Y' d- F  B根据需要的质量和压缩比,差分信号按照 4 (2 位)、 8 3 位)、 16 (4 位)或 32 5 位)水平量化。
1 X* ~( m- s  J; D# l# E2 u  I9 dADPCM 算法的实现方法有很多。它们在量化和预测模式上有所不同。
2 k; F" A8 _4 ~, l/ J" a3 e在本应用笔记中,我们提供了由交互式多媒体协会(IMA)开发的4位量化算法IMA ADPCM。
9 |, L$ S* W" W选择 IMA ADPCM 有多种原因:
2 x6 {" ~, a+ t" e1 N# ~& Z它可以应用于 8 kHz 44.10 kHz 之间的不同采样率; {( t  Z, x2 k6 b& O) s  R- [4 P
它能在较低的 CPU 的使用率和较少的内存占用情况下保证音频的播放质量5 f7 t; T. b/ [
它具有广泛的实现方式,例如在 Windows Mac 操作系统中
( a" Z  g/ |9 ^, T1 H! C8 EIMA 数字音频对焦和技术工作组公布的一份文件对 IMA ADPCM 算法进行了充分说明:在多媒体系统中增强数字音频兼容性的建议措施 版本 30 Y. a6 h9 p9 ~2 ~& [

' i: O8 h: F) P: l; j: A
. P# o) {4 s4 {! `6 u
1.2 ADPCM 算法实现
9 e: U8 r# q+ ?) n4 D; U0 B本应用笔记提供的 IMA ADPCM 算法用于对具有下述规范的音频文件进行编码:
- \1 t% b$ G* \0 U! p) V" ^音频格式:PCM# j+ C' W: n3 p3 g. R5 a
音频采样大小:16 % X5 \/ n" u6 a: V
通道 : 1 ( 单声道 )  E+ T; t9 V5 k
音频采样率:8 kHz 44.1 kHz
& e! m( E+ T) K% b: Q每个 16 位 PCM 采样被编码为 4 位 ADPCM 采样,压缩比达到 1/4。
$ V& Y+ }/ v+ f3 T3 P; fIMA ADPCM 算法实现包含两个函数,一个函数编码音频采样,另一个函数解码音频采样。& \' X# B; l  M
ADPCM 固件由两个文件组成:
: h; s  q, k# t8 c2 e) Ka) adpcm.c:它包括执行编码和解码的两个 ADPCM 函数的源代码。
( n4 D5 e/ i8 n) L9 Pb) adpcm.h:它是 adpmc.c 的头文件。它应该包含在调用 ADPCM 函数的文件中。+ M3 t8 y7 w, F1 U) f

2 j' M4 m6 x, c% m, L( c; h$ O
+ v* b/ Z7 @, {( P" `% u
1.3 ADPCM 算法函数
; k! a8 F- T5 S3 K& D' t' {1 描述了 ADPCM 函数。
! K4 [; Q7 m' G$ Y3 p) }0 e* S: _) a2 h7 r7 p) P0 V

; |$ t9 X9 Q) ^( D Z61$J~~%L(M)1QQK~}1HM`A.png
3 ^0 R2 a4 B0 a; G2 w& v
1 m. B8 Z+ D+ Q; k

1 I$ ]$ S  c" j9 B- e) C $ N* c4 g$ g1 s2 @8 m( R  C9 M
1.3.1ADPCM_Encode 函数( Z4 |- e$ L* j5 l) R2 X
2 描述了 ADPCM_Encode 函数。6 ^! E! |* F5 [+ s" x7 Z- a
  H0 u1 m$ A( @% R

& H! J2 \/ K+ N% h& h `7RG3Q1%G%}{]S7]0(}C36K.png 3 ^5 I0 Q: X; o$ O  o3 R

+ B# ~& b  N$ c1 w6 t& tADPCM_Encode 函数返回一个包含 4 位 ADPCM 采样值的字节。软件将 2 个 ADPCM 采样值存入一个字节以便节约内存空间。
" m+ w* I/ |+ c4 O4 G7 L& s! b2 Z: ~% [' M
3 e7 |6 r2 E* v+ }: ]8 V
示例:5 i$ f  k8 t' j
// 输入:pcm_sample1 和 pcm_sample2 ; 2 个 16 位 PCM 采样值。3 ?" V3 ]. d! q& p  }4 F7 z
// 输出:adpcm_byte ;存入一个字节的两个 4 位 ADPCM 采样值。  }9 O  U3 m4 j" z$ [& f- P
uint8_t code;% O0 c3 s. }7 v' y$ H
/* 编码第一个 16 位采样值 */4 d) c" N4 L" C* W3 d' I: m
code = ADPCM_Encode(pcm_sample1);& B1 X/ h# ]% M, _! ?
/* 存储第一个 4 位采样值 */
- ]1 W8 a9 r1 C1 madpcm_byte = code;1 [. U/ @+ m' g9 s/ E1 c3 S) K9 O; F
/* 编码第二个 16 位采样值 */2 S' @& ~& F% t8 c' d' B
code = ADPCM_Encode(pcm_sample2);
4 A* k$ H0 U* x& B( h8 J# Q7 {/* 存储第二个 4 位采样值 */
& h! G1 k5 U% b0 m( Hadpcm_byte |= (code << 4);/* adpcm_byte 包含两个 4 位 ADPCM 采样值 */8 l0 K7 L. {. Q/ t. |# O( Y

6 \1 ]. \% i7 z/ }8 Z0 J+ Y
( f/ a/ X2 K9 q+ ?
1.3.2ADPCM_Decode 函数8 V' m+ X  H) D2 n) ?, C1 g! d. j
3 描述了 ADPCM_Decode 函数。& {& G6 J4 ~- u; s

* u) s' ~! q  W
. n1 g: G4 P2 n' ^4 e
UK~@G$BI`TF`POQ}6M9}OIE.png ! A) f5 E  M( `, O, w; R! t

" `$ C  e3 v4 x5 W! }1 V
' j6 q; V% K9 U2 P5 [
7 Q+ b6 ]; M: f2 q; w. H
ADPCM_Encode函数的输入是一个包含4位ADPCM采样值的字节。在调用ADPCM_Decode函数之前,该软件必须提取出 4 ADPCM 数据并将其存入一个字节。
* T- [$ f% ~+ `, p. L( p! W/ @7 W; {3 j8 }

3 f: |8 j0 [, F& d' v8 z5 s示例:! H8 J6 n2 A1 g# y& p7 ?9 n  d
// 输入:adpcm_byte ;存入一个字节的两个 4 位 ADPCM 采样值。. `6 o5 F4 w% q6 w2 \% Z' y8 L
// 输出:pcm_sample1 和 pcm_sample2 ; 2 个 16 位 PCM 采样值。
  f; I- S; U- W4 g6 ruint8_t code;
0 j4 x( |8 }8 L1 i3 n( H/* 提取第一个 ADPCM4 位采样值 */" |& N- T- c2 n% f& ]- o& O; d; _
code = (adpcm_byte & 0x0F);' R3 C0 J$ f# l" t
/* 解码第一个 ADPCM 采样值 */
$ V8 u# V3 \+ @4 L& m1 q% vpcm_sample1 = ADPCM_Decode(code);
6 r" w5 A: T! Y& b: M1 q- @* r/* 提取第二个 ADPCM 采样值 */8 ]- m$ N( @  t/ ?" d8 B
code = (adpcm_byte >> 4);
$ Y' c  u( Z+ `" A/* 解码第二个 ADPCM 采样值 */7 s% a+ U3 A, T. i9 F. S! u
pcm_sample2 = ADPCM_Decode(code);
( l$ ~# L# o: M5 g5 T% S
- N; H% B0 _) u! a" o' d8 e( W2实现示例  `! \  t# J4 r# j
2.1说明4 T( |, G# T. e  z9 T( B9 u
可以在 STM3210E-EVAL 板上运行提供的例子。它是一个典型的音频应用,包括:
( B% M* U+ H( ?3 C' ?1 S5 _首先用 PC 软件将一个 PCM 文件编码为 ADPCM 格式(这个软件名为 muse.exe,是由ST 开发的。它实现了与 STM32F103xx 增强型系列产品相同的 ADPCM 算法编码器。
) D, ]( b; x3 b, r: M& k! |muse.exe 在本应用笔记附带的压缩软件包中:请参考 2.2 章节了解如何应用这个工具。), Y9 S! L, j) v* x7 _; j+ b5 O# c
然后将编码文件加载到 Flash
* X' s8 w2 e; A5 u使用高容量 STM32F103xx 微控制器解码文件,驱动 DAC 播放音频。
" ^& B: `* p8 a; w# W$ A在 STM3210E-EVAL 板上,128 兆位 NOR Flash 存储 ADPCM 文件和 STM32F103xx 器件上运行的固件解码器。然后用它解码该数据流,并且通过应用 I2S 外部 DAC 回放音频采样。
9 ?0 n$ Z* J( K* m5 v硬件环境基于应用笔记 “AN2739:如何使用高密度 STM32F103xx 微控制器与外部 I2S 音频编解码器播放音频文件 ,请参考该应用笔记以获得更多信息。
7 e: l. m( |# \. V7 d要运行这个演示示例,需要进行三个步骤:. f; S! s5 D5 v$ L! D
1. 生成 ADPCM 文件5 _% g- Q4 P! w7 k$ w7 }
2. 将 ADPCM 文件载入 NOR Flash" ~! p% y# l' E
3. 播放 ADPCM 文件, U9 M$ @5 y( y. k# m

) c6 N+ o( Z' S1 R# L
5 O$ b, T" P; {6 G( B

- B- Y" {7 _& X! X完整版请查看:附件4 q, B  H9 f  t! b

4 K( I4 B/ s) u# F6 ^0 N

6 Q$ h  o2 u9 d0 D) D# C4 {: }: G, I0 [  O5 _

CD00224093_ZHV2.3.pdf

下载

217.52 KB, 下载次数: 7

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

举报

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

111111111111111111111111111111

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版