MATLAB编码实现均匀PCM与非均匀PCM.doc
《MATLAB编码实现均匀PCM与非均匀PCM.doc》由会员分享,可在线阅读,更多相关《MATLAB编码实现均匀PCM与非均匀PCM.doc(8页珍藏版)》请在冰点文库上搜索。
![MATLAB编码实现均匀PCM与非均匀PCM.doc](https://file1.bingdoc.com/fileroot1/2023-6/25/8373aaf7-2518-4d11-b440-3281ae3809c3/8373aaf7-2518-4d11-b440-3281ae3809c31.gif)
均匀PCM与非均匀PCM
实验目的
1.掌握MATLAB语言的函数调用,提高编程编程能力。
2.掌握量化信噪比的基本概念。
3.学习均匀量化和非均匀量化的基本原理,加深对非均匀量化的理解。
实验原理
均匀量化的基本原理
在脉冲编码调制中,模拟信号首先以高于奈奎斯特的速率采样,然后将所的样本量化。
假设模拟信号是以[-Ⅹmax,Ⅹmax]表示的区间内分布的,而量化电平数很大。
量化电平可以是相等的或是不相等的;前者就属于均匀PCM,而后者就是非均匀PCM。
关于量化的几个基本概念,量化间隔;量化误差;量化信噪比。
(1)相邻量化电平间距离称量化间隔,用“Δ”表示。
(2)设抽样值为,量化后的值为,xq(kTs)与x(kTs)的误差称为量化误差,又称为量化噪声;量化误差不超过±Δ/2,而量化级数目越多,Δ值越小,量化误差也越小。
(3)衡量量化的性能好坏最常用指标是量化信噪比(Sq/Nq),其中Sq表示量化信号值xq(kTs)产生的功率,Nq表示量化误差功率,量化信噪比越大,则量化性能越好。
在均匀PCM中,长度为2Xmax的区间[-Ⅹmax,Ⅹmax]被划分为N个相等的子区间,每一子区间长度为△=2Xmax/N。
如果N足够大,那么在每一子区间内输入的密度函数就能认为是均匀的,产生的失真为D=△2/12。
如果N是2的幂次方即,那么就要求用比特来表示每个量化电平。
这就意味着,如果模拟信号的带宽是,采样又是在奈奎斯特率下完成的,那么传输PCM信号所要求的带宽至少是(实际上1.5比较接近于实际)。
这时失真由下式给出,
(1-1)
如果模拟信号的功率用表示,则信号/量化噪声的比(SQNR)由下式给出
(1-2)
式中表示归一化输入,定义为
(1-3)
以分贝(dB)计的SQNR为
(1-4)
量化以后,这些已量化的电平用比特对每个已量化电平进行编码.编码通常使用自然二进制码(NBC),即最低电平映射为全0序列,最高电平映射为全1序列,全部其余的电平按已量化值的递增次序映射。
非均匀量化的基本原理
正变换:
,其中是归一化输入(),是一个参数,在标准律的非线性中它等于255。
反变换:
在非均匀量化PCM中,输入信号首先通过一非线性环节以减小输入的动态范围,再将输出加到某一均匀PCM系统上。
在接收端,输出再通过另一非线形环节,该环节是在发送端所用的非线性环节的逆特征。
这样,总的效果就等效于一个在量化电平之间具有非均匀间隔的PCM系统。
非均匀量化时,量化器随着输入信号的大小采用不同的量化间隔,大信号时采用大的量化间隔,小信号时采用小的量化间隔,可以以较少的量化电平数达到输入动态范围的要求
一般对语音信号传输来说,所使用的非线性可以是律的非线性,或是A律的非线性,中国和欧洲采用A率压缩特性(A=87.56),北美和日本采用律压缩特性(=255),压缩特性分别如下:
μ律:
(1-5)
A律:
(1-6)
式中,x为归一化输入,y为归一化输出,A、为压缩系数,式(3-1)也可以表示为,
(1-7)
本实验主要仿真律的有关特性。
如图1-1所示为不同值对应的输入输出关系曲线.
图1-1不同值对应的输入输出关系
律的非线性的逆为
量化信噪比的基本概念
实验内容:
(1)均匀量化产生一个幅度为1和的正弦信号,用均匀量化方法分别用8电平和16电平进行量化,在同一个坐标轴上画出原信号和已量化信号,比较这两种情况下的SQNR。
(2)均匀量化产生长度为500的零均值、单位方差的高斯随机变量序列,利用u_pcm.m求当量化电平数为64时所得的SQNR。
求出该序列的前5个值、相应的量化值和相应的码字。
(3)非均匀量化产生一个长度为500,按分布的随机变量序列。
用16、64和128量化电平数和的律非线性,并求SQNR。
(4)Matlab代码:
(1)下面给出的M文件u-pcm.m用采样值序列和要求的量化电平数作输入,求得已量化序列、编码序列和产生的SQNR(以dB计)。
function[sqnr,a_quan,code]=u_pcm(a,n)
%U_PCM uniformPCMencodingofasequence
% [SQNR,A_QUAN,CODE]=U_PCM(A,N)
% a=inputsequence.
% n=numberofquantizationlevels(even).
% sqnr=outputSQNR(indB).
% a_quan=quantizedoutputbeforeencoding.
% code=theencodedoutput.
amax=max(abs(a));
a_quan=a/amax;
b_quan=a_quan;
d=2/n;
q=d.*[0:
n-1];
q=q-((n-1)/2)*d;
fori=1:
n
a_quan(find((q(i)-d/2<=a_quan)&(a_quan<=q(i)+d/2)))=...
q(i).*ones(1,length(find((q(i)-d/2<=a_quan)&(a_quan<=q(i)+d/2))));
b_quan(find(a_quan==q(i)))=(i-1).*ones(1,length(find(a_quan==q(i))));
end
a_quan=a_quan*amax;
nu=ceil(log2(n));
code=zeros(length(a),nu);
fori=1:
length(a)
forj=nu:
-1:
0
if(fix(b_quan(i)/(2^j))==1)
code(i,(nu-j))=1;
b_quan(i)=b_quan(i)-2^j;
end
end
end
sqnr=20*log10(norm(a)/norm(a-a_quan));
PCM.M
%SQNR_8=sqnr8
%SQNR_16=sqnr16
x=0:
0.1*pi:
4*pi;
y=sin(x);
[sqnr8,a_quan8,code8]=u_pcm(y,8);
[sqnr16,a_quan16,code16]=u_pcm(y,16);
plot(x,y,x,a_quan8,x,a_quan16);
(2)PCM2.M
x=1:
500;
y=randn(1,500);
[sqnr64,a_quan64,code64]=u_pcm(y,64);
%SQNR64=squnr64
a_quan64_result=[a_quan64
(1),a_quan64
(2),...
a_quan64(3),a_quan64(4),a_quan64(5)]%Ç°5¸öÁ¿»¯Öµ
code64_result=[code64(1,1:
6),code64(2,1:
6),...
code64(3,1:
6),code64(4,1:
6),code64(5,1:
6)]%Ç°5¸öÂë×Ö
(3)可能用到的子程序:
mulaw.m和invmulaw.m用于实现律的非线性和它的逆.
mulaw.m
function[y,a]=mulaw(x,mu)
%MULAW mu-lawnonlinearityfornonuniformPCM
% Y=MULAW(X,MU).
% X=inputvector.
a=max(abs(x));
y=(log(1+mu*abs(x/a))./log(1+mu)).*signum(x);
invmulaw.m
functionx=invmulaw(y,mu)
%INVMULAW theinverseofmu-lawnonlinearity
%X=INVMULAW(Y,MU) Y=normalizedoutputofthemu-lawnonlinearity.
x=(((1+mu).^(abs(y))-1)./mu).*signum(y);
signum.m
functiony=signum(x)
%SIGNUM findsthesignumofavector.
% Y=SIGNUM(X)
% X=inputvector
y=x;
y(find(x>0))=ones(size(find(x>0)));
y(find(x<0))=-ones(size(find(x<0)));
y(find(x==0))=zeros(size(find(x==0)));
mula_pcm.m
function[sqnr,a_quan,code]=mula_pcm(a,n,mu)
%MULA_PCM mu-lawPCMencodingofasequence
% [SQNR,A_QUAN,CODE]=MULA_PCM(A,N,MU).
% a=inputsequence.
% n=numberofquantizationlevels(even).
% sqnr=outputSQNR(indB).
% a_quan=quantizedoutputbeforeencoding.
% code=theencodedoutput.
[y,maximum]=mulaw(a,mu);
[sqnr,y_q,code]=u_pcm(y,n);
a_quan=invmulaw(y_q,mu);
a_quan=maximum*a_quan;
sqnr=20*log10(norm(a)/norm(a-a_quan));
主程序:
令向量a是按N(0,1)产生的长度为500的向量,即
a=randn(1,500)
pcm3.m
a=randn(1,500);
[sqnr16,a_quan16,code16]=mula_pcm(a,16,255);
[sqnr64,a_quan64,code64]=mula_pcm(a,64,255);
[sqnr128,a_quan128,code128]=mula_pcm(a,128,255);
[Y,I]=sort(a);
sqnr16
sqnr64
sqnr128
实验分析:
(1)
(2)
a_quan64_result=
-0.4331-1.69310.11810.2756-1.1419
code64_result=
Columns1through17
01101000101010000
Columns18through30
1100011010001
(3)
sqnr16=
13.5210
sqnr64=
25.4650
sqnr128=
31.7463
每次实验结果有差异!
随机产生
实验总结:
量化误差与量化比特数成正比,每增加一个比特,即每增加两倍的量化电平,误差约增加6db.