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

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

[复制链接]
STMCU小助手 发布时间:2022-12-5 22:00
前言本应用笔记描述了 ADPCM 音频固件编解码器,并提供了演示固件来说明如何在使用STM32F103xxI2S 时,利用外部的 DAC 来播放 ADPCM 文件。
% |  Y! l6 p4 J0 m/ i3 d# |本应用笔记基于 “AN2739:如何利用具有外部 I2S 音频编解码器的高容量 STM32F103xx 微控制器播放音频文件 ”。由于关于 SPI、I2S 和外部 DAC 的部分在 AN2739 中已有说明,此处不再赘述。因此,为了能充分理解本应用笔记,建议您参考 AN2739。
+ ~* j+ g. N+ ^% ]# y  w; F+ p/ e5 e, ~; G  N

5 J2 f: e/ R2 ?; z& I5 W$ m1 ADPCM 算法
7 q# g. q) _/ u) s2 U1.1 概述
4 ?  d* j& u4 R) \自适应差分脉冲编码调制 , 或简称为 ADPCM, 是波形编码的音频算法 , 它通过以前的信号值预测当前的信号值 , 并且仅发送真实值和预测值的差值。
, g- J2 V/ K9 E, x, t在普通的脉冲编码调制 (PCM)中,发送的是真实或实际信号值。4 ^+ W* ^' E& o5 \/ {' ]5 O& O/ Q
ADPCM 的优势在于通常预测信号值和真实信号值的差值相当小,这意味着与相应的 PCM 值相比,它可以用更少的位数来表示。6 e6 U' h8 _4 q% _% L
根据需要的质量和压缩比,差分信号按照 4 (2 位)、 8 (3 位)、 16 (4 位)或 32 (5 位)水平量化。. A  F$ p6 E9 Z' S; B: l
ADPCM 算法的实现方法有很多。它们在量化和预测模式上有所不同。
/ g4 _% b& m1 I' k在本应用笔记中,我们提供了由交互式多媒体协会(IMA)开发的4位量化算法IMA ADPCM。
' Q& f  }" L. P, \7 W: r$ |  @选择 IMA ADPCM 有多种原因:
% f7 Q4 t: u6 j* Q% [● 它可以应用于 8 kHz 到 44.10 kHz 之间的不同采样率
9 O: o. Z: |+ j& C( S● 它能在较低的 CPU 的使用率和较少的内存占用情况下保证音频的播放质量
  i" ]2 [/ F* W3 l' N4 l2 ^● 它具有广泛的实现方式,例如在 Windows 和 Mac 操作系统中, e$ }0 {' r: o6 h0 G0 f. Y
IMA 数字音频对焦和技术工作组公布的一份文件对 IMA ADPCM 算法进行了充分说明:“ 在多媒体系统中增强数字音频兼容性的建议措施 ” 版本 3。
6 b+ J( G- }3 y0 _1 w4 z
3 ]- v5 R! H' b- e5 y/ @* `
1.2 ADPCM 算法实现5 I% @" e+ |/ \4 F! J8 L/ m
本应用笔记提供的 IMA ADPCM 算法用于对具有下述规范的音频文件进行编码:
$ R) H$ M: I) g- Y● 音频格式:PCM/ W- c. m1 q$ i6 F' f- V7 G
● 音频采样大小:16 位
* I& y+ R& Y1 B$ p4 l9 J● 通道 : 1 ( 单声道 )
# I3 b+ H7 P: c! q8 V/ U- z● 音频采样率:8 kHz 到 44.1 kHz
2 T3 ~2 w2 H' X; }' |. U+ f( J9 X每个 16 位 PCM 采样被编码为 4 位 ADPCM 采样,压缩比达到 1/4。
( [$ E3 Y# ~: y' ?( m" ~IMA ADPCM 算法实现包含两个函数,一个函数编码音频采样,另一个函数解码音频采样。# A4 t& g& B5 C$ [/ Q2 T
ADPCM 固件由两个文件组成:8 B. O  Z1 k3 B, e0 R" N5 z
a) adpcm.c:它包括执行编码和解码的两个 ADPCM 函数的源代码。: C; d' g7 x! e1 n2 L% y) R
b) adpcm.h:它是 adpmc.c 的头文件。它应该包含在调用 ADPCM 函数的文件中。
" w) }4 ^0 M% H, Y; T
. b7 E0 s7 e- U0 E& x6 |+ l& e
9 i. y! {6 _; z/ X0 w% V; S
1.3 ADPCM 算法函数
( R& V$ c, U. J, K表 1 描述了 ADPCM 函数。
! a9 ~5 @2 l. ^- ?4 R! H& e
- o- y/ w6 C! k: n* [$ L
X4F@8LLMES1851YZR41]ZVW.png
* L8 ~% q* \( ?8 |6 a; H$ U
( d+ G6 W& k2 e
1.3.1 ADPCM_Encode 函数$ M1 b% J  ]: A" v) ?8 _. L# C9 P% _( ~
表 2 描述了 ADPCM_Encode 函数。; j" j+ ^2 }! `7 y/ W
1 C/ f9 A* _" n+ ~4 Z
- T' [6 t' E) }0 d2 f  ?
48%1MSGW@N7{5H~)NC39PE0.png
% c/ ^# W7 ?3 N, p; c2 w) }7 D+ ?- n7 i5 l; i
ADPCM_Encode 函数返回一个包含 4 位 ADPCM 采样值的字节。软件将 2 个 ADPCM 采样
/ W8 ?# G5 E' ]$ N* p值存入一个字节以便节约内存空间。  w0 j8 V5 \: F

, k+ c' t2 d/ f
示例:- A$ V! p; B! E, e
// 输入:pcm_sample1 和 pcm_sample2 ; 2 个 16 位 PCM 采样值。
6 |5 p1 H) Q2 q3 o, I) \$ a// 输出:adpcm_byte ;存入一个字节的两个 4 位 ADPCM 采样值。; x2 m! H- Z+ N2 R! o
uint8_t code;5 t% ^! L4 ?% O: f# \5 P
/* 编码第一个 16 位采样值 */- ?& x' C( E2 |9 \3 N
code = ADPCM_Encode(pcm_sample1);, Y6 }; g# q1 v( X* s# z
/* 存储第一个 4 位采样值 */
; q7 u) u$ o3 |* O& `adpcm_byte = code;7 R# r: ]5 V: Q% G! W
/* 编码第二个 16 位采样值 */
! x) |4 l) j6 x) b% p7 O: Hcode = ADPCM_Encode(pcm_sample2);
3 J; E; ?6 z) y' w/ _# w0 H0 k/* 存储第二个 4 位采样值 */
# D3 t0 c1 ^6 Vadpcm_byte |= (code << 4);/* adpcm_byte 包含两个 4 位 ADPCM 采样值 */* c0 z& Q& E3 g' r+ G

# i& T, v0 E. W9 G0 u" L" Y( K6 {
1.3.2 ADPCM_Decode 函数! N! C9 E! Y* s
表 3 描述了 ADPCM_Decode 函数。# I( c& U  Y! |  p7 E

3 N. B; V; X  a9 g4 a
1 {" J6 {/ M. o4 l! ?/ y3 {
FL$~2E2DN84`G}VW}W}{[{5.png / Y+ R% Y% |7 T+ G; W
8 I5 a5 ]/ L  J' Y; q' c' m; i: O
ADPCM_Encode函数的输入是一个包含4位ADPCM采样值的字节。在调用ADPCM_Decode函数之前,该软件必须提取出 4 位 ADPCM 数据并将其存入一个字节。3 k: r7 R% ?2 D" q
, _% N! `! f, @5 Y
示例:
# B( s7 c. ~! Q- L; j
// 输入:adpcm_byte ;存入一个字节的两个 4 位 ADPCM 采样值。
+ \& C) D, \- V3 D$ E' I// 输出:pcm_sample1 和 pcm_sample2 ; 2 个 16 位 PCM 采样值。
; j5 H; m$ u5 ]' k/ _) yuint8_t code;/ L/ R! v2 B+ k  V6 R9 v0 K8 \
/* 提取第一个 ADPCM4 位采样值 */
! R/ j. h# U% T9 Y# Vcode = (adpcm_byte & 0x0F);
) W; D5 B7 C' ~% t7 q* _/* 解码第一个 ADPCM 采样值 */! D, I% l+ V1 B& d: Q
pcm_sample1 = ADPCM_Decode(code);
. j/ Y1 N; w0 l! f0 _9 m: |9 _$ ^/* 提取第二个 ADPCM 采样值 */) _" D% o8 A& y& M  ^; u1 Y& o
code = (adpcm_byte >> 4);
: [6 X8 u0 X/ O# H" a% t* o) B/* 解码第二个 ADPCM 采样值 */  c& K( Y) @* B, V9 a' B
pcm_sample2 = ADPCM_Decode(code);
" `- u7 V$ i$ s- A) T( G4 `函数名称 ADPCM_Decode0 K9 e8 U" r+ f, P* ]+ Z0 [
原型 int16_t ADPCM_Decode(uint8_t code);7 |1 O/ @4 ?. S7 I6 t8 [3 A

/ {. Y' p! O! B% F
3 W% h5 S6 q' C) G; R6 T+ [) b
2 实现示例
6 a& g8 O+ x" l
2.1 说明9 a6 Q% P0 D; `) k5 W2 u
可以在 STM3210E-EVAL 板上运行提供的例子。它是一个典型的音频应用,包括:
, D5 X& V$ u) F% U4 z● 首先用 PC 软件将一个 PCM 文件编码为 ADPCM 格式(这个软件名为 muse.exe,是由ST 开发的。它实现了与 STM32F103xx 增强型系列产品相同的 ADPCM 算法编码器。muse.exe 在本应用笔记附带的压缩软件包中:请参考 第 2.2 章节了解如何应用这个工具。)! B* K& \) J. V$ H" L- c$ E  O
● 然后将编码文件加载到 Flash
  t/ k4 s- T/ y+ q; h. K- u● 使用高容量 STM32F103xx 微控制器解码文件,驱动 DAC 播放音频。
