编码信道下的通信系统仿真,内部包含ppt、报告、matlab仿真程序

编码信道下的通信系统仿真,内部包含ppt、报告、matlab仿真程序《信息论》课外项目报告

编码信道下的通信系统仿真

项目报告撰写及成绩评定说明

考核环节权重(%)备注
项目20三个人一组,完成项目并提交报告。报告要包括:1.系统建模;2.通信过程仿真及结果分析;3.小组成员在项目中的分工及个人心得。评分标准:1.教师评分 50%;2.小组互评 50%;
  注:请各组独立完成,禁止相互抄袭。

同学们利用课后时间自行完成。择日统一答辩,每组派一个代表制作PPT答辩。

项目说明

项目名称:编码信道下的通信系统仿真。

由于搭建一个完整通信系统的工作量较大,所以本实验可以使用Matlab等仿真工具。下面分别描述系统中各模块的需求。

①离散信源:能以指定的概率分布(p,1-p)产生0,1符号构成的二进制信源符号序列。

②信源编码器:信源编码器的输入是上一步产生的二进制符号序列。要求:能选择使用无编码(直通)、二进制香农编码、二进制霍夫曼编码、二进制费诺编码这四种编码方式中的任何一种。

在上一步指定信源的概率分布后,就可以马上生成这三种编码的码表,实际的编码工作只是查表而已。当然,直接对上一步指定的信源进行编码是不合适的,需要先进行信源的扩展,换句话说,需要确定信源分组的长度。这个长度N也是本系统的一个重要参数,是在系统运行之前由用户输入的。

③信道编码器:信道编码器的输入是信源编码器输出的二进制符号序列。编码方式要求能选择使用无编码、三次重复编码、Hamming(7,4)码这三种信道编码方式中的任何一种。

信道编码器是个简单的一一对应的函数转换模块,没有额外的控制参数,可以事先实现这三种编码器,统一其输入输出格式,运行时按照指定的类型直接使用即可。

④信道:其输入是信道编码器输出的二进制符号序列。经过传输后输出被噪声干扰和损坏了的二进制符号序列。要求能够模拟理想信道、给定错误概率p的BSC以及给定符号0、1各自错误概率p、q的任意二进制信道

⑤信道译码器:由于信源经过信源编码器和信道编码器后的统计特性难以明确给出,所以此时理想译码器准则无法实施。因此,根据第四步给出的信道统计特性,采用极大似然译码准则进行译码。

⑥信源译码器:在第二步确定信源编码器后,即可同时确定信源译码器。信源译码器的工作仅仅是简单的查表。

要求:

  1. 输入:各模块的相关参数。
  2. 输出:信源产生的原始符号序列、信源译码器输出的符号序列、信道编码后的信息传输效率、整个通信过程的误比特率(BER)以及信道编译码过程中产生的误码率(BLER)。

提示:

  1. 本实验中的信源模块部分都会用到随机数的产生。各种编程语言基本都提供了这个功能。
  2. Matlab是一个优秀的系统仿真软件,而Simulink是Matlab中最著名的通信工具箱。上述实验要求中的很多功能有Matlab或Simulink已经实现并提供了方便的调用接口。例如二进制对称信道,在Matlab中就有一个bse()函数完成了这个功能。同学们在设计、开发这个实验前应该花一些时间先熟悉Matlab及Simulink。

一、模块描述

概述:通过对通信系统的背景做了简单介绍,进而详细分析了系统的架构、以及系统的构成和工作原理,之后使用了MATLAB软件来建模,构建了通信系统的模型,明确了系统的设计方向,按功能将整个系统划分为6个模块,即随机序列的生成、信源编码器、信道、信道编码器、信道译码器、信源译码器。

图1 系统流图

整个系统的框图如上所示。

1.离散信源

离散信源我们采用了MATLAB中的randsrc函数,随机生成了一长串由0和1组成的二进制符号序列,其中0和1各个概率分别为p,1-p。选择的依据为:无记忆是因为信源输出信息之间相互独立,扩展信源计算概率的时候可以将0和1的概率直接相乘,方便计算扩展信源的概率分布。

2.信源编码

将信源输出符号变换成另外的压缩符号,然后将压缩后信息传送给信道编码,并记录下序列长度,方便下面信道编码。

其编码原理如下:

  1. 首先将信源符号集中的符号按概率大小从大到小排列。
  2. 用0和1表示概率最小的两个符号。可用0表示概率小的符号,也可用 1表示概率小的符号,但整个编码需保持一致。
  3. 将这两个概率最小的符号合并成一个符号,合并符号概率为最小概率之和,将合并后符号与其余符号组成一个N-1的新信源符号集,称之为缩减符号集。
  4. 对缩减符号集用步骤1,2操作。

