通信系统仿真小论文.docx
- 文档编号:11985576
- 上传时间:2023-04-16
- 格式:DOCX
- 页数:12
- 大小:182.31KB
通信系统仿真小论文.docx
《通信系统仿真小论文.docx》由会员分享,可在线阅读,更多相关《通信系统仿真小论文.docx(12页珍藏版)》请在冰豆网上搜索。
通信系统仿真小论文
Huffman编码算法的实现
一、目的
1、学习Matlab软件的使用和编程;
2、进一步深入理解Huffman编码算法的原理;
3、提高独立进行算法编程的能力。
二、内容
1、用Matlab实现Huffman编码算法程序;
2、要求程序输出显示所有的码字以及编码效率;
3、设计简单的输入界面(可以是简单的文字提示信息),程序运行时提示用户输入代表信源符号概率的向量;要对用户输入的概率向量进行合法性检查。
三、原理
1、二进制Huffman编码的基本原理及算法
(1)把信源符号集中的所有符号按概率从大到小排队。
(2)取概率最小的两个符号作为两片叶子合并(缩减)到一个节点。
(3)视此节点为新符号,其概率等于被合并(缩减)的两个概率之和,参与概率排队。
(4)重复
(2)(3)两步骤,直至全部符号都被合并(缩减)到根。
(5)从根出发,对各分枝标记0和1。
从根到叶的路径就给出了各个码字的编码和码长。
2、程序设计的原理
(1)程序的输入:
以一维数组的形式输入要进行huffman编码的信源符号的概率,在运行该程序前,显示文字提示信息,提示所要输入的概率矢量;然后对输入的概率矢量进行合法性判断,原则为:
如果概率矢量中存在小于0的项,则输入不合法,提示重新输入;如果概率矢量的求和大于1,则输入也不合法,提示重新输入。
(2)huffman编码具体实现原理:
1>在输入的概率矩阵p正确的前提条件下,对p进行排序,并用矩阵L记录p排序之前各元素的顺序,然后将排序后的概率数组p的前两项,即概率最小的两个数加和,得到新的一组概率序列,重复以上过程,最后得到一个记录概率加和过程的矩阵p以及每次排序之前概率顺序的矩阵a。
2>新生成一个n-1行n列,并且每个元素含有n个字符的空白矩阵,然后进行huffman编码:
Ø将c矩阵的第n-1行的第一和第二个元素分别令为0和1(表示在编码时,根节点之下的概率较小的元素后补0,概率较大的元素后补1,后面的编码都遵守这个原则)
Ø然后对n-i-1的第一、二个元素进行编码,首先在矩阵a中第n-i行找到值为1所在的位置,然后在c矩阵中第n-i行中找到对应位置的编码(该编码即为第n-i-1行第一、二个元素的根节点),则矩阵c的第n-i行的第一、二个元素的n-1的字符为以上求得的编码值,根据之前的规则,第一个元素最后补0,第二个元素最后补1,则完成该行的第一二个元素的编码,
Ø最后将该行的其他元素按照“矩阵c中第n-i行第j+1列的值等于对应于a矩阵中第n-i+1行中值为j+1的前面一个元素的位置在c矩阵中的编码值”的原则进行赋值,重复以上过程即可完成huffman编码。
3>计算信源熵和平均码长,其比值即为编码密码效率。
四、Huffman编码的Matlab源程序
p=input('pleaseinputanumber:
')%提示输入界面
n=length(p);
fori=1:
n
ifp(i)<0
fprintf('\nTheprobabilitiesinhuffmancannotlessthan0!
\n');
p=input('pleaseinputanumber:
')%如果输入的概率数组中有小于0的值,则重新输入概率数组
end
end
ifabs(sum(p)-1)>0
fprintf('\nThesumoftheprobabilitiesinhuffmancanmorethan1!
\n');
p=input('pleaseinputanumber:
')%如果输入的概率数组总和大于1,则重新输入概率数组
end
q=p;
a=zeros(n-1,n);%生成一个n-1行n列的数组
fori=1:
n-1
[q,l]=sort(q)%对概率数组q进行从小至大的排序,并且用l数组返回一个数组,该数组表示概率数组q排序前的顺序编号
a(i,:
)=[l(1:
n-i+1),zeros(1,i-1)]%由数组l构建一个矩阵,该矩阵表明概率合并时的顺序,用于后面的编码
q=[q
(1)+q
(2),q(3:
n),1];%将排序后的概率数组q的前两项,即概率最小的两个数加和,得到新的一组概率序列
end
fori=1:
n-1
c(i,1:
n*n)=blanks(n*n);%生成一个n-1行n列,并且每个元素的的长度为n的空白数组,c矩阵用于进行huffman编码,并且在编码中与a矩阵有一定的对应关系
end
c(n-1,n)='0';%由于a矩阵的第n-1行的前两个元素为进行huffman编码加和运算时所得的最
c(n-1,2*n)='1';后两个概率,因此其值为0或1,在编码时设第n-1行的第一个空白字符为0,第二个空白字符1。
fori=2:
n-1
c(n-i,1:
n-1)=c(n-i+1,n*(find(a(n-i+1,:
)==1))-(n-2):
n*(find(a(n-i+1,:
)==1)))%矩阵c的第n-i的第一个元素的n-1的字符赋值为对应于a矩阵中第n-i+1行中值为1的位置在c矩阵中的编码值
c(n-i,n)='0'%根据之前的规则,在分支的第一个元素最后补0
c(n-i,n+1:
2*n-1)=c(n-i,1:
n-1)%矩阵c的第n-i的第二个元素的n-1的字符与第n-i行的第一个元素的前n-1个符号相同,因为其根节点相同
c(n-i,2*n)='1'%根据之前的规则,在分支的第一个元素最后补1
forj=1:
i-1
c(n-i,(j+1)*n+1:
(j+2)*n)=c(n-i+1,n*(find(a(n-i+1,:
)==j+1)-1)+1:
n*find(a(n-i+1,:
)==j+1))%矩阵c中第n-i行第j+1列的值等于对应于a矩阵中第n-i+1行中值为j+1的前面一个元素的位置在c矩阵中的编码值
end
end%完成huffman码字的分配
fori=1:
n
h(i,1:
n)=c(1,n*(find(a(1,:
)==i)-1)+1:
find(a(1,:
)==i)*n)%用h表示最后的huffman编码,矩阵h的第i行的元素对应于矩阵c的第一行的第i个元素
ll(i)=length(find(abs(h(i,:
))~=32))%计算每一个huffman编码的长度
end
l=sum(p.*ll);%计算平均码长
fprintf('\nhuffmancode:
\n');
h
hh=sum(p.*(-log2(p)));%计算信源熵
fprintf('\nthehuffmaneffciency:
\n');
t=hh/l%计算编码效率
五、程序运行结果
(1)如果输入正确的概率矢量,结果如下:
pleaseinputanumber:
[0.320.180.050.100.150.2]
p=
0.32000.18000.05000.10000.15000.2000
huffmancode:
h=
11
00
1010
1011
100
01
thehuffmaneffciency:
t=0.9774
(2)如果输入不正确的概率矢量,结果如下:
pleaseinputanumber:
[-0.20.50.30.4]
p=
-0.20000.50000.30000.4000
Theprobabilitiesinhuffmancannotlessthan0!
pleaseinputanumber:
[0.60.10.30.4]
p=
0.60000.10000.30000.4000
Thesumoftheprobabilitiesinhuffmancanmorethan1!
pleaseinputanumber:
[0.050.090.100.210.250.30]
p=
0.05000.09000.10000.21000.25000.3000
huffmancode:
h=
0110
0111
010
00
10
11
thehuffmaneffciency:
t=0.9894
六、总结
1、在该实验的过程中,利用一个矩阵记录每次排序前概率的所在位置,是该实验的关键,在编码的过程中利用该矩阵就能比较容易进行huffman编码。
2、通过这个实验,对huffman编码的具体实现原理了解的更加深刻,在实验的过程中也遇到了一些问题,通过查找资料和相关书籍得到了解决,总的来说,在完成该实验的过程中,还是学到了比较多的知识,包括使对一些matlab语句的掌握的更加熟练,完成一个算法必须要有一个整体的把握等等。
基于MATLAB的2ASK和2FSK调制仿真
二、目的:
(1)熟悉2ASK和2FSK调制原理。
(2)学会运用Matlab编写2ASK和2FSK调制程序。
(3)会画出原信号和调制信号的波形图。
(4)掌握数字通信的2ASK和2FSK的调制方式。
三、原理分析
1、二进制振幅键控(2ASK)
频移键控是利用载波的幅度变化来传递数字信息,而其频率和初始相位保持不变。
在2ASK中,载波的幅度只有两种变化状态,分别对应二进制信息“0”或“1”。
二进制振幅键控的表达式为:
s(t)=A(t)cos(w0+θ)0<t≤T
式中,w0=2πf0为载波的角频率;A(t)是随基带调制信号变化的时变振幅,即
当发送“0”时
当发送“1”时
A(t)=
典型波形如图1所示:
图1
2ASK信号的产生方法通常有两种:
相乘法和开关法,相应的调制器如图2。
图2(a)就是一般的模拟幅度调制的方法,用乘法器实现;图2(b)是一种数字键控法,其中的开关电路受s(t)控制。
在接收端,2ASK有两种基本的解调方法:
非相干解调(包络检波法)和相干解调(同步检测法),相应的接收系统方框图如图:
2、二进制频移键控(2FSK)
二进制频移键控信号码元的“1”和“0”分别用两个不同频率的正弦波形来传送,而其振幅和初始相位不变。
故其表达式为:
图42FSK信号时间波形
由图可见,2FSK信号的波形(a)可以分解为波形(b)和波形(c),也就是说,一个2FSK信号可以看成是两个不同载频的2ASK信号的叠加。
2FSK信号的调制方法主要有两种。
第一种是用二进制基带矩形脉冲信号去调制一个调频器,使其能够输出两个不同频率的码元。
第二种方法是用一个受基带脉冲控制的开关电路去选择两个独立频率源的振荡作为输出。
2FSK信号的接收也分为相关和非相关接收两类。
相关接收根据已调信号由两个载波f1、f2调制而成,则先用两个分别对f1、f2带通的滤波器对已调信号进行滤波,然后再分别将滤波后的信号与相应的载波f1、f2相乘进行相干解调,再分别低通滤波、用抽样信号进行抽样判决器即可。
原理图如下:
非相关接收经过调制后的2FSK数字信号通过两个频率不同的带通滤波器f1、f2滤出不需要的信号,然后再将这两种经过滤波的信号分别通过包络检波器检波,最后将两种信号同时输入到抽样判决器同时外加抽样脉冲,最后解调出来的信号就是调制前的输入信号。
其原理图如下图所示:
图5(b)非相干方式
四、仿真源程序和代码
a=[1,0,1,1,0,1];
subplot(3,1,1);stem(a);title('随机信号');
fori=1:
length(a)
t=i-1:
0.001:
i;
if(a(i)==1)
s=sin(2*pi*t);
end
if(a(i)==0)
s=0;
end
holdon;
subplot(3,1,2);plot(t,s);title('2ASK调制后的信号')
end
fori=1:
length(a)
t=i-1:
0.001:
i;
if(a(i)==1)
s=sin(2*pi*t);
end
if(a(i)==0)
s=sin(4*pi*t);
end
holdon;
subplot(3,1,3);plot(t,s);title('2FSK调制后的信号')
end
五、仿真结果
通过实验,我们在MATLAB平台上对数字信号的传输系统进行了一次仿真,有效的完善了学习过程中实践不足的问题,同时进一步巩固了原先的基础知识。
基本掌握了MATLAB的基本功能和使用方法,对数字基带传输系统有了一定的了解,加深了对2ASK和2FSK信号的调制原理的认识,理解了如何对他们进行调制,通过使用MATLAB仿真,对个调制和解调电路中各元件的特性有了较为全面的理解。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 通信 系统 仿真 论文