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

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

[复制链接]
STMCU小助手 发布时间:2022-7-15 23:14
前言, K. L6 b5 w% A, _. I
本应用笔记描述了 ADPCM 音频固件编解码器,并提供了演示固件来说明如何在使用STM32F103xxI2S 时,利用外部的 DAC 来播放 ADPCM 文件。
( L. `- M3 s1 R% F本应用笔记基于 “AN2739:如何利用具有外部 I2S 音频编解码器的高容量 STM32F103xx 微控制器播放音频文件 。由于关于 SPII2S 和外部 DAC 的部分在 AN2739 中已有说明,此处不再赘述。因此,为了能充分理解本应用笔记,建议您参考 AN2739# M. m$ f2 q) j$ D4 p
: R# d9 B* q, J* z( O5 e4 K
  J# U; V+ H- Z$ t4 t: M/ v
1 ADPCM 算法
/ O. O' X$ |( c4 d5 J1 I3 x4 p7 x1.1概述
$ a5 ~+ j! F8 S" f自适应差分脉冲编码调制 , 或简称为 ADPCM, 是波形编码的音频算法 , 它通过以前的信号值预测当前的信号值 , 并且仅发送真实值和预测值的差值。
, u5 t1 P9 f9 k" o, h. W- Z0 f在普通的脉冲编码调制 (PCM)中,发送的是真实或实际信号值。
( Z1 n6 f+ H% q# x& qADPCM 的优势在于通常预测信号值和真实信号值的差值相当小,这意味着与相应的 PCM 值相比,它可以用更少的位数来表示。
2 B/ V- Q5 z/ `# ]8 F+ }根据需要的质量和压缩比,差分信号按照 4 (2 位)、 8 3 位)、 16 (4 位)或 32 5 位)水平量化。8 K/ n& |' p$ x: g1 e1 Z
ADPCM 算法的实现方法有很多。它们在量化和预测模式上有所不同。% I+ X8 O, f: `: }
在本应用笔记中,我们提供了由交互式多媒体协会(IMA)开发的4位量化算法IMA ADPCM。: B$ C1 D" a& T( J
选择 IMA ADPCM 有多种原因:
" ]$ r/ ]5 a" n8 z6 w它可以应用于 8 kHz 44.10 kHz 之间的不同采样率: o/ Q6 E/ ?, W8 ^" A+ @
它能在较低的 CPU 的使用率和较少的内存占用情况下保证音频的播放质量
2 W6 Z( I& J0 P: ?" y它具有广泛的实现方式,例如在 Windows Mac 操作系统中' k/ l  j6 Q/ G9 \. {- V
IMA 数字音频对焦和技术工作组公布的一份文件对 IMA ADPCM 算法进行了充分说明:在多媒体系统中增强数字音频兼容性的建议措施 版本 3
7 V# F+ M* u' }' \4 W; i  I
% I, l( v: d7 ]3 r$ m  U# s3 J
9 _* }3 r0 N4 f+ D
1.2 ADPCM 算法实现3 o9 t( Z; S. E5 y4 V1 o/ M; x( _5 {
本应用笔记提供的 IMA ADPCM 算法用于对具有下述规范的音频文件进行编码:4 }" _/ G' _) Z; Q! Q  L, @3 L
音频格式:PCM% G) [# B5 l, ~3 v; N: y" r
音频采样大小:16
: Z; O, }7 s+ y3 @, w& f  i通道 : 1 ( 单声道 )- @5 U$ j2 v) o
音频采样率:8 kHz 44.1 kHz
1 ]# N: Y" R6 p2 u, ~# m" Z每个 16 位 PCM 采样被编码为 4 位 ADPCM 采样,压缩比达到 1/4。+ h  ]8 F: N9 o9 c
IMA ADPCM 算法实现包含两个函数,一个函数编码音频采样,另一个函数解码音频采样。3 r- V2 D8 t& U) p  f9 t
ADPCM 固件由两个文件组成:7 F% R& {2 n. k9 `5 z# I
a) adpcm.c:它包括执行编码和解码的两个 ADPCM 函数的源代码。& ]0 f$ W2 o" ^% L7 d) n/ I& ?
b) adpcm.h:它是 adpmc.c 的头文件。它应该包含在调用 ADPCM 函数的文件中。
8 d6 `0 v# p* `' y; s7 r$ v
* R9 b; w/ O3 m. E$ h9 v! U% a
0 ^* h# J! [& k7 s& Z1 j' N3 _
1.3 ADPCM 算法函数
+ E# u  n# {5 x; `1 m. x: Y* A1 描述了 ADPCM 函数。
* L) O4 b% A5 k) C4 ^5 M) t, ~& I5 i, X, E2 n+ A