5.以此类推,直到只剩两个符号,将0和1分别赋予它们。

6.根据以上步骤,得到0,1赋值,画出Huffman码树,并从最后一个合并符号回朔得到Huffmaan编码。

3.信道编码器

(7,4)汉明码的编码就是将输入的四位信息码编成七位的汉明码,即加入三位监督位。一般来说,若汉明码长为n,信息位数为k,则监督位数r=n-k。若希望用r个监督位构造出r个监督关系式来指示一位错码的n种可能位置,则要求 2r-1≥n或2-1≥k+r+1。

在通信系统信号传输的过程中由于外界的干扰,可能会产生误码,利用Hamming(7,4)码的纠错和抗干扰能力避免这种情况,提高信道的可靠性。Hamming(7,4)码性能好,编码电路简单,易于实现,提高系统可靠性,而且能够自动检测并纠正一重错。

4.信道

输入是信道编码器输出的二进制符号序列。经过传输后输出被噪声干扰和损坏了的二进制符号序列。要求能够模拟理想信道、给定错误概率p的BSC以及给定符号0、1各自错误概率p、q的任意二进制信道。错误概率小信道噪声小,干扰少,可靠性大,信道容量大,传输速率快。

5.信道译码器

由于信源经过信源编码器和信道编码器后的统计特性难以明确给出,所以此时理想译码器准则无法实施。因此,根据第四步给出的信道统计特性,采用极大似然译码准则进行译码。

译码参数和方式和编码时相同。根据校验矩阵来进行最后的差错纠正,然后输出恢复出的二进制序。最佳译码规则平均差错率最小的译码规则,它有两种译码规则:按“后验概率最大”原则定出,又称最大后验概率译码规则 ;按“联合概率最大”原则定出,又称最大联合概率译码规则。

6.信源译码器

把信道译码器输出的代码组变换成信宿所需要的消息形式,它的作用相当于信源编码器的逆过程。在第二步确定信源编码器后,即可同时确定信源译码器。信源译码器的工作仅仅是简单的查表,把信源函数编译出来。根据上面的信源编码器选择,相互照应使译码顺利完成。

二、仿真过程及仿真结果分析

1. 离散序列信号生成

利用库函数randsrc来生成一串0和1概率可调的随机序列。randsrc函数可直接产生一组一行k列并且0,1按概率分布的随机序列。因此直接可产生随机随机序列.对应程序如下:

sample=100;%给定独立二进制信源[0,1]的样本数

N=4%设定最大扩展阶数

p=0.4;%设定符号0的概率

zao=0.0

x=randsrc(1,sample,[0,1;p,1-p]);

对应结果如下:

图2 产生的随机序列

2.无记忆的N阶扩展信源

分别输入样本数,扩展阶数和0的概率等一些变量赋值, 然后通过0和1概率来确定扩展以后所对应的概率分布,并将这些值存到H元胞里。

sample=160;%给定独立二进制信源[0,1]的样本数

N=8设定最大扩展阶数

p=0.4;%设定符号0的概率

zao=0.0

x=randsrc(1,sample,[0,1;p,1-p]);

%离散无记忆N次扩展

for i=1:2^N

H{1,i}=i-1;

H{2,i}=dec2base(H{1,i},2,N);

H{3,i}=sum(H{2,i}=='1');

H{4,i}=((1-p)^(H{3,i}))*(p)^(N-H{3,i});

Y(1,i)= H{4,i};

end

图3 仿真H元胞变量值

3 二进制霍尔曼编码

将N次扩展产生的概率进行霍夫曼编码生成,生成新的码表,然后将码表和其对应的码长填入到H元胞中,然后对序列进行分组,并在H中查询,然后将查询到新序列存到mm中。

对应程序如下:

%创建霍夫曼编码字典

symbols=[1:2^N];

[dict, avglen] = huffmandict(symbols,Y);%返回码表字典和字典中字符串平均长度

%将字典里面的数据放入H元胞

for i=1:2^N

H{5,i}=num2str(dict{i,2});

H{5,i}=strrep(H{5,i},' ', '');

H{6,i}=length(H{5,i});

end

%将所传信源按照N次扩展分组进行编码

M=floor(sample/N);

for i=1:M

W{1,i}=x(N*(i-1)+1:N*(i-1)+N);

F{1,i}=num2str(W{1,i});

F{1,i}=strrep(F{1,i},' ', '');

for j=1:2^N

if F{1,i}==H{2,j};

F{2,i}=H{5,j};

end

end

F{3,i}=length(F{2,i});

end

%将编完的码合成一个序列

for j=1:M

for i=1:length(F{2,j})

if i==1&&j==1

