ADPCM的matlab仿真精讲

更新时间:2024-05-29 14:38:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

ADPCM编码与解码

一、实验原理与目的

目前,脉冲编码调制(PCM)的数字通信系统已经在大容量数字微波、光纤通信系统,以及市话网局间中继传输系统中获得广泛的应用。但是现有的PCM编码必须采用64Kbit/s的A律或μ律对数压扩的方法,才能符合长途电话传输语音的质量指标,其占用频带要比模拟单边带通信系统宽很多倍。这样,对于费用昂贵的长途大容量传输,尤其是对于卫星通信系统,采用PCM数字通信方式时的经济性很难和模拟相比拟。因此,人们一直致力于研究压缩数字化语音占用频带的工作,也就是努力在相同质量指标的条件下,降低数字化语音数码率,以提高数字通信系统的频带利用率。

自适应差值编码调制(ADPCM)是在差值脉冲编码调制(DPCM)基础上逐步发展起来的。它在实现上采用预测技术减少量化编码器输入信号的多余度,将差值信号编码以提高效率、降低编码信号速率,这广泛应用于语音和图像信号数字化。CCITT近几年确定了64Kb/s—32kb/s的变换体制,将标准的PCM码变换为32kb/s的ADPCM码,传输后再恢复为64Kb/s的PCM信号,从而使64Kb/s数字话音压缩速率一倍,使传输信道的容易扩大一倍。

ADPCM中的量化器与预测器均采用自适应方式,即量化器与预测器的参数能根据输入信号的统计特性自适应于最佳参数状态。通常,人们把低于64Kb/s数码率的语音编码方法称为语音压缩编码技术,语音压缩编码方法很多,自适应差值脉冲调制(ADPCM)是语音压缩编码中复杂程度较低的一种方法。它能32kbit/s数码率上达到符合64kbit/s数码率的语音质量要求,也就是符合长途电话的质量要求。

ADPCM是波形编码中非常有效的一种数字编码方式。在ADPCM系统中量化器和预测器均采用自适应方式,即量化器和预测器的参数能随输入信号的统计特性自适应于或接近于最佳的参数状态。与PCM系统相比,ADPCM的量化器和预测器都是根据前面出现的PCM抽样值并对下一个抽样值进行预测,将当前的抽样值和预测值进行求差,然后对差值进行编码。对差值编码需要的位数要比直接对原始语音信号编码所需的位数少,从而达到对信号压缩的目的,在这里编码所包含的信息从原来的原始语音信号变为语音信号之间的变化。

1.1 脉冲编码调制PCM

PCM编码是Pulse Code Modulation的缩写,又叫脉冲编码调制,它是数字通信的编码方式之一,其编码主要过程是将话音、图像等模拟信号每隔一定时间进行取样,使其离散化,同时将抽样值按分层单位四舍五入取整量化,同时将抽样值按一组二进制码来表示抽样脉冲的幅值。PCM编码的最大的优点就是音质好,最大的缺点就是体积大。我们常见的Audio CD就采用了PCM编码,一张光盘的容量只能容纳72分钟的音乐信息。

PCM方式是由取样,量化和编码三个基本环节完成的。音频信号经低通滤波器带限滤波后,由取样,量化,编码三个环节完成PCM调制,实现A/D变化,形成的PCM数字信号再经纠错编码和调制后,录制在记录媒介上。数字音响的记录媒介有激光唱片和盒式磁带等。放音时,从记录媒介上取出的数字信号经解调,纠错等处理后,恢复为PCM数字信号,由D/A变换器和低通滤波器还原成模拟音频信号。将CD―PCM数字信号变换还原成模拟信号的解码器―称为CD---PCM解码器。

脉冲调制就是把一个时间连续,取值连续的模拟信号变换成时间离散,取值离散的数字信号后在信道中传输.脉冲编码调制就是对模拟信号先抽样,再对样值幅度量化,编码的过程.

所谓抽样,就是对模拟信号进行周期性扫描,把时间上连续的信号变成时间上离散的信号.该模拟信号经过抽样后还应当包含原信号中所有信息,也就是说能无失真的恢复原模拟信号.它的抽样速率的下限是由抽样定理确定的.在该实验中,抽样速率采用8Kbit/s.

