-
2021-05-25 01:39:12
摘要
本课程设计介绍了(7,3)循环码的编译与译码原理,用C语言编程实现其编码与译码功能。通过C语言平台运用所编写的程序,输入任意的数字信息序列,得出了编码结果。着重在无差错和部分差错的情况下进行了译码,并对译码结果进行分析。
关键词:循环码、C语言、编译码
目录
一、计算机通信1
1.1通信的概念?1
1.2计算机通信介绍?1
二、系统设计2
2.1循环码2
2.2 编码原理5
2.3译码原理6
2.4循环码译码的设计?6
2.5纠错码?7
三、设计结果及分析9
3.1程序运行结果9
3.2运行结果理论分析11
3.3软件可行性分析12
四、总结13
参考文献14
附:程序清单15
一、计算机通信
1.1通信的概念?
通信就是克服距离上的障碍,从一地向另一地传递和交换消息。消息是信息源所产生的,是信息的物理表现,例如,语音、文字、数据、图形和图像等都是消息(Message)。消息由模拟消息(如语音、图像等)以及数字消息(如数据、文字等)之分。所有消息必须在转换成电信号(通常简称为信号)后才能在通信系统中传输。所以,信号(Signal)是传输消息的手段,信号是消息的物资载体。?
相应的信号可以分为模拟信号和数字信号,模拟信号的自变量可以是连续的或离散的,但幅度是连续的,如电话机、电视摄像机输出的信号就是模拟信号。数字信号的自变量可以是连续的或离散的,但幅度是离散的,如计算机等各种数字终端设备输出的信号就是数字信号。?
通信的目的是传送消息,但对受信者有用的是消息中包含的有效内容,即信息(Information)。消息是具体的、表面的,而信息是抽象的、本质的,且消息中包含的信息的多少可以用信息量来度量。通信技术,特别是数字通信技术近年来发展非常迅速,它的应用越来越广泛。?
数字通信系统较模拟通信系统而言,具有抗干扰能力强、便于加密、易于实现集成化、便于与计算机连接等优点。因而,数字通信更能适应对通信技术的高要求。??
1.2计算机通信介绍?
计算机通信是一种以数据通信形式出现,在计算机与计算机之间或计算机与终端设备之间进行信息传递的方式。它是现代计算机技术与通信技术相融合的产物,在军队指挥自动化系统、武器控制系统、信息处理系统、决策分析系统、情报检索系统以及办公自动化系统等领域得到了广泛应用。计算机通信按照传输连接方式的不同,可分为直接式和间接式两种。直接式是指将两部计算机直接相联进行通信,可以是点对点,也可以是多点通播。间接式是指通信双方必须通过交换网络进行传输。??按照通信覆盖地域的广度,计算机通信通常分为局域式、城域式和广域式三类。局域式是指在一局部的地域范围内(例如一个机关、学校、军营等)建立计算机通信。局域计算机通信覆盖地区的直径在数公里以内。城域式是指在一个城市范围内所建立的计算机通信。城域计算机通信覆盖地区的直径在十公里到数十公里。广域式是指在一个广泛的地域范围内所建立的计算机通信。通信范围可以超越城市和国家,以至于全球。广域计算机通信覆盖地区的直径一般在数十公里到数干公里乃至上万公里。在通常情况下,计算机通信都是由多台计算机通过通信线路连接成计算机通信网进行的,这样可共享网络资源,充分发挥计算机系统的效能。
二、系统设计
2.1循环码
循环码是线性分组码的一种,所以它具有线性分组码的一般特性,此外还具有循环性。循环码的编码和解码设备都不太复杂,且检(纠)错能力强。它不但可以检测随机的错误,还可以检错突发的错误。(n,k)循环码可以检测长为n-k或更短的任何突发错误,包括首尾相接突发错误。?
循环码是一种无权码,循环码编排的特点是相邻两个数码之间符合卡诺图中的邻接条件,即相邻两个数码之间只有一位码元不同,码元就是组成数码的单元。符合这个特点的有多种方案,但循环码只能是表中的那种。循环码的优点是没有瞬时错误,因为在数码变换过程中,在速度上会有快有慢,中间经过其它一些数码形式,称它们为瞬时错误。这在某些数字系统中是不允许的,为此希望相邻两个数码之间仅有一位码元不同,即满足邻接条件,这样就不会产生瞬时错误。循环码就是这样一种编码,它可以在卡诺图中依次循环得到。循环码又称格雷码(Grey Code)。
2.1.1循环码的定义
循环码既是采用循环移位特性界定的一类线性分组码,循环码是一种线性代数分组码,记为(n,k)码,其中n为码长,k为信息码元数。
如果一个线性分组码的任意一个码字c(n元组)都是一个码字c?的循环移位,那么称此线性分组码为一个循环码。
2.1.2循环码的特点
若是一个码字,则它的循环移位也是一个码字。
循环码是线性分组码的一种,所以它具有线性分组码的一般特性,此外还具有循环性。循环码的编码和解码设备都不太复杂,且检(纠)错能力强。它不但可以检测随机的错误,还可以
更多相关内容 -
基于MATLAB的循环码编译码实现
2018-11-08 11:59:03本文件为循环码编码和译码的m文件,里面含有关键性注释,方便学习和参考 -
Matlab模拟循环编码译码
2022-03-30 12:01:19Matlab模拟循环编码译码 2 部分代码 function [ C_decode ] = Jiaoyanzi_decode( n,k,R,gx )%UNTITLED2 Summary of this function goes here% Detailed explanation goes here% n 码字长度,k为信息为长度,R为...1 简介
Matlab模拟循环编码译码
2 部分代码
function [ C_decode ] = Jiaoyanzi_decode( n,k,R,gx )
%UNTITLED2 Summary of this function goes here
% Detailed explanation goes here
% n 码字长度,k为信息为长度,R为接收码字序列,gx为生成多项式序列
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%校验子译码%
g=zeros(1,n-k+1);
for i=1:n-k+1 %倒序的生成多项式 对应的多项式为:1+x+x3 生成多项式序列后面为高位
g(i)=gx(n-k+1+1-i);
end
R1=zeros(1,n);
for i=1:n
R1(i)=R(n+1-i); %将循环码cm进行正序,因为我们习惯码字序列高位在前,低位在后。
end
p=2;
[q,s]=gfdeconv(R1,g,2); %gfdeconv函数输入和输出的多项式的对应的序列后面为高位。 移位后的m(x)与g(x)做模2除法得到商q和余式r(x)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
[s1,s2]=size(s);
if s2==3 %将S校验子序列转化为十进制数
SS=4*s(3)+2*s(2)+s(1);
elseif s2==2
SS=2*s(2)+s(1);
elseif s2==1
SS=s(1);
end
if SS==0
EE=[0,0,0,0,0,0,0];
elseif SS==1
EE=[0,0,0,0,0,0,1];
elseif SS==2
EE=[0,0,0,0,0,1,0];
elseif SS==4
EE=[0,0,0,0,1,0,0];
elseif SS==3
EE=[0,0,0,1,0,0,0];
elseif SS==6
EE=[0,0,1,0,0,0,0];
elseif SS==7
EE=[0,1,0,0,0,0,0];
elseif SS==5
EE=[1,0,0,0,0,0,0];
end
map=find(EE==1); %确定接收码字错误的位置
R(map)=~R(map); %错误码字译码
C_decode=R;
end
3 仿真结果
4 参考文献
[1]段晓霞. 基于MATLAB编码的PCM编译码实现[J]. 廊坊师范学院学报:自然科学版, 2019, 19(4):5.
博主简介:擅长智能优化算法、神经网络预测、信号处理、元胞自动机、图像处理、路径规划、无人机等多种领域的Matlab仿真,相关matlab代码问题可私信交流。
部分理论引用网络文献,若有侵权联系博主删除。
-
(7,3)循环码编码译码
2021-05-20 15:44:12#include/*函数声明*/void Begin();.../*主函数*/main(){printf("\n (7,3)循环码的编码和译码\n ");Begin();}/*进行编码*/void Code(){int Input[3];int Output[7];int reg[4]={0,0,0,0};int temp,i,j,t;printf...#include/*函数声明*/
void Begin();
void Code();
void Decoding();
/*主函数*/
main()
{
printf("\n (7,3)循环码的编码和译码\n ");
Begin();
}
/*进行编码*/
void Code()
{
int Input[3];
int Output[7];
int reg[4]={0,0,0,0};
int temp,i,j,t;
printf("请输入3位信息码(输入3次,一次一位) :");
for(i=0;i<3;i++)
scanf(" %d",&Input[i]); /*输入3位信息码*/
for(i=0;i<3;i++) /*进行除法操作*/
{temp=reg[3]+Input[i]; /*生成多项式为g(x)=x^4+x^3+x^2+1*/
if(temp==2) temp=0;
reg[3]=reg[2]+temp;
if(reg[3]==2)reg[3]=0;
reg[2]=reg[1]+temp;
if(reg[2]==2)reg[2]=0;
reg[1]=reg[0];
reg[0]=temp;
}
for(i=0;i<3;i++) Output[i]=Input[i]; /*进行编码操作*/
for(i=3;i<7;i++)
{
temp=reg[3];
for(j=3;j>0;j--)
reg[j]=reg[j-1];
reg[0]=0;
Output[i]=temp;
}
printf("________________________________________");
printf("\n");
printf(" 编码结果: \n");
for(i=0;i<7;i++)
printf( " %d ",Output[i]); /*输出编码结果*/
printf("\n");
printf("________________________________________");
printf("\n");
Begin();
}
/*译码并进行纠检错*/
void Decoding()
{ int Input[7],Output[7];
int reg[4]={0,0,0,0,};
int temp,i,d,x,p;
printf("\n请输入7位码字(一次一位,输入7次):");
for(i=0;i<7;i++)
scanf(" %d",&Input[i]); /*输入接受码组*/
for(i=0;i<7;i++) /*进入除法电路*/
{temp=reg[3]; /*计算伴随式S(x)*/
reg[3]=reg[2]+temp;
if(reg[3]==2)reg[3]=0;
reg[2]=reg[1]+temp;
if(reg[2]==2)reg[2]=0;
reg[1]=reg[0];
reg[0]=temp+Input[i];
if(reg[0]==2)reg[0]=0;
}
p=reg[3]+2*reg[2]+4*reg[1]+8*reg[0];
if(p!=1&&p!=2&&p!=3&&p!=7&&p!=8&&p!=13&&p!=14&&p!=0)
{ /*输入错误位数大于2位*/
printf(" \"The error >=2\" \n");
getchar();
exit(0);
}
printf("___________________________________________\n");
printf("s(x)=");
for(i=3;i>=0;i--)
printf(" %d",reg[i]);
printf("\n");
for(i=0;i<7;i++) /*纠正一位错误*/
{d=reg[3]*reg[2]*reg[1]*(!reg[0]);
Output[i]=d+Input[i];
if(Output[i]==2) Output[i]=0;
temp=reg[3];
x=0; /*S(x)进行自发运算以求得错误位数*/
reg[3]=temp+reg[2];
if(reg[3]==2)reg[3]=0;
reg[2]=reg[1]+temp;
if(reg[2]==2)reg[2]=0;
reg[1]=reg[0];
reg[0]=temp+x;
} /*输出3位信息源*/
printf("The decoding bit3 is:");
for(i=0;i<3;i++)
printf(" %d ",Output[i]);
printf("\n");
printf("The Decoding bit7 is:"); /*输出7位译码结果*/
for(i=0;i<7;i++)
printf(" %d ",Output[i]);
printf("\n");
printf("___________________________________________\n");
Begin();
}
/*选择操作*/
void Begin()
{
fflush(stdin);
char ch;
printf(" -----------------------------------------------------------------");
printf("\n");
printf(" -- 输入c开始编码 --");
printf("\n");
printf(" -- 输入d开始译码 --");
printf("\n");
printf(" -- 输入e离开程序 --");
printf("\n");
printf(" -----------------------------------------------------------------");
printf("\n");
ch=getchar();
if(ch=='c') Code();
else if(ch=='d') Decoding();
else if(ch=='\n') Begin();
else if(ch=='e') exit(0);
else {printf("\"input error\"\n"); fflush(stdin);Begin();} /*输入错误提示*/
}
-
循环码_循环码编译码实现_
2021-09-30 12:22:21MATLAB实现循环码编译码过程,有文档介绍,简单易懂 -
(15_7)循环码的编译码方法
2021-05-14 21:42:04论文+代码+实验结果 -
(7,3)循环码编码、译码的实现
2011-06-22 18:08:36简单的实现(7,3)循环码的编码、译码,课程设计用的 -
循环码编译码matlab程序.docx
2021-02-07 02:48:28循环码编译码matlab程序循环码编码程序function [ C ] = cyclic_encoder( Si )%C为循环编码的输出编码结果%对x^8+1进行模2因式分解得到:x^8+1=(x^3+x^2+x+1)*(x^5+x^4+x+1)y=size(Si,2);%y表示Si的列数,即输入码元...循环码编译码matlab程序
循环码编码程序
function [ C ] = cyclic_encoder( Si )
%C为循环编码的输出编码结果
%对x^8+1进行模2因式分解得到:x^8+1=(x^3+x^2+x+1)*(x^5+x^4+x+1)
y=size(Si,2);%y表示Si的列数,即输入码元的个数
M=ceil(y/5);%将信息码元分成M帧,一帧5个信息码元
n=8;%循环编码的一帧码长
k=5;%信息位的个数
r=n-k;%监督位的个数
gx=[1,1,1,1];%(8,5)循环码的生成多项式g(x)=x^3+x^2+x+1
Ai=zeros(1,8*M);%Ai用来存放所输入的码元经过循环编码后的码字
Axi=zeros(1,8);%Axi用来表示循环编码后的一帧的编码输出码字
mi=zeros(1,5);%mi用来存放每一帧的信息码元
for i=1:M
for j=1:5
mi(j)=Si(j+(i-1)*5);
end
Axi(4:8)=mi(1:5);
Axi=circshift(Axi',-r)';%实现(x^(n-k))*m(x),其中m(x)的系数由mi决定
[qx,rx]=deconv(Axi,gx);%实现((x^(n-k))*m(x))/g(x),得到商q(x)和余数r(x)
Axi=Axi+rx;%实现Axi(x)=Axi(x)+r(x),得到的Axi就是循环编码的编码输出码字
Ai(8*i-4:8*i)=Axi(1:5);
Ai(8*i-7:8*i-5)=Axi(6:8);
end
%for循环是为了实现模2相加,使循环编码的输出码字Ai中只有0,1
for i=1:8*M
if rem(abs(Ai(i)),2)==0
Ai(i)=0;
else
Ai(i)=1;
end
end
C=Ai;%循环编码的输出码字C=Ai
end
循环码译码程序
function [ So ] = cyclic_decoder( R )
%输入R为经AWGN信道传输后的二进制信息,So为循环译码器的译码结果
R=1*(R>0.5);%对接收到的信号进行抽样判决
y=size(R,2);%y表示R的列数,即输入码元的个数
M=ceil(y/8);%将接收到的码元R分成M帧,一帧8个码元
So=zeros(1,5*M);%用来存放纠检错之后的译码结果
Axo=zeros(1,8);%用来存放纠检错之后每一帧的译码结果
%对接收信号进行纠检错译码
n=8;%循环编码的码长
k=5;%信息位的个数
r=n-k;%监督位的个数
s=zeros(1,3);%用来存放校正子s
h=[1,1,0,0,1,1];%监督多项式h(x)=x^5+x^4+x+1
hn=[];%hn(x)为监督多项式h(x)的逆多项式,hn用来放hn(x)的各项系数
for i=2:5
hn(i)=h(k+2-i);
end
hn(1)=h(1);
hn(6)=h(6);
%计算监督矩阵H
H=zeros(r,n);%监督矩阵H为r*n阶矩阵
H0=zeros(1,n);%用来存放hn(x)的系数
H1=zeros(1,n);%用来存放x*hn(x)的系数
H2=zeros(1,n);%用来存放x^2*hn(x)的系数
H0(3:8)=hn(1:6);
H1(2:7)=hn(1:6);
H2(1:6)=hn(1:6);
H(1,:)=H2(1:8);
H(2,:)=H1(1:8);
H(3,:)=H0(1:8);
flag=0;%出错的标志,为1表示检测出错误
for i=1:M
for j=1:8
Axo(j)=R(j+(i-1)*8);
end
s=Axo*H';%计算校正子s
for k=1:3
if rem(abs(s(k)),2)==0
s(k)=0;
else
s(k)=1;
end
end
if s==[0 0 0]
if flag==0
flag=0;
end
else
flag=1;
end
for k=1:8
if rem(abs(Axo(k)),2)==0
Axo(k)=0;
else
Axo(k)=1;
-
循环码编译码
2021-02-21 10:52:34循环码编译码写前感言内容功能模块结果展示代码说明计算码字次数功能快捷键译码手动测试模块自动测试模块主函数调用完整代码 写前感言 我现在是一名即将毕业的大四本科生,大学生活快要结束了,我整理四年学习资料时... -
基于MATLAB的循环码编译码器设计与仿真胡鑫.pdf
2021-10-02 14:19:38基于MATLAB的循环码编译码器设计与仿真胡鑫.pdf -
循环码产生电路设计.doc
2021-05-20 08:06:11循环码具有许多特殊的代数性质,这些性质有助于按照要求的纠错能力系统地构造这类码,并且简化译码算法,并且目前发现的大部分线性码与循环码有密切关系。循环码还有易于实现的特点,很容易用带反馈的移位寄存器实现... -
(15,7)循环码的编译码方法
2021-05-14 21:45:14此次课程设计题目是(15,7)循环码的编译码方法,首先介绍了线性分组码的编译码原理;其次在matlab平台下,完成了任意码的编码和译码,并求出该码的最小码距以及其纠错能力;最后分析了该码在高斯信道下的误码性能。... -
数据结构-循环码的编码与译码-实验报告.docx
2021-08-27 22:19:55数据结构-循环码的编码与译码-实验报告.docx -
基于MATLAB的循环码实验报告.doc
2021-04-20 02:46:41基于MATLAB的循环码实验报告基于Matlab循环码编码方法的应用叶俊(指导老师,刘...本文主要介绍了循环码的编码和译码的基本编码原理,纠错能力及其在Matlab中的实现及应用。关键词:循环码 编码 MatlabThe Applicat... -
利用Matlab实现循环码编码
2021-04-19 05:07:17利用Matlab实现循环码编码一:实验目的:利用matlab验证循环码的编码方法二:实验要求:求出x15+1的所有因式,从中选择一个11次因式作为构造(15,4)循环码的生成多项式,用matlab编码得到所有许用码组。三:实验原理... -
matlab循环码编码信号经循环码编码误码率变低
2021-04-19 01:31:48%未加循环编译码snrdB_min=-6;snrdB_max=20; %设置信噪比取值的上下限:dB为单位for j=snrdB_min:1:snrdB_maxmax=10000;x=randint(1,max);%随机生成一个二进制序列n=max/4;Fc=20;Fd=10;Fs=40;%Fs为系统的采样频率,... -
【通信】Matlab实现循环码编译码器
2022-05-05 15:37:57循环码属于线性代码,具有严密的代数理论基础,具有良好的错误检测和纠正功能.循环码编译电路大多用移位寄存器和模2构成的线性时序网络来完成.基本电路简单,容易实现,但在体积和功能扩展上受到了限制而不能发挥更大的... -
【通信】基于matlab GUI循环编码译码【含Matlab源码 1348期】
2021-10-02 14:04:44一、获取代码方式 获取代码方式1: 完整代码已上传我的资源:【通信】基于matlab GUI循环编码译码【含Matlab源码 1348期】 获取代码方式2: 通过紫极神光博客主页开通CSDN会员,凭支付凭证,私信博主,...1 循环码概念 -
循环码的译码PPT学习教案.pptx
2021-10-02 23:10:49循环码的译码PPT学习教案.pptx -
循环码编解码.zip
2020-06-20 21:14:24本设计要求利用MATLAB或其他编程语言生成信号源序列,信道噪声,实现循环码编解码过程。 (1)已知(10,6)系统循环码的生成多项式为:g(x)=x4+x+1,请设计该循环码的编码器。 (2)输入随机码元序列长度至少1000位... -
基于MATLAB的循环码编译码器设计与仿真胡鑫.doc
2020-07-13 03:55:41基于MATLAB的循环码编译码器设计与仿真胡鑫 课程设计报告 循环码编目基于MATLAB题 译码器的设计与仿真 胡鑫 学生姓名 1114030110 学生学号 电气信息工程学院 系别 业 通信工程专 届届 别15 指导教师吴琰 电气信息... -
循环码编码与译码
2014-09-19 19:19:51基于matlab仿真,进行循环码的编码与译码 -
实验6 BCH循环码的编码与译码.doc
2021-04-21 11:07:54信息论与编码理论实验内容 -
一类纠二元突发错的准循环码的译码算法 (2010年)
2021-05-17 06:59:54介绍了一种基于二维乘积码的一类纠二元突发错的准循环码及其最大纠突发错能力,并提出了一种译码算法。在一定条件下,这类码可化为循环Gilbert码。经常这类码比具有相同码长和校验位的Gilbert码可纠更长的突发错。... -
循环码编码译码的Matlab实现
2010-05-27 11:27:22利用Matlab实现循环码的编码与译码 里面有WORD文档说明编译码的实现方式 -
实验BCH循环码的编码与译码.doc
2020-11-18 09:35:02PAGE / NUMPAGES 实验6 BCH循环码的编码与译码 一实验内容 用VC或Matlab软件编写循环BCH码的编码与译码程序利用程序对教科书的例题做一个测试 二实验环境 计算机 Windows 2000 或以上 Microsoft Visual C++ 6.0 或... -
800Mbps准循环LDPC码译码器的FPGA实现.pdf
2021-07-13 18:03:54800Mbps准循环LDPC码译码器的FPGA实现.pdf -
循环码编码和译码的程序
2010-05-01 00:28:05循环码编码和译码的程序循环码编码和译码的程序循环码编码和译码的程序循环码编码和译码的程序 -
LFSR线性反馈移位寄存器循环码编码原理
2020-05-05 00:52:35线性反馈移位寄存器(LFSR)循环码编码原理 作为知识储备,近日在学习循环码编码的原理,教材为John G.Proakis和Masoud Salehi所著的《数字通信》第五版,循环码编码器对应于课本的第328页,对于利用LFSR实现模...