一文读懂数字信号处理中的汉明编码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使用自带的base64库进行base64编码和解码

《Python使用自带的base64库进行base64编码和解码》在Python中,处理数据的编码和解码是数据传输和存储中非常普遍的需求,其中,Base64是一种常用的编码方案,本文我将详细介绍如何使... 目录引言使用python的base64库进行编码和解码编码函数解码函数Base64编码的应用场景注意

一文详解SpringBoot响应压缩功能的配置与优化

《一文详解SpringBoot响应压缩功能的配置与优化》SpringBoot的响应压缩功能基于智能协商机制,需同时满足很多条件,本文主要为大家详细介绍了SpringBoot响应压缩功能的配置与优化,需... 目录一、核心工作机制1.1 自动协商触发条件1.2 压缩处理流程二、配置方案详解2.1 基础YAML

一文详解如何从零构建Spring Boot Starter并实现整合

《一文详解如何从零构建SpringBootStarter并实现整合》SpringBoot是一个开源的Java基础框架,用于创建独立、生产级的基于Spring框架的应用程序,:本文主要介绍如何从... 目录一、Spring Boot Starter的核心价值二、Starter项目创建全流程2.1 项目初始化(

一文带你了解SpringBoot中启动参数的各种用法

《一文带你了解SpringBoot中启动参数的各种用法》在使用SpringBoot开发应用时,我们通常需要根据不同的环境或特定需求调整启动参数,那么,SpringBoot提供了哪些方式来配置这些启动参... 目录一、启动参数的常见传递方式二、通过命令行参数传递启动参数三、使用 application.pro

使用PyTorch实现手写数字识别功能

《使用PyTorch实现手写数字识别功能》在人工智能的世界里,计算机视觉是最具魅力的领域之一,通过PyTorch这一强大的深度学习框架,我们将在经典的MNIST数据集上,见证一个神经网络从零开始学会识... 目录当计算机学会“看”数字搭建开发环境MNIST数据集解析1. 认识手写数字数据库2. 数据预处理的

java字符串数字补齐位数详解

《java字符串数字补齐位数详解》:本文主要介绍java字符串数字补齐位数,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Java字符串数字补齐位数一、使用String.format()方法二、Apache Commons Lang库方法三、Java 11+的St

一文带你深入了解Python中的GeneratorExit异常处理

《一文带你深入了解Python中的GeneratorExit异常处理》GeneratorExit是Python内置的异常,当生成器或协程被强制关闭时,Python解释器会向其发送这个异常,下面我们来看... 目录GeneratorExit:协程世界的死亡通知书什么是GeneratorExit实际中的问题案例

一文详解SQL Server如何跟踪自动统计信息更新

《一文详解SQLServer如何跟踪自动统计信息更新》SQLServer数据库中,我们都清楚统计信息对于优化器来说非常重要,所以本文就来和大家简单聊一聊SQLServer如何跟踪自动统计信息更新吧... SQL Server数据库中,我们都清楚统计信息对于优化器来说非常重要。一般情况下,我们会开启"自动更新

VSCode中C/C++编码乱码问题的两种解决方法

《VSCode中C/C++编码乱码问题的两种解决方法》在中国地区,Windows系统中的cmd和PowerShell默认编码是GBK,但VSCode默认使用UTF-8编码,这种编码不一致会导致在VSC... 目录问题方法一:通过 Code Runner 插件调整编码配置步骤方法二:在 PowerShell

一文详解kafka开启kerberos认证的完整步骤

《一文详解kafka开启kerberos认证的完整步骤》这篇文章主要为大家详细介绍了kafka开启kerberos认证的完整步骤,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录一、kerberos安装部署二、准备机器三、Kerberos Server 安装1、配置krb5.con