error('Toomanylevelsforthisrange.');return
end
if(s
error('Theleftmostboundarytoosmall.');return
end
if(s+(n-2)*delta>c)
error('Theleftmostboundarytoolarge.');return
end
args=[];
forj=1:
nargin-7
args=[args,',p',int2str(j)];
end
args=[args,')'];
a
(1)=b;
fori=2:
n
a(i)=s+(i-2)*delta;
end
a(n+1)=c;
[y,dist]=eval(['mse_dist(funfcn,a,tol',args]);
实验结果:
均方误差:
dist=0.0769
量化值:
y=-5.0168-4.2168-3.2605-2.3158-1.3832-0.45990.45991.38322.31583.26054.21685.0168
3.均匀PCM
实验代码:
主函数:
echoon
t=[0:
0.01:
10];
a=sin(t);
[sqnr8,aquan8,code8]=u_pcm(a,8);
[sqnr16,aquan16,code16]=u_pcm(a,16);
pause%PressakeytoseetheSQNRforN=8.
sqnr8
pause%PressakeytoseetheSQNRforN=16.
sqnr16
pause%Pressakeytoseethefirstfivequantizedvalues.
plot(t,a,'-',t,aquan8,'-',t,aquan16,'-',t,zeros(1,length(t)));
title('用8电平和16电平对一个正弦信号进行的均匀PCM');
子函数:
function[sqnr,a_quan,code]=u_pcm(a,n)
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));
实验结果:
所得的SQNR是:
sqnr8=18.9023sqnr16=25.1272
4.非均匀PCM
实验代码:
主函数:
echoon
t=[0:
0.01:
10];
a=[20*randn(1,20),randn(1,480)];
n=64;
[sqnr,aquan,code]=u_pcm(a,64);
pause%PressakeytoseetheSQNR.
sqnr
pause
plot(a);
pause
plot(aquan,'-');
[sqnr1,aquan1,code1]=mula_pcm(a,64,255);
pause%PressakeytoseetheSQNR.
sqnr1
pause
plot(aquan1,'-');
子函数:
function[sqnr,a_quan,code]=mula_pcm(a,n,mu)
[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));
function[sqnr,a_quan,code]=u_pcm(a,n)
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));
实验结果:
sqnr=19.7348
sqnr1=24.1075
三、实验分析与讨论
1.信号量化的目的是什么?
用有限的离散值近似模拟原始信号的振幅,在接收端由这些有限的离散值恢复原始信号。
2.量化信号有哪些优缺点?
缺点:
无论抽样值大小如何,量化噪声的均方根值都是固定不变的。
因此,当信号
较小时,则信号量化噪声功率比也比较小,这样,对于弱信号时的信号量噪比就难以达到给定的要求。
3.什么是A率压缩和
率压缩?
它们各自有什么特点?
A压缩律是指符合下式的对数压缩规律:
律压缩特性:
4.在PCM系统中,信号量噪比是指什么,它和信号带宽有什么关系?
信号功率与量化噪声之比简称信号量噪声比。
当低通信号最高频率
给定时,PCM系统的输出信号量噪比随系统的带宽B按指数规律增长。
四、思考题
1、实验1中Huffman码的效率是多少?
Huffman码唯一吗?
为什么?
答:
霍夫曼编码效率等于熵/平均码长,已知熵为3.0371,平均码长为3.1,所以霍夫曼编码效率为0.98。
霍夫曼码不唯一,因为在进行概率相加时,可能会出现上一次的和与某一个概率一样,此时有向上和向下两种编码方式,因此造成霍夫曼码不唯一。
2、
.
答:
3、
答:
代码:
%均匀PCM量化器
n=input('请输入量化级数:
');
endtime=2;%定义信号周期为2
dt=0.5;%定义抽样间隔为0.5
t=0:
dt:
endtime;%划分数组
a=zeros(size(t));
fortt=1:
1/dt
a(tt+[0:
endtime/2-1]*(2/dt))=t(tt);%当0<=t<1时,x(t)=t
end
fortt=1/dt+1:
2/dt
a(tt+[0:
endtime/2-1]*(2/dt))=2-t(tt);%当1<=t<2时,x(t)=-t+2
end
amax=max(abs(a));%max求最大值,abs求绝对值
a_quan=a/amax;%归一化
b_quan=a_quan;%赋初值
d=1/n;%求出量化间隔
q=d.*[1:
n];
q=q-d/2;%求出量化电平
%进行量化
fori=1:
n
%定位第i个量化间隔码子
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));%ceil返回大于或者等于指定表达式的最小整数
code=zeros(length(a),nu);
fori=1:
length(a)
forj=nu:
-1:
0
if(fix(b_quan(i)/(2^j))==1)%fix向最靠近0取整
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));%求量化信噪比
disp('系统的量化信噪比:
')
disp(sqnr)
disp('系统的量化误差:
')
disp(a-a_quan)
disp('系统的量化编码结果:
')
disp(code)
plot(t,a,'r-')
holdon;
plot(t,a_quan,'b--')
8电平的结果截图:
16电平的结果截图:
五、实验心得
此次实验内容为模数转换,主要为将模拟信号转换成数字信号进行抽样量化编码等过程,通过本次实验,我了解了哈弗曼编码的原理及过程,以前学过哈弗曼编码理论原理,这次通过matlab仿真又加深了印象,还有计算编码效率,对比出来霍夫曼编码方式是最优的。
然后是量化,也就是有损数据压缩,抽样信号必须经过量化才能转化成数字信号。
然后分别使用了均匀PCM和非均匀PCM的原理,对信号进行变换