MATLAB循环码编译码实验

news2024/11/19 14:38:19

标题

  • 循环码编译码实验
    • 一、实验目的
      • 1、掌握循环码编码原理和译码原理
      • 2、练习使用Matlab编程实现循环码编码和译码
    • 二、实验原理
      • 伴随式译码
      • 捕错译码
    • 三、实验要求
      • 1、编程实现码长n=15的各种循环码的编码、译码,给出相应的码生成多项式、(典型)监督矩阵和生成矩阵。
      • 2、举例说明给定信息的编码结果(或者给出所有可能的编码结果)。
      • 3、举例说明对收到码字的检错纠错结果。
    • 四、实验内容
      • 4.1 n=15的循环码的码生成多项式、(典型)监督矩阵和生成矩阵
      • 4.2给定信息的编码结果
      • 4.3收到码字的检错纠错

循环码编译码实验

一、实验目的

1、掌握循环码编码原理和译码原理

2、练习使用Matlab编程实现循环码编码和译码

二、实验原理

循环码作为线性分组码的子类,自然可以用伴随式进行译码。另外,利用循环码的循环码特性,可以实现更为简单有效的捕错译码。

伴随式译码

循环码的伴随式译码与线性分组码的伴随式译码思想相同,都包括根据接收码字 R R R和校验矩阵 H 计算伴随式 S、根据伴随式 S 和编码规则估计错误图样 E 以及根据接收码字 R 和估计的错误图样 E E E得到译码码字 C C C等步骤。

捕错译码

捕错译码的基本思想是通过将接收码字中的错误集中并判断伴随式的重量实现译码,针对系统码的译码使用。
对于 ( n , k ) (n,k) (n,k)系统循环码(码字中的前 k 个码元为信息元),假设信息多项式为 m ( x ) m(x) m(x),发送码字多项式为 :
C ( x ) = m ( x ) x ( n + k ) + p ( x ) C(x)=m(x){{x}^{(n+k)}}+p(x) C(x)=m(x)x(n+k)+p(x)

其中,p(x) 为校验元对应的多项式,信道错误图样为:
E(x)=E_1 (x)+E_p (x)
其中,信息部分的错误图样如下:
E 1 ( x ) = e ( n − 1 ) x ( n − 1 ) + e ( n − 2 ) x ( n − 2 ) + . . . + e ( n − k ) x ( n − k ) {{E}_{1}}(x)={{e}_{(n-1)}}{{x}^{(n-1)}}+{{e}_{(n-2)}}{{x}^{(n-2)}}+...+{{e}_{(n-k)}}{{x}^{(n-k)}} E1(x)=e(n1)x(n1)+e(n2)x(n2)+...+e(nk)x(nk)

校验部分的错误图样如下:
E p ( x ) = e ( n − k − 1 ) x ( n = k − 1 ) + e ( n − k − 2 ) x ( n − k − 2 ) + . . . + e 1 x 1 + e 0 {{E}_{p}}(x)={{e}_{(n-k-1)}}{{x}^{(n=k-1)}}+{{e}_{(n-k-2)}}{{x}^{(n-k-2)}}+...+{{e}_{1}}{{x}^{1}}+{{e}_{0}} Ep(x)=e(nk1)x(n=k1)+e(nk2)x(nk2)+...+e1x1+e0

