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

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

[复制链接]
STMCU小助手 发布时间:2022-7-15 23:14
前言
9 V3 }( j  Z6 f本应用笔记描述了 ADPCM 音频固件编解码器,并提供了演示固件来说明如何在使用STM32F103xxI2S 时,利用外部的 DAC 来播放 ADPCM 文件。
8 n5 _# q* e3 K6 n* T4 a! @4 H本应用笔记基于 “AN2739:如何利用具有外部 I2S 音频编解码器的高容量 STM32F103xx 微控制器播放音频文件 。由于关于 SPII2S 和外部 DAC 的部分在 AN2739 中已有说明,此处不再赘述。因此,为了能充分理解本应用笔记,建议您参考 AN2739
' n) C6 Q# B. I- y1 i" q* @: C% g  A# N$ k  u8 i+ W* H/ d

$ v1 b6 F' O% F4 G1 ADPCM 算法
, L9 g* u  t4 f  X  L9 p& c( |1.1概述
* x. |) E( M) e4 S: D/ D自适应差分脉冲编码调制 , 或简称为 ADPCM, 是波形编码的音频算法 , 它通过以前的信号值预测当前的信号值 , 并且仅发送真实值和预测值的差值。
* P0 b" f9 a& R, |7 p' V$ H在普通的脉冲编码调制 (PCM)中,发送的是真实或实际信号值。: _/ W0 b1 J. v! p, R/ v, D/ f3 I
ADPCM 的优势在于通常预测信号值和真实信号值的差值相当小,这意味着与相应的 PCM 值相比,它可以用更少的位数来表示。% e) |4 A+ M+ v$ J" S/ @% l
根据需要的质量和压缩比,差分信号按照 4 (2 位)、 8 3 位)、 16 (4 位)或 32 5 位)水平量化。% z% g" B6 B2 d7 T
ADPCM 算法的实现方法有很多。它们在量化和预测模式上有所不同。5 \" T$ v0 k' p: p- f5 v# \
在本应用笔记中,我们提供了由交互式多媒体协会(IMA)开发的4位量化算法IMA ADPCM。
  l6 A9 T$ s1 W' V6 b9 j0 i选择 IMA ADPCM 有多种原因:
4 b* F& R' g5 N; B8 \* n它可以应用于 8 kHz 44.10 kHz 之间的不同采样率; |4 D* c3 X$ }; E# w) h$ `8 F' C
它能在较低的 CPU 的使用率和较少的内存占用情况下保证音频的播放质量, X' b, w  \# i/ W, K5 x
它具有广泛的实现方式,例如在 Windows Mac 操作系统中3 ?$ c2 [3 k$ p- f; x' F9 u
IMA 数字音频对焦和技术工作组公布的一份文件对 IMA ADPCM 算法进行了充分说明:在多媒体系统中增强数字音频兼容性的建议措施 版本 3+ N  h: |: Q) H" A" M

3 n! K2 r: `9 f
/ m8 E3 ~& S6 k( G, ^5 M
1.2 ADPCM 算法实现
+ J0 n; T/ S  X% ]% ~本应用笔记提供的 IMA ADPCM 算法用于对具有下述规范的音频文件进行编码:
/ E) f" D8 ]8 Y/ o! _音频格式:PCM
% ^6 L- X5 B- O. j$ U0 V音频采样大小:16
6 [, G% g1 k6 `7 j$ d通道 : 1 ( 单声道 )
" l) b. x/ n% F/ E+ {音频采样率:8 kHz 44.1 kHz
# n' \! L- C# W) o每个 16 位 PCM 采样被编码为 4 位 ADPCM 采样,压缩比达到 1/4。5 |2 T' \- g  {& Q6 B
IMA ADPCM 算法实现包含两个函数,一个函数编码音频采样,另一个函数解码音频采样。
7 p- O' B$ K- \4 i( Q: d% SADPCM 固件由两个文件组成:* S' R( E! O7 Y9 }; v0 N. i
a) adpcm.c:它包括执行编码和解码的两个 ADPCM 函数的源代码。. k" |) S; Q1 d
b) adpcm.h:它是 adpmc.c 的头文件。它应该包含在调用 ADPCM 函数的文件中。4 V! L" i7 @- N& o: L) D7 o9 p
% _- M  l6 z% l4 j

