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

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

[复制链接]
STMCU小助手 发布时间:2022-12-5 22:00
前言本应用笔记描述了 ADPCM 音频固件编解码器,并提供了演示固件来说明如何在使用STM32F103xxI2S 时,利用外部的 DAC 来播放 ADPCM 文件。
: y2 N$ v7 d& S& |本应用笔记基于 “AN2739:如何利用具有外部 I2S 音频编解码器的高容量 STM32F103xx 微控制器播放音频文件 ”。由于关于 SPI、I2S 和外部 DAC 的部分在 AN2739 中已有说明,此处不再赘述。因此,为了能充分理解本应用笔记,建议您参考 AN2739。
# Q: ]! q9 X7 \& a) g! j
5 G8 \( Z' d4 |/ X/ D! |

7 q) X' |8 U3 g1 ADPCM 算法8 }. Q2 F; t; z
1.1 概述. G0 M9 B0 l$ w3 \& @
自适应差分脉冲编码调制 , 或简称为 ADPCM, 是波形编码的音频算法 , 它通过以前的信号值预测当前的信号值 , 并且仅发送真实值和预测值的差值。
9 V1 x$ d2 V; S) x& {在普通的脉冲编码调制 (PCM)中,发送的是真实或实际信号值。. ~- g/ [  l0 t1 q( L; A1 q
ADPCM 的优势在于通常预测信号值和真实信号值的差值相当小,这意味着与相应的 PCM 值相比,它可以用更少的位数来表示。
& g3 [" J# _" Q. O9 ~根据需要的质量和压缩比,差分信号按照 4 (2 位)、 8 (3 位)、 16 (4 位)或 32 (5 位)水平量化。5 E8 t% ?6 b1 k
ADPCM 算法的实现方法有很多。它们在量化和预测模式上有所不同。
8 ?* G! @7 f+ S3 X+ R在本应用笔记中,我们提供了由交互式多媒体协会(IMA)开发的4位量化算法IMA ADPCM。5 q6 b% e( T3 W: b: c
选择 IMA ADPCM 有多种原因:# W* U& Q  I/ W
● 它可以应用于 8 kHz 到 44.10 kHz 之间的不同采样率
! x. `% B: I0 X/ R; E$ H● 它能在较低的 CPU 的使用率和较少的内存占用情况下保证音频的播放质量
+ g. w1 t: Y% s1 Y2 A0 p4 G● 它具有广泛的实现方式,例如在 Windows 和 Mac 操作系统中
& L( D1 p: E6 J6 l9 h! I  o0 a) m" J% dIMA 数字音频对焦和技术工作组公布的一份文件对 IMA ADPCM 算法进行了充分说明:“ 在多媒体系统中增强数字音频兼容性的建议措施 ” 版本 3。
" a0 U7 I5 K/ L/ X8 i. O9 N  I7 I! f( \# \& o$ c# Y
1.2 ADPCM 算法实现
: o5 f4 O% {' l% h本应用笔记提供的 IMA ADPCM 算法用于对具有下述规范的音频文件进行编码:: w% w: N$ I& h6 P
● 音频格式:PCM
& h* _4 t; y7 I( V/ G5 z● 音频采样大小:16 位: }% w! G- a  j: s' F9 B
● 通道 : 1 ( 单声道 ). G& [" S% \! Z% V
● 音频采样率:8 kHz 到 44.1 kHz
6 @" A8 e3 A6 y; o# K7 r( I每个 16 位 PCM 采样被编码为 4 位 ADPCM 采样,压缩比达到 1/4。
# M; t3 \4 S& k/ C6 mIMA ADPCM 算法实现包含两个函数,一个函数编码音频采样,另一个函数解码音频采样。. f) ]  N. E# Z. R" }7 O5 p5 p4 }& r
ADPCM 固件由两个文件组成:0 Q- c3 {9 t! f, D" {8 N
a) adpcm.c:它包括执行编码和解码的两个 ADPCM 函数的源代码。! _, q( }6 L% X- L  G+ n" N2 r
b) adpcm.h:它是 adpmc.c 的头文件。它应该包含在调用 ADPCM 函数的文件中。
; n8 J, y, P" H' e1 Z7 }1 @% v9 C- o3 |! G

  b' p' M' y8 F2 l& }
1.3 ADPCM 算法函数/ m  e* H7 k) G
表 1 描述了 ADPCM 函数。9 r2 u3 @0 t- D& t" Z; u
9 r' U8 k+ Z/ D
X4F@8LLMES1851YZR41]ZVW.png . K/ ^( d% e' O1 E

# }! e8 o; H' @; Y# @3 f1.3.1 ADPCM_Encode 函数
* F% V  r. t/ N, q, h- V6 r1 r表 2 描述了 ADPCM_Encode 函数。
1 e! Q- m7 X# q0 p3 C( @
* D. ^8 S5 M% _" F
" r& a, x0 g( u6 J  @
48%1MSGW@N7{5H~)NC39PE0.png 8 x# e" a6 ~' E! x9 W+ ~# Y
5 ^  u2 X* @! y" D5 M
ADPCM_Encode 函数返回一个包含 4 位 ADPCM 采样值的字节。软件将 2 个 ADPCM 采样& g/ r: B% s5 f; n$ j1 {% ?% R
值存入一个字节以便节约内存空间。
6 A& w& e) Y2 L  e& U' |9 G/ s
0 A+ G0 ^* V- m$ d
示例:9 {. K# r4 W) |
// 输入:pcm_sample1 和 pcm_sample2 ; 2 个 16 位 PCM 采样值。
0 i6 \+ V- D, Y4 `// 输出:adpcm_byte ;存入一个字节的两个 4 位 ADPCM 采样值。
/ H- h* l  t% t9 Yuint8_t code;
! `0 ^+ w6 a; q/* 编码第一个 16 位采样值 */8 D4 I; Z" h- h* n' e* x4 W! L
code = ADPCM_Encode(pcm_sample1);
5 S9 u2 L. Y" K6 f/* 存储第一个 4 位采样值 */
) u) P  @! D( ?% Gadpcm_byte = code;% w, {; L. q: j! ]
/* 编码第二个 16 位采样值 */
" @* |7 J; e& s6 `' o  W- F5 ]code = ADPCM_Encode(pcm_sample2);
: |0 Y, G. `% w0 r0 S/* 存储第二个 4 位采样值 */
- q6 G% x" [9 C+ U4 a( c9 gadpcm_byte |= (code << 4);/* adpcm_byte 包含两个 4 位 ADPCM 采样值 */) n& V, P0 u7 O
; d# B6 z% L, w
1.3.2 ADPCM_Decode 函数
6 V7 ^9 |- \4 M' `0 t$ R, a表 3 描述了 ADPCM_Decode 函数。$ ]* H& J3 W! p% U
+ r2 D- h5 ~( G, E+ X

1 _$ ]+ Z4 z4 a2 M2 t/ ~# M* ] FL$~2E2DN84`G}VW}W}{[{5.png
# h! l4 L: {, S6 f$ _
5 f4 O3 {3 R# \- T3 I. ]6 G+ hADPCM_Encode函数的输入是一个包含4位ADPCM采样值的字节。在调用ADPCM_Decode函数之前,该软件必须提取出 4 位 ADPCM 数据并将其存入一个字节。$ N& l% x8 u! x7 |( |8 V6 t1 n# l7 b

/ ]' V3 x: L! A5 v, A
示例:

7 z1 u& _! S5 C. Z// 输入:adpcm_byte ;存入一个字节的两个 4 位 ADPCM 采样值。
- k& D3 M; Z2 U: h. \6 x; Z8 Y0 X// 输出:pcm_sample1 和 pcm_sample2 ; 2 个 16 位 PCM 采样值。6 }7 J- q( L& Y3 `
uint8_t code;
+ D- f0 B9 R) o* P% Q/* 提取第一个 ADPCM4 位采样值 */
* x6 t/ c: {; }7 |- gcode = (adpcm_byte & 0x0F);& N8 H& X3 I, T) ~% ?7 u6 X
/* 解码第一个 ADPCM 采样值 */8 p* {+ O& K" D
pcm_sample1 = ADPCM_Decode(code);
+ u. C3 K0 j6 u7 z1 Q5 F/* 提取第二个 ADPCM 采样值 */; [( f" r+ T0 v* S' ~
code = (adpcm_byte >> 4);
8 J; R  K: |2 W2 F$ f/* 解码第二个 ADPCM 采样值 */5 U7 K: N* T1 e; N( T
pcm_sample2 = ADPCM_Decode(code);
5 E" z3 _2 ?' _/ T! F/ {9 S函数名称 ADPCM_Decode& O8 p" j7 E1 B
原型 int16_t ADPCM_Decode(uint8_t code);
  \; j5 Z0 T. D! ^& W; `, ?" b  i6 ]8 ?/ R" J6 ^0 g) m
& [9 V, O! a8 w, T. v
2 实现示例

% V5 ^+ |+ A3 K/ `2 A& A: p2 W$ u. c2.1 说明
1 _( [8 b: V- W) R9 ?# I% j5 v( X% L可以在 STM3210E-EVAL 板上运行提供的例子。它是一个典型的音频应用,包括:$ W$ T& T2 w; h7 L# A8 t. _  e
● 首先用 PC 软件将一个 PCM 文件编码为 ADPCM 格式(这个软件名为 muse.exe,是由ST 开发的。它实现了与 STM32F103xx 增强型系列产品相同的 ADPCM 算法编码器。muse.exe 在本应用笔记附带的压缩软件包中:请参考 第 2.2 章节了解如何应用这个工具。)
! c, \, z( k" n7 x● 然后将编码文件加载到 Flash
. H- K. C2 E7 A2 x4 K● 使用高容量 STM32F103xx 微控制器解码文件,驱动 DAC 播放音频。
7 z8 p( h2 M/ A+ P! v9 {0 D在 STM3210E-EVAL 板上,128 兆位 NOR Flash 存储 ADPCM 文件和 STM32F103xx 器件上运行的固件解码器。然后用它解码该数据流,并且通过应用 I2S 外部 DAC 回放音频采样。硬件环境基于应用笔记 “AN2739:如何使用高密度 STM32F103xx 微控制器与外部 I2S 音频
) {! x& v. V' C* ]+ Q0 p: S! R编解码器播放音频文件 ”,请参考该应用笔记以获得更多信息。; J9 i3 n1 Y+ g  ?. G( {
要运行这个演示示例,需要进行三个步骤:
1 j  ^' ]& r1 R* q% {' X7 x( i1. 生成 ADPCM 文件
8 K' ~- o$ ]! h& j$ N2. 将 ADPCM 文件载入 NOR Flash# Y& ^: Z" X, v4 Z7 i9 }; W2 D
3. 播放 ADPCM 文件3 ]6 h2 @2 {9 v+ u
- x+ `# l; S( _4 x2 y

* I' A) A8 J0 o完整版请查看:附件$ H6 o7 C7 v( S2 n

+ C1 s$ r% w5 P

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

下载

219.64 KB, 下载次数: 2

收藏 评论0 发布时间:2022-12-5 22:00

举报

0个回答

所属标签

相似分享

官网相关资源

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