3 S# ^2 z$ a% s; _ Z61$J~~%L(M)1QQK~}1HM`A.png
/ `/ A" b4 }# `+ r% g4 H7 A& G2 g* Z$ e* @% p* m! T
& F7 s4 e2 ~7 u0 f. h* H

- f8 q9 B: a: z# F* T6 C1.3.1ADPCM_Encode 函数2 a& ^- B* z2 ~& A! {6 z& L
2 描述了 ADPCM_Encode 函数。
! n5 ?" ^, V1 g7 _2 m9 M+ y
' s( Z& c" l/ i$ u7 W

4 ~4 U: t4 R5 V- m. v5 l `7RG3Q1%G%}{]S7]0(}C36K.png
6 a; Y$ ~/ X0 \3 [# u! B8 ^
1 z4 w9 ~" F+ E7 T0 \1 VADPCM_Encode 函数返回一个包含 4 位 ADPCM 采样值的字节。软件将 2 个 ADPCM 采样值存入一个字节以便节约内存空间。/ s1 _& J9 G( u0 W. d3 k% Y" q9 h- o+ c

  S3 ^( }1 q, u  U' Q) u& V
6 u1 E4 V+ T: f3 M1 ]+ }& ]
示例:7 T! f! Y/ T' J) R# d  H
// 输入:pcm_sample1 和 pcm_sample2 ; 2 个 16 位 PCM 采样值。( c* q% U# ^+ s
// 输出:adpcm_byte ;存入一个字节的两个 4 位 ADPCM 采样值。2 i% B$ X3 Z  C1 A/ g! H
uint8_t code;
/ ]- H. _% S- x+ N: C( x4 p/* 编码第一个 16 位采样值 */1 A& z  F2 G4 P* ^
code = ADPCM_Encode(pcm_sample1);
% k2 C2 A$ O1 l/* 存储第一个 4 位采样值 */" k3 M/ [: y$ z3 G
adpcm_byte = code;
0 s; B8 m# O8 A$ {8 Z3 b3 J% m9 M/* 编码第二个 16 位采样值 */% Q" l. [1 H6 Y1 j" p
code = ADPCM_Encode(pcm_sample2);" r+ u( P$ P9 k1 v3 G1 Y) q$ F9 y
/* 存储第二个 4 位采样值 */+ ^+ ^) c' d, X. R# z
adpcm_byte |= (code << 4);/* adpcm_byte 包含两个 4 位 ADPCM 采样值 */; E) }9 ?  J0 u3 q+ C0 Q

0 w0 `5 Z+ _5 L7 A& ]
* C/ q; a0 H' x) w9 E6 Q
1.3.2ADPCM_Decode 函数2 w* K2 o+ q+ x& i; p
3 描述了 ADPCM_Decode 函数。3 V9 a) {7 J& W* x# k

/ @# k: n- G# K# n; |8 a$ u$ G

. C3 }# }4 M, q$ s7 m) u UK~@G$BI`TF`POQ}6M9}OIE.png ' k: \; r* g* c. k

# G8 ^! w5 ^0 P% O8 Y8 y
" }% {! w4 Y$ T

