一文读懂数字信号处理中的汉明编码Hamming Coding

2023-10-10 11:30

本文主要是介绍一文读懂数字信号处理中的汉明编码Hamming Coding,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、什么是汉明编码?

       汉明编码(Hamming Coding)属于前向纠错编码(Forword Error Correction Coding)的一种,除汉明编码外,前向纠错编码通常还包括BCH码,Reed-solomon(RS)码,卷积编码等。前向纠错编码技术通常分为两部分,一是在发射端,对信源进行编码,二是在接收端,对接收数据进行解码、检错、纠错。

二、汉明编码是如何纠错的?

      汉明编码也可归类为一种线性分组码,例如最常用的汉明码(7,4),指的就是把原始信息比特每4个比特为一个小的分组,在汉明编码时,对每个分组进行编码,而不是对每个比特进行编码,编码后,每个小组的比特数从4变成7,亦即增加了3bit的数据,用于检错和纠错。

     现在将原始4bit信息表示为(a_3,a_2,a_1,a_0),而汉明编码产生的3bit监督位表示为(b_2,b_1,b_0),原始的4bit信息,是分组而来,也就是在汉明编码前,需要将数据每4bit分为一组。而3bit的监督位,则是根据以下规则产生的:

b_2 \oplus a_3 \oplus a_2 \oplus a_1 = 0       规则R1

b_1 \oplus a_3 \oplus a_2 \oplus a_0 = 0       规则R2

b_0 \oplus a_3 \oplus a_1 \oplus a_0 = 0       规则R3

其中,\oplus表示异或运算。根据以上三个规则,可以算得全部的原始信息位所对应的监督位的值,如表1所示。

       在编码的时候,即可以根据上述的3个规则来产生监督位,Hamming编码的过程,其实可以分为两步,一是将待编码数据按要求先分组,二是根据规则利用原始信息产生监督信息。在解码的时候,需要同样根据这3个规则,来判断到底是是否有错,到底是哪个比特出了错。表2中R1R2R3分别表示规则1、规则2、规则3,满足对应的规则,则值为0,不满足则值为1。通过计算接收的7bit的数据之间是否满足规则R1R2R3,就可以知道是哪个bit在传输的时候出错。换种说法就是,编码后的7bit数据,每个bit和其它几个bit是有关联的,这个关联就是上面所述的规则R1R2R3,从是否满足规则R1R2R3推导出出错的bit。知道了哪个bit出错了之后,直接将出错的bit取反即可实现纠错。从这也可以看出,(7,4)hamming码只能实现1bit的纠错。

      接下来,举一个简单的例子来再次说明一下(7,4)Hamming 编码的原理。例如,分组后,得到的4bit原始数据为(a_3,a_2,a_1,a_0)=[1 0 1 1],然后根据规则R1R2R3(懒得计算可参考表1),计算得到监督位为(b_2,b_1,b_0)=[0 0 1]。从而编码后,得到7bit的数据为[1011 001]。假设在数据传输过程中,有1个bit传输出错,数据从[1011 001]变成了[1010 001],这时候,在解码的时候,根据接收的数据[1010 001],代入规则R1R2R3中计算,

b_2 \oplus a_3 \oplus a_2 \oplus a_1 = 0       规则R1

b_1 \oplus a_3 \oplus a_2 \oplus a_0 = 1       规则R2

b_0 \oplus a_3 \oplus a_1 \oplus a_0 = 1       规则R3

       从上面的计算可以发现,数据bit之间的关系满足规则R1,但不满足规则R2、R3。满足规则R1,说明b2,a3,a2,a1是对的,从而在假设错1bit的情况下,如果同时不满足规则R2和R3,就可以知道是bit a0出错了,对比表2中R1R2R3=001时,也可推断是bit a0出错了。知道是bit a0出错,将bit a0取反,可以得到[1011 001],从而实现数据的纠错。

       以上即为个人在学习Hamming(7,4)编码时的一些总结,分享到这里,如有理解错误,还望指正,虚心接收大神们的指导。

 

