网站客服:zx81024163 |

手机单声道转换器 单片机开发——PDM

2024-09-01 10:04:41发布    浏览377次    信息编号:163886

友情提醒:凡是以各种理由向你收取费用,均有骗子嫌疑,请提高警惕,不要轻易支付。

手机单声道转换器 单片机开发——PDM

点开音乐,边听边看☝(今天推荐的是《秋日冲泡》)

PDM 代表脉冲密度调制。但是,更好的缩写应该是“1 位过采样音频”,因为它只不过是一种高采样率、单比特数字系统。如果说有什么优势的话,那就是采样率是音频 CD 的几倍,并且使用合适的方法将字长从 16 位减少到 1 位,这将作为 PDM 系统的基础。大多数现代数字音频系统使用多位 PCM(脉冲编码调制)来表示信号。PCM 具有简化处理的优势。这允许对音频流执行混音、滤波和均衡等信号处理操作。

PDM 仅使用 1 位来传输音频,其概念和实现比 PCM 更简单。它通常用于手机中,将音频从麦克风传输到信号处理器。从理论上讲,PDM 非常适合这项任务,因为它以较低的成本带来了数字技术的优势,例如低噪声和不受干扰信号的影响。

本文档将介绍 PDM 的基础知识:如何生成、传输和处理 PDM。

快速词汇表

DAC(数模转换器):用于将数字表示的信号转换为模拟量的设备。

LSB(最低有效位):数字量的最小变化。位是二进制数字量。

MSB(最高有效位):数字量中值最高的位。实际上,它代表定点有符号数中的符号位。

PCM(脉冲编码调制):使用一系列多位字来表示采样信号的系统。此技术用于音频 CD。

PDM(脉冲密度调制):使用单个位来表示采样信号的系统。

速率:对信号进行采样以产生时间不连续表示的速率。

:用于表示样本的位数。

:使用给定字长来表征随机数据样本的过程。

:是在量化之前添加的类噪声信号,以提高性能。

:用于减轻数据量化有害影响的过程,通常通过添加抖动来减轻。

噪声:由于系统内的信号内容而导致本底噪声发生不受欢迎的变化。

相控阵相机

在讨论 PDM 之前,我们先来回顾一下传统的多位数字音频 PCM。PCM 的音频信号由一系列样本值表示,每个样本值都有固定的位数。有两个因素决定系统性能:

具体来说,带宽是采样频率的一半,信噪比为 (6.02N+1.76)dB(6.02+1.76),其中 N 是字长中的位数。

原始 16 位系统的理论 SNR 为 。实际上,抖动用于线性化系统并消除噪声调制;这会使 SNR 降低 4dB4。使用前面的公式,未抖动的 1 位系统的 SNR 为 8dB8,这对于任何实际的音频工作来说都是不可接受的。同时,最佳抖动需要 2 个最低有效位才能工作;由于 1 位系统总共只有 1 个最低有效位,并且它用于音频,因此没有抖动的空间。

1 位渲染乍看起来似乎不可行,因为系统无法正确抖动。解决方案在于了解噪声整形和过采样。

噪声整形

考虑一个典型的PCM信号,比如用24位表示的正弦波波形,这个波形在字长为1位的系统中该如何表示,而且在这样的系统有严重的噪声和失真问题的情况下,又该如何表示呢?

一种方法是丢弃除最高有效位之外的所有位,有效地将信号阈值设定在零附近。这会将正弦波转换为在零交叉处切换的方波。这会带来大量失真;实际上超过 40%。失真的原因是系统没有抖动。量化总是会引入误差,但在抖动系统中,误差会以与信号无关的白噪声基底形式出现。在无抖动或抖动不足的系统中,许多误差都以失真的形式出现。

因此,答案不是保留最高有效位,而是将其减少到 1 位。但是,我们都熟悉将字长减少到 1 位就可以正常工作的例子。这就是半色调处理,自报纸发明以来,它一直是印刷媒体上再现图像的基本原理。

