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

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

[复制链接]
STMCU小助手 发布时间:2022-7-15 23:14
前言; Q  P1 F: u: y* ^! B! m
本应用笔记描述了 ADPCM 音频固件编解码器,并提供了演示固件来说明如何在使用STM32F103xxI2S 时,利用外部的 DAC 来播放 ADPCM 文件。
! e& N  C- r1 F) ~! R3 Q本应用笔记基于 “AN2739:如何利用具有外部 I2S 音频编解码器的高容量 STM32F103xx 微控制器播放音频文件 。由于关于 SPII2S 和外部 DAC 的部分在 AN2739 中已有说明,此处不再赘述。因此,为了能充分理解本应用笔记,建议您参考 AN27399 d/ X2 P: Z- Z2 f! Y; |
! o1 k+ Q) C% q: s" h6 K" v
% v+ @2 P2 w) h# Y2 i
1 ADPCM 算法
: N7 Y) j% R6 {& j8 n1.1概述4 Z0 c$ f/ t( ]& g
自适应差分脉冲编码调制 , 或简称为 ADPCM, 是波形编码的音频算法 , 它通过以前的信号值预测当前的信号值 , 并且仅发送真实值和预测值的差值。
# K/ k( N6 v% V& o5 i在普通的脉冲编码调制 (PCM)中,发送的是真实或实际信号值。
8 a& W" Y" `2 P; Z$ J+ [6 DADPCM 的优势在于通常预测信号值和真实信号值的差值相当小,这意味着与相应的 PCM 值相比,它可以用更少的位数来表示。$ @- f" w  k; C: s8 Z
根据需要的质量和压缩比,差分信号按照 4 (2 位)、 8 3 位)、 16 (4 位)或 32 5 位)水平量化。1 n; J  e7 a& d* V. u
ADPCM 算法的实现方法有很多。它们在量化和预测模式上有所不同。- O  K, c9 `( ?# s8 v/ n
在本应用笔记中,我们提供了由交互式多媒体协会(IMA)开发的4位量化算法IMA ADPCM。" y; r+ Y, x/ n6 J3 W
选择 IMA ADPCM 有多种原因:( i1 a* l; Q2 q
它可以应用于 8 kHz 44.10 kHz 之间的不同采样率# X3 H: t% ]9 [
它能在较低的 CPU 的使用率和较少的内存占用情况下保证音频的播放质量
. R, ^& o5 z0 {. _- n它具有广泛的实现方式,例如在 Windows Mac 操作系统中+ {' E2 J8 {, e7 e
IMA 数字音频对焦和技术工作组公布的一份文件对 IMA ADPCM 算法进行了充分说明:在多媒体系统中增强数字音频兼容性的建议措施 版本 3
' n) `! a+ V) x0 S# K/ l$ T% r4 k
7 t8 q, p1 p# O" j3 H6 J

- ~4 z7 D( W3 \; y" p1.2 ADPCM 算法实现' ?& H' V) f+ d% z/ o
本应用笔记提供的 IMA ADPCM 算法用于对具有下述规范的音频文件进行编码:
, r) a1 f9 {' s: W) {2 t0 m音频格式:PCM2 d* }+ u& m) d4 y' ^
音频采样大小:16
. ~) r$ k. _5 h  Z& k& ?& {通道 : 1 ( 单声道 )* [4 G% I2 @6 N2 `- T- h4 v6 W( W
音频采样率:8 kHz 44.1 kHz
$ g" G9 {5 \1 o( i* D每个 16 位 PCM 采样被编码为 4 位 ADPCM 采样,压缩比达到 1/4。9 K, b7 l  z* W
IMA ADPCM 算法实现包含两个函数,一个函数编码音频采样,另一个函数解码音频采样。
3 ~+ E: U/ }/ o3 |9 ?# l' X: BADPCM 固件由两个文件组成:+ p1 Y5 M8 ?. J3 R& y( v, L
a) adpcm.c:它包括执行编码和解码的两个 ADPCM 函数的源代码。
6 i( }' W, K9 `) D" Rb) adpcm.h:它是 adpmc.c 的头文件。它应该包含在调用 ADPCM 函数的文件中。0 x+ a3 P; q# F3 j6 E7 Y# |
: w, ^1 l3 b6 h( T

- h/ p# F. i2 w! w1.3 ADPCM 算法函数8 s' t3 J+ [+ W, {  H& x# ^2 D# F
1 描述了 ADPCM 函数。
$ F  x* I  x3 I( w0 w( N. m  |( f6 b* Z+ d* A

0 C, j# v$ e% k: z$ x# P& r Z61$J~~%L(M)1QQK~}1HM`A.png
/ _" D* d+ v& C! C$ ^, ^; ~
% A* E  x5 u* x3 U4 @

/ R# Q- }- E% Q, W
0 ^* Z; @* V/ J2 M- @: P# _1 k1.3.1ADPCM_Encode 函数
% f( }6 C3 e6 U: f( ~% j2 描述了 ADPCM_Encode 函数。
) p; v* [4 M/ K# Q$ N+ ]: V, F" @2 N5 f- Z% Q* z) w

, w% t5 ]7 N5 }6 `2 d `7RG3Q1%G%}{]S7]0(}C36K.png , q3 q- w3 T5 v- s) {' Y
; o8 Q' ]- O( f
ADPCM_Encode 函数返回一个包含 4 位 ADPCM 采样值的字节。软件将 2 个 ADPCM 采样值存入一个字节以便节约内存空间。; H6 C- G( u9 Y
* b$ k, k- V# l# Z, s

& {( K2 r+ L6 N' x" V. ]; i示例:
. L: L* c% p: `- Z- e1 k4 U// 输入:pcm_sample1 和 pcm_sample2 ; 2 个 16 位 PCM 采样值。& o. H+ a! ?8 k. ?( m
// 输出:adpcm_byte ;存入一个字节的两个 4 位 ADPCM 采样值。
0 n& W0 C/ G% S- g6 J. ?5 e# Muint8_t code;+ L0 D* h5 l! A( b& s
/* 编码第一个 16 位采样值 */
0 ]3 L8 ^1 Z( J7 n$ l# j3 v9 p1 gcode = ADPCM_Encode(pcm_sample1);2 V, g6 `0 I  Y9 z3 h
/* 存储第一个 4 位采样值 */
' X7 g% E6 [% N7 a* B; y1 Eadpcm_byte = code;
6 j  {" E" m( v% }$ t$ x" j; B4 h# U3 y/* 编码第二个 16 位采样值 */1 v4 [$ h% H' h3 Z3 |
code = ADPCM_Encode(pcm_sample2);
" r4 ]% L/ e( ?' n3 M& L/ W/* 存储第二个 4 位采样值 */5 W; h: L0 R8 a0 n3 \$ n; G
adpcm_byte |= (code << 4);/* adpcm_byte 包含两个 4 位 ADPCM 采样值 */0 @' n4 N0 v/ L+ h

5 S" D) H: S+ x0 I% j
& U9 c' B: Q3 A& I4 x/ X7 R1 C
1.3.2ADPCM_Decode 函数$ \5 M" N2 W" [
3 描述了 ADPCM_Decode 函数。
0 H' ^, `4 s* J" ^, q3 h6 p+ h! q  Y
/ k, k1 J, @& c  r( ]3 H
UK~@G$BI`TF`POQ}6M9}OIE.png 1 y$ [1 o: f8 g+ ]
/ \9 P- n' C0 s. _

+ _0 y) D4 w" k7 e- U& s
0 R0 e* _  m( T  L6 Y1 ?ADPCM_Encode函数的输入是一个包含4位ADPCM采样值的字节。在调用ADPCM_Decode函数之前,该软件必须提取出 4 ADPCM 数据并将其存入一个字节。' z- _; e5 [7 J% }
' \4 f! Z" F2 v+ I( S) Z5 I& |
+ N. Y' f6 M$ S2 t2 F- \& q
示例:. z$ W! ]* S1 `* W, K+ S( Y% {
// 输入:adpcm_byte ;存入一个字节的两个 4 位 ADPCM 采样值。  |2 O  ?5 U7 a
// 输出:pcm_sample1 和 pcm_sample2 ; 2 个 16 位 PCM 采样值。( c+ j% d6 s0 @, e% k, D0 m; e
uint8_t code;
. u# G8 `$ l5 n/ S/* 提取第一个 ADPCM4 位采样值 */
9 f. ~4 x* }5 ?$ O! Tcode = (adpcm_byte & 0x0F);
- J+ w& I3 l! ]$ A* X( l: p. S7 N/* 解码第一个 ADPCM 采样值 */
$ F: d6 H" _2 |" E9 {pcm_sample1 = ADPCM_Decode(code);
4 f& e+ z1 s; l* S$ r2 G9 J" F/* 提取第二个 ADPCM 采样值 */' ~0 ~. {- m0 I$ }5 @
code = (adpcm_byte >> 4);+ |. t: y1 e( d& u$ d
/* 解码第二个 ADPCM 采样值 */- g& C- Q# u( b- R
pcm_sample2 = ADPCM_Decode(code);
. x$ j! ]: }; V0 n9 r" R" V* n- g, ?& d* ~% A* A! |( Y
2实现示例
4 M1 j, ~$ u$ W, a+ k8 R8 P# ?2.1说明" u+ J0 \* [/ H. e: D
可以在 STM3210E-EVAL 板上运行提供的例子。它是一个典型的音频应用,包括:
- a. Y; t0 N4 F6 c3 P首先用 PC 软件将一个 PCM 文件编码为 ADPCM 格式(这个软件名为 muse.exe,是由ST 开发的。它实现了与 STM32F103xx 增强型系列产品相同的 ADPCM 算法编码器。
* X8 k" I0 a  h2 u9 W* hmuse.exe 在本应用笔记附带的压缩软件包中:请参考 2.2 章节了解如何应用这个工具。)  L1 a9 w" ~) n& p( u
然后将编码文件加载到 Flash
: X2 D# ~( p0 c6 ]! G使用高容量 STM32F103xx 微控制器解码文件,驱动 DAC 播放音频。( g8 h! `2 a% L: M! Z6 g
在 STM3210E-EVAL 板上,128 兆位 NOR Flash 存储 ADPCM 文件和 STM32F103xx 器件上运行的固件解码器。然后用它解码该数据流,并且通过应用 I2S 外部 DAC 回放音频采样。, z1 n- N$ B: ?8 h- v& ]3 |
硬件环境基于应用笔记 “AN2739:如何使用高密度 STM32F103xx 微控制器与外部 I2S 音频编解码器播放音频文件 ,请参考该应用笔记以获得更多信息。/ v! ?3 a" A# _" O; I6 l" l$ G& n  p
要运行这个演示示例,需要进行三个步骤:8 b# T' X6 I$ C/ a" z7 T
1. 生成 ADPCM 文件
/ r. O5 D5 f( l; a% b9 Z1 D- Y" y2. 将 ADPCM 文件载入 NOR Flash+ f; `2 ?: s7 s! L) W, r$ h6 w
3. 播放 ADPCM 文件6 z. \. D+ |3 {: l# J, ?/ x; {& @
$ B% y5 v3 x6 n# [6 v8 o
5 Z1 L/ A7 C: }' R% X3 I

' _. L' V$ Q% K- B, i6 V& x完整版请查看:附件- P5 b4 N1 N- {6 X% N$ a1 t" y

$ [4 r! P* m; F

  K  ?6 x5 b9 v5 h$ Y
3 |0 h3 l" T$ M# ?5 c# J' i8 b

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