7 k: o* n, A" Z* N: I# A1.3 ADPCM 算法函数
8 ~) G( p( C  Z( f) I1 描述了 ADPCM 函数。
' T$ l5 h- S) ]% D5 j1 t4 Y" q3 j( B4 X% t( g
- m3 H" f% ^8 Z! {8 [& @6 X. T
Z61$J~~%L(M)1QQK~}1HM`A.png 2 j6 w+ M; z% X* }0 A4 {, N, u6 W
0 Y3 T5 v, b- n+ I8 P# R! |  R

3 O! V6 M' O% {5 Q ( h* R7 L4 j! |  K: K6 @# ]. V* E) Z
1.3.1ADPCM_Encode 函数  ~- Y; o7 X$ b' v1 M+ q3 `9 S
2 描述了 ADPCM_Encode 函数。* G; O/ q2 m5 J' ?: B6 w' K. O; A

  L. J* F3 N' F5 m8 p) j2 V
' a- p5 S9 ~8 v/ M: Y
`7RG3Q1%G%}{]S7]0(}C36K.png
7 Q- `: k: _# f: d/ W$ x% S5 p$ a" p% L8 L, G
ADPCM_Encode 函数返回一个包含 4 位 ADPCM 采样值的字节。软件将 2 个 ADPCM 采样值存入一个字节以便节约内存空间。
8 W/ l' i  C' e5 M3 m/ H% _1 M. J/ W6 l4 J" F! ^; ^* X) _
% S5 e8 I( O4 B0 b6 s7 d8 R
示例:% s  w  I9 |" U' @. Y
// 输入:pcm_sample1 和 pcm_sample2 ; 2 个 16 位 PCM 采样值。
6 S6 B4 U/ E$ @' y$ b) z- T// 输出:adpcm_byte ;存入一个字节的两个 4 位 ADPCM 采样值。% L: E$ b' Y. U' T4 x
uint8_t code;; [; Q' M9 |6 f! d: M) t
/* 编码第一个 16 位采样值 */
* ~" B7 g$ y5 d: Z( }$ s( R% K* `2 ccode = ADPCM_Encode(pcm_sample1);; `3 H, @, y' G9 g9 ?# o
/* 存储第一个 4 位采样值 */
1 j$ S( Z9 }' d4 ~6 S  p$ }adpcm_byte = code;  w3 u6 l) j# Y1 a8 e. _4 B
/* 编码第二个 16 位采样值 */
6 ^, m7 l0 i. y9 R0 C; Vcode = ADPCM_Encode(pcm_sample2);
" M3 c" O8 Z4 a# k9 ]/* 存储第二个 4 位采样值 */
3 x* ?+ L0 u4 E6 N+ k, t. M; d4 Gadpcm_byte |= (code << 4);/* adpcm_byte 包含两个 4 位 ADPCM 采样值 */; ~9 s* S$ h1 M- I1 t. d

- T# q1 e+ }% m- Q$ C- Q

. a1 e& h* B# ]1.3.2ADPCM_Decode 函数
# a& H8 p: h3 {5 J: N; R3 描述了 ADPCM_Decode 函数。
9 F4 U8 s; m9 _) g2 e5 q8 u  ]) B$ @! U6 ]