在半色调处理中,连续色调图像(例如灰度图)被转换成一系列黑白点。换句话说,字长缩短为 1 位,该位的状态对应于黑点或白点。这不是通过简单的阈值处理来实现的,而是通过将阈值处理产生的误差分散到相邻的未阈值化的点上来实现的。这个过程称为误差扩散。(还有许多其他方法可用于创建半色调,我们在此不再赘述。)误差扩散对图像质量的影响是巨大的,如下所示:

为什么扩散阈值产生的误差会大大改善图像的视觉质量?答案是误差扩散有两个功能。首先,它将简单阈值造成的失真转换为更接近噪声基底的东西。其次,它塑造噪声基底,以增加高频空间中的噪声为代价降低低频空间中的噪声。此外,高图像频率被人眼的原始分辨率过滤,因此一旦这些点足够小(或图像足够远),大多数高频噪声几乎是不可见的。

结果是阈值产生的严重失真变成了良性的高通噪声基底。良性的意思是效果是可以接受的,尽管由于系统没有抖动,它不是真正的噪声基底。噪声仍然与信号交织在一起,呈现出音调行为和其他视觉伪影。不过,视觉效果很好。

半色调系统是噪声整形的一个例子。减少字长引起的噪声被整形,因此不会被调低,但高通情况并非如此。一般来说,噪声整形系统的字长是任意长度,不需要将其噪声传递函数通过高通滤波器。然而,对于绝大多数此类系统(包括 PDM 系统),都有一个 1 位输出和一个高通噪声传递函数。

过采样

减少字长会引入巨大的噪声(1 位系统中的噪声大约高于 16 位系统中的噪声)。噪声整形会将噪声分散到很宽的带宽上,但不会降低整体噪声水平。在图像应用中,大多数图像内容都是低频,将噪声推到高频(可能会掩盖高频)不是问题。然而,在音频领域,中频和高频非常重要,而且非常清晰。如果将字长缩短到 1 位,即使使用噪声整形,也几乎不可能获得可接受的结果。结果是高频噪声很容易被听到。

问题的答案是使用更高的采样率。这会增加系统的带宽,从而产生高于可听范围的新频谱。因此,可以使用噪声整形将噪声推入频谱的更高位置。有益的是,可以创建更多空间来倾倒噪声。而且由于频谱高于可听范围,因此噪声是听不见的。

可以通过两种方式实现更高的采样率:

现在让我们更详细地了解这两种方法。

PDM 麦克风

PDM麦克风又称数字麦克风,包括以下部分:

来自麦克风元件的模拟信号首先被放大,然后在 PDM 调制器中以高速率采样和量化。调制器包括量化操作和噪声整形;输出是高速率的单个比特。噪声整形确保音频带内的相关噪声相对较低,尽管音频带以上的噪声相对较高。接口逻辑可以接收主时钟并传输采样的比特流。

麦克风所连接的设备为 PDM 麦克风提供主时钟。时钟频率定义了系统的采样频率,从而定义了数据线上传输的比特率。虽然没有明确的标准,但典型的过采样率是 64。因此,为了获得 24KHz 的带宽(相比之下,采样频率为 48KHz 的 PCM 系统),主时钟频率需要为 3。

数据线上的 1 位数据在主时钟的上升沿或下降沿都被视为有效。大多数 PDM 麦克风支持双通道操作,其中一个麦克风在主时钟的上升沿上的数据线上有效,而另一个麦克风在下降沿上的数据有效。在非有效沿,数据输出为高阻抗。两个麦克风的数据线可以简单地连接在一起。PDM 接收器能够分离两个比特流。

DAC 和 PCM-PDM 转换器

在许多可以将 PCM 转换为 PDM 的商用 DAC 和系统中,该过程与 PDM 麦克风的过程略有不同。信号已以低频采样,且为 PCM 格式。为了获得噪声整形可以有效的高采样频率,必须先对信号进行插值。然后在噪声整形器中将其字长缩减为 1 位。

插值是一种数字滤波操作,可在有效样本之间生成额外样本,以提高有效采样频率。对于 PDM 应用,过采样率通常为 64;这意味着每个输入样本之间有 63 个新样本。

PDM调制器