接收码多项式为 R(x),则伴随式多项式为:
S ( x ) ≡ R ( x ) ≡ E ( x ) ≡ ( E 1 ( x ) + E p ( x ) ) m o d [ g ( x ) ] S(x)≡R(x)≡E(x)≡(E_1 (x)+E_p (x))mod[g(x)] S(x)R(x)E(x)(E1(x)+Ep(x))mod[g(x)]
如果错误图样多项式 E(x) 的次数小于等于 n-k-1,则所有错误都集中在校验元上,此时
S ( x ) ≡ R ( x ) ≡ E ( x ) ≡ E p ( x ) m o d [ g ( x ) ] S(x)≡R(x)≡E(x)≡E_p (x)mod[g(x)] S(x)R(x)E(x)Ep(x)mod[g(x)]
而校验部分的错误图样的次数低于生成多项式的次数 n-k,因此伴随式 S 就是错误图样 E。从而纠错过程就简化为: C ^ = R + S \hat{C}=R+S C^=R+S
实际上,任一 (n,k,d) 线性分组码的最大最小距离等于 n − k + 1 n-k+1 nk+1。循环码作为线性分组码的一类,有条件限制且纠错能力 t < d t<d t<d。如果码字中出现的所有小于等于 t 个错误出现在连续的 n − k n-k nk 位,则要求循环码的参数满足信息组长度 k < n / t k<n/t k<n/t 或纠错能力 t < n / t t<n/t t<n/t
根据循环码的性质,对于能够纠正 t 个错误的 (n,k) 循环码,经过 i 次循环移位后的接收码多项式 Ri(x) 对应的伴随式 Si 的重量小于等于 t 的充要条件是所有小于等于 t 个错误都集中再来移位后的码字的后 n-k 位。首先,如果错误已经集中在码字的低 n − k n-k nk 位,则有:
S i ( x ) = E i p ( x ) S_i (x)=E_ip (x) Si(x)=Eip(x)
由于该 (n,k) 循环码能够纠正小于等于 t 个错误,如果错误图样是可纠正的,则必有:
w ( E ( x ) ) ≤ t w(E(x))≤t w(E(x))t
从而该错误图样经过 i 次循环移位后的错误图样重量保持不变。另一方面,如果错误图样的重量小于等于 t ,而错误没有集中,则经过 i 次循环移位后的错误图样的次数大于生成多项式的次数,从而有:
E i ( x ) − S i ( x ) = q ( x ) g ( x ) = C i ( x ) E_i (x)-S_i (x)=q(x)g(x)=C_i (x) Ei(x)Si(x)=q(x)g(x)=Ci(x)
由于 Ci(x) 是生成多项式的倍式,因此必是该 (n,k) 循环码的码字,因此其重量要大于等于码的最小距离,另外根据 t = f l o o r ( ( d − 1 ) / 2 ) t=floor((d-1)/2) t=floor((d1)/2)可得到:
w ( − S i ( x ) ) = w ( S i ( x ) ) ≥ t + 1 > t w(-{{S}_{i}}(x))=w({{S}_{i}}(x))\ge t+1>t w(Si(x))=w(Si(x))t+1>t
也即,如果错误没有集中在码字的底 n-k 位,则伴随式的重量必大于 t,与假设条件不符。

三、实验要求

1、编程实现码长n=15的各种循环码的编码、译码,给出相应的码生成多项式、(典型)监督矩阵和生成矩阵。

2、举例说明给定信息的编码结果(或者给出所有可能的编码结果)。

3、举例说明对收到码字的检错纠错结果。

四、实验内容

4.1 n=15的循环码的码生成多项式、(典型)监督矩阵和生成矩阵

我们以(15,7)循环码为例,首先调用cyclpoly函数生成所有x15-1的所有8次幂的因子

clear all;
close all;
n=15;
k=7;
p=cyclpoly(n,k,'all');  
%产生x15-1的所有三次幂的因子 Produce generator %polynomials for cyclic code

在这里插入图片描述

可以在workbench看到P的取值,分别是 x 8 + x 4 + x 2 + x + 1 {{\text{x}}^{8}}+{{x}^{4}}+{{x}^{2}}+x+1 x8+x4+x2+x+1 x 8 + x 7 + x 6 + x 4 + 1 {{\text{x}}^{8}}+{{x}^{7}}+{{x}^{6}}+{{x}^{4}}+1 x8+x7+x6+x4+1 x 8 + x 7 + x 5 + x 4 + x 3 + x + 1 {{\text{x}}^{8}}+{{x}^{7}}+{{x}^{5}}+{{x}^{4}}+{{x}^{3}}+x+1 x8+x7+x5+x4+x3+x+1。这些都是(15,7)循环码的生成多项式 g ( x ) g(x) g(x)