这篇关于一文读懂数字信号处理中的汉明编码Hamming Coding的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/180134

相关文章

一文全面详解Python变量作用域

《一文全面详解Python变量作用域》变量作用域是Python中非常重要的概念,它决定了在哪里可以访问变量,下面我将用通俗易懂的方式,结合代码示例和图表,带你全面了解Python变量作用域,需要的朋友... 目录一、什么是变量作用域?二、python的四种作用域作用域查找顺序图示三、各作用域详解1. 局部作

一文彻底搞懂Java 中的 SPI 是什么

《一文彻底搞懂Java中的SPI是什么》:本文主要介绍Java中的SPI是什么,本篇文章将通过经典题目、实战解析和面试官视角,帮助你从容应对“SPI”相关问题,赢得技术面试的加分项,需要的朋... 目录一、面试主题概述二、高频面试题汇总三、重点题目详解✅ 面试题1:Java 的 SPI 是什么?如何实现一个

一文详解PostgreSQL复制参数

《一文详解PostgreSQL复制参数》PostgreSQL作为一款功能强大的开源关系型数据库,其复制功能对于构建高可用性系统至关重要,本文给大家详细介绍了PostgreSQL的复制参数,需要的朋友可... 目录一、复制参数基础概念二、核心复制参数深度解析1. max_wal_seChina编程nders:WAL

一文详解如何查看本地MySQL的安装路径

《一文详解如何查看本地MySQL的安装路径》本地安装MySQL对于初学者或者开发人员来说是一项基础技能,但在安装过程中可能会遇到各种问题,:本文主要介绍如何查看本地MySQL安装路径的相关资料,需... 目录1. 如何查看本地mysql的安装路径1.1. 方法1:通过查询本地服务1.2. 方法2:通过MyS

基于Go语言实现Base62编码的三种方式以及对比分析

《基于Go语言实现Base62编码的三种方式以及对比分析》Base62编码是一种在字符编码中使用62个字符的编码方式,在计算机科学中,,Go语言是一种静态类型、编译型语言,它由Google开发并开源,... 目录一、标准库现状与解决方案1. 标准库对比表2. 解决方案完整实现代码(含边界处理)二、关键实现细

一文详解如何在Vue3中封装API请求

《一文详解如何在Vue3中封装API请求》在现代前端开发中,API请求是不可避免的一部分,尤其是与后端交互时,下面我们来看看如何在Vue3项目中封装API请求,让你在实现功能时更加高效吧... 目录为什么要封装API请求1. vue 3项目结构2. 安装axIOS3. 创建API封装模块4. 封装API请求

一文带你搞懂Redis Stream的6种消息处理模式

《一文带你搞懂RedisStream的6种消息处理模式》Redis5.0版本引入的Stream数据类型,为Redis生态带来了强大而灵活的消息队列功能,本文将为大家详细介绍RedisStream的6... 目录1. 简单消费模式(Simple Consumption)基本概念核心命令实现示例使用场景优缺点2

解决IDEA报错:编码GBK的不可映射字符问题

《解决IDEA报错:编码GBK的不可映射字符问题》:本文主要介绍解决IDEA报错:编码GBK的不可映射字符问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录IDEA报错:编码GBK的不可映射字符终端软件问题描述原因分析解决方案方法1:将命令改为方法2:右下jav

一文详解Java异常处理你都了解哪些知识

《一文详解Java异常处理你都了解哪些知识》:本文主要介绍Java异常处理的相关资料,包括异常的分类、捕获和处理异常的语法、常见的异常类型以及自定义异常的实现,文中通过代码介绍的非常详细,需要的朋... 目录前言一、什么是异常二、异常的分类2.1 受检异常2.2 非受检异常三、异常处理的语法3.1 try-

一文带你搞懂Python中__init__.py到底是什么

《一文带你搞懂Python中__init__.py到底是什么》朋友们,今天我们来聊聊Python里一个低调却至关重要的文件——__init__.py,有些人可能听说过它是“包的标志”,也有人觉得它“没... 目录先搞懂 python 模块(module)Python 包(package)是啥?那么 __in