b=F{2,j}(i);

else

b=[b,F{2,j}(i)];

end

end

end

mm=b-48;%转换为数值型矩阵

对应结果如下:

图4 码表及码长

图5 新序列mm

4.汉明编码

将信源编码的新序列进行分组,将其拆分成n*4的矩阵han,当编码序列长度不能被4整除的时候,将向下取整,然后利用encode函数对该矩阵进行汉明编码,产生新的矩阵code,其编码效率为4/7。

对应程序如下:

%将序列进行四个一组进行分组

for i=1:floor(length(mm)/4)

han(i,:)=mm(4*(i-1)+1:4*(i-1)+4);

end

m=3;%给定m=3的汉明码

[h,g,n,k]=hammgen(m);

code=encode(han,n,k,'hamming/binary');%编码

对应结果如下:

图6 拆分后矩阵han

图7 编码产生新矩阵code

5.信道

将信道编码产生的矩阵通过BSC信道来进行传输,可以利用bsc函数来更改其中对0和1的噪声概率,然后生成新的矩阵R,并计算错误的个数numerrs和信道误码率BLER,本次采用的概率为0.1。

对应程序如下:

%加噪声

R = bsc(code,zao); % Binary symmetric channel

[numerrs, BLER] = biterr(code,R) % Number and percentage of errors

图8 输出矩阵R

图9 输出的numerrs和BLER

6.信道译码器

这里依然采用汉明译码,对信道传输过来的R进行译码,并将新的矩阵存储到newmsg。

%解码

