【通信原理】信道编码——线性分组码

2023-11-15

线性分组码

线性分组码,有两个特点,一个是线性,一个是分组。线性是指校验位和数据位成线性关系,可以通过线性方程直接求得。分组是指校验位由当前码组的数据位唯一确定。比如(n,k)线性分组码,指码长为n,数据位为k的编码方案。汉明码是线性分组码中的一种。

  1. 发送方生成码组
  2. 接收方破译码组
  3. 生成矩阵和校验矩阵
  • 码组形式:k bit数据位+r bit校验位,这样的码被称为系统码。
  • 重点在第三部分生成矩阵和校验矩阵。
  • 我这里说的数据位,也被称为信息位。

(1)发送方生成码组

n=k+r。数据位为k位,冗余的校验位为r位。满足 2 r ≥ k + r + 1 \Large 2^r \ge k+r+1 2rk+r+1

用k bit数据组成的行向量矩阵m乘以生成矩阵G,即得码组c。 c 1 × n = m 1 × k × G k × n c_{1\times n} = m_{1\times k}\times G_{k\times n} c1×n=m1×k×Gk×n

(2)接收方破译码组

将接受到的码组c和校验矩阵H相乘,如果得到0向量,则说明收到的是正确的。

或者,将所有错误情况列举出来查表。

(3)生成矩阵和校验矩阵

一般教科书里面会先讲校验矩阵,再讲生成矩阵,我也准备这样写,但为什么这样写呢?

这要从信道编码出现的原因讲起。信源编码是降冗余,是想要传输速率一定的情况下,发出去更多的符号;信道编码是加冗余,是想要在信道干扰条件一定的情况下,送出去更多的可靠的符号。比如信息位是4位,添加了3位的冗余,那么携带信息的码字有16种,而7比特总共有128种码字。这多出来的的就是112种,就是被禁用的。

而在这128种情况里面,一定有和16种携带信息的向量正交的。我们选出三种线性无关的禁用码字,用来当作校验矩阵。从定义都可以知道,校验矩阵和许用码字的矩阵相乘的结果是一个零向量。那么我们就可以用这个来进行校验。

由线性代数的知识,我们对校验矩阵进行行初等变换,其校验结果是不变的。那么我们就可以把校验矩阵变换成特殊形式,然后就可以轻松降校验矩阵转换为生成矩阵。用生成矩阵生成的码字就可以用校验矩阵进行校验了。

上面的理论显然是非常抽象且枯燥的,现在我举一个例子,(7,4)汉明码。

  1. 校验矩阵:它的特点是,从左到右分别是1~7的二进制表示。

    H = [ 0 0 0 1 1 1 1 0 1 1 0 0 1 1 1 0 1 0 1 0 1 ] H = \begin{bmatrix} 0 & 0 & 0 & 1 & 1 & 1 & 1 \\ 0 & 1 & 1 & 0 & 0 & 1 & 1 \\ 1 & 0 & 1 & 0 & 1 & 0 & 1 \end{bmatrix} H=001010011100101110111

  2. 对上述校验矩阵进行行初等变换,将靠右的部分变为单位阵。

    H = [ 0 1 1 1 1 0 0 1 0 1 1 0 1 0 1 1 0 1 0 0 1 ] = [ P , I r × r ] H = \begin{bmatrix} 0 & 1 & 1 & 1 & 1 & 0 & 0 \\ 1 & 0 & 1 & 1 & 0 & 1 & 0 \\ 1 & 1 & 0 & 1 & 0 & 0 & 1\end{bmatrix} = [P,I_{r\times r}] H=011101110111100010001=[P,Ir×r]

  3. 然后得到生成矩阵,生成系统码形式的汉明码的生成矩阵

