通信原理综合实验报告 PCM.docx
《通信原理综合实验报告 PCM.docx》由会员分享,可在线阅读,更多相关《通信原理综合实验报告 PCM.docx(21页珍藏版)》请在冰豆网上搜索。
通信原理综合实验报告PCM
重庆交通大学信息科学与工程学院
综合性设计性实验报告
专业班级:
通信工程一班
姓名:
学号:
实验所属课程:
通信原理
实验室(中心):
语音八楼
指导教师:
许登元
实验完成时间:
2013年1月1日
一、设计题目
基于MATLAB的通信系统仿真——信源编解码
二、实验目的:
1.综合应用《Matlab编程与系统仿真》、《信号与系统》、《现代通信原理》等多门课程知识,使我们建立通信系统的整体概念;
2.培养我们系统设计与系统开发的思想;
3.培养我们利用软件进行通信仿真的能力。
4.培养我发现问题,解决问题,查阅资料解决问题的能力。
5、培养我熟练掌握MATLAB,运用此matlab软件工具进行通信仿真的能力
三、实验设备及软件:
PC机一台,MATBLAB。
四、实验主要内容及要求:
1、对通信系统有整体的较深入的理解,深入理解自己仿真部分的原理的基础,画出对应的通信子系统的原理框图
2、提出仿真方案;
3、完成仿真软件的编制
4、仿真软件的演示
5、提交详细的设计报告
五、实验原理
1、PCM基本原理
脉冲编码调制(PCM)简称脉码调制,它是一种用二进制数字代码来代替连续信号的抽样值,从而实现通信的方式。
因此此种通信方式抗干扰能力强,因此在很多领域都得到了广泛运用。
PCM信号的形成主要由三大步骤组成,包括:
抽样、量化和编码。
它们分别完成时间上离散、幅度上离散及量化信号的二进制表示。
量化分为均匀量化和非均匀量化,为了减小小信号的量化误差,我们常使用的是非均匀量化。
非均匀量化分为A律和µ律。
我国采用的是A律,但由于A律不好实现,所以我们常用近似的13折线编码。
1.1抽样
抽样即是将时间连续的模拟信号由一系列时间离散的样值所取代的过程它实现的是信号在时间上的离散化。
抽样信号要想无失真的恢复出原信号,抽样频率必须要满足抽样定理。
即:
如果信号的最高频率为fH,那么抽样频率fs必须要满足fs>=2fH.
1.2量化
经过抽样后的信号还并不是数字信号,它只实现了时间上的离散化。
幅值上并不离散。
所以我们要对信号进行量化,实现其幅值的离散化。
量化分为均匀量化和非均匀量化。
本实验主要用到了非均匀量化中的A律13折线压缩。
下面主要介绍A律13折线。
A律压缩是指压缩器具有如下的压缩特性:
由于A律在工程上不好实现,所以我们经常用近似的13折线压缩法去代替A率压缩
下面是13折线时的X值与A律计算得的X的比较
第二行的X值是根据A=87.6时计算得到的,第三行的X值是13折线分段时的值。
可见,13折线各段落的分界点与A=87.6的曲线非常的接近。
而13折线的x按2的幂次分布,计算较方便,也易于实现。
1.3编码
编码即把量化后的新哈变换成二进制代码,其反过程就叫做译码。
本实验中我们用的是折叠二进制码。
我们把一个量化电平数用一个8位的二进制表示。
第1位表示信号的极性,2-4位表示段落码,5-8位表示段内码。
A律正输入值编码表
段落码
段落序号
1
2
3
4
5
6
7
8
段落码
000
001
010
011
100
101
110
111
段内码
量化级
段内码
量化级
段内码
15
1111
7
0111
14
1110
6
0110
13
1101
5
0101
12
1100
4
0100
11
1011
3
0011
10
1010
2
0010
9
1001
1
0001
8
1000
0
0000
在13折线中,用8位的折叠二进制码表示信号量化值的具体步骤为:
用第2到4位表示段落码,8个段落的起点电平由它的8种可能状态来分别表示。
其他四位表示段内码,每一个段落它的16个均匀的划分量化级由它的16种可能状态来分别表示。
这样就使得8个段落被划分为128个量化级。
再加上负的,相当于一共有256种量化电平数。
数字通信系统原理框图
本实验详细设计方案
各子系统详细介绍:
1、模拟信号为原始的信源信号
2、抽样是将上述的时间和幅值都连续的模拟信号转换为时间离散,幅值连续的信号。
3、量化是将上述信号转换为时间和幅值均离散的数字信号
4、Pcm编码是将量化后的信号转换为01比特流
5、Huffuman编码是为了减少冗余,提高传输效率
6、汉明编码是通过增加冗余位来提高传输效率
7、Bpsk调制式将上述0、1比特流转换成适合在信道中传输的波形
8、加噪是模仿信号传输过程中噪声的干扰,解调、滤波是为了恢复原信号。
抽样判决是把信号恢复成0、1比特流的形式
9、汉明译码、huffuman解压缩、pcm反变换分别是汉明编码,huffuman编码,pcm编码的反过程。
10、最后还原成模拟信号
六、主要代码及必要说明:
主函数
functionPCMmain()
closeall;
clc;
clear;
A=3;
t1=0:
0.1:
6*pi;
a1=sin(t1);
figure;
subplot(2,1,1);
plot(t1,a1);
title('原始信号');
t2=0:
2*pi/32:
6*pi;
a=sin(t2);
subplot(2,1,2);
stem(t2,a);
title('抽样信号');
res=pcm(a);
%--------------------------------
[datastream,huff,n]=hfencodingmain(res);
bit2=hanmencoding(datastream);
[panjue]=channel(bit2,5);
bit22=hamyima(panjue);
[bit3]=huffdecoding(bit22,huff,n);
S=ipcm(bit3);
figure;
title('经过信道的重建信号');
t=linspace(0,6*pi,length(S));
plot(t,S,'r');
holdon;
plot(t,S,'.b');
pcm编码
functionres=pcm(s)
z=sign(s);
maxs=max(abs(s));
s=abs(s/maxs);%归一化
Q=2048*s;%一个量化单位为1/2048;
code=zeros(length(s),8);
w
(1)=0;
fork=2:
8
w(k)=2^(k+2);%段起始值[0,16,32,64,128,256,512,1024]
end
res=[];
fori=1:
length(s)
if(z(i)>0)
code(i,1)=1;
else
code(i,1)=0;
end
fork=8:
-1:
1
ifQ(i)>=w(k)
a=dec2bin(k-1,3);
code(i,2:
4)=a;%段落码的判断
break;
end
end
ifk>=2
t=fix((Q(i)-w(k))/(2^(k-2)));
else
t=fix(Q(i)-w(k));
end
code(i,5:
8)=dec2bin(t,4);%段内码的判断
res=[res,code(i,:
)];
end
end
huffuman编码的主函数
function[datastream,huff,n]=hfencodingmain(code)
[p,h1,h]=aa(code);
[c,n]=hufftree(p,h1);
[datastream,huff]=hufencoding(c,p,h,h1,n);
End
Huffuman编码子函数
1、统计各电平出现概率
function[p,h1,h]=aa(x)
m=length(x)/8;
fori=1:
256
chars(i).data=dec2bin(i-1,8);
chars(i).num=0;
end
h=[];
forj=1:
m
temp=x((j-1)*8+1:
j*8);
h=[h;temp];
fork=1:
256
ifsum(temp==chars(k).data)==8
chars(k).num=chars(k).num+1;
break;
end
end
end
h1=[];l=0;
fori=1:
256
ifchars(i).num~=0
h1=[h1,chars(i)];
l=l+1;
end
end
fory=1:
l
p(y)=h1(y).num/m;
end
end
2、构建huffuman树
function[c,n]=hufftree(p,h1)
n=length(p);
fori=1:
n-1
forj=i:
n
ifp(i)>=p(j)
P=p(i);p(i)=p(j);p(j)=P;
T=h1(i);h1(i)=h1(j);h1(j)=T;
end
end
end
Q=sort(p);
c=-ones(2*n-1,6);
c(:
1)=1:
2*n-1;
c(1:
n,2)=Q;q=Q;
m=zeros(1,2*n-1);
fori=n+1:
2*n-1
c(i,2)=q
(1)+q
(2);
temp1=find(c(:
2)==q
(1)&c(:
6)~=1,1);
c(temp1,6)=1;
temp2=find(c(:
2)==q
(2)&c(:
6)~=1,1);
c(temp2,6)=1;
c(i,4)=temp1;
c(i,5)=temp2;
c(temp1,3)=i;
c(temp2,3)=i;
Q=[Q,q
(1)+q
(2)];
q=[q
(1)+q
(2),q(3:
end)];
q=sort(q);
end
end
根据构建的huffuman树进行编码
function[datastream,huff]=hufencoding(c,p,h,h1,n)
fori=1:
n
huffcode=[];
p=c(i,3);
j=i;
while(p~=-1)
if(c(p,4)==j)
huffcode=[0,huffcode];
else
huffcode=[1,huffcode];
end
j=p;
p=c(j,3);
end
huff(i).ch=h1(i).data;
huff(i).code=huffcode;
end
[l,k]=size(h);
datastream=[];
fori=1:
l
forj=1:
n
ifsum(h(i,:
)==huff(j).ch)==8
datastream=[datastream,huff(j).code];
break;
end
end
end
end
(7、4)汉明编码
functionbit2=hanmencoding(m)
H=[0111100;
1011011;
1101001];
G=[1000011;
0100101;
0010110;
0001111];
bit2=[];
n=fix(length(m)/4);
fori=1:
n
t=m((i-1)*4+1:
i*4);
bit2=[bit2,rem(t*G,2)];
end
bit2=[bit2,m(4*n+1:
end)];
end
通过信道的子函数
function[panjue]=channel(bit2,SNR)
%--------------调制---------------
cs=bit2*2-1;
de=[];
t=linspace(0,1,16);
carrier=cos(2*pi*t);
fori=1:
length(cs)
de=[de,cs(i)*carrier];
end
figure;
subplot(4,1,1);
plot(de);axis([0,length(de)/10,-1,1]);
title('调制信号');
%--------------加噪---------------
de=awgn(de,SNR,'measured');
%-------------解调-------------------
designal=[];
fori=1:
16:
length(de)-15
designal=[designal,de(i:
i+15).*carrier];
end
subplot(4,1,2);
plot(designal);
axis([0,length(designal)/10,-1,1]);
title('解调信号');
%-------------滤波-------------------
loadlowpass;
l=fix((length(lowpass))/2);
designal=[designal,zeros(1,l)];
b=filter(lowpass,1,designal);
b=b(l+1:
end);
subplot(4,1,3);
plot(b);
axis([0,length(b)/10,-1,1]);
title('滤波后的信号');
%------------抽样判决--------------------
panjue=[];panjue1=[];
fori=1:
length(b)/16;
sum1=b((i-1)*16+4);
ifsum1>=0
panjue=[panjue,1];
panjue1=[panjue1,ones(1,16)];
else
panjue=[panjue,0];
panjue1=[panjue1,zeros(1,16)];
end
end
subplot(4,1,4);
plot(panjue1);
axis([0,length(panjue1)/10,-1,1]);
title('抽样判决信号');
end
汉明码译码函数
functionbit3=hamyima(bit2)
H=[0111100;
1011011;
1101001];
j=fix(length(bit2)/7);
bit3=[];
fork=1:
j
R=bit2((k-1)*7+1:
k*7);
S=rem(R*H',2);
fori=1:
7
ifsum(S==H(:
i)')==3
break;
end
end
R(i)=~R(i);
bit3=[bit3,R(1:
4)];
end
bit3=[bit3,bit2(j*7+1:
end)];
end
huffuman译码
function[transcode]=huffdecoding(datastream,huff,n)
k=datastream;
transcode=[];len=0;
max=1;
foru=1:
n
temp=length(huff(u).code);
iftemp>max
max=temp;
end
end
while(length(k)~=0)
d=k
(1);
forL=1:
length(k)
symbol=0;
fori=1:
n
if(length(d)==length(huff(i).code))
if(length(find(d==huff(i).code))==length(d))
transcode=[transcode,huff(i).ch];
k=k(length(d)+1:
end);
symbol=1;
end
end
ifsymbol==1
break;
end
end
ifsymbol==1
break;
elseiflength(k)-length(d)>0
d=[d,k(length(d)+1)];
else
transcode=[transcode,k];break;
end
end
end
end
pcm译码
functionS=ipcm(code)
len=length(code)/8;
w
(1)=0;
fork=2:
8
w(k)=2^(k+2);%段起始值[0,16,32,64,128,256,512,1024]
end
fori=1:
7
b(i)=(w(i+1)-w(i))/16;%每段的最小量化间隔
end
b(8)=1024/16;
S=[];
fori=1:
len
s=code((i-1)*8+1:
(i-1)*8+8);
t=bin2dec(s(2:
4))+1;%判断段落位置
y=bin2dec(s(5:
8));%判断段内地址
m=w(t)+(y+0.5)*b(t);
m=m/2048;
ifs
(1)==0%判断极性
m=-m;
end
S=[S,m];
end
functiona=bin2dec(x)%二进制转十进制
n=length(x);
sum=0;
fori=1:
n
sum=sum+x(i)*2^(n-i);
end
a=sum;
functiona=dec2bin(x,n)%将x转换为n位的二进制a
a=zeros(1,length(n));
fori=1:
n
ifx>=2^(n-i)
a(i)=1;
x=x-2^(n-i);
else
a(i)=0;
end
end
六、测试结果及分析:
信噪比为5时的重建模拟信号
信噪比为2时的重建模拟信号
信噪比为1时的重建模拟信号
对比不同信噪比情况下的重建信号可知,信噪比越大,信号恢复的质量越好。
七、实验体会:
通过本次实验我收获不少,使我对通信原理更加的了解了,尤其是模拟信号数字化这一块儿。
有了以前的matlab以及信息论与编码课程设计做铺垫,这次实验相比以往要更顺利一些。
但编码过程中还是遇到了一些问题。
比如抽样判决过程中,我一直有个问题不是很明白,为什么不取一个周期的平均值作为判决依据,而要取一个周期的某个点呢。
我觉得取平均值的话可以在一定程度上减小误差。
那么还希望老师能够解决我的这个疑问。
在测试不同信噪比情况下,信号恢复情况时我发现,同一信噪比情况下,出来的图也并不完全一样的。
我想是不是信道加噪的过程是随机的原因。
其间,程序出错了,自己改半天改不出来,最后还是在同学的帮助下解决的。
在此,非常的感谢她对我的帮助。
同时也体会到了互助的力量。
那么通过这次实验学到了不少,也希望自己以后可以通过自己的努力以及老师,同学的帮助学到更多的东西。
八、参考文献
[1]王立宁,乐光新等.Matlab与通信仿真[M],人民邮电出版社,2000.1
[2]JohnG.proakis等著,刘树棠译.现代通信系统(Matlab版)(第二版)[M],电子工业出版社,2006.9
[3]BernardSklar著,徐平平等译.数字通信-基础与应用(第二版)[M],电子工业出版社,2004.11
[4]樊昌信等.通信原理(第6版)[M].国防工业出版社,2008.3