PDM 调制器(在 PDM 麦克风中)或噪声整形器(在 PCM 到 PCM 转换器中)能够在通带中产生噪声极低的 1 位信号。调制器的复杂性由其阶数表示。调制器的阶数等于它所包含的插值(聚合节点)数量;一般而言,阶数越高,从通带到阻带的噪声整形越积极,噪声性能越好。但是,高阶调制器的生产和设计更为复杂;它们在某些工作条件下会变得更不稳定;并且在过载之前的最大输入电平较低。由于没有行业标准,典型 PDM 麦克风的调制器为 4 阶。这在噪声性能和复杂性之间提供了良好的折衷。

下面是给定正弦波输入信号的 PDM 调制器输出的时域和频域视图。时域输出以高速率在两个级别之间切换。在频域中,通带在 x 轴上从 00 延伸到 0.5fs0.5。在此之上是过采样产生的频谱空间。通带上方的噪声急剧上升显而易见。还可以看到非常少量的第三谐波失真(峰值接近 0.06fs0.06)。

传输和处理 PDM 信号

PDM 位流是一种逻辑电平信号,其典型开关频率约为 3MHz,并且具有快速边沿跳变。因此,需要像任何其他快速信号(如 SPDIF 或模拟视频)一样对待它。使用高质量同轴电缆并正确终止信号非常重要。

如果要听到信号,必须将其转换为模拟格式。如果需要通过测试设备进行处理或分析,则需要将其转换为 PCM。PDM 信号也可用于执行这些操作。

从理论上讲,将 PDM 信号转换为模拟信号非常简单。1 位信号已经包含频谱低频部分的音频信号。要恢复它,只需使用低通滤波器。实际上,信号的快速切换边缘需要仔细设计模拟滤波器级,但通过这种方式可以恢复非常高质量的模拟信号。

将 PDM 转换为 PCM 更为复杂。需要将采样频率降低一个过采样因子。这是通过称为抽取的数字滤波过程完成的。抽取是插值的对应部分:从信号中移除样本以降低采样频率。重要的是,超过音频带宽的 1 位噪声不会带入音频带。抽取滤波器旨在滤除这种噪声,使基带音频信号保持完整。抽取器的输出是基带速率的 PCM 音频流(无过采样)。通常在滤波期间,字长从 1 位增加到大约 20 个有效位。

表现

1 位系统已经非常成熟。尽管 1 位系统存在其固有问题,尤其是无法添加足够的抖动来完全线性化系统并消除噪声调制,但设计具有出色音频性能的系统仍然是可能的。

PDM 调制器通常是专有的;因此,它们的性能取决于设计。APx PDM 接口选项使用的调制器是 4 阶调制器,加上具有出色图像/混叠抑制能力的 6 阶插值/抽取滤波器。由此产生的系统规格如下:

所有高阶 PDM 调制器的最大输入电平均低于满量程。超过此电平会导致调制器过载,从而导致噪声性能下降。APx 用户界面将指示调制器何时过载。

系统的 THD+N 性能由调制器的本地噪声决定。此处存在较小的三次谐波失真。这是因为系统没有抖动。

综上所述

PDM 是一种经济高效的方式,可通过单个时钟/数据对以单通道和/或双通道数字方式传输音频。尽管 1 位格式有其固有的局限性,但通过精心设计可以实现非常高的音频性能。APx PDM 接口选项可以生成和分析 PDM 信号,大大简化了 PDM 信号链各个方面的设计和故障排除。

PDM 使用示例

1、PDM(Pulse)是一种用数字信号来表示模拟信号的调制方式。PDM只输出1位数据,要么是0,要么是1。

2、PDM将数字麦克风采样的数据放在PCM数据寄存器的0-15位,PDM采样的实时数据可以通过DMA或者PDM中断来采集。

3、本测试用例使用DMA Ping-Pong模式传输PDM数据流,并通过DMA基本模式将PDM数据打印到串口助手。

1.串口配置

1. 包含文件和头文件。

2、定义UART句柄并调用初始化函数,当通过DMA向串口助手传输数据时,需要在初始化UART时同时配置UART使用的DMA对象和DMA通道。