( Y4 s7 |9 h/ W% L( t0 c UK~@G$BI`TF`POQ}6M9}OIE.png ) \8 r+ y. K2 q) m9 m0 @* Q
0 g  d. F1 R6 L. [7 i2 W; ~6 ]  W

  A9 v4 h8 t- j% v( A1 Y. J: e* s" y+ k& T4 e1 Z" w9 p
ADPCM_Encode函数的输入是一个包含4位ADPCM采样值的字节。在调用ADPCM_Decode函数之前,该软件必须提取出 4 ADPCM 数据并将其存入一个字节。
7 u7 b5 w, b* w; L. i  D  B# w0 P% o/ I' t
+ T7 O! M8 n9 k4 O, l# ]
示例:
2 o% z2 i- L3 c8 G! i, c+ {// 输入:adpcm_byte ;存入一个字节的两个 4 位 ADPCM 采样值。6 U' ]& Z1 o) {
// 输出:pcm_sample1 和 pcm_sample2 ; 2 个 16 位 PCM 采样值。
0 t$ w; B5 h! Y4 ^5 Q( {6 ?3 E% ?uint8_t code;
1 m" s( |- G9 m7 ?6 r: [/* 提取第一个 ADPCM4 位采样值 */  z, Y$ O" K! a3 y
code = (adpcm_byte & 0x0F);. W  i1 Q1 {* p
/* 解码第一个 ADPCM 采样值 */
+ O9 O# @2 m8 H, hpcm_sample1 = ADPCM_Decode(code);
: y- _8 p4 _- h! x8 F/ O+ P/* 提取第二个 ADPCM 采样值 */, J1 R( X( ~# E
code = (adpcm_byte >> 4);
0 ~, }9 u+ P5 x5 H: O9 W1 S' u/* 解码第二个 ADPCM 采样值 */7 n) e1 t5 h# W- F
pcm_sample2 = ADPCM_Decode(code);
4 L. B7 c+ r1 L( k2 F# x4 c# K8 A
  y8 k  g) T8 N" \* W. m7 K2实现示例2 j! Q5 B! _' E$ m, K
2.1说明
6 x# X8 Q2 Q. Z: ?; o) t可以在 STM3210E-EVAL 板上运行提供的例子。它是一个典型的音频应用,包括:
& }( G8 G; Z4 C% x0 P( R( S  v, q0 v6 ~首先用 PC 软件将一个 PCM 文件编码为 ADPCM 格式(这个软件名为 muse.exe,是由ST 开发的。它实现了与 STM32F103xx 增强型系列产品相同的 ADPCM 算法编码器。
* B- K4 r( U. ~; H5 T! emuse.exe 在本应用笔记附带的压缩软件包中:请参考 2.2 章节了解如何应用这个工具。)
( u/ [% X" @6 {" u$ s! M然后将编码文件加载到 Flash
. w/ D1 V" u( F! x1 i使用高容量 STM32F103xx 微控制器解码文件,驱动 DAC 播放音频。$ o! m9 ^4 t: O! W6 ~
在 STM3210E-EVAL 板上,128 兆位 NOR Flash 存储 ADPCM 文件和 STM32F103xx 器件上运行的固件解码器。然后用它解码该数据流,并且通过应用 I2S 外部 DAC 回放音频采样。+ k$ i( B& s9 M# O1 T
硬件环境基于应用笔记 “AN2739:如何使用高密度 STM32F103xx 微控制器与外部 I2S 音频编解码器播放音频文件 ,请参考该应用笔记以获得更多信息。
+ w" m' b9 l! p要运行这个演示示例,需要进行三个步骤:! \3 `% w0 ?- b, f. k1 q" ]
1. 生成 ADPCM 文件" [) q" d% \$ J0 i6 A9 ~( P( H
2. 将 ADPCM 文件载入 NOR Flash
5 w" U4 a; E1 T6 J  U5 G) l! y5 T3. 播放 ADPCM 文件* l. W& `0 T' @! {; N, ^

  s1 |+ q, a# D! ?
( B. I5 v3 `% G! {6 C* L
  ~4 C9 H# L' v( p( o
完整版请查看:附件
  ~# X; u6 t9 Z, S$ W4 n* l* L* T- _" R5 |& C0 G

4 a% I! P  Y) V6 c8 Y
" u1 R! @8 s, r% N1 P' q

CD00224093_ZHV2.3.pdf

下载

217.52 KB, 下载次数: 7

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

举报

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

111111111111111111111111111111

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版