资源描述
通信系统建模和仿真试验汇报
试验2:MATLAB编程实现 A律PCM编码系统设计和仿真
1 关键技术指标:
输入信号:s(t)=Asin(2πft+θ);
输入信号幅值:A=-70~0dB;
输入信号频率:f=4Hz;
抽样频率:fs=100Hz;
2 总体系统设计框图
图1. A律PCM编解码系统框图
3 程序块步骤设计和检验
3.1 A律PCM编码模块
3.1.1 A律PCM编码规则:
图2 段落码和段内码编码规则
3.1.2 PCM编码步骤
输入信号x后,先判定x符号,x>0时C1=1,x<0时C1=0;判定完符号后将信号进行归一化和量化,再进行段落判定和段内判定,最终将C1~C8输出。步骤图以下:
输入信号S
判定符号
归一化、量化
输出
段内判定
段落判定
3.2.A律PCM译码模块
对已经编码信号进行译码时,先输入已经编码码组,依据极性码规则提取符号,判定符号位,接着再判定段落位置和段内位置,最终将译码后结果输出,其译码步骤图以下:
输入信号S
判定符号
归一化、量化
输出
段内判定
段落判定
4 程序代码及测试仿真结果
4.1 连接全程序
输入信号进行参数设定:
抽样频率fs=40,dt=1/fs,t=0:dt:2,输入正弦信号幅度不一样,vm1=-70:5:0,这是以分贝为单位,要将她转换为以伏特为单位vm=10.^(vm1/20);
开始画图调用各个模块函数:PCM均匀量化编码[sqnrM,zxx,zz]=upcm(x,M),PCM编码y=pcm_encode(sxx),PCM解码yy=pcm_decode(y,v);
还要计算噪声平均功率和信号平均功率来得到信号量化信噪比:
nq(m)=sum((x-yy).*(x-yy))/length(x);
sq(m)=mean(yy.^2); snr(m)=(sq(m)/nq(m));
4.2 仿真结果
在matlab上运行主函数pcm_e_decode.m,可得到原始信号波形,PCM译码后波形,不一样幅度下PCM编码后量化信噪比和均匀量化量化信噪比波形
图3 原始抽样信号(上)和PCM译码后重建信号(下)
原始抽样信号和PCM译码后信号全部是正弦波,能够看出经过PCM译码后重建信号和原始信号相比没有失真,译码正确。
图4 A律PCM编码和均匀量化编码量化信噪比比较
从上图能够看出:
(1)对均匀编码和非均匀编码,量化信噪比伴随输入信号幅度改变而改变;
(2)在输入正弦信号幅度相同情况下,经过A律13折线近似PCM非均匀量化编码后信号量化信噪比要比均匀量化编码后信噪比小,所以,能够得出结论:非均匀量化能够有效地改善量化信噪比。
4.3 Matlab源程序程序代码
%均匀量化编码:
function[sqnr,a_quan,code]=upcm(a,n)
amax=max(abs(a));
a_quan=a/amax; %抽样值归一化
b_quan=a_quan;
d=2/n;
q=d.*[0:n-1]-(n-1)/2*d;
%对归一化输入信号序列进行量化
for i=1:n
index=find((q(i)-d/2<=a_quan)&(a_quan<=q(i)+d/2));
a_quan(index)=q(i).*ones(1,length(index));
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);
for i=1:length(a)
for j=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编码:
function[out]=pcm_encode(x)
for i=1:n
if x(i)>0
out(i,1)=1;
else
out(i,1)=0
end
if abs(x(i))>0 & abs(x(i))<32
out(i,2)=0;out(i,3)=0;out(i,4)=0;step=2;st=0;
elseif abs(x(i))>=32 & abs(x(i))<64
out(i,2)=0;out(i,3)=0;out(i,4)=1;step=2;st=32;
elseif abs(x(i))>=64 & abs(x(i))<128
out(i,2)=0;out(i,3)=1;out(i,4)=0;step=4;st=64;
elseif abs(x(i))>=128 & abs(x(i))<256
out(i,2)=0;out(i,3)=1;out(i,4)=1;step=8;st=128;
elseif abs(x(i))>=256 & abs(x(i))<512
out(i,2)=1;out(i,3)=0;out(i,4)=0;step=16;st=256;
elseif abs(x(i))>=512 & abs(x(i))<1024
out(i,2)=1;out(i,3)=0;out(i,4)=1;step=32;st=512;
elseif abs(x(i))>=1024 & abs(x(i))<2048
out(i,2)=1;out(i,3)=1;out(i,4)=0;step=64;st=1024;
elseif abs(x(i))>=2048 & abs(x(i))<4096
out(i,2)=1;out(i,3)=1;out(i,4)=1;step=128;st=2048;
else
out(i,2)=1,out(i,3)=1;out(i,4)=1;step=128;st=2048;
end
if(abs(x(i))>=4096)
out(i,2:8)=[1 1 1 1 1 1 1];
else
tmp=floor((abs(x(i))-st)/step);
t=dec2bin(tmp,4)-48; %函数dec2bin输出是ASCII字符串,48对应0
out(i,5:8)=t(1:4);
end
end
out=reshape(out',1,8*n);
%PCM译码:
function[out]=pcm_decode(in,v)
%decode the input pcm code
%in, input the pcm code 8bits sample
%v, quantized level
n=length(in);
in=reshape (in',8,n/8);
slot(1)=0;
slot(2)=32;
slot(3)=64;
slot(4)=128;
slot(5)=256;
slot(6)=512;
slot(7)=1024;
slot(8)=2048;
step(1)=2;
step(2)=2;
step(3)=4;
step(4)=8;
step(5)=16;
step(6)=32;
step(7)=64;
step(8)=128;
for i=1:n/8
ss=2*in(1,i)-1;
tmp=in(2,i)*4+in(3,i)*2+in(4,i)+1;
st=slot(tmp);
dt=(in(5,i)*8+in(6,i)*4+in(7,i)*2+in(8,i))*step(tmp)+0.5*step(tmp);
out(i)=ss*(st+dt)/4096*v;
end
%主程序中:
figure(1)
for k=1:length(vm)
for m=1:2
x=vm(k)*sin(2*pi*4*t+2*pi*rand(1));
[sqnrM,zxx,zz]=upcm(x,M); %PCM均匀量化编码
srm(m)=sqnrM;
v=vm(k);
xx=x/v; %normalize
sxx=floor(xx*4096);
y=pcm_encode(sxx); %PCM编码
yy=pcm_decode(y,v); %PCM解码
nq(m)=sum((x-yy).*(x-yy))/length(x); %噪声平均功率
sq(m)=mean(yy.^2); %信号平均功率
snr(m)=(sq(m)/nq(m)); %信号量化信噪比
usnrq(k)=mean(srm);
snrq(k)=10*log10(mean(snr)); %量化信噪比
end
展开阅读全文