[H,G]=cyclgen(n,p(i,:),'system');

调用cyclgen生成(15,7) 系统循环码的生成矩阵G和校验矩阵 H。
在这里插入图片描述
可以发现MATLAB中 的定义和通信原理书上并不一样,它的单位矩阵在右侧。因此我们需要做旋转对称。

%cyclgen生成的G不是[IkQ]形式的,需要中心对称翻转,同理H
%中心旋转对称
H([1,8],:)=H([8,1],:);
H([2,7],:)=H([7,2],:);
H([3,6],:)=H([6,3],:);
H([4,5],:)=H([5,4],:);

H(:,[1,15])=H(:,[15,1]);
H(:,[2,14])=H(:,[14,2]);
H(:,[3,13])=H(:,[13,3]);
H(:,[4,12])=H(:,[12,4]);
H(:,[5,11])=H(:,[11,5]);
H(:,[6,10])=H(:,[10,6]);
H(:,[7,9])=H(:,[9,7]);

G([1,7],:)=G([7,1],:);
G([2,6],:)=G([6,2],:);
G([3,5],:)=G([5,3],:);
G(:,[1,15])=G(:,[15,1]);
G(:,[2,14])=G(:,[14,2]);
G(:,[3,13])=G(:,[13,3]);
G(:,[4,12])=G(:,[12,4]);
G(:,[5,11])=G(:,[11,5]);
G(:,[6,10])=G(:,[10,6]);
G(:,[7,9])=G(:,[9,7]);

4.2给定信息的编码结果

至此准备工作已经完成,我们只需要输入信息序列,就可以得到编码结果

%%
%编码
Msg=input('输入信息元序列:');
C=rem(Msg*G,2);
disp('编码后序列为:')
disp(C);

手动输入信息元序列,可以查看到编码结果
在这里插入图片描述
上述问题所有代码如下

clear all;
close all;
n=15;
k=7;
p=cyclpoly(n,k,'all');  %产生x7-1的所有三次幂的因子 Produce generator polynomials for cyclic code

for i=1:3

% [H1,H1]=cyclgen(n,p(1,:));%取第一个公因子x8++x4+x2+x+1,G为系统的,H为对应的校验阵
% [H2,G2]=cyclgen(n,p(2,:));%取第二个公因子x8++x7+x6+1,G为系统的,H为对应的校验阵
% [H3,G3]=cyclgen(n,p(3,:));%取第三个公因子x8+x7+x5+x4+x3+x+1,G为系统的,H为对应的校验阵

[H,G]=cyclgen(n,p(i,:),'system');

%%
%cyclgen生成的G不是[IkQ]形式的,需要中心对称翻转,同理H
%中心旋转对称
H([1,8],:)=H([8,1],:);
H([2,7],:)=H([7,2],:);
H([3,6],:)=H([6,3],:);
H([4,5],:)=H([5,4],:);

H(:,[1,15])=H(:,[15,1]);
H(:,[2,14])=H(:,[14,2]);
H(:,[3,13])=H(:,[13,3]);
H(:,[4,12])=H(:,[12,4]);
H(:,[5,11])=H(:,[11,5]);
H(:,[6,10])=H(:,[10,6]);
H(:,[7,9])=H(:,[9,7]);

G([1,7],:)=G([7,1],:);
G([2,6],:)=G([6,2],:);
G([3,5],:)=G([5,3],:);
G(:,[1,15])=G(:,[15,1]);
G(:,[2,14])=G(:,[14,2]);
G(:,[3,13])=G(:,[13,3]);
G(:,[4,12])=G(:,[12,4]);
G(:,[5,11])=G(:,[11,5]);
G(:,[6,10])=G(:,[10,6]);
G(:,[7,9])=G(:,[9,7]);
%%
%编码
Msg=input('输入信息元序列:');
C=rem(Msg*G,2);
disp('编码后序列为:')
disp(C);