所谓量化,就是把经过抽样得到的瞬时值将其幅度离散,即用一组规定的电平,把瞬时抽样值用最接近的电平值来表示.

一个模拟信号经过抽样量化后,得到已量化的脉冲幅度调制信号,它仅为有限个数值.

所谓编码,就是用一组二进制码组来表示每一个有固定电平的量化值.然而,实际上量化是在编码过程中同时完成的,故编码过程也称为模/数变换,可记作A/D.

1.2 差分脉冲编码调制DPCM

差分PCM(Differential PCM)记录的不是信号的绝对大小而是相对大小。

因为信号的相对大小的变化通常要比信号本身要小,编码是所用的码位也就少。如果取样频率足够高,大多数连续的样值之间会有很大的相关性。差分系统就是利用这种信息的冗余,不记录信号的大小,而是记录相邻值之间的差值的大小。

抽样值xn+enx~n量化器x~n预测器e~n+

图2.1 DPCM编码器示意图

差分编码采用预测编码技术,从输入中减去预测值,然后对预测误差进行量化,最终的编码就是预测值与实际值之间的差值。解码器用以前的数据对当前样值进行预测,然后用误差编码重构原始样值。这种方法使用的比特数较少,但它的性能决定于预测编码方法以及它对信号变化的适应能力。 1.3 增量调制DM

DPCM 对输入信号与预测值之差进行编码。当取样的频率提高时,样值之间的变化减小,样值之间的相对性变强。增量调制DM(Delta modulation)是一种特殊简化的DPCM,只用了1 bit的量化器,它采用较高的取样频率和1比特的编码。因为只能用一个量化级来代表样值的变化,为了跟踪信号的变化,必须使用高的取样频率,一般要求在 200kHz以上。因此编码反映的只是差分本身,而不是原始的信号。而且在DM中,当语音波形幅度发生急剧变化时,译码波形不能充分跟踪这种急剧的变化而必然产生失真,这称为斜率过载。而在没有语音的无声状态时,或者信号幅度为固定值时,量化输出都将呈现0、1交替的序列。这种噪声称为颗粒噪声。 1.4 自适应增量调制ADM

一般情况下,人耳对过载量化噪声不是很敏感,而对颗粒噪声较为敏感,所

以要将△的幅值取得足够小。但是△取得小,过载噪声就会增大,因而这时必须增加采样频率,以减少信号量化过程中的过载噪声,然而如果提高采样频率,那么信息压缩的效果就会降低。兼顾这两方面的要求,应采用随输入波形自适应的改变△大小的自适应编码方式,使△值随信号平均斜率而变化:斜率大时,△自动增大;反之则减小。这就是自适应增量调制ADM(Adaptive DM)。

这个方法的原理是:在语音信号的幅值变化不太大的区间内,取小的△值来抑制颗粒噪音;在幅值变化大的地方,取大的△值来减小过载噪音。其增量幅度的确定方法为,首先在颗粒噪音不产生大的影响的前提下,确定最小的△幅值。在同样的符号持续产生的情况下,将△幅值增加到原来的2倍。即当+△、+△这样持续增加时,如果下一个残差信号还是相同的符号,那么再将△幅值增加一倍,如此下去,并且确定好某一个最大的△幅值上限,只要在这个最大的△幅值以内同样的符号持续产生,就将△幅值继续增加下去。如果相反,残差信号值为异号时,就将前面的幅值△设为原来的1/2,重新以△/2为幅值。也就是说,如果同样的符号持续产生两次以上,在第三次时就将△幅值增加一倍,如果产生异号,将△幅值减小1/2。而且,当异号持续产生而减小△幅值时,一直减小到以最初确定的最小的△幅值为下限为止。这种ADM算法中,它的采样率至少是16 kHz。 二、 仿真思路 2.1编码原理

自适应差分脉冲编码调制ADPCM(Adaptive Differential Pulse Code Modulation)用预测编码来压缩数据量。它结合了ADM的差分信号与PCM的二进制码的方法,是一种性能比较好的波形编码。它的核心想法是:①利用自适应的思想改变量化阶的大小,即使用小的量化阶(step-size)去编码小的差值,使用大的量化阶去编码大的差值,②使用过去的样本值估算下一个输入样本的预测值,使实际样本值和预测值之间的差值总是最小。