G = [ I k × k ; P T ] = [ 1 0 0 0 0 1 1 0 1 0 0 1 0 1 0 0 1 0 1 1 0 0 0 0 1 1 1 1 ] G = [I_{k\times k};P^T] = \begin{bmatrix} 1 & 0 & 0 & 0 & 0 & 1 & 1 \\ 0 & 1 & 0 & 0 & 1 & 0 & 1 \\ 0 & 0 & 1 & 0 & 1 & 1 & 0 \\ 0 & 0 & 0 & 1 & 1 & 1 & 1 \\ \end{bmatrix} G=[Ik×k;PT]=1000010000100001011110111101

  1. 生成汉明码: m = [ 1 , 0 , 1 , 0 ] ; c = m G = [ 1 , 0 , 1 , 0 , 1 , 0 , 1 ] m = [1,0,1,0] ;c = mG = [1,0,1,0,1,0,1] m=[1,0,1,0];c=mG=[1,0,1,0,1,0,1]
  2. 校验:$s = Hc^T = [0;0;0] $

s被称为伴随式。

变换前后的最小汉明距离不变。

贴一段我用来测试上述过程的代码。

import numpy as np
import itertools as it

G = np.array([[1,0,0,0,0,1,1],
              [0,1,0,0,1,0,1],
              [0,0,1,0,1,1,0],
              [0,0,0,1,1,1,1]])
H = np.array([[0,1,1,1,1,0,0],
              [1,0,1,1,0,1,0],
              [1,1,0,1,0,0,1]])

s = list(it.product(range(2), repeat=4))

M = np.array(s)

C = np.matmul(M,G)%2

D = []

for c in C:
    tmp = []
    for other_c in C:
        if (c!=other_c).any():
            tmp.append(sum((c+other_c)%2))
    D.append(np.min(tmp))
print("最小汉明距离:",np.min(D))
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【通信原理】信道编码——线性分组码 的相关文章

  • CVE-2019-3396 Confluence RCE漏洞简单粗暴复现

    CVE 2019 3396 Confluence RCE漏洞简单粗暴复现 1 前言 网上也有很多关于该漏洞的说明和复现 不再做过多阐述 在复现该漏洞时踩了一些坑 然后发现了一个快速复现的方法 所以本篇文章介绍的是如何简单快速地复现该漏洞 想