- B0 X, ?& \) |* sADPCM_Encode函数的输入是一个包含4位ADPCM采样值的字节。在调用ADPCM_Decode函数之前,该软件必须提取出 4 ADPCM 数据并将其存入一个字节。
6 z3 e: G! S* @6 A& u. a" a3 b7 _6 f1 m4 N9 t
8 A0 @& y2 }0 @( D, F
示例:' ?7 w' t: J+ `; \: \" Q
// 输入:adpcm_byte ;存入一个字节的两个 4 位 ADPCM 采样值。
) C) |: N: A1 t( i0 g5 ^- T// 输出:pcm_sample1 和 pcm_sample2 ; 2 个 16 位 PCM 采样值。
& E$ |! I7 ?6 q! T. c8 L$ I( ]6 Puint8_t code;
8 Y+ y1 C* \/ y, s: [7 R' m: U: ]/* 提取第一个 ADPCM4 位采样值 */
9 i- X: T7 K3 K/ p5 }code = (adpcm_byte & 0x0F);
  E3 X- a% ~: O/* 解码第一个 ADPCM 采样值 */" y2 s8 L0 M2 O* z
pcm_sample1 = ADPCM_Decode(code);: h3 {; \2 m) r2 C$ K" K: U
/* 提取第二个 ADPCM 采样值 */2 u5 ]6 H- S3 |' d* D9 p
code = (adpcm_byte >> 4);
# i/ Q. q- u' F& \3 T/* 解码第二个 ADPCM 采样值 */
& ?8 v2 s3 ^& u; Y5 ?% h) O% j" spcm_sample2 = ADPCM_Decode(code);& k) X3 ?3 T) r* N3 G5 |, Z0 {
- X6 p! l# [9 n+ P% [5 U( X2 ^) K
2实现示例8 t2 o9 g# K7 P$ p7 B8 p  k. @" A. S
2.1说明
, ?/ o* b$ W& k2 E3 s可以在 STM3210E-EVAL 板上运行提供的例子。它是一个典型的音频应用,包括:' f  |2 j+ y! q) j2 I; G8 d& r
首先用 PC 软件将一个 PCM 文件编码为 ADPCM 格式(这个软件名为 muse.exe,是由ST 开发的。它实现了与 STM32F103xx 增强型系列产品相同的 ADPCM 算法编码器。
+ I( `$ L, m' r! B: R4 U! ~, nmuse.exe 在本应用笔记附带的压缩软件包中:请参考 2.2 章节了解如何应用这个工具。)
, Z  I% m1 {9 c* V+ j然后将编码文件加载到 Flash7 p5 |4 d& [5 i0 C! O3 r2 L) l% S
使用高容量 STM32F103xx 微控制器解码文件,驱动 DAC 播放音频。) C! v1 D- t) j: v2 a
在 STM3210E-EVAL 板上,128 兆位 NOR Flash 存储 ADPCM 文件和 STM32F103xx 器件上运行的固件解码器。然后用它解码该数据流,并且通过应用 I2S 外部 DAC 回放音频采样。( ~0 v. X7 ]8 A( I
硬件环境基于应用笔记 “AN2739:如何使用高密度 STM32F103xx 微控制器与外部 I2S 音频编解码器播放音频文件 ,请参考该应用笔记以获得更多信息。
+ f, H" `3 V+ E. M* x; X7 a0 Z7 t要运行这个演示示例,需要进行三个步骤:& {+ m3 T9 h+ ]) H, V: C: i
1. 生成 ADPCM 文件
5 L8 w& k' i# s& Z4 l5 f* q2. 将 ADPCM 文件载入 NOR Flash( A$ C' A8 _2 L3 T$ ?" b! N  e
3. 播放 ADPCM 文件
) M0 M, V' I& b9 o4 R! g/ t- a. d# v5 V" @) i
  ]' I! s, g5 B+ |2 g  N/ @) z
. z2 o  F5 Q% d6 i5 v. p0 g
完整版请查看:附件
. e8 I6 k% u6 K$ @0 X; R" D# y3 I# h" M3 J' T5 N2 _& N0 r8 |
6 h6 Q* Q- d0 R2 r
4 K; K2 w* ^2 P" q, R% w; D

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