end

4.3收到码字的检错纠错

我们下面以(7,4)循环码为例,验证通过差错图案对码字进行检错。

clear all;
close all;
n=7;
k=4;

%%
%编码
u=input('输入信息元序列:');
x=[zeros(1,n-k),1];
g=cyclpoly(n,k);
a=gfconv(x,u);

[q,m1]=gfdeconv(a,g);
a1=n-k-length(m1);
m=[m1,zeros(1,a1)];
code(1,:)=[u,m];
disp('编码后的序列为:')
disp(code)




%%
%利用校正子译码
Msg=input('输入接收到的序列:');
[q,s]=gfdeconv(fliplr(Msg),fliplr(g),2);%计算接受码字的校正子s
a=3-length(s);                         %补零长度,s长度不一定是n-k
s=[zeros(1,a),s];                      %长度为n-k的校正子



disp('纠错后的码字序列为:');
disp(code);
u=zeros(1,4);

%显示原信息序列
u=[code( :,1),code( :,2),code( :,3),code( :,4)];%因为是系统码,因此原信息码是编码的前4disp('原信息序列为:');
disp(u);

我们知道有 e ( x )   m o d   g ( x ) = r ′ ( x ) e(x)\bmod g(x)=r'(x) e(x)modg(x)=r(x)的关系,其中 e ( x ) e(x) e(x)是错误图样, r ′ ( x ) r'(x) r(x)是错误码元与 g ( x ) g(x) g(x)相除后的余项式,也是校验子。因而我们可以自己建表,通过查表修复码元。

%错误图样与校正子的关系
e0=[0 0 0 0 0 0 0];s0=[0 0 0];
e1=[0 0 0 0 0 0 1];s1=[0 0 1];
e2=[0 0 0 0 0 1 0];s2=[0 1 0];
e3=[0 0 0 0 1 0 0];s3=[1 0 0];
e4=[0 0 0 1 0 0 0];s4=[0 1 1];
e5=[0 0 1 0 0 0 0];s5=[1 1 0];
e6=[0 1 0 0 0 0 0];s6=[1 1 1];
e7=[1 0 0 0 0 0 0];s7=[1 0 1];

在这里为了简化计算,我们可以使用查表的方式,将校正子和对应的错误图样联系起来。

%%
%判决并由接受码字的校正子和对应的错误图样求码字
if s==s0
    code=Msg;
end

if s==s1
    code=gfadd(Msg,[0 0 0 0 0 0 1]);
end

if s==s2
    code=gfadd(Msg,[0 0 0 0 0 1 0]);
end

if s==s3
    code=gfadd(Msg,[0 0 0 0 1 0 0]);
end

if s==s4
    code=gfadd(Msg,[0 0 0 1 0 0 0]);
end

if s==s5
    code=gfadd(Msg,[0 0 1 0 0 0 0]);
end

if s==s6
    code=gfadd(Msg,[0 1 0 0 0 0 0]);
end

if s==s7
    code=gfadd(Msg,[1 0 0 0 0 0 0]);
end

通过MATLAB我们可以知道[1 1 1 0]的编码结果是[1 1 1 0 1 0 0],但是我们不妨输入错误了一位的码元序列[1 1 1 1 1 0 0]。通过校验子查表可以得到对应的错误图案,从而恢复正确的码元为[1 1 1 0 1 0 0]。正确码元的前四位就是原信息序列。
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/148989.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java设计模式中装饰者模式/装饰者模式具体内容是什么/静态代理与装饰者模式联系与区别是什么