随机推荐

  • Quartz 之 JobKey 源码解读

    首先 我们看下上个博文 CronTrigger 示例2 中部分打印的日志内容 INFO 17 一月 09 41 40 016 下午 MyScheduler Worker 9 com example03 SimpleJob SimpleJob
  • 2021-01-25Redis存取list

    redis存取list类型数据 首先 为了避免高并发给myql数据库增加负担 所有大多数时候会利用redis数据库解决这个问题 1 首先启动redis服务 在bin目录下打开powshell命令如下 PS D devtools Redis
  • 浅谈程序分析

    孙军 新加坡管理大学教授 研究方向为 形式化方法 软件工程 安全等 爱好 爬山 攀岩等 如果读者想了解更多有关程序分析相关的技术内容 欢迎加入编程语言技术社区 SIG 程序分析 加入方式 文末有小助手微信 添加并备注加入 SIG 程序分析
  • 获取map中第一个数据值

    为什么80 的码农都做不了架构师 gt gt gt 获取map中第一个非空数据值 param
  • Git GUI基本操作

    一 Git GUI基本操作 1 版本库初始化 gitpractise文件夹就变成了Git可以管理的仓库 目录下多了一个 git文件夹 此目录是Git用于管理版本库的 不要擅自改动里面的文件 这样会破坏Git仓库 git文件夹默认是隐藏的 如
  • 二进制编码

    前言 我们都知道 一个程序是 数据结构 算法 如果对应到组成原理或者是硬件层面上来说 算法就是我们的各种计算机指令 而数据结构就是我们对应的二进制数据 字符串的表示 从编码到数字 其实不仅数字可以用字符串来表示 最典型的例子就是字符串 最早
  • Java基础5--数组

    Java基础5 数组 数组定义 数组是相同类型数据的有序集合 数组描述的是相同类型的若干个数据 按照一定的先后次序排列组合而成 其中 每一个数据称作一个数组元素 每个数组元素可以通过一个下标来访问它们 数组声明与创建 首先必须声明数组变量
  • NLTK: [Error:11004] getaddrinfo failed

    当我运行nltk的词分割时 from nltk tokenize import word tokenize text God is Great I won a lottery print word tokenize text 出现了缺少pu
  • 【Linux驱动】copy_to_user 、copy_from_user 函数

    用户一般访问内核 需要从用户态变为内核态 然后再访问内核 这么做的目的是防止用户随意篡改内核 在编写某个外设的驱动时 我们需要实现内核中的 read 和 write 函数 此时站在内核的角度 无法直接读取用户缓冲区 或者 无法直接向用户缓冲
  • GBDT与xgboost :流失预测 shap解释 调参 保存调参好的模型

    集成学习 集成学习的方式分为两类 个体的学习器之间存在强依赖关系 必须串行生成序列化方法 代表 Boosting 个体学习器之间不存在强依赖关系 可同时生成并行化方法 代表是Bagging和随机森林 bagging boosting sta
  • workbench拓扑优化教程_拓扑优化(Topology Optimization)浅谈

    近期刚刚完成了某产品吊重梁的拓扑优化分析 稍微整理下这方面的内容 如有不恰当的地方 还望各位大佬指正 拓扑优化 topology optimization 是一种根据给定的负载情况 约束条件和性能指标 在给定的设计区域内对材料分布进行优化的
  • Linux中常用操作命令

    一 常用的文件 目录操作命令 这是我们使用得最多的命令了 Linux最基础的命令 可用 pwd命令查看用户的当前目录 可用 cd 命令来切换目录 表示当前目录 表示当前目录的上一级目录 父目录 表示用 cd 命令切换目录前所在的目录 表示用
  • python3 selenium webdriver.Chrome php 爬取汽车之家所有车型详情数据[开源版]

    介绍 本接口是车型库api的补充 用于爬取汽车之家所有车型详情数据 开源地址 https gitee com web CarApi tree master python 软件架构 python3 selenium webdriver Chr
  • 2020数字中国创新大赛 • 算法赛道冠军技术方案分享

    写在前面的话 作者说 我是来自京东数科的朱翔宇 也是此次大赛 Champion Chasing Boy 团队的 DOTA 常用ID 在与队友 鱼遇雨欲语与余 京东零售 尘沙杰少 林有夕 嗯哼哼唧的共同努力下 最终在 2020数字中国创新大赛
  • XSS-Game 通关教程,XSS-Game level1-18,XSS靶场通关教程

    作者主页 士别三日wyx 作者简介 CSDN top100 阿里云博客专家 华为云享专家 网络安全领域优质创作者 专栏简介 此文章已录入专栏 靶场通关教程 XSS Game XSS Game level1 XSS Game level2 X
  • 国内好用的CRM框架推荐和介绍

    一 如何选择CRM管理系统的方法 选择适合自己的CRM管理系统是企业客户关系管理的重要决策之一 需要根据自身的需求和实际情况进行选择 下面介绍几个选择比较好的CRM管理系统的方法 1 确定功能需求 企业需要根据自身的业务特点和管理需求 确定
  • maven高级-黑马-笔记

    目录 1 分模块开发 2 依赖管理 依赖冲突 可选依赖和排除依赖 3 聚合和继承 聚合 继承 3 属性 属性 4 多环境配置与应用 多环境开发 跳过测试 5 私服 1 分模块开发 1 创建Maven模块 2 书写模块代码 分模块开发需要先针
  • VS Code插件汇总

    插件 Basic Chinese Simplified Language Pack C C C C CMake Tools C C Extension Pack Web Open in browser Microsoft Edge Tool
  • 华为OD题目: 货币单位换算

    package com sf ccmas video config odd od12 import java util 货币单位换算 时间限制 1s空间限制 256MB 限定语言 不限 题目描述 记账本上记录了若干条多国货币金额 需要转换成
  • 【通信原理】信道编码——线性分组码

    线性分组码 线性分组码 有两个特点 一个是线性 一个是分组 线性是指校验位和数据位成线性关系 可以通过线性方程直接求得 分组是指校验位由当前码组的数据位唯一确定 比如 n k 线性分组码 指码长为n 数据位为k的编码方案 汉明码是线性分组码