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

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

[复制链接]
STMCU小助手 发布时间:2022-7-15 23:14
前言
7 @% R( ?: z" r- |+ q' c! w本应用笔记描述了 ADPCM 音频固件编解码器,并提供了演示固件来说明如何在使用STM32F103xxI2S 时,利用外部的 DAC 来播放 ADPCM 文件。/ C; J- }5 B. \
本应用笔记基于 “AN2739:如何利用具有外部 I2S 音频编解码器的高容量 STM32F103xx 微控制器播放音频文件 。由于关于 SPII2S 和外部 DAC 的部分在 AN2739 中已有说明,此处不再赘述。因此,为了能充分理解本应用笔记,建议您参考 AN27399 l! l  V6 q7 b1 f

" [" O4 ^8 L* e2 m; k. P8 |- B
( S# m1 }7 R9 Z4 w, s) H  M
1 ADPCM 算法
) `( R8 X; |& G2 R9 q# N4 _) [( K- |* Y. V1.1概述' n; z; g; W8 F" l! V
自适应差分脉冲编码调制 , 或简称为 ADPCM, 是波形编码的音频算法 , 它通过以前的信号值预测当前的信号值 , 并且仅发送真实值和预测值的差值。
$ S5 @! W7 n% K$ \5 a0 O在普通的脉冲编码调制 (PCM)中,发送的是真实或实际信号值。
$ \$ b" g  z" ^ADPCM 的优势在于通常预测信号值和真实信号值的差值相当小,这意味着与相应的 PCM 值相比,它可以用更少的位数来表示。: V$ B0 D' k$ |4 O5 F
根据需要的质量和压缩比,差分信号按照 4 (2 位)、 8 3 位)、 16 (4 位)或 32 5 位)水平量化。
6 v; W4 d- B. c. d$ H; n3 p# `" WADPCM 算法的实现方法有很多。它们在量化和预测模式上有所不同。
- H1 b! e  V! z7 _; u在本应用笔记中,我们提供了由交互式多媒体协会(IMA)开发的4位量化算法IMA ADPCM。
# x6 M$ x; }2 N' Z5 o选择 IMA ADPCM 有多种原因:
/ \; q: I( L- `: l$ L它可以应用于 8 kHz 44.10 kHz 之间的不同采样率
, X# ^! O; o0 T* q2 @8 }它能在较低的 CPU 的使用率和较少的内存占用情况下保证音频的播放质量
% l3 Z9 `( u9 D% y; j它具有广泛的实现方式,例如在 Windows Mac 操作系统中
+ Q5 x, W0 l( p1 f! J- g5 D) zIMA 数字音频对焦和技术工作组公布的一份文件对 IMA ADPCM 算法进行了充分说明:在多媒体系统中增强数字音频兼容性的建议措施 版本 3# {8 o" c2 C4 W7 o

7 M+ u2 R" i1 `

7 b2 T- a, n" Z1.2 ADPCM 算法实现
8 w* V; m2 M  {1 X! b0 p本应用笔记提供的 IMA ADPCM 算法用于对具有下述规范的音频文件进行编码:$ h: ^, t, ~' c! {; O
音频格式:PCM
6 D5 W: b9 ~4 t/ s音频采样大小:16 4 W9 G) L4 A) U/ w
通道 : 1 ( 单声道 )
- `8 I0 Z( v8 M- r/ t音频采样率:8 kHz 44.1 kHz( U" b1 l7 p' I0 g; B
每个 16 位 PCM 采样被编码为 4 位 ADPCM 采样,压缩比达到 1/4。
1 ?) a4 n+ ~. I7 X7 Y4 \, v( x1 aIMA ADPCM 算法实现包含两个函数,一个函数编码音频采样,另一个函数解码音频采样。
4 {% T0 X8 B" w1 U% x" wADPCM 固件由两个文件组成:, G& X. D& A: B! R
a) adpcm.c:它包括执行编码和解码的两个 ADPCM 函数的源代码。
2 h# G3 T9 f; y* I9 K$ t* Db) adpcm.h:它是 adpmc.c 的头文件。它应该包含在调用 ADPCM 函数的文件中。
8 W7 N( a$ h1 O$ _. L% n6 n
# c( g* m9 G4 c1 g: U" o; D/ b+ a

' k$ u& F/ Y& ]2 e; J# W1.3 ADPCM 算法函数
. k4 ?/ {; d  [7 `- j1 描述了 ADPCM 函数。
. u, E+ H' _4 d
" u/ C6 x7 y1 r9 p3 g

% _3 z$ [5 y; E$ f Z61$J~~%L(M)1QQK~}1HM`A.png
2 H7 S. M; a2 e0 o; R1 H* B5 L
1 X# K) ~- B, ~- C5 ^* Q) G
1 \: m, W: g+ Y
: ?# w7 b2 B0 E/ h, Z4 b2 G
1.3.1ADPCM_Encode 函数7 p9 {: u  |/ q+ [& a! E/ n8 m) Z6 \
2 描述了 ADPCM_Encode 函数。
3 k3 v; s3 F4 s$ `
. D* A% e* ?( K( u6 V$ z( F+ e0 s

* A; F  J( G# c/ I- D; W: ] `7RG3Q1%G%}{]S7]0(}C36K.png ! w4 C4 c6 e% k( {; j7 H
3 r+ G3 Y0 J9 J( ~1 b- t2 e+ p8 }
ADPCM_Encode 函数返回一个包含 4 位 ADPCM 采样值的字节。软件将 2 个 ADPCM 采样值存入一个字节以便节约内存空间。2 Y( T# w" V8 v) }7 L0 v/ m+ [

% l: d7 S5 b  Y1 h) n/ S

: R0 E4 a3 C  X* E示例:
9 a$ b( x6 K8 O& H2 u, V// 输入:pcm_sample1 和 pcm_sample2 ; 2 个 16 位 PCM 采样值。5 d) Y% A6 [) _+ p1 K& i5 R
// 输出:adpcm_byte ;存入一个字节的两个 4 位 ADPCM 采样值。
+ L9 b! d+ E. |+ Zuint8_t code;( L9 M" B" N2 M
/* 编码第一个 16 位采样值 */8 c& A" v  J6 D7 f
code = ADPCM_Encode(pcm_sample1);
6 V4 l; I# U: _6 ^$ y2 Y! R/* 存储第一个 4 位采样值 */$ T- B6 C- q9 I& R8 L: t' s
adpcm_byte = code;& ?6 }6 b6 u1 d% Z$ U) o* ]
/* 编码第二个 16 位采样值 */
1 o: F: ?  N3 Bcode = ADPCM_Encode(pcm_sample2);) c) F: }2 Z5 }+ S, N+ e, [
/* 存储第二个 4 位采样值 */
  P/ w9 K- K7 K0 a# p6 |6 W% eadpcm_byte |= (code << 4);/* adpcm_byte 包含两个 4 位 ADPCM 采样值 */
0 v' I8 B9 N- g+ Y1 i+ Q
! t$ r1 y+ q% K3 \. s5 m
& O! N% u1 y# [! `# R/ a4 j6 r
1.3.2ADPCM_Decode 函数
' L6 J, u: v/ W. y% i3 描述了 ADPCM_Decode 函数。% p0 z8 C5 I2 a  T/ Z! }0 t( l
; ^( v( }& G' a( z' x
& g" j, n. q/ z
UK~@G$BI`TF`POQ}6M9}OIE.png
. M% p: ~1 G9 J, ~* j2 w5 \( i; D; R8 _" R* `

0 Y) w) W, ^8 p* b- O, H/ i0 j- d( [  t9 I
ADPCM_Encode函数的输入是一个包含4位ADPCM采样值的字节。在调用ADPCM_Decode函数之前,该软件必须提取出 4 ADPCM 数据并将其存入一个字节。6 S5 P. K7 B9 ~, A. [+ C
: `* R: Y% m+ Z4 ?) w. T8 I
* n7 B, f' A/ v# Q' d
示例:) G6 m5 j7 a* t% p, R
// 输入:adpcm_byte ;存入一个字节的两个 4 位 ADPCM 采样值。5 A/ A8 @' |9 Q# Z* z, N- i: O
// 输出:pcm_sample1 和 pcm_sample2 ; 2 个 16 位 PCM 采样值。! u* u4 z' F5 G
uint8_t code;; U8 F, o0 n, R& i/ u
/* 提取第一个 ADPCM4 位采样值 */: H1 A' V7 h6 D6 |: M
code = (adpcm_byte & 0x0F);
8 r! z& R% m& P/* 解码第一个 ADPCM 采样值 */% v4 p# O6 p. n' [) c# R
pcm_sample1 = ADPCM_Decode(code);
2 X8 ]$ f/ N8 P0 |* ?6 c% q/* 提取第二个 ADPCM 采样值 */
+ O; y" @) T3 ]8 @code = (adpcm_byte >> 4);, i. M, z7 W0 `, t0 u" s" k  c
/* 解码第二个 ADPCM 采样值 */$ T# u2 z: }. O1 y  _9 {# z
pcm_sample2 = ADPCM_Decode(code);
/ b2 H' M0 i4 w9 v
% A! M, r( X# l4 w: M" y7 t2实现示例; Y7 h( }9 ]& X. t+ M4 q& S$ v0 m
2.1说明" A1 O# A& s0 H' f3 X2 [* Y
可以在 STM3210E-EVAL 板上运行提供的例子。它是一个典型的音频应用,包括:
6 M! f& N3 ]5 J5 y; _6 g/ W1 z2 }首先用 PC 软件将一个 PCM 文件编码为 ADPCM 格式(这个软件名为 muse.exe,是由ST 开发的。它实现了与 STM32F103xx 增强型系列产品相同的 ADPCM 算法编码器。5 u. X. Z( V8 p( b4 W3 \
muse.exe 在本应用笔记附带的压缩软件包中:请参考 2.2 章节了解如何应用这个工具。)
+ ?# ^6 x6 O& j然后将编码文件加载到 Flash' Q; M" W: _" b( c* N% x8 ?4 C
使用高容量 STM32F103xx 微控制器解码文件,驱动 DAC 播放音频。
0 F  y' }# }" N在 STM3210E-EVAL 板上,128 兆位 NOR Flash 存储 ADPCM 文件和 STM32F103xx 器件上运行的固件解码器。然后用它解码该数据流,并且通过应用 I2S 外部 DAC 回放音频采样。
  l  B" c: y) [* H硬件环境基于应用笔记 “AN2739:如何使用高密度 STM32F103xx 微控制器与外部 I2S 音频编解码器播放音频文件 ,请参考该应用笔记以获得更多信息。' O5 d. b% F! e4 k& N7 ?: O9 x
要运行这个演示示例,需要进行三个步骤:
% m9 @& W8 Q/ F2 Q* K" {. o2 V  h2 F1. 生成 ADPCM 文件4 D. _: p% ?" g# {/ A
2. 将 ADPCM 文件载入 NOR Flash
1 f& @% z6 j, y3 c, `2 R8 h3. 播放 ADPCM 文件
9 E1 v8 [- ]; D- S& X! P: c$ K) X

- m1 A( ~2 O9 a- p

: A) Y' ?+ E' P/ M) c! |完整版请查看:附件( h. V$ y" F+ ~9 M# \
. b% T+ S$ e2 _& A. \6 y

' U/ h6 O0 J6 J5 F1 V6 O4 G2 |/ Z0 ?  c9 f9 Y+ k' U

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