打印
[STM32F1]

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

[复制链接]
589|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
jcky001|  楼主 | 2022-12-6 09:53 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
前言本应用笔记描述了 ADPCM 音频固件编解码器,并提供了演示固件来说明如何在使用STM32F103xxI2S 时,利用外部的 DAC 来播放 ADPCM 文件。
本应用笔记基于 “AN2739:如何利用具有外部 I2S 音频编解码器的高容量 STM32F103xx 微控制器播放音频文件 ”。由于关于 SPI、I2S 和外部 DAC 的部分在 AN2739 中已有说明,此处不再赘述。因此,为了能充分理解本应用笔记,建议您参考 AN2739。


1 ADPCM 算法
1.1 概述
自适应差分脉冲编码调制 , 或简称为 ADPCM, 是波形编码的音频算法 , 它通过以前的信号值预测当前的信号值 , 并且仅发送真实值和预测值的差值。
在普通的脉冲编码调制 (PCM)中,发送的是真实或实际信号值。
ADPCM 的优势在于通常预测信号值和真实信号值的差值相当小,这意味着与相应的 PCM 值相比,它可以用更少的位数来表示。
根据需要的质量和压缩比,差分信号按照 4 (2 位)、 8 (3 位)、 16 (4 位)或 32 (5 位)水平量化。
ADPCM 算法的实现方法有很多。它们在量化和预测模式上有所不同。
在本应用笔记中,我们提供了由交互式多媒体协会(IMA)开发的4位量化算法IMA ADPCM。
选择 IMA ADPCM 有多种原因:
● 它可以应用于 8 kHz 到 44.10 kHz 之间的不同采样率
● 它能在较低的 CPU 的使用率和较少的内存占用情况下保证音频的播放质量
● 它具有广泛的实现方式,例如在 Windows 和 Mac 操作系统中
IMA 数字音频对焦和技术工作组公布的一份文件对 IMA ADPCM 算法进行了充分说明:“ 在多媒体系统中增强数字音频兼容性的建议措施 ” 版本 3。

1.2 ADPCM 算法实现
本应用笔记提供的 IMA ADPCM 算法用于对具有下述规范的音频文件进行编码:
● 音频格式:PCM
● 音频采样大小:16 位
● 通道 : 1 ( 单声道 )
● 音频采样率:8 kHz 到 44.1 kHz
每个 16 位 PCM 采样被编码为 4 位 ADPCM 采样,压缩比达到 1/4。
IMA ADPCM 算法实现包含两个函数,一个函数编码音频采样,另一个函数解码音频采样。
ADPCM 固件由两个文件组成:
a) adpcm.c:它包括执行编码和解码的两个 ADPCM 函数的源代码。
b) adpcm.h:它是 adpmc.c 的头文件。它应该包含在调用 ADPCM 函数的文件中。


1.3 ADPCM 算法函数
表 1 描述了 ADPCM 函数。



1.3.1 ADPCM_Encode 函数
表 2 描述了 ADPCM_Encode 函数。




ADPCM_Encode 函数返回一个包含 4 位 ADPCM 采样值的字节。软件将 2 个 ADPCM 采样
值存入一个字节以便节约内存空间。

示例:
// 输入:pcm_sample1 和 pcm_sample2 ; 2 个 16 位 PCM 采样值。
// 输出:adpcm_byte ;存入一个字节的两个 4 位 ADPCM 采样值。
uint8_t code;
/* 编码第一个 16 位采样值 */
code = ADPCM_Encode(pcm_sample1);
/* 存储第一个 4 位采样值 */
adpcm_byte = code;
/* 编码第二个 16 位采样值 */
code = ADPCM_Encode(pcm_sample2);
/* 存储第二个 4 位采样值 */
adpcm_byte |= (code << 4);/* adpcm_byte 包含两个 4 位 ADPCM 采样值 */

1.3.2 ADPCM_Decode 函数
表 3 描述了 ADPCM_Decode 函数。