编码输出Si++d量化 逆量化器dq+-Xp(n-1)步长调节预测器qSrSp

图2.2 ADPCM原理框图

编码的核心思想是对差值进行编码和预测,采用非均匀量化,并使不同幅值的信号信噪比接近一致,避免大幅值语音信号信噪比大而小幅值语音信号信噪比小。ADPCM编码过程如图2.2所示输示。输入Si是一个16bit二进制补码语音数据,其范围在32767到-32767之间。预测采样值Sp,与线性输入Si的差值为d。量化器对差值进行量化产生一个有符号的4位编码数据I,这个数据的表示范围在7到-7之间,最高位为符号位。

编码时,首先计算16位的二进制补码的当前采样值Si和上一预测采样值

S之间的差值d,这个差值的量化编码即输出4位ADPCM值I。在算法实现中,

p定义一个结构变量存储预测采样Sp和量化步长索引,并制定了两个表。一个表为索引调整表,其输入为差值量化编码I,用来更新步长索引。另一个表为步长调整表,其输入为步长索引,输出为步长q。编码时,首先用上一个采样点的步长索引查步长调整表求出步长q。如果当前采样值Si和采样预测值S之间的差

p值d为负,则I的D3位置1。如果该差值绝对值大于步长q,则I的D2位置1。如果d-q大于q/2,则I的D1位置1,如果d-q-q/2大于q/4,则I的D0位置1。如果以上条件不满足,则相应位置0。这样就确定了编码值I。然后编码值I作为索引调整表的输入,查表输出索引调整,并和结构变量中原步长索引相加,产生新的步长索引,在下一个采样值的编码中使用。编码输出I后,编码还需要重复进行和解码完全一样的计算过程,求出新的预测采样值S。

p

I逆量化器dq+SrSp步长调节q预测器

图2.3 解码原理框图

2.2解码原理

解码是编码的逆过程,ADPCM的解码过程如图2.3所示。解码输入即编码输出I,逆量化器将I逆量化成差值dq。差值dq与预测采样Sp相加得到解码输出Sr。解码过程同编码过程中求预测采样的原理是一样的,当编码端的Sr能很好的跟踪上Si时,解码端的Sr也能同样再现Si。这里涉及算法本身的时延和实现平台、实现方法的实时性等因素。

解码时首先通过步长索引查步长调整表得到量化步长,差值量化编码I经逆量化器得到语音差值d,这是求I的逆过程;然后与前次预测值一起重建当前

q语音信号S,最后用固定预测Spr?S,更新预测采样S,用I更新量化步长

rp索引值。

三、程序代码

MATLAB程序如下: ADPCM编码:

function adpcm_y = adpcm_encoder(raw_y)

IndexTable = [-1, -1, -1, -1, 2, 4, 6, 8, -1, -1, -1, -1, 2, 4, 6, 8];%索引调整表

StepSizeTable = [7, 8, 9, 10, 11, 12, 13, 14, 16, 17, 19, 21, 23, 25, 28, 31, 34, 37, 41, 45, 50, 55, 60, 66, 73, 80, 88, 97, 107, 118, 130, 143, 157, 173, 190, 209, 230, 253, 279, 307, 337, 371, 408, 449, 494, 544, 598, 658, 724, 796, 876, 963, 1060, 1166, 1282, 1411, 1552, 1707, 1878, 2066, 2272, 2499, 2749, 3024, 3327, 3660, 4026, 4428, 4871, 5358, 5894, 6484, 7132, 7845, 8630, 9493, 10442, 11487, 12635, 13899, 15289, 16818, 18500, 20350, 22385, 24623, 27086, 29794, 32767];%步长索引表

prevsample = 0; previndex = 1; Ns = length(raw_y); n = 1;

raw_y = 32767 * raw_y; % 降输入信号变为16bit while (n <= Ns)

predsample = prevsample;%预测值传递 index = previndex;%索引指针 step = StepSizeTable(index);

diff = raw_y(n) - predsample;%信号现在值与预测值差 if (diff >= 0)%如果差值大于0,则负号位为0,否则为1 code = 0; else code = 8;

diff = -diff;%取正值 end