继续整理记录这段时间来的收获&#xff0c;详细代码可在我的Gitee仓库SpringBoot克隆下载学习使用&#xff01; 5.4 装饰者模式 5.4.1 概述 在不改变现有对象结构的情况下&#xff0c;动态给对象增加某些职责或功能的模式 5.4.2 结构 抽象构件(Component)&#xff1a;定义…

Javascript 中的堆、栈、引用和值

学透CSS-强烈推荐 Javascript 中的内存存储 栈-Stack&#xff1a; 这是当前 Javascript 线程的暂存空间。由于 Javascript 通常只有单线程&#xff0c;因此通常只有一个堆栈。堆栈的大小也是有限的。 堆-Heap &#xff0c;它是应用程序级别的动态内存存储。从堆中访问和检索…

java 手把手带你创建一个spring入门案例

查看本文 首先 您需要下载spring 如果没有安装 可以查看我的文章 java spring下载步骤 首先 我们打开idea开发工具 选择左上角 File > New > Project 如下图操作 勾选 然后点击下一步 然后我们选择项目目录 这里我直接用了个中文目录 最好不要跟我学哦 因为个人英文不…

微信语音转换成mp3文件保存的简单详细步骤

目录 读者手册 一、前言 二、操作步骤一 把语音转化为silk文件&#xff08;silk后缀的文件&#xff09; 1.长按语音收藏&#xff08;手机操作&#xff09; 2.找到主页收藏 3.找到收藏的语音 4.转存为笔记 5.点击笔记里面的语音&#xff08;下面全部电脑操作&#xff0…

Kubernetes(k8s) 笔记总结(一)