ADPCM_Encode函数的输入是一个包含4位ADPCM采样值的字节。在调用ADPCM_Decode函数之前,该软件必须提取出 4 位 ADPCM 数据并将其存入一个字节。

示例:

// 输入:adpcm_byte ;存入一个字节的两个 4 位 ADPCM 采样值。
// 输出:pcm_sample1 和 pcm_sample2 ; 2 个 16 位 PCM 采样值。
uint8_t code;
/* 提取第一个 ADPCM4 位采样值 */
code = (adpcm_byte & 0x0F);
/* 解码第一个 ADPCM 采样值 */
pcm_sample1 = ADPCM_Decode(code);
/* 提取第二个 ADPCM 采样值 */
code = (adpcm_byte >> 4);
/* 解码第二个 ADPCM 采样值 */
pcm_sample2 = ADPCM_Decode(code);
函数名称 ADPCM_Decode
原型 int16_t ADPCM_Decode(uint8_t code);


2 实现示例

2.1 说明
可以在 STM3210E-EVAL 板上运行提供的例子。它是一个典型的音频应用,包括:
● 首先用 PC 软件将一个 PCM 文件编码为 ADPCM 格式(这个软件名为 muse.exe,是由ST 开发的。它实现了与 STM32F103xx 增强型系列产品相同的 ADPCM 算法编码器。muse.exe 在本应用笔记附带的压缩软件包中:请参考 第 2.2 章节了解如何应用这个工具。)
● 然后将编码文件加载到 Flash
● 使用高容量 STM32F103xx 微控制器解码文件,驱动 DAC 播放音频。
在 STM3210E-EVAL 板上,128 兆位 NOR Flash 存储 ADPCM 文件和 STM32F103xx 器件上运行的固件解码器。然后用它解码该数据流,并且通过应用 I2S 外部 DAC 回放音频采样。硬件环境基于应用笔记 “AN2739:如何使用高密度 STM32F103xx 微控制器与外部 I2S 音频
编解码器播放音频文件 ”,请参考该应用笔记以获得更多信息。
要运行这个演示示例,需要进行三个步骤:
1. 生成 ADPCM 文件
2. 将 ADPCM 文件载入 NOR Flash
3. 播放 ADPCM 文件

使用特权

评论回复
沙发
周半梅| | 2024-10-16 07:03 | 只看该作者

需要在做项目的过程中经历磨难

使用特权

评论回复
板凳
Pulitzer| | 2024-10-16 08:06 | 只看该作者

硬件设计和软件设计本来就是鱼和熊掌的关系,两者不可兼得

使用特权

评论回复
地板
童雨竹| | 2024-10-16 10:02 | 只看该作者

结构化模块化的程序设计的思想,使最基本的要求

使用特权

评论回复
5
Wordsworth| | 2024-10-16 11:05 | 只看该作者

确定好硬件原理图,硬件布线,最后才是软件的开发

使用特权

评论回复
6
Clyde011| | 2024-10-16 12:08 | 只看该作者

没有发现有哪本是介绍设计思想的

使用特权

评论回复
7
公羊子丹| | 2024-10-16 13:01 | 只看该作者

写程序不难,但是程序怎么样才能写的好,写的快,那是需要点经验积累的

使用特权

评论回复
8
万图| | 2024-10-16 14:04 | 只看该作者

在实际的项目应用当中,单片机引脚的复用相当厉害

使用特权

评论回复
9
Uriah| | 2024-10-16 15:07 | 只看该作者

但是如果不懂程序设计的思想的话,会给你做项目的过程中带来很多很多的困惑。

使用特权

评论回复
10
帛灿灿| | 2024-10-16 17:03 | 只看该作者

时间片轮的设计思想

使用特权

评论回复
11
Bblythe| | 2024-10-16 18:06 | 只看该作者

事实上很多做项目的工程师本身自己也会在用

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1505

主题

4522

帖子

6

粉丝