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

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

[复制链接]
STMCU小助手 发布时间:2022-7-15 23:14
前言* W! I7 g" C" |5 s
本应用笔记描述了 ADPCM 音频固件编解码器,并提供了演示固件来说明如何在使用STM32F103xxI2S 时,利用外部的 DAC 来播放 ADPCM 文件。9 k- i% J. |; ], w3 F2 J% C2 ^7 u
本应用笔记基于 “AN2739:如何利用具有外部 I2S 音频编解码器的高容量 STM32F103xx 微控制器播放音频文件 ”。由于关于 SPI、I2S 和外部 DAC 的部分在 AN2739 中已有说明,此处不再赘述。因此,为了能充分理解本应用笔记,建议您参考 AN2739。/ y( H) {  C# u- w" M

1 l% x0 v5 T  ^) ]. ^8 N, B
- |! R8 x, A+ X8 A0 Z* J
1 ADPCM 算法
# Y2 ~. R/ M$ ~$ {1.1概述! i  G! m$ M* r! c8 Y/ o5 ?0 Z9 a
自适应差分脉冲编码调制 , 或简称为 ADPCM, 是波形编码的音频算法 , 它通过以前的信号值预测当前的信号值 , 并且仅发送真实值和预测值的差值。6 {1 k: _+ B4 b2 n9 I% G
在普通的脉冲编码调制 (PCM)中,发送的是真实或实际信号值。
3 S* }. }0 Y5 ~: e9 O, qADPCM 的优势在于通常预测信号值和真实信号值的差值相当小,这意味着与相应的 PCM 值相比,它可以用更少的位数来表示。9 p5 |1 c0 @5 E4 P
根据需要的质量和压缩比,差分信号按照 4 (2 位)、 8 (3 位)、 16 (4 位)或 32 (5 位)水平量化。
$ h* y5 ~* {( o# G$ `! |, XADPCM 算法的实现方法有很多。它们在量化和预测模式上有所不同。
% a0 Z: v& O3 T2 X% O在本应用笔记中,我们提供了由交互式多媒体协会(IMA)开发的4位量化算法IMA ADPCM。
, S  D4 s* ^7 D* H; r( U; L选择 IMA ADPCM 有多种原因:
, T2 x, ?: M2 c" {●它可以应用于 8 kHz 到 44.10 kHz 之间的不同采样率# n4 E% q9 f; w0 y0 E4 b
●它能在较低的 CPU 的使用率和较少的内存占用情况下保证音频的播放质量- k7 `/ g* F# p4 r8 X
●它具有广泛的实现方式,例如在 Windows 和 Mac 操作系统中. G* S5 v  p2 ?& ~& Y$ y' B
IMA 数字音频对焦和技术工作组公布的一份文件对 IMA ADPCM 算法进行了充分说明:“ 在多媒体系统中增强数字音频兼容性的建议措施 ” 版本 3。
  l. d- B3 c4 x9 |+ H# G- d  K1 U; C# l  I% ?
& N: |0 v3 Q& K. S: d( N' M( [
1.2 ADPCM 算法实现
! l& D( T% I' O) x本应用笔记提供的 IMA ADPCM 算法用于对具有下述规范的音频文件进行编码:+ G" F  n' J2 z6 Q% r: T% H: z6 s
●音频格式:PCM
) x) a1 x2 r7 l; Z1 y# T% W●音频采样大小:16 位
# w* g5 w. r3 v●通道 : 1 ( 单声道 )* O" m7 k* Q" V
●音频采样率:8 kHz 到 44.1 kHz8 q7 N3 t5 A2 s2 l0 X& K; g0 p
每个 16 位 PCM 采样被编码为 4 位 ADPCM 采样,压缩比达到 1/4。0 Q4 D& g* m: r$ f: [8 Z8 F3 u
IMA ADPCM 算法实现包含两个函数,一个函数编码音频采样,另一个函数解码音频采样。" w( d) R9 G" u2 l' B- b# S
ADPCM 固件由两个文件组成:/ p; Z0 E- }$ Q: p
a) adpcm.c:它包括执行编码和解码的两个 ADPCM 函数的源代码。
% H+ g: Y# w; o' V( M' s3 |b) adpcm.h:它是 adpmc.c 的头文件。它应该包含在调用 ADPCM 函数的文件中。  r: r" C9 N! u! S$ V

6 d3 H( t7 Q6 ?6 y* N, a

9 g' f* B* i  P  _+ [$ U9 I+ G1.3 ADPCM 算法函数
1 T/ O3 P. @1 o. N* d0 P$ s3 M表 1 描述了 ADPCM 函数。1 Z0 Y- W! G! f: T7 Q' Q4 X
0 [  V/ n7 \4 W" V. j3 h7 w
4 U+ p- @" ]: M5 p9 I+ k- H
Z61$J~~%L(M)1QQK~}1HM`A.png
/ \' X) @2 y& a' |. j8 `* c; q. x/ k2 N+ e

  I# \) q# Y1 n$ F8 |
! q+ n4 L" t% P1.3.1ADPCM_Encode 函数5 b( T& G/ [  {2 o6 Z6 g
表 2 描述了 ADPCM_Encode 函数。; S9 `) H: D, Q, S. \5 i
. I5 \, x8 x' C0 {: |" ]( N

( l* r6 T. r1 l. m( v `7RG3Q1%G%}{]S7]0(}C36K.png
3 @7 u* b- I& l9 f( W8 J/ r0 D- z6 ]* s4 r! O, p+ J
ADPCM_Encode 函数返回一个包含 4 位 ADPCM 采样值的字节。软件将 2 个 ADPCM 采样值存入一个字节以便节约内存空间。' u1 @) G( J/ D, X" Y+ p* l

: x) L4 p. s0 L7 p
; I- J0 x: }) h/ P3 i# ?( L
示例:
: X/ }" [' V! n0 k  _// 输入:pcm_sample1 和 pcm_sample2 ; 2 个 16 位 PCM 采样值。
2 V: C- ]$ i! ~& X4 [// 输出:adpcm_byte ;存入一个字节的两个 4 位 ADPCM 采样值。* h# e) s4 M2 O
uint8_t code;4 I" O  R- [8 S
/* 编码第一个 16 位采样值 */& i$ _6 w2 f$ Y
code = ADPCM_Encode(pcm_sample1);6 y$ ?1 N' {9 U
/* 存储第一个 4 位采样值 */
8 K- P; L  P( A( jadpcm_byte = code;; X+ P' f( i# |' G% `6 D
/* 编码第二个 16 位采样值 */
) R" _+ ]; I* j% _1 a6 U1 Ncode = ADPCM_Encode(pcm_sample2);
: X* Z# k: `, @. Y" Y/* 存储第二个 4 位采样值 */  w; t) [* B5 a- P- t$ r2 A
adpcm_byte |= (code << 4);/* adpcm_byte 包含两个 4 位 ADPCM 采样值 */
6 L" F: W( D+ x3 b' v2 G( {& `/ L$ `8 W
; h& l! v7 @  C  K
1.3.2ADPCM_Decode 函数/ f7 ~( J$ K' ~+ `
表 3 描述了 ADPCM_Decode 函数。, A8 P4 ]) ]. w' F

( V  ]# R% i' |! G: K+ N% c
( p4 w3 Q) L8 n! P
UK~@G$BI`TF`POQ}6M9}OIE.png 1 N3 t6 {9 {" V3 F0 o/ Z
: j3 P9 k5 g/ f0 j, z' r

8 o0 D; j( Y. ]2 d8 E* d7 `$ g. s- P7 _  L# S) y
ADPCM_Encode函数的输入是一个包含4位ADPCM采样值的字节。在调用ADPCM_Decode函数之前,该软件必须提取出 4 位 ADPCM 数据并将其存入一个字节。% j% z: l7 b; x8 i; f! c8 ?

+ x1 K) U/ \# g5 k
& _! K% B' O/ h/ I( s2 |9 I
示例:
6 s* \) c5 @7 N7 {" Y% m// 输入:adpcm_byte ;存入一个字节的两个 4 位 ADPCM 采样值。
# r# |" N8 C% D0 n8 }% n/ N! g+ Q// 输出:pcm_sample1 和 pcm_sample2 ; 2 个 16 位 PCM 采样值。6 _& k, x4 p) q' |9 e9 v. j
uint8_t code;
5 d4 M9 @7 w. b/ W/* 提取第一个 ADPCM4 位采样值 */9 U& E* H- v6 t; R( o* M0 Q0 F5 Q
code = (adpcm_byte & 0x0F);& k/ I1 A6 S& M( Y( q# p. g: H% F
/* 解码第一个 ADPCM 采样值 */
% B% J2 D1 `! G7 w3 i# E# `/ ~# kpcm_sample1 = ADPCM_Decode(code);  a6 ^, g; t. j# V4 k% x' V' B
/* 提取第二个 ADPCM 采样值 */
) u" [! r& p6 d6 hcode = (adpcm_byte >> 4);  y( s% _0 K4 f& g9 b" m
/* 解码第二个 ADPCM 采样值 */
' q5 |' L6 l: epcm_sample2 = ADPCM_Decode(code);
: i3 S2 k. [. U% L7 r) p' K$ `2 k8 C* [$ V
2实现示例
8 i) l/ |2 y( M0 m2.1说明
- |9 U7 j: z- C可以在 STM3210E-EVAL 板上运行提供的例子。它是一个典型的音频应用,包括:
; |0 R( q' a9 E1 _2 j●首先用 PC 软件将一个 PCM 文件编码为 ADPCM 格式(这个软件名为 muse.exe,是由ST 开发的。它实现了与 STM32F103xx 增强型系列产品相同的 ADPCM 算法编码器。
) W, j+ h0 q8 M% ^$ D! c5 `6 m) Amuse.exe 在本应用笔记附带的压缩软件包中:请参考 第 2.2 章节了解如何应用这个工具。)
( |2 s- }  V: E; t●然后将编码文件加载到 Flash5 Z; Z2 B7 C( p: Y& Q
●使用高容量 STM32F103xx 微控制器解码文件,驱动 DAC 播放音频。8 K) e5 H3 z8 `' H( s
在 STM3210E-EVAL 板上,128 兆位 NOR Flash 存储 ADPCM 文件和 STM32F103xx 器件上运行的固件解码器。然后用它解码该数据流,并且通过应用 I2S 外部 DAC 回放音频采样。/ p; |6 K( p5 _9 J4 B
硬件环境基于应用笔记 “AN2739:如何使用高密度 STM32F103xx 微控制器与外部 I2S 音频编解码器播放音频文件 ”,请参考该应用笔记以获得更多信息。; ^2 C! {4 N2 n- n. G
要运行这个演示示例,需要进行三个步骤:
4 B$ U* u9 @9 v$ K1 S% c& C8 y0 z1. 生成 ADPCM 文件
' @% O+ v+ x# I% a; P, ?4 t$ v2 J. L& I2. 将 ADPCM 文件载入 NOR Flash
( N- q( ^1 Y- x9 i% F3. 播放 ADPCM 文件
3 L: ^+ h6 G( f' i& I0 R3 w( F
$ K; @% H$ d2 u' `- F2 b9 p! _. r6 _! h
  [" M  f- r& X: G* i4 H4 [8 S7 m
完整版请查看:附件
9 Q! g8 _: ?- B* G5 I5 N
! t$ m" @( T+ V) s
9 {& e/ X5 t1 H) O" {7 c$ Z1 M

8 ?% T: ~7 r* q7 j/ v7 q; \4 a

CD00224093_ZHV2.3.pdf

下载

217.52 KB, 下载次数: 38

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

举报

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

111111111111111111111111111111

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版