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

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

[复制链接]
STMCU小助手 发布时间:2022-7-15 23:14
前言/ G8 I" h/ |! r" `& z% ?
本应用笔记描述了 ADPCM 音频固件编解码器,并提供了演示固件来说明如何在使用STM32F103xxI2S 时,利用外部的 DAC 来播放 ADPCM 文件。0 c) i1 G: |& r+ ~' B1 P% Z
本应用笔记基于 “AN2739:如何利用具有外部 I2S 音频编解码器的高容量 STM32F103xx 微控制器播放音频文件 。由于关于 SPII2S 和外部 DAC 的部分在 AN2739 中已有说明,此处不再赘述。因此,为了能充分理解本应用笔记,建议您参考 AN2739# V: I, J/ H6 ?6 ^

/ J, D! e8 _, e0 Q1 K/ f) K1 w- j
# P/ f/ I- {0 t4 D4 s2 K
1 ADPCM 算法
8 k  x! v9 |* [/ \1.1概述
4 W% ^9 x1 ?& o0 L. B自适应差分脉冲编码调制 , 或简称为 ADPCM, 是波形编码的音频算法 , 它通过以前的信号值预测当前的信号值 , 并且仅发送真实值和预测值的差值。
/ b# T' g  z* ], T4 o2 S6 Q3 N* G1 L在普通的脉冲编码调制 (PCM)中,发送的是真实或实际信号值。
  A1 Q: O6 F' v) Q  h1 H  j4 Z2 nADPCM 的优势在于通常预测信号值和真实信号值的差值相当小,这意味着与相应的 PCM 值相比,它可以用更少的位数来表示。& R( T! l% O  t9 r- G* w. r1 F
根据需要的质量和压缩比,差分信号按照 4 (2 位)、 8 3 位)、 16 (4 位)或 32 5 位)水平量化。
4 s, A, X, Q1 ~+ R( K7 NADPCM 算法的实现方法有很多。它们在量化和预测模式上有所不同。
3 f! {3 Z' ~- d+ c0 k& A在本应用笔记中,我们提供了由交互式多媒体协会(IMA)开发的4位量化算法IMA ADPCM。" O, h  x) f. d8 K6 |  @7 M
选择 IMA ADPCM 有多种原因:1 x; X' M* v$ G8 k* \
它可以应用于 8 kHz 44.10 kHz 之间的不同采样率
7 h: a$ g. w, S; l" b它能在较低的 CPU 的使用率和较少的内存占用情况下保证音频的播放质量2 O3 I" M8 x& |( V; _0 u2 `
它具有广泛的实现方式,例如在 Windows Mac 操作系统中% O6 R; K. e% v3 k! ?/ A$ r
IMA 数字音频对焦和技术工作组公布的一份文件对 IMA ADPCM 算法进行了充分说明:在多媒体系统中增强数字音频兼容性的建议措施 版本 3
" W7 I! N3 @4 z) U: x3 y6 a5 h
% ~+ t3 k5 M/ m( T

+ {6 A. b: n' i$ S! Q$ a9 c) c1.2 ADPCM 算法实现! F: @, A& x2 h* i
本应用笔记提供的 IMA ADPCM 算法用于对具有下述规范的音频文件进行编码:# J$ z6 @+ W: ?* {  C: L: o# l& ?) L
音频格式:PCM8 e/ g: x% \3 V
音频采样大小:16 - I3 R) X9 D8 X, Y) y- ]$ r7 X
通道 : 1 ( 单声道 )
% s; Z4 I! s! j音频采样率:8 kHz 44.1 kHz6 w( ^' c5 y: r- k
每个 16 位 PCM 采样被编码为 4 位 ADPCM 采样,压缩比达到 1/4。
( Y! r) k! B: q9 MIMA ADPCM 算法实现包含两个函数,一个函数编码音频采样,另一个函数解码音频采样。6 G! q: X- ~! I/ p' O
ADPCM 固件由两个文件组成:) b5 j$ ~% |+ V8 p1 l
a) adpcm.c:它包括执行编码和解码的两个 ADPCM 函数的源代码。
' N( o4 Q: x9 q6 x  Jb) adpcm.h:它是 adpmc.c 的头文件。它应该包含在调用 ADPCM 函数的文件中。2 {, ^( [/ f9 N7 O
6 g: z5 X3 o4 [% ?
0 h$ n0 c% H3 y# X
1.3 ADPCM 算法函数7 R5 C8 e8 |$ Q+ b/ }
1 描述了 ADPCM 函数。+ `9 ~4 \( ]2 h5 a$ d5 K# y

( ~. ~* }! a% x/ X: e
; k) o! R( x% Q7 F+ f$ {! ]! s
Z61$J~~%L(M)1QQK~}1HM`A.png
% I! ]. q/ x, f, M2 p3 G( t, n# x9 m0 |2 r  s: g
1 x, P/ S* u$ e& x

% K9 \; ?# ]0 p. S; N* e; m1.3.1ADPCM_Encode 函数/ h* o$ ?9 A$ k  i( p
2 描述了 ADPCM_Encode 函数。
% \! S' X9 |1 L# B% F4 a1 p. O8 ^: ~9 L5 V9 s2 T: B

; u; @: U! [' j: k1 o0 d `7RG3Q1%G%}{]S7]0(}C36K.png % H/ _' P4 D' L( E% C% E* a' o
3 |4 |! A, Q! E6 m$ Z% F
ADPCM_Encode 函数返回一个包含 4 位 ADPCM 采样值的字节。软件将 2 个 ADPCM 采样值存入一个字节以便节约内存空间。" P. [# c- _# [/ n! q( @* f

4 H; I* p4 H$ ^! H+ i) \

. _6 y4 I- P* u) v示例:
6 T( x, X7 S% S& Y# I// 输入:pcm_sample1 和 pcm_sample2 ; 2 个 16 位 PCM 采样值。
% W! L4 `/ S( S* N// 输出:adpcm_byte ;存入一个字节的两个 4 位 ADPCM 采样值。
1 }( b  E% \" {0 }& e9 Quint8_t code;& [7 Q) \  ~, p- i/ s. O# I
/* 编码第一个 16 位采样值 */2 V1 u' b3 ?- u0 s
code = ADPCM_Encode(pcm_sample1);  A( }0 s1 E, P8 Q, c
/* 存储第一个 4 位采样值 */
6 X4 J+ O% t0 |adpcm_byte = code;* o7 K" l* W0 }( Z
/* 编码第二个 16 位采样值 */) G2 K& b" C! j' y: v! U* I+ X! S
code = ADPCM_Encode(pcm_sample2);2 Y8 r4 S  u" r) E. B5 f
/* 存储第二个 4 位采样值 */0 r% n* r8 {1 N8 J
adpcm_byte |= (code << 4);/* adpcm_byte 包含两个 4 位 ADPCM 采样值 */
  x6 h1 f4 H* C/ S0 O. n* X* {( b& G$ r( W6 J$ n% J9 Y
0 h# x% z9 N  b1 s* T
1.3.2ADPCM_Decode 函数# ~/ k! N& T" A  S
3 描述了 ADPCM_Decode 函数。: x: G# y8 y! b

5 I1 f, ~* V5 Q, {8 g3 K

0 i& u: y2 d9 p, H6 R6 S! k UK~@G$BI`TF`POQ}6M9}OIE.png 7 g8 _# D- L3 U) V7 @1 H$ n
5 j4 f  u0 U4 y9 e
7 q0 b3 N2 i5 V' d' s& l

' G2 ]% a& m$ F% k4 _. BADPCM_Encode函数的输入是一个包含4位ADPCM采样值的字节。在调用ADPCM_Decode函数之前,该软件必须提取出 4 ADPCM 数据并将其存入一个字节。
$ d) s. ~* m. U( r& p# L- X3 W. E6 |: C: p/ E
. d+ x5 t- U; e9 g5 z
示例:
! u) Z& Y; R( }// 输入:adpcm_byte ;存入一个字节的两个 4 位 ADPCM 采样值。, G# M; ?9 D# f* R0 c3 w
// 输出:pcm_sample1 和 pcm_sample2 ; 2 个 16 位 PCM 采样值。
$ h# A) }( y7 F2 u7 h$ zuint8_t code;
' P2 M2 H# a& @: C+ {2 l/* 提取第一个 ADPCM4 位采样值 */: i7 {, E3 Z1 {) f/ m% h
code = (adpcm_byte & 0x0F);
* U2 y; v6 R! ?: v& S) k/* 解码第一个 ADPCM 采样值 */1 w1 `( X5 G6 }! |% ~3 ?
pcm_sample1 = ADPCM_Decode(code);
8 s1 b' e" e1 k' q  O8 V3 s. W/ q/* 提取第二个 ADPCM 采样值 */
  r: d/ E& m$ W1 ~: K! |$ w+ Ecode = (adpcm_byte >> 4);
# `2 t, v+ |, |& k7 Y/* 解码第二个 ADPCM 采样值 */- [1 w+ k% n4 n& H0 X( S
pcm_sample2 = ADPCM_Decode(code);
& P! W' E( ]9 L* Z  F
0 X: e4 M+ E8 c- _6 J2 n2实现示例2 x% s; N7 f: |7 {
2.1说明
- v8 n$ L3 e7 H& i& n  D( {可以在 STM3210E-EVAL 板上运行提供的例子。它是一个典型的音频应用,包括:
6 w7 E8 [! }, R# B2 S' \- ~首先用 PC 软件将一个 PCM 文件编码为 ADPCM 格式(这个软件名为 muse.exe,是由ST 开发的。它实现了与 STM32F103xx 增强型系列产品相同的 ADPCM 算法编码器。
$ R. n0 L8 {, T4 ]& v# |6 n* bmuse.exe 在本应用笔记附带的压缩软件包中:请参考 2.2 章节了解如何应用这个工具。): y5 b- u$ U$ ^- P4 o
然后将编码文件加载到 Flash  z! o7 W& G* x
使用高容量 STM32F103xx 微控制器解码文件,驱动 DAC 播放音频。+ J+ T1 m' u! Z. Q! r$ y% d
在 STM3210E-EVAL 板上,128 兆位 NOR Flash 存储 ADPCM 文件和 STM32F103xx 器件上运行的固件解码器。然后用它解码该数据流,并且通过应用 I2S 外部 DAC 回放音频采样。
8 y! i* u" i" H硬件环境基于应用笔记 “AN2739:如何使用高密度 STM32F103xx 微控制器与外部 I2S 音频编解码器播放音频文件 ,请参考该应用笔记以获得更多信息。& F3 Z, q6 _9 r1 G) p& \( O
要运行这个演示示例,需要进行三个步骤:
6 e- C* Z. `3 |1 l; O* w1. 生成 ADPCM 文件
4 ]7 h1 k- e, T2. 将 ADPCM 文件载入 NOR Flash
, H5 q' {' l. k4 ^9 Q3. 播放 ADPCM 文件/ L0 U1 P- ^& k* _  I5 a. w' m
. |8 e" B% L1 W" |+ E
# `+ N: N, v: i! z& c

# l% y  ?2 |4 b7 |* |; k完整版请查看:附件
- ^/ ^# I- w3 j0 D
) X5 d" p- o% `1 U$ P; q) W2 Y1 [
4 K- R8 X" q, d" E4 x0 _
( a' v+ ^" ]" J: w  y' u( L7 g

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 手机版