tempstep = step;%步长,量化级 if (diff >= tempstep)

code = bitor(code, 4);%按位或运算,将第三位编码为1 diff = diff - tempstep; end

tempstep = bitshift(tempstep, -1);%二进制移位操作,目的是变成1/2 if (diff >= tempstep)

code = bitor(code, 2);%按位或运算,第二位编码为1 diff = diff - tempstep; end

tempstep = bitshift(tempstep, -1); if (diff >= tempstep)

code = bitor(code, 1);%第一位编码为1 end

diffq = bitshift(step, -3);

if (bitand(code, 4))%按位与运算,提取第三位 diffq = diffq + step; end

if (bitand(code, 2))

diffq = diffq + bitshift(step, -1); end

if (bitand(code, 1))

diffq = diffq + bitshift(step, -2); end

if (bitand(code, 8))

predsample = predsample - diffq; else

predsample = predsample + diffq; end

if (predsample > 32767) predsample = 32767;

elseif (predsample < -32768)

predsample = -32768; end

index = index + IndexTable(code+1);

if (index < 1) index = 1; end

if (index > 89) index = 89; end

prevsample = predsample; previndex = index;

adpcm_y(n) = bitand(code, 15); -pcm_y(n) = code; n = n + 1; end ADPCM解码:

function raw_y = adpcm_decoder(adpcm_y)

IndexTable = [-1, -1, -1, -1, 2, 4, 6, 8, -1, -1, -1, -1, 2, 4, 6, 8];

StepSizeTable = [7, 8, 9, 10, 11, 12, 13, 14, 16, 17, 19, 21, 23, 25, 28, 31, 34, 37, 41, 45, 50, 55, 60, 66, 73, 80, 88, 97, 107, 118, 130, 143, 157, 173, 190, 209, 230, 253, 279, 307, 337, 371, 408, 449, 494, 544, 598, 658, 724, 796, 876, 963, 1060, 1166, 1282, 1411, 1552, 1707, 1878, 2066, 2272, 2499, 2749, 3024, 3327, 3660, 4026, 4428, 4871, 5358, 5894, 6484, 7132, 7845, 8630, 9493, 10442, 11487, 12635, 13899, 15289,

16818, 18500, 20350, 22385, 24623, 27086, 29794, 32767];

prevsample = 0; previndex = 1;

Ns = length(adpcm_y); n = 1;

while (n <= Ns)

predsample = prevsample; index = previndex;

step = StepSizeTable(index); code = adpcm_y(n);

diffq = bitshift(step, -3); if (bitand(code, 4)) diffq = diffq + step; end

if (bitand(code, 2))

diffq = diffq + bitshift(step, -1); end

if (bitand(code, 1))

diffq = diffq + bitshift(step, -2); end

if (bitand(code, 8))

predsample = predsample - diffq; else

predsample = predsample + diffq; end

if (predsample > 32767) predsample = 32767;

elseif (predsample < -32768) predsample = -32768; end

index = index + IndexTable(code+1);

if (index < 1) index = 1; end

if (index > 89) index = 89; end

prevsample = predsample; previndex = index;

raw_y(n) = predsample / 32767; n = n + 1; end

输入一个模拟信号的编码解码过程: t=0:pi/50:2*pi; y=cos(t);

adpcm_y=adpcm_encoder(y); Y=adpcm_decoder(adpcm_y); Z=Y-y;

subplot(2,2,1) plot(t,y)

title('输入模拟信号y'); subplot(2,2,2)

stem(adpcm_y) title('ADPCM编码'); subplot(2,2,3) plot(t,Y)

title('ADPCM解码'); subplot(2,2,4) plot(Z) title('误差');

该程序运行后得到结果入下图:

输入的模拟信号y112100.58064-0.52-1012345670020406080100120ADPCM编码ADPCM解码10.40.20.50-0.20-0.4-0.5-0.6-0.8-101234567-102040误差6080100120

四、结果分析

从上面的运行结果来看,ADPCM编码的效率较高,解码后误差小。而且编码位数都为4位二进制,提供跟高的压缩比,减小了带宽利用,提高了频率利用率,因此在频带紧缺的现代通信中具有广泛的应用前景.

本文来源:https://www.bwwdw.com/article/rmy6.html

Top