C=mod(R*h',2); %对伴随式除2取余数

newmsg=decode(R,n,k,'hamming/binary'); %解码

图10 译码矩阵newmsg

7.信源译码器

为了能够对其进行信源译码,需要先将H矩阵按照码长进行升序排列,然后存到T中,然后对其进行译码,最后合并到zui矩阵中。

对应程序如下:

%计算原来每个编码长度

[m2,n2]=size(newmsg);

D2 = newmsg(1,:);

for i=2:m2

D2=[D2,newmsg(i,:)];

end

T=H;

T=sortrows(T',6);

T=T';

D3=D2;

daxiao=length(D3);

weizhi=1;

%查询码表

while daxiao>T{6,2^N}

flag=0;

for i=1:T{6,2^N}

LK=D3(1,1:i);

bi{1,1}=num2str(LK);

bi{1,1}=strrep(bi{1,1},' ', '');

for j=1:2^N

if strcmp(bi{1,1},T{5,j})

D3=D3(1,i+1:daxiao);

daxiao=length(D3);%重新计算大小

yima{1,weizhi}=T{2,j};

weizhi=weizhi+1;

flag=1;

break;

end

end

if flag==1

break;

end

end

% if flag==0&&daxiao>T{6,2^N}

% break;

% end

end

%还原信源

zui=[];

for j=1:length(yima)

for i=1:N

if length(yima{1,j})~=0

if i==1&&j==1

zui=yima{1,j}(i);

else

zui=[zui,yima{1,j}(i)];

end

else

break;

end

end

end

对应结果如下:

图11 升序矩阵T

图12 译码序列zui

8.序列比较

将初始序列和输出序列进行比较,得到误比特率BER和比较的散点图(实心点位原序列,空心点为输出序列)。

%最后译码

zui=zui-48;

kuan=length(zui);

if kuan>sample

kuan=sample;

end

error=0;

for i=1:kuan

if zui(1,i)~=x(1,i)

error=error+1;

end

end

BER=error/kuan;

plot(zui(1,:),'o');

hold on

plot(x(1,:),'.');

xlim([1,sample]);%只设定x轴的绘制范围

set(gca,'XTick',[0:5*sample/100:sample]) ;

ylim([-1, 3]);%只设定x轴的绘制范围

set(gca,'YTick',[-1:1:3]) ;

对应结果如下:

图13 误比特率

图14 散点图

三、小组成员在项目中的分工及个人心得

1.组长及组员的分工情况

组长 :徐光涛:主要负责编写程序,解答组员疑惑,报告答辩。

组员: 朱一飞:负责程序的运行仿真与程序改错,制作ppt;

组员: 闵玮亮:负责修改逻辑错误与报告的编写。

每个人的完成情况

都较好的完成每个人应该有的部分,还互相帮助,使报告质量能以更高水平。

个人心得

徐光涛:通过这次大作业使我对MATLAB的应用更加熟练了,同时对信息的传递过程有了更加神的理解,在本次通信系统仿真设计中,我们对霍夫曼编码、汉明码编码包括原理、适用条件、编码步骤等相关基础知识进行了系统的复习,清楚的意识到编码的意义和重要性,提高了整体合作能力和作业完成的效率。

朱一飞:通过编程实现通信系统的仿真,对每一部分的功能作用都得到领会,对如何选择,选择要求也得到体会,并对各个模块的功能和联系有了更加深刻的理解此次设计使通信系统的理论和实践相结合,也为以后的毕业设计和工作打下基础。在这个过程中同学们的通力合作冲破难关更对我是一次非常有意思的体验。非常感谢老师。

闵玮亮:这一次的大作业让我对MATLAB汇编有了更加深刻的理解,也从组长那儿学到了很多的编程知识,自己的能力有了一定的提升,对信息传递的各方面也有了更多的了解,期间和我的组员积极合作,都有效的完成了自己的工作,总体上获得了进步。


附录

clear all

sample=100;%给定独立二进制信源[0,1]的样本数

N=8;%设定最大扩展阶数

p=0.4;%设定符号0的概率

zao=0.1;

x=randsrc(1,sample,[0,1;p,1-p]);

%离散无记忆N次扩展

for i=1:2^N

H{1,i}=i-1;

H{2,i}=dec2base(H{1,i},2,N);

H{3,i}=sum(H{2,i}=='1');

H{4,i}=((1-p)^(H{3,i}))*(p)^(N-H{3,i});

Y(1,i)= H{4,i};

end

%创建霍夫曼编码字典

symbols=[1:2^N];

[dict, avglen] = huffmandict(symbols,Y);%返回码表字典和字典中字符串平均长度

%将字典里面的数据放入H元胞

for i=1:2^N

H{5,i}=num2str(dict{i,2});

H{5,i}=strrep(H{5,i},' ', '');

H{6,i}=length(H{5,i});

end

%将所传信源按照N次扩展分组进行编码

M=floor(sample/N);

for i=1:M

W{1,i}=x(N*(i-1)+1:N*(i-1)+N);

F{1,i}=num2str(W{1,i});

F{1,i}=strrep(F{1,i},' ', '');

for j=1:2^N

if F{1,i}==H{2,j};

F{2,i}=H{5,j};

end

end

F{3,i}=length(F{2,i});

end

%将编完的码合成一个序列

for j=1:M

for i=1:length(F{2,j})

if i==1&&j==1

b=F{2,j}(i);

else

b=[b,F{2,j}(i)];

end

end

end

mm=b-48;%转换为数值型矩阵

%将序列进行四个一组进行分组

for i=1:floor(length(mm)/4)

han(i,:)=mm(4*(i-1)+1:4*(i-1)+4);

end

m=3;%给定m=3的汉明码

[h,g,n,k]=hammgen(m);

code=encode(han,n,k,'hamming/binary');%编码

%加噪声

R = bsc(code,zao); % Binary symmetric channel

[numerrs, BLER] = biterr(code,R) % Number and percentage of errors

%解码

C=mod(R*h',2); %对伴随式除2取余数

newmsg=decode(R,n,k,'hamming/binary'); %解码

%计算原来每个编码长度

[m2,n2]=size(newmsg);

D2 = newmsg(1,:);

for i=2:m2

D2=[D2,newmsg(i,:)];

end

T=H;

T=sortrows(T',6);

T=T';

D3=D2;

daxiao=length(D3);

weizhi=1;

%查询码表

while daxiao>T{6,2^N}

flag=0;

for i=1:T{6,2^N}

LK=D3(1,1:i);

bi{1,1}=num2str(LK);

bi{1,1}=strrep(bi{1,1},' ', '');

for j=1:2^N

if strcmp(bi{1,1},T{5,j})

D3=D3(1,i+1:daxiao);

daxiao=length(D3);%重新计算大小

yima{1,weizhi}=T{2,j};

weizhi=weizhi+1;

flag=1;

break;

end

end

if flag==1

break;

end

end

% if flag==0&&daxiao>T{6,2^N}

% break;

% end

end

%还原信源

zui=[];

for j=1:length(yima)

for i=1:N

if length(yima{1,j})~=0

if i==1&&j==1

zui=yima{1,j}(i);

else

zui=[zui,yima{1,j}(i)];

end

else

break;

end

end

end

%最后译码

zui=zui-48;

kuan=length(zui);

if kuan>sample

kuan=sample;

end

error=0;

for i=1:kuan

if zui(1,i)~=x(1,i)

error=error+1;

end

end

BER=error/kuan;

plot(zui(1,:),'o');

hold on

plot(x(1,:),'.');

xlim([1,sample]);%只设定x轴的绘制范围

set(gca,'XTick',[0:5*sample/100:sample]) ;

ylim([-1, 3]);%只设定x轴的绘制范围

set(gca,'YTick',[-1:1:3]) ;

  • 8
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值