文章目录1. 云平台2. 私有网络 VPC(重点&#xff01;&#xff01;&#xff01;)3. Kubernetes 介绍4. k8s 架构5. kubectl 和 kubeadm6. 三台云服务器的 安装部署7. Kubernetes 环境搭建7.1 安装docker环境7.2 安装k8s的 预备环境8. kubernetes集群 安装的三大件(kubelet、kube…

三句话,让Ai帮你画18万张图

本文介绍Stable Diffusion的快速上手&#xff0c;本地部署&#xff0c;以及更多有趣的玩法展示。 在 DALL-E 2 和 Imagen 之后&#xff0c;AI绘图领域又一个热乎的深度学习模型出炉——Stable Diffusion 。8月份发布的 Stable Diffusion 更加高效且轻量&#xff0c;可以在消费…

P4:Transforms的使用

transform.py就像是一个工具箱&#xff0c;里面有很多工具&#xff08;如&#xff1a;totensor、resize等不同的工具&#xff09;。 使用规则&#xff1a; 拿特定格式的图片&#xff0c;通过使用工具&#xff0c;得到想要的结果。 1、transforms.ToTensor()的使用 1、作用&a…

实战1:基于tensorflow卷积网络实现面部关键点检测详细教程(代码+数据)

项目概述: 此任务的目标是预测面部图像上的关键点位置。这可以用作多个应用程序中的构建块,例如:检测面部关键点是一个非常具有挑战性的问题。人脸特征因人而异,即使是单个人,由于 3D 姿势、大小、位置、视角和光照条件等因素也存在很大差异。 直接上结果: 数据集描…

JSP SSM 个人博客系统系统myeclipse开发mysql数据库springMVC模式java编程计算机网页设计

一、源码特点 JSP SSM 个人博客系统系统是一套完善的web设计系统&#xff08;系统采用SSM框架进行设计开发&#xff0c;springspringMVCmybatis&#xff09;&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代 码和数据库&#xff0c;系统主要采…

vue3-Teleport笔记

简单来写一下Teleport src/components/TeleportLearn.vue <script setup></script><template><div><Teleport to"body"><div>你好</div></Teleport></div> </template><style scoped></style&…

NVMe IO数据传输如何选择PRP or SGL?

在Host与Controller之间有数据交互时&#xff0c;Controller会多次访问Host内存。比如执行NVMe Read/Write:当Host下发NVMe Write命令时&#xff0c;Host会先放数据放在Host内存中&#xff0c;然后通知Controller过来取数据。Controller接到信息后&#xff0c;会通过PCIe Memor…

Python下载ts文件视频并合并

目录 一、ts文件的由来 二、下载ts文件 1.下载index.m3u8&#xff0c;并做相应处理 2.下载ts文件 三、合并ts文件 一、ts文件的由来 ts文件&#xff0c;ts即"Transport Stream"的缩写&#xff0c;特点就是要求从视频流的任一片段开始都是可以独立解码的&#x…

C 程序设计教程(06)—— C 语言的运算符与表达式

C 程序设计教程&#xff08;06&#xff09;—— C 语言的运算符与表达式 该专栏主要介绍 C 语言的基本语法&#xff0c;作为《程序设计语言》课程的课件与参考资料&#xff0c;用于《程序设计语言》课程的教学&#xff0c;供入门级用户阅读。 目录C 程序设计教程&#xff08;0…

【每日一题】【LeetCode】【第七天】盛最多水的容器

解决之路 因为是周日&#xff0c;找个中等题挑战一下。 题目描述 测试案例&#xff08;部分&#xff09; 第一次 想一下&#xff0c;因为涉及到底乘高&#xff0c;所以不能排序。逆序也没必要。 简化一下题干&#xff0c;盛水最多&#xff0c;也就是算面积最大&#xff0c…

【北邮果园大三上】运筹学期中前

第一章.线性规划 1.1例题 根据现实世界中的问题建立模型 一般表达式 ①和式 ②向量式 1.2变化标准&#xff1a; 1.3线性规划求解的基础原理和单纯解法 1.3.1解 ①基础概念 基 可行解与基础解 其他分类 ②判断举例 原式子&#xff1a; 判断标准 将一个未知数作为常熟&#…

从Wireshark看TCP连接的建立与关闭

http://t.zoukankan.com/jonathanlin-p-4282582.html TCP是一种面向连接、可靠的协议。TCP连接的建立与断开&#xff0c;都是需要经过通信双方的协商。用一句话概括就是&#xff1a;三次握手say hello&#xff08;建立连接&#xff09;&#xff1b;四次握手say goodbye&#x…

蓝桥杯Python组排序算法与函数

目录 一、排序算法 二、排序函数 1、Python 的 sort() 函数和 sorted() 函数 2、sort() 例子 3、sorted() 例子 4、部分排序 三、例题 1、统计数字&#xff08;lanqiaoOJ题号535&#xff09; 2、错误票据&#xff08;lanqiaoOJ题号205&#xff09; 3、奖学金&#xf…

线程池 - ThreadPoolExecutor 详解

线程池 - ThreadPoolExecutor 详解 线程池 ThreadPoolExecutor 源码解析参考 juc 专栏系列文章。 基本概述 线程池&#xff1a;一个容纳多个线程的容器&#xff0c;容器中的线程可以重复使用&#xff0c;省去了频繁创建和销毁线程对象的操作。 线程池作用&#xff1a; 降低资…

【基础】Elasticsearch 基础

Elasticsearch 基本概念及使用Elasticsearch 基本概念ES 的简介及使用场景ES 基本概念ES 与 Kibana 的安装Elasticsearch 分词器ES 内置分词器ik 分词器的安装和使用Elasticsearch 基本使用索引操作数据的增删改查DSL 查询聚合查询批量操作Elasticsearch 基本概念 ES 的简介及…

多线程锁相关

日升时奋斗&#xff0c;日落时自省 目录 1、常见的锁策略 1.1、悲观锁vs乐观锁 1.2、轻量级锁vs重量级锁 1.3、自旋锁vs挂起等待锁 1.4、互斥锁vs读写锁 1.5、公平锁vs非公平锁 1.6可重入锁vs不可重入锁 2、CAS 2.1、CAS解析 2.2、CAS的应用场景 2.2.1、实现原子类 …