3、默认使用UART1,PB00、PB01作为通讯串口,其中PB00为模块的TX,PB01为模块的RX。uart口默认配置参数为:波特率、无校验、8个数据位、1个停止位。

#include "io_config.h"
#include "lsuart.h"
static UART_HandleTypeDef UART_PDM_Config;
static void ls_pdm_uart_init(void)
{
uart1_io_init(PB00, PB01); //uart io 初始化函数
UART_PDM_Config.UARTX = UART1;
UART_PDM_Config.DMAC_Instance = &dmac1_inst; //uart选择的dma对象
UART_PDM_Config.Tx_Env.DMA.DMA_Channel = 3; //uart选择的dma通道号
UART_PDM_Config.Init.BaudRate = UART_BAUDRATE_500000;
UART_PDM_Config.Init.MSBEN = 0;
UART_PDM_Config.Init.Parity = UART_NOPARITY;
UART_PDM_Config.Init.StopBits = UART_STOPBITS1;
UART_PDM_Config.Init.WordLength = UART_BYTESIZE8;
HAL_UART_Init(&UART_PDM_Config);
}

2.PDM 配置

1. 包含 lspdm 头文件。注意:该文件在 UART 配置期间已包含。

2.定义PDM句柄并调用初始化函数。

3、使用GPIO复用模式,将PB10复用为数字麦克风的CLOCK引脚,PB09复用为数字麦克风的DATA引脚。

4.将PDM句柄中的实例对象映射到PDM寄存器的基地址,并为PDM寄存器赋值。

5、设置PDM时钟速率为1,采样率为16KHZ,延迟捕获为30个周期,数据增益为5,使用单声道模式。

6、选择PDM的DMA对象,选择PDM的DMA通道,配置两个数组,以DMA乒乓模式交替存储大、小PDM数据。

#include "lspdm.h"
#define PDM_CLK_KHZ 1024 //默认使用1.024MHZ的时钟速率
#define PDM_SAMPLE_RATE_HZ 16000 //默认使用16KHZ采样
#define FRAME_BUF_SIZE 256
PDM_HandleTypeDef pdm;//pdm句柄定义
DMA_RAM_ATTR uint16_t Buf0[FRAME_BUF_SIZE]; //dma乒乓模式下交替接受pdm数据buf0的定义
DMA_RAM_ATTR uint16_t Buf1[FRAME_BUF_SIZE]; //dma乒乓模式下交替接受pdm数据buf1的定义
static struct PDM_PingPong_Bufptr pdm_data_receive;
void pdm_init()
{
pdm_clk_io_init(PB10);
pdm_data0_io_init(PB09);
pdm.Instance = LSPDM; //LSPDM表示pdm外设的基址,在lspdm.h中已经定义
PDM_Init_TypeDef Init =
{
.fir = PDM_FIR_COEF_16KHZ,
.cfg = {
.clk_ratio = PDM_CLK_RATIO(PDM_CLK_KHZ), //pdm时钟配置
.sample_rate = PDM_SAMPLE_RATE(PDM_CLK_KHZ,PDM_SAMPLE_RATE_HZ), //pdm采样速率配置
.cap_delay = 30, //延时捕捉
.data_gain = 5, //数据增益
},
.mode = PDM_MODE_Mono, //单声道模式
};
pdm.DMAC_Instance = &dmac1_inst; //pdm选择的dma对象
pdm.Env.DMA.Channel[0] = 1; //dma通道选择
pdm_data_receive.Bufptr[0] = Buf0;
pdm_data_receive.Bufptr[1] = Buf1;
HAL_PDM_Init(&pdm,&Init);
}

3.其他配置

DMA 对象初始化。

1. 包含.h 头文件。

2.调用该函数。

3.调用该函数。

#include "lsdmac.h"
DEF_DMA_CONTROLLER(dmac1_inst,DMAC1);
DMA_CONTROLLER_INIT(dmac1_inst); //dma对象初始化

4.PDM配置步骤及流程介绍

1. DMA对象初始化、调用及功能