; l% A, J# J9 g+ ~在 STM3210E-EVAL 板上,128 兆位 NOR Flash 存储 ADPCM 文件和 STM32F103xx 器件上运行的固件解码器。然后用它解码该数据流,并且通过应用 I2S 外部 DAC 回放音频采样。硬件环境基于应用笔记 “AN2739:如何使用高密度 STM32F103xx 微控制器与外部 I2S 音频# D. r0 \( Y2 m3 H, J$ M
编解码器播放音频文件 ”,请参考该应用笔记以获得更多信息。
6 T2 G2 U$ k% M' ^4 t* E$ e& I要运行这个演示示例,需要进行三个步骤:% j$ d+ B; _  V
1. 生成 ADPCM 文件( f/ k. N0 ^2 ~' E) r3 A
2. 将 ADPCM 文件载入 NOR Flash) _, w/ {. A8 ?% v$ J* f4 \
3. 播放 ADPCM 文件$ Q" a) N  I8 i( ?2 Y+ t

! ~2 t! H( m4 ]) T1 _$ N" ~) q: i4 C; z" K5 K3 y
完整版请查看:附件5 i9 k0 K7 u- Q8 \
0 |6 w8 h5 }2 Q! Z

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

下载

219.64 KB, 下载次数: 6

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

举报

0个回答

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版