-
2021-12-15 09:21:57
编码
function C=HM_code(M) G=[1 1 1 1 1 0 1 0 1 0 1 1]; G=[eye(4) G]; C=M*G; C=mod(C,2);
译码
function D=HM_Dcode(A) H=[1 1 1 0 1 0 0 1 1 0 1 0 1 0 1 0 1 1 0 0 1]; S=H*A.'; S=mod(S,2); s=[0 0 0 0 1 1 1 1 0 0 1 1 0 0 1 1 0 1 0 1 0 1 0 1]; index=[4 2 1]*S; e=[7 6 4 5 3 2 1]; %if (index~=0) % A(e(index))=mod(A(e(index))+1,2); %end for k=1:length(index) if (index(k)~=0) A(k,e(index(k)))=mod(A(k,e(index(k)))+1,2); end end D=A;
测试
clear all;clc; m=[1 1 1 0]; hm=HM_code(m) hm2=[0 0 0 1 1 1 1]; hm_d=HM_Dcode(hm2)
更多相关内容 -
汉明码编码程序,汉明码编码规则,matlab
2021-09-10 17:30:11matlab汉明码程序,实现汉明编码,,并实现纠错和检错功能 -
汉明码使用详解
2019-07-15 21:14:59汉明码是一种数据传输中校验和纠错的手段。当传输一个二进制码时,它在每一个2的整数次幂位插入校验位,如1、2、4、8…如下图所示,其中P为校验码,D为数据: 其中P1在第一位,二进制01,与二进制编码最后一位为1...汉明码是一种数据传输中校验和纠错的手段。当传输一个二进制码时,它在每一个2的整数次幂位插入校验位,如1、2、4、8…如下图所示,其中P为校验码,D为数据:
位数二进制分别为:
P1: 第1位 001;P2 第2位 010;D1 第3位 011;P3 第4位 100;D2 第5位 101; D3 第6位 110;
其中P1在第一位,二进制001,与二进制编码最后一位为1的位数的数据相异或,即D1和D2
P1=D1⊕D2
P2在第二位,二进制10,与二进制编码倒数第二位为1的位数的数据相异或,即D1 D3
P2=D1⊕D3
P3在第三位,二进制100,与二进制编码倒数第三位为1的位数的数据相异或,即D2 D3
P3=D2⊕D3
假如我们想要传输的数据为0110001100110101,你可能会说用4位校验码就能表示完全表示这个16位数,毕竟24=16,那你就忽略了这三位校验码本身,校验码插入后如下:
如上图:
P0= 异或(0 1 0 0 1 0 1 1 1 1)=0;
P1=异或(0 1 0 0 1 0 1 0 1)=0;
P2=异或(1 1 0 1 0 0 1 0 1)=1;
P3=异或(0 0 1 1 0 0 1)=1;
P4=异或(1 0 1 0 1)=1.
若传输后第11位因噪声翻转为0,则
传输数据为:010011010011001110101;
接收数据为:010011010001001110101;
将校验位与对应的数据位相异或,即可得出错误位,如下:
P4=异或(P4 1 0 1 0 1)=0
P3=异或(P3 0 0 0 1 0 0 1)=1(即异或的数据位有错误,或者说,错误的数据位的倒数第四位为1)
P2=异或(P2 1 1 0 1 0 0 1 0 1)=0
P1=异或(P1 0 1 0 0 0 0 1 0 1)=1(即错误的数据位的倒数第二位为1)
P0=异或(P0 0 1 0 0 0 0 1 1 1 1)=1(即错误的数据位的倒数第一位为1) 得出错误位为:01011,即11.
-
汉明码(15-11)的C语言实现
2020-02-05 23:11:13在VS2008下用C语言实现的汉明码的编解码 源代码 在VS2008下用C语言实现的汉明码的编解码 源代码 在VS2008下用C语言实现的汉明码的编解码 源代码 在VS2008下用C语言实现的汉明码的编解码 源代码 -
hamming_汉明码matlab_汉明码_性能仿真_
2021-09-29 01:20:56只是一个完整的汉明码 matlab编译码性能仿真程序。包括编译码两个函数模块。 -
说人话,人话,汉明码(海明码、hamming code)通俗易懂的解释,说人话。
2018-10-19 19:54:03最近在复习汉明码,上计算机组成原理的时候学过了,可是老师讲的实在是太水。于是过了好几个月我再次用“人话”来解释什么是汉明码。最讨厌故弄玄虚装腔作势的讲解了,晦涩难懂,根本理解不了= = ,能不能说人话。 ...转载请注明出处,谢谢!
最近在复习汉明码,上计算机组成原理的时候学过了,可是老师讲的实在是太水。于是过了好几个月我再次用“人话”来解释什么是汉明码。最讨厌故弄玄虚装腔作势的讲解了,晦涩难懂,根本理解不了= = ,能不能说人话。
不明白的欢迎留言评论哈~
想要理解汉明码首先要知道“奇偶校验”这个东西。这个东西很简单。
我们约定一串编码里1的个数是偶数个,那么这串编码里携带的信息就是对的,否则就是错的。
我们可以在开头对这串编码加一位校验码实现奇偶校验。
for example:
我们想传输10010这串码,那么在传输的时候,就传010010,其中在开头的0就是校验位。
我们想传输10000这串码,那么在传输的时候,就传110000,其中在开头的1就是校验位。
两个例子的1的个数都是偶数。
好了,接下来可以讲汉明码了。
首先汉明码是采用奇偶校验的码。它采用了一种非常巧妙的方式,把这串数字分了组,通过分组校验来确定哪一位出现了错误。
第一个问题,检错原理。
它的原理可以通过一个例子来说明。
因为在传输过程中,最最最可能的是只错一位数据,所以,
汉明码默认一串数据只错一位
我们假设想传这一列数据1234567,我们先把他们分个组(当然怎么分组的我们等会儿再讨论),如图。
转载请标明出处 P1组:1,2,3,4
P2组:2,4,5,7
P3组:3,4,6,7tips:最好把这个图花在你的演算纸上^_^,方便些哦~
我们约定,哪一个组出错了,就给这个组做一个1的标志。
要记得哦,只错一个数据。
比如,这次的情况是,P1组中有一个错了,P2组没错,P3组没错。
嗯,好,现在我们看图,我们看,
P2组里谁都没错,可以排除2,4,5,7这几个数据;
P3组里谁都没错,可以排除3,4,6,7这几个数据;
那么P1组里我们知道是有错的,那经过P2,P3组的对数据的排除,我们很容易知道,是1这个数据有了错误。
好,那么错一个组的情况我们讨论过了,那么错两组的情况呢?
假设P1中有个错了,P2中有个错了,P3全对了
好,同时属于P1和P2而且不属于P3的数据是哪个?对,看图,是2这个数据。
好,那么三个组的情况呢?
同时属于P1、P2、P3组的数据是谁呢?对,是4这个数据。
好,这种分组,这种方式是不是很爽呢?汉明码就是利用了这种分组,这样它就可以很简单地分辨出哪一个数据出错,这种可以检测出数据出错的能力叫做“检错”,一定要和“纠错”分开,检错只能检测到错误不一定能改过来错误,纠错是可以的。
知道那个图的原理就好,现在扔掉它。
下一个问题,校验码的位置。
这是规定,记住它,在采用汉明码的一串数据中,2的i次方的位置上,我们放校验码。
校验码是1,或者是0,使得校验码所在的组的1的个数是偶数。
如图:
绿色的位置是放校验码的地方,1,2,4,8,16……等等,2的i次方的地方。
下一个问题,汉明码是怎么分组的呢?
我们看到,其实有些数据是既在P1组又在P2组的。
怎么分组,这个要记住,没啥原理了哈哈。
要预先做的工作是,
把表示位置的这个数,转化成二进制数。
也就是,
第1个位置,变成第0001个位置;
第2个位置,变成第0010个位置;
第3个位置,变成第0011个位置;
第4个位置,变成第0100个位置;
第5个位置,变成第0101个位置;
第6个位置,变成第0110个位置;
那么,规定来了,
凡是位置符合这种形式的,XXX1,归到P1;
凡是位置符合这种形式的,XX1X,归到P2;
凡是位置符合这种形式的,X1XX,归到P3;
凡是位置符合这种形式的,1XXX,归到P4;
那么显然各个校验码也被分到各个组里面去了,而且,每个组只有一个校验码。(这个,太简单我就不解释了……)
那么组分好了,校验码的值也就确定下来了。(数组内有多少个1就可以了)
好,为了防止你不明白,我举个例子哈。
我们想传这一组码:XX1X101X011
一共11位。
标X的是校验码的位置,我们暂时不知道它的值是多少。
位置在1,3,5,7,9,11的数据进到P1组。(你转换一下这些位置的二进制,就知道他们的位置符合XXX1)
位置在2,3,6,7,10,11的数据进到P2组。(位置符合XX1X)
位置在4,5,6,7的数据进到P3组。(位置符合X1XX)
位置在8,9,10,11的数据进到P4组。(位置符合1XXX)
那么确定了分组,校验码的值也就顺便确定下来了。
这样整个串的码就确定下来了。
现在知道汉明码是怎么分组的了吗?对,通过位置数的性质。
好,下两个问题。
从发送者的角度,我该怎么发用上汉明码的数据呢?
首先我们考虑我们到底要发多少位。假设校验码一共k位,我们想发的原始数据一共n位,要注意我们的校验码也要校验校验码错没错,所以,要校验的一共有k+n位,k位校验码可以检测2^k位的码,但是不能所以,校验码的位数要满足这个公式
,或者说
这样我们就能算出来要用多少校验码了。
其实哈,实际上不用这么麻烦,教科书总是那么复杂。假设你想发101011111,那你就先占下校验位,然后空着的位填你想发的数据就好。
占下1,2,4,8……等等位,看能占下多少位就可以,当然这个手算比较直观啦哈。
好,我假设你填完了,然后分好组,也确定了校验位的值了,那么发送出去啦~
嘟嘟嘟~~~~~~~
我是接收者,我收到了一串汉明码,怎样用汉明码的性质来检错呢?
1.分组,分好P1,P2,P3……
(2020年更正错误,各位看官不好意思了,下面的都是对的。)
2.分别对每个组校验,没有错的给它0,有错的给1.
3.记得第一个问题,汉明码的原理吗?你可能会想,3个组,我们可以画3个圈,可是100个组,这个圈可就太难画了啊!
这里有一个等价的方法,hamming真的太聪明了。
把P从大到小排列起来,得到一串1010,
for example:
组别: P5 P4 P3 P2 P1
标志: 1 0 1 0 1
从大到小排列起来,标志排成了一串一零串。这个数就是出错的数据的位置。
本例中,10101位置上的位错了,换成十进制是第21个位置上的数错了。
然后,我们发现了它错误的位置,又因为它是二进制的,不是0就是1,所以,可以顺便把它纠错。
好了,这样,我就全都讲完了……………………
你可以随便写一串101010101010101010,从接收方的角度,解这一串汉明码,很好玩的。
加油哦~~~
-
计算机网络中Hamming(哈明码)的c语言实现
2021-05-21 04:04:38直接贴代码了//============================================================================// Name : Hamming.cpp// Author : wzw// Version :// Copyright : Your copyright notice// Description...直接贴代码了
//============================================================================
// Name : Hamming.cpp
// Author : wzw
// Version :
// Copyright : Your copyright notice
// Description : Hello World in C++, Ansi-style
//============================================================================
#include
#include
#include
int isRightParity(int,int[]);
void getColumn(int,int,int,int[]);
void getParity(int[],int,int,int[],int[]);//得到数据与校验码组合码
void getCodedMessage(int[],int[],int,int[]);
int isPowerOfTwo(int);
int getParityBit(int);
void getNextParityCode(int,int,int[]);
int main(){
int data_bit; //数据位长
printf("Input The Bits Of Data:/n");
scanf("%d",&data_bit);
int data[data_bit];
for (int i=0;i
printf("Input The %dth Bit/n",i+1);
int temp;
temp=(int)getche()-48;
if((temp==0)||(temp==1)){ //确保输入数据时0或1
data[i]=temp;
printf("/n");
}
else{
printf("/nInput Must Be 0 Or 1/n");
i--;
}
}
printf("The Data To Be Coded Is: ");//显示输入的待传输数据
for(int i=0;i
printf("%d",data[i]);
}
int parity_bit; //校验码位长matrix column;matrix row is parity+data_bit;
parity_bit=getParityBit(data_bit); //根据数据位长选择最短的检验码,返回位长
printf("/nChoose Bits Of Parity Is: %d /n",parity_bit);
int parity_code[parity_bit]; //校验码
int coded_message[parity_bit+data_bit]; //数据和校验码融合之后的数据
getParity(data,data_bit,parity_bit,parity_code,coded_message);
printf("Parity Is: ");
for(int i=0;i
printf("%d",parity_code[i]);
}
printf("/nCoded Message Is: ");
for(int i=0;i
printf("%d",coded_message[i]);
}
printf("/n/nPress Any Key Exit...");
getch();
}
void getColumn(int index,int data_bit,int parity_bit,int column[]){
for(int i=0;i
int parity_row[parity_bit];
getNextParityCode(parity_bit,i,parity_row);
column[i]=parity_row[index];
}
}
void getParity(int data[],int data_bit,int parity_bit,int parity_code[],int coded_message[]){ //计算校验码P
int flag[parity_bit];
int column[data_bit+parity_bit];//矩阵一列
for(int m=0;m
getNextParityCode(parity_bit,m,parity_code);
getCodedMessage(data,parity_code,(parity_bit+data_bit),coded_message);
for(int i=0;i
flag[i]=0;
}
for(int i=0;i
getColumn(i,data_bit,parity_bit,column);
int matrix_product=0;//乘积
for(int j=0;j
matrix_product=matrix_product+coded_message[j]*column[j];
}
if(matrix_product%2==0){
flag[i]=1;
continue;
}
else{
flag[i]=0;
break;
}
}
if(isRightParity(parity_bit,flag)==1){
break;
}
else{
continue;
}
}
}
int isRightParity(int length,int flag[]){
int temp=1;
for(int i=0;i
temp=temp*flag[i];
}
if(temp==1){
return 1;
}
else{
return 0;
}
}
void getCodedMessage(int data[],int parity_code[],int length,int coded_message[]){
int index_data,index_parity;
index_data=index_parity=0;
for(int i=0;i
if(isPowerOfTwo(i+1)==1){
coded_message[i]=parity_code[index_parity];
index_parity++;
}
else{
coded_message[i]=data[index_data];
index_data++;
}
}
}
int isPowerOfTwo(int num){//num is power幂 of 2 or not
int ispoweroftwo;
int i=0;
while(1){
int pow2i=(int)pow(2,(double)i);
if(num
ispoweroftwo=0;
break;
}
else if(num==pow2i){
ispoweroftwo=1;
break;
}
else if(num>pow2i){
i++;
}
}
return ispoweroftwo;
}
void getNextParityCode(int parity_bit,int index,int parity_code[]){//change index+1 to BCD
int temp=index+1;
for(int i=0;i
parity_code[parity_bit-i-1]=temp%2;
temp=temp/2;
}
}
int getParityBit(int data_bit){//get least bit of parity
int paritybit=0;
int power;
while(1){
paritybit++;
power=(int)pow(2,(double)paritybit)-1;
if((paritybit+data_bit)<=power){
break;
}
}
return paritybit;
}
-
汉明码(Hamming Code)原理及实现
2021-11-15 17:52:28汉明码实现原理 汉明码(Hamming Code)是广泛用于内存和磁盘纠错的编码。汉明码不仅可以用来检测转移数据时发生的错误,还可以用来修正错误。(要注意的是,汉明码只能发现和修正一位错误,对于两位或者两位以上的... -
AR专用汉明码生成器
2016-04-02 22:45:19目前网络上的AR专用汉明码资源很少,本人特地开发一款AR专用汉明码生成器 用JAVA开发,打包成了EXE格式。 本程序生成AR专用的5X5的...http://blog.csdn.net/sac761/article/details/51045218 欢迎交流! QQ489662100 -
汉明码(Richard Hanming)
2021-10-24 17:43:09汉明码是由Richard Hanming于1950年提出的,它具有一位纠错能力。 由编码纠错理论得知,任何一种编码是否具有检测能力和纠错能力,都与编码的最小距离有关。所谓编码最小距离,是指在一种编码系统中,任意两组合法... -
汉明码——计算机网络——全网最通俗的讲解
2019-02-24 15:46:27汉明码——计算机网络——全网最通俗的讲解 一、什么是汉明码(hamming code) “汉明码”,也称作“海明码”,英文名为“hanming code”,在通信领域中,“汉明码”有广泛的应用,由理查德·卫斯里·汉明于... -
11汉明码编解码实验.doc
2021-04-29 09:47:4111汉明码编解码实验实验一 汉明码编解码实验一、实验目的1、掌握汉明码的编解码原理。2、掌握汉明码的软件仿真方法。3、掌握汉明码的硬件仿真方法。4、掌握汉明码的硬件设计方法。二、预习要求1、掌握汉明码的编解码... -
MATLAB实现汉明码编码译码
2020-12-23 01:15:38MATLAB实现汉明码编码译码 汉明码的编码就是如何根据信息位数k,求出纠正一个错误的监督矩阵H,然后根据H求出信息位所对应的码字。 1、根据已知的信息位数k,从汉明不等式中求出校验位数m=n-k; 2、在每个码字C:... -
汉明码纠错检错c程序编程
2011-03-28 21:22:2411位汉明码纠错检错接收端c语言程序,仅限参考。 -
汉明码(海明码)计算方法
2019-10-07 04:12:23汉明码是一种具有纠错功能的校验码.本文简单地介绍汉明码的计算方法.汉明码的目的是能够纠正一位误码.假设信息码共有 n 位,汉明码共有 r 位,那么总共的码长为 n + r 位.为能检测出 n + r 位编码中其中一位的错误,... -
汉明码原理和纠错
2021-01-24 17:12:22汉明码原理和实现 汉明码历史 汉明码(Hamming Code),是在电信领域的一种线性调试码,以发明者理查德·卫斯里·汉明的名字命名。汉明码在传输的消息流中插入验证码,当计算机存储或移动数据时,可能会产生数据... -
通俗易懂解释汉明码(附MATLAB实现代码)
2020-09-09 14:50:34汉明码(Hamming Code),是在电信领域的一种线性调试码,以发明者理查德·卫斯里·汉明的名字命名。汉明码在传输的消息流中插入验证码,当计算机存储或移动数据时,可能会产生数据位错误,以侦测并更正单一比特错误... -
MATLAB初学——对于汉明码编码译码的实现
2019-07-01 11:00:19今天上课,老师让我们用matlab进行汉明码编码译码的实现,之前上通信原理课程的时候老师顺带提过一句,现在已然是记不太清了,所以上网搜索了一下关于汉明码的原理。 汉明码(Hamming Code),是在电信领域的一种... -
VC++实现汉明码
2022-01-08 00:24:46海明码一般指汉明码; 汉明码(Hamming Code)。汉明码在传输的消息流中插入验证码,当计算机存储或移动数据时,可能会产生数据位错误,以侦测并更正单一比特错误。由于汉明编码简单,它们被广泛应用于内存(RAM)。... -
[7,4]汉明码编解码
2010-03-27 20:41:50【7,4】汉明码的编解码c语言实现1111111111111111111111111111 -
汉明码的matlab实现(hanming code)
2011-09-05 20:33:16该资源对一段录音文件(.wav)格式,进行matlab软件中的hanming 编码,通过BSC信道,并解码纠错,利用算法仿真误比特率。文件包含(7,3)、(7,4)、(8,4)的源代码及一个完整报告文件。有问题可邮件:sljdzw@bupt... -
简单易懂的汉明码(海明码)校验原理
2021-06-08 10:26:27汉明码编码原理 汉明码也叫做海明码,它通过向原始数据中添加校验数据来进行查错和纠错。具体来说, 假设数据位有n位,则校验位为k,k满足 2^k >= n+k+1 汉明码的位数为n+k,且校验位位于2的幂次的位置 每... -
汉明码编码的纠错原理
2018-10-06 17:38:25当计算机存储或移动数据时,可能会产生数据位错误,这时可以利用汉明码来检测并纠错,简单的说,汉明码是一个错误校验码码集,由Bell实验室的R.W.Hamming发明,因此定名为汉明码。 2. 汉明码的定义和汉明码不等式... -
MATLAB实现(7,4)汉明码的编码解码纠错及BER的分析
2022-03-01 13:40:34MATLAB实现7,4汉明码的编码解码纠错及BER的分析背景代码计算BER计算不使用汉明编码情况时的BER(模拟环境与理论情况)总结 背景 本科时信息论与编码的作业,流程逻辑如下: 数据->汉明编码->BPSK调制->加入... -
基于matlab的多路信道编码——汉明码
2021-12-21 19:08:04信源函数_marujie123的博客-CSDN博客) eg.产生四路信源序列: %% 四路信源产生序列 I = 4 %信源数量 m=zeros(4,100);%m是一个4行100列的矩阵 for i = 1:I m(i,:)=randi([0,1],1,100);%m的每一行都是一组长度为100的... -
【信道编码/Channel Coding】汉明码Hamming Code
2021-12-13 18:04:41这是本专栏信道编码/Channel Coding的第三站,想对信道编码有一个系统性的认识可以...而在本篇文章中,将介绍汉明码(Hamming Code)的构成,而且会着重讲解汉明码的线性分组码形式,因为这是我学习过程中最大的疑惑。 -
汉明码的原理、生成和检验
2017-12-03 11:29:23汉明码具有一位纠错能力。 设将要进行检测的二进制代码为n位,为使其具有纠错能力,需要再加上k位的检测位,组成n+k位的代码。那么,新增加的检测位数k应满足: 2k≥n+k+1或2k-1≥n+k 代码长度和检测位数的关系 -
汉明码原理
2022-04-07 17:53:16终于搞懂汉明码了 -
508_汉明码权重
2021-01-27 21:21:06汉明码之前使用非常少,印象中第一次看到的时候我还在北京。那时候,工作变动但是自己感觉有一些迷惑,因为不觉得自己的能力有什么竞争力。 自己之前的工作经验在PowerPC平台,而那时候我自己的的工作又是这个。...