更新时间:2023-12-15 00:22
脉冲密度调制(Pulse Density Modulation),简称PDM,是一种使用二进制数0,1表示模拟信号的调制方式。在PDM信号中,模拟信号的幅值使用输出脉冲对应区域的密度表示。PWM波是PDM波转换频率固定的一种特例,对于一个使用8位长表示的电压信号而言,峰值的1/2处会高低电平各持续一半,即128个时钟周期。在PDM信号中,会在1,0之间每个时钟周期都切换。两种波形的平均值都是50%,但是PDM波切换的更加频繁。对于100%和0的电平信号,两种方式的输出相同。
在实际输出的一位数据流中,只存在“1”和“0”,1的密度越大,代表该区域对应的模拟信号幅值越大,反之,0的密度越大,代表该区域的模拟信号幅值越小。1和0连续转换的区域对应中间幅值。使用低通滤波器将PDM信号滤波后,可以恢复连续的模拟信号波形。
PDM数据流是通过sigma-delta调制实现从模拟到离散的编码,在此过程中会使用一位量化器,以使输出非1即0。1和0各自对应波形上升或下降的趋势。在现实世界中,很少有单方向变化的信号,总会存在量化误差,即1、0所表示的信号与实际模拟信号对应的差值,这个误差在sigma-delta电路中,通过回路反馈回来。因此,误差通过反馈,又能影响下一次的量化输出和误差,起到了平滑的作用。
把PDM信号解码为模拟信号非常简单:只需要把PDM信号通过一个低通滤波器即可,该方法可行的原因是,低通滤波器能很好地起到平均波形信号的作用。由于原信号的平均幅值被各个时刻的脉冲1、0的密度衡量,因此低通滤波器是解码过程唯一所需的步骤。
matlab仿真实现
仿真如图1所示,采样时间为0.001s,输入信号为正弦波,频率为2*pi,根据Y(z)=E(z)+[X(z)-Y(z)*z^-1]*(1/(1-z^-1)),转换为差分方程,得到y(n)=x(n)+e(n)-e(n-1)
得到的波形为:
matlab代码实现
%Sample demo for Delta modulation
sample_num=200;
n_sample=5;
x_src=0:2*pi/sample_num:n_sample*2*pi;
y_src=sin(x_src);
%y_src(i)与qe(i+1)对应,y_pdm(i)
% Delta modulation-demodulation
%len 表示采样点数
len = length(y_src);
qe(1) = 0;
for i=1:len
if(y_src(i)>=qe(i))
y_pdm(i)=1;
else
y_pdm(i)=-1;
end
qe(i+1)=y_pdm(i)-y_src(i)+qe(i);
end
subplot(2,1,1);plot(y_src,'r');
grid on
title('(red:input signal, green:sin PDM wave)');
ylabel('amplitude');
axis([0 n_sample*sample_num -1 1])
subplot(2,1,2);plot(y_pdm,'g');
grid on
ylabel('amplitude');
axis([0 n_sample*sample_num -1 1])
仿真波形:
PDM是索尼公司SACD所使用的编码方式,名为 Direct Stream Digital。
一些系统会把立体音频的PDM信号转换为串行数据,主时钟的上升沿代表左声道的一位数据,下降沿代表右声道的一位数据。