2. 使用的UART初始化及DMA通道配置、调用函数

3. PDM初始化及DMA通道配置、调用及所用函数

4. DMA乒乓模式配置、调用函数

5.开始启用PDM并调用该函数

6.等待DMA以乒乓方式交替接收两个pdm数组数据,看是否接收到全尺寸数据,接收完成后会在DMA中断处理函数中调用重新定义的back函数

7.back函数中flag用来决定将哪个自定义数组数据(buf0或者buf1)发送给串口助手并调用A函数

8、当通过串口发送用户自定义数组数据时,会调用用户自定义的发送完成回调函数:

5、PDM通过DMA和UART发送、接收数据的操作如下:

1.将编译好的程序下载到需要测试的模块中。

2、将芯片的uart接口(程序中设置的IO为PB00(TX)PB01(RX))和串口转接板的RX/TX连接起来,同时两者的地线要连接在一起。

3、将DMIC的时钟引脚连接到PB10,引脚连接到PB09,LR引脚连接到vdd或地,GND引脚连接到地,VDD引脚连接到电源vdd引脚。

4、在电脑上打开串口调试工具,设置波特率为:数据位:8 停止位:1 奇偶校验位:无。

5、打开串口,在串口助手上就可以看到语音数据显示,预期结果如下图所示。


PCM作为一种将模拟量转换为数字量的方法,采用等间隔采样方式,将每次采样的模拟分量的幅度表示为N位数字分量(N=量化深度)。因此,PCM方法中每次采样的结果都是N位字长的数据。PDM采用时钟采样调制模拟分量,采样率远高于PCM采样率,并且只有1位输出,要么是0,要么是1。因此,用PDM表示的数字音频也被称为1位音频。与PDM的一连串0和1相比,PCM的量化结果更加直观和简单。

在使用 PDM 作为模数转换方法的应用的接收端,需要一个抽取滤波器 ( ) 将密集的 0 和 1 表示的密度分量转换为幅度分量,而 PCM 获得的数字分量已经与幅度相关。图 20 显示了通过 PDM 数字化的正弦波。

图 20. PDM 表示的正弦波

PCM方式的逻辑比较简单,但是需要三条信号线:数据时钟、采样时钟、数据信号;PDM方式的逻辑相对复杂,但是只需要两条信号线,即时钟和数据。PDM在手机、平板等对空间限制比较严格的地方有着广泛的应用。在数字麦克风领域,应用最广泛的就是PDM接口,其次是I2S接口。PDM格式的音频信号可以走线在噪声干扰较强的电路附近,比如LCD屏(相当于说数字信号比模拟信号抗干扰能力强,PCM也有这个优势)。

通过PDM接口,只需要两根信号线就可以传输双声道数据。图21给出了两个PDM接口发送设备与同一个接收设备的连接,例如分别用1/2作为左右声道的麦克风,这样就可以将采集到的双声道数据传送到接收设备。主设备(本例中为接收设备)为两个从设备提供时钟,分别在时钟的上升沿和下降沿触发选择1/2作为数据输入。图22给出了Maxim的Class-D类放大器对PDM接口时序的要求,可以看出它在上升沿对左声道数据进行采样,在下降沿对右声道数据进行采样。

图 21. PDM 连接图(2 个发射器 + 1 个接收器)

图 22. PDM 时序图

基于PDM的架构与I2S和TDM的区别在于,抽取滤波器( )不在发送设备中,而是在接收设备内部。源输出是原始的高采样率( )调制数据,例如Sigma-Delta调制器的输出,而不是像I2S那样的抽取数据(I2S是 ,因此它处于一个易于操作和 的音频速率)。基于PDM接口的应用降低了发送设备的复杂性,而且由于抽取滤波器集成在作为接收设备的CODEC内部,因此系统的整体复杂性大大降低。对于数字麦克风,可以通过使用更复杂的硅工艺制造CODEC或处理器,而不是使用传统麦克风所用的工艺,来实现更高效的抽取滤波器。

相关音频信号文章:

提醒:请联系我时一定说明是从星空网上看到的!