摘要:首先介绍增量调制内容,然后引出自适应增量调试的过程。结合相关的MATLAB程序对相关内容深入理解。
增量调制是由PCM发展过来的模拟信号数字化的一种编码方式,它是PCM的一种特例。增量调制编码基本原理是指用1bit编码,这1bit不是表示信号抽样值的大小,而是表示抽样幅值的增量特性,即采用一位二进制码“1”或者“0”来表示信号抽样时刻的值相对于前一个抽样时刻的值是增大还是减小,增大则输出“1”码,减小则输出“0”码。输出的“1”,“0”只是表示信号相对于前一个时刻的增减,不是表示信号的绝对值。
在增量调制系统中发送端调制后的二进制代码1和0只表示信号这个抽样时刻相对于前一个抽样时刻是增加(1码)还是减少(0码)。接收端译码每收到一个1码,译码器的输出相对于前一个时刻的值上升一个量化阶,而收到一个0码,译码器的输出相对于前一个时刻的值下降一个量化阶。
增量调制(DM)是DPCM的一种简化形式。在增量调制下,采用1bit量化器,即用1位二进制码传输采样值的增量信息,预测滤波器器是一个单位延迟器,延迟一个采样时间间隔。预测滤波器的分子系数向量是[0 1],分母系数为1。当前采样值与预测滤波器输出的前一个值相比较,如果其差值大于零,则发送1码,如果小于零则发送0码。
增量调制系统框图如下所示,其中量化器和编码器是一个零值比较器,根据输入极性输出0或者1。
设输入信号为:x(t)=sin(2*pai*50t)+0.5*sin(2*pai*150t)
增量调制的采样间隔为1ms,量化阶距δ=0.4,单位延迟器的初始值为0。建立仿真模型并求出前20个采样点。
根据图一建立数学关系,编程中采用循环结构来模拟仿真采样时刻向前推进,并建立前后采样时刻采样值的关系。程序如下。
%ch3example13prog1.m
clc;
clear;
%编码端
Ts=1e-3;%采样间隔
t=0:Ts:20*Ts;%时间序列
x=sin(2*pi*50*t)+0.5*sin(2*pi*150*t);%输入信号
delta=0.4;%量化阶距
D(1+length(t))=0;%预测器初始状态
for k=1:length(t)
e(k)=x(k)-D(k);%误差信号
e_q(k)=delta*(2*(e(k)>=0)-1);%量化器输出
D(k+1)=e_q(k)+D(k);%延迟器状态更新
codeout(k)=(e_q(k)>0);%编码输出
end
subplot(3,1,1);
plot(t,x,'-o');
axis([0 20*Ts,-2 2]);
hold on;
subplot(3,1,2);
plot(t,codeout);
axis([0 20*Ts,-2 2]);
%解码端
Dr(1+length(t))=0;%解码端预测器初始状态
for k=1:length(t)
eq(k)=delta*(2*codeout(k)-1);%解码
xr(k)=eq(k)+Dr(k);
Dr(k+1)=xr(k);%延迟器状态更新
end
subplot(3,1,3);
stairs(t,xr);%解码输出
hold on;
subplot(3,1,3);
plot(t,x);%原信号
程序执行如下所示。从图中原信号和解码结果对比来看,在输入信号变化平缓的部分,编码器输出1,0交替码,相应的解码结果以正负阶距交替变化,形成颗粒噪声,或称为空载失真。在输入信号变化过快的部分,解码信号因不能跟上信号的变化而引起斜率过载失真。量化阶距增大,则斜率过载失真减小,但是空载失真增大。如果量化阶距能够根据信号的变化缓急自适应调制,则可以兼顾优化空载失真和斜率过载失真,这就是自适应增量调制的思路。
ΔM与PCM都是采用二进制代码表示模拟信号的编码方式。但是在PCM中,代码表示采样值本身的大小。而在ΔM中,它用一位编码器表示相邻采样值的大小,从而反映出抽样时刻波形的变化趋势,与采样值本身大小无关。
一个语音信号,如果抽样速率很高(远大于奈奎斯特速率),抽样间隔很小,那么相邻采样点之间的幅度变化不会很大,相邻抽样值得相对大小(差值)同样能够反映模拟信号的变化规律。此差值又称为“增量”,其值可正可负。这种用差值编码进行通信的方式就称为“增量调制”(Delta Modulation),缩写为DM或ΔM。
增量脉冲编码(DM)是一种以带宽换取速率的AD变换方式,其中调制信号是差值,由于DM中存在严重弊端,如果输入信号含有较高的高频分量,货值信号幅度较大,都会使得信号变化特性较快,从而预测信号无法正确跟踪输入信号,最终导致信号失真。增量总和调制系统首先是对信号进行一次积分,改变信号特性,使得信号高频分量的幅度降低,之后再进行DM调制。
%ch3example13prog2.m
clc;
clear;
%编码端
Ts=1/8000;%采样间隔
t=0:Ts:40*Ts;%时间序列
x=sin(2*pi*800*t);%输入信号
delta=1;%量化阶距
D(1+length(t))=0;%预测器初始状
D(1)=0;
e_q(1)=0;
e(1)=x(1);
for k=2:length(t)
e(k)=x(k)-e_q(k-1)+e(k-1);%信号积分
e_q(k)=delta*(2*(e(k)>=0)-1);%量化器输出
D(k+1)=e_q(k)+D(k);%延迟器状态更新
codeout(k)=(e_q(k)>0);%编码输出
end
[B,A]=butter(2,0.2,'low');
out=filter(B,A,e_q)
subplot(3,1,1);
plot(t,x);
axis([0 40*Ts,-2 2]);
hold on;
subplot(3,1,2);
stairs(t,e_q);
axis([0 40*Ts,-2 2]);
% %解码端
% Dr(1+length(t))=0;%解码端预测器初始状态
% for k=1:length(t)
% eq(k)=delta*(2*codeout(k)-1);%解码
% xr(k)=eq(k)+Dr(k);
% Dr(k+1)=xr(k);%延迟器状态更新
% end
hold on;
subplot(3,1,3);
stairs(t,out);%解码输出
axis([0 40*Ts,-2 2]);
% hold on;
% subplot(3,1,3);
% plot(t,x);%原信号
上述仿真结果如下图所示。第一行为输入信号,第二行是调制输出信号,量化器输出。第三行是输出波形,输出基本上恢复原貌,但是有一些失真。采样频率较低,而且跟滤波器的特性有关。
加大采样频率为32kHz,调整滤波器的阶数,输出结果如下。其中滤波器阶数修改为5,采样频率修改为Ts=1/32000;%采样间隔
可以看出输出失真减少,信号基本上满足要求。但是系统有延迟。增量调制系统是以牺牲系统的高采样率换取可靠性的一种调试方式。
为了便于对比,将自适应增量调制ADM与线性增量调制LDM(步长delta为固定值)的调制结果放到同一个图像中,并将ADM最小步长固定为1/8,选择LDM的不同步长进行对比。程序如下所示。
%ch3example15prog1.m
clc;
clearvars;
%源代码
A=10;
K=100;%用来调整采样率与信号频率关系的比例系数,初始值100
fm=100;%信号频率
fs=K*fm;%采样频率
dt=1/fs;%采样时间间隔
T=2/fm;%采样时间长度,选两个周期的时间长度
N=T/dt+1;%采样点数
t=0:dt:T;%量化采样区间
%for i=1:N
% y(i)=A*sin(2*pi*(fm+10*cos(60*pi*(i-1)*dt))*(i-1)*dt);%输入函数
%end
y=A*sin(2*pi*fm*t);%产生正弦波形数据
% [adm,ldm]=Delta_Modulation(y,N);%调用增量调制函数
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
input_signal=y;
N_point=N;
% function [adm_out,ldm_out]=Delta_Modulation(input_signal,N_point)
%增量调制函数,同时输出自适应增量调制adm_out与线性增量调制ldm_out结果
step_min=0.125;%自适应增量调制最小步长为1/8
step_ldm=1;%线性增量调制步长恒为1
step_adm=zeros(1,N_point);%自适应增量调制步长序列
mq=zeros(1,N_point);%量化输出
mq(1)=1;
adm_out(1)=0;%初始化序列
for i=2:1:N_point%进行自适应增量调制
mq(i)=sign(input_signal(i-1)-adm_out(i-1));
%将上一时刻的输出与实际输入进行比较,如果输出小于输入,量化为1,则
%该时刻上升一个台阶,否则量化为-1,该时刻下降一个台阶
if step_adm(i-1)<step_min
step_adm(i)=step_min;
else
step_adm(i)=step_adm(i-1)*(1+0.75*(mq(i-1)/mq(i)));
%如果本时刻与前一时刻量化比较结果同号,则步长增加50%,异号则将步长减小50%
end
adm_out(i)=adm_out(i-1)+mq(i)*step_adm(i);
%该时刻的输出在上一时刻输出值得基础上增加或者减少一个现有台阶步长的增量
end
adm_mq=mq;
ldm_out(1)=0;%初始化序列
mq=zeros(1,N_point);%量化输出
mq(1)=1;
for i=2:1:N_point%进行线性增量调制
mq(i)=sign(input_signal(i-1)-ldm_out(i-1));
%将上一时刻的输出与实际输入进行比较,如果输出小于输入,量化为1,则
%下一时刻上升一个台阶,否则量化为-1,下一时刻下降一个台阶
ldm_out(i)=ldm_out(i-1)+mq(i)*step_ldm;
%该时刻的输出在上一时刻输出值得基础上增加或者减少一个现有台阶步长的增量
end
ldm_mq=mq;
% end
adm=adm_out;
ldm=ldm_out;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
var_adm=var(y-adm)%自适应增量调制误差信号的方差-功率
var_ldm=var(y-ldm)%线性增量调制误差信号的方差-功率
figure(1);
subplot(2,1,1);
plot(t,y,'k',t,adm,'b');
title('自适应增量调制前后的信号波形');
axis([0,T,-1.2*A,1.2*A]);
subplot(2,1,2);
plot(t,y,'k',t,ldm,'b');
title('线性增量调制前后的信号波形');
axis([0,T,-1.2*A,1.2*A]);
figure(2);
subplot(2,1,1);
plot(t,adm_mq);
title('自适应增量调制量化输出');
axis([0,T,-2,2]);
subplot(2,1,2);
plot(t,ldm_mq);
title('线性增量调制量化输出');
axis([0,T,-2,2]);
b=fir1(30,0.15);
adm_filter=filter(b,1,adm);
ldm_filter=filter(b,1,ldm);
figure(3);
subplot(2,1,1);
plot(t,y,'r',t,adm_filter,'b');
title('自适应增量调制前后的信号波形');
axis([0,T,-1.2*A,1.2*A]);
subplot(2,1,2);
plot(t,y,'r',t,ldm_filter,'b');
title('线性增量调制信号滤波后波形');
axis([0,T,-1.2*A,1.2*A]);
下述图中为ADM最小步长为1/8,线性LDM步长固定为0.5,可见LDM出现了明显的过载失真,编码速率跟不上信号的变换速率,且产生的信号噪声比ADM要大,这个可以从方差看出来(var_adm=0.5565,var_ldm=0.9232)
下述图中为ADM最小步长为1/8,线性LDM步长固定为0.8,可见LDM出现了明显的过载失真,但没有上图严重,也存在一定的颗粒失真,总体上颗粒噪声也不太大,且产生的信号噪声比ADM略小,这个可以从方差看出来(var_adm=0.5565,var_ldm=0.4069)
下图将LDM的步长固定为1.5,可见LDM已经没有过载失真,而是出现了较为明显的颗粒噪声。颗粒失真是步长过大,输入信号变化比较缓慢的情况下,输出波形在上下阶距跳动,增加了输出波形的噪声。
下图将LDM的步长固定为3,LDM已经出现了明显的颗粒失真,在信号平缓处比较严重,产生的信号噪声比ADM要大得多(var_adm=0.5565,var_ldm=3.1878)
下图是某一调频波进行跟踪的过程,在跟踪过程中,ADM既能较好地跟踪上输入信号变化较快的部分,又能跟上信号平缓的部分减小颗粒噪声,达到一个较好的跟踪效果。而线性LDM步长固定为1,在信号变化快的部分跟踪不上,平缓部分颗粒噪声大。