MATLAB初學 對於漢明碼編碼解碼的實現

2021-09-24 21:14:39 字數 2602 閱讀 5574

今天上課,老師讓我們用matlab進行漢明碼編碼解碼的實現,之前上通訊原理課程的時候老師順帶提過一句,現在已然是記不太清了,所以上網搜尋了一下關於漢明碼的原理。

漢明碼(hamming code),是在電信領域的一種線性除錯碼,以發明者理查德·衛斯里·漢明的名字命名。。。。。。

簡單來說,漢明碼就是乙個可以校驗和糾錯的編碼。

首先記住乙個公式:

我們現在以k=4,n=7的例項來說明漢明碼的編碼原理:

a=[1,0,1,0,1,1,1]

因為n+k=11,我們要編碼出來的是乙個長度為11的陣列,其中四位是校驗碼

根據k值的不同,我們可以吧原始陣列分為k組,將原始陣列的下標分別轉換為二進位制

第一組的分別是末位為1的下標:***1

第二組的分別是次末位為1的下標:xx1x

第三組的分別是次位為1的下標:x1xx

第四組的分別是首位為1的下標:1***

所以第一組p1的下標分別為:3,5,7,9,11

第二組:3,6,7,10,11

第三組:5,6,7

第四組:9,10,11

每乙個校驗位的數值是組內每乙個元素數值的奇偶數

對於解碼:

假設接收到長度為11的陣列進行解碼,先取出校驗碼,然後用每個組的元素進行奇偶的校驗,如果錯誤,則該組的乙個校驗狀態轉為錯誤,記為1,通過對四個組進行奇偶校驗,用每個組的奇偶校驗值可以得出乙個陣列,用該陣列即可算出資料錯誤位置

假設傳遞時最後一位發生錯誤,則1,3,4組受到影響,校驗陣列為[1,0,1,1],通過計算2^3+2^1+2^0=11為錯誤位置

以下為**:

clc

a=[1,0,1,0,1,1,1];

ah1=hamingcode(a,4);

h1h2=hamingdecode(h1,4);

h2

function h = hamingcode(a,k)

n=length(a(:));

z=1;

j=1;

h=zeros(1,n+k);

for i=1:n+k %將輸入陣列寫入全零矩陣待用,且跳過驗證

if i==2^(z-1)

z=z+1;

continue

else

h(i)=a(j);

j=j+1;

endendif k==4

h(1)=rem(h(3)+h(5)+h(7)+h(9)+h(11),2);

h(2)=rem(h(3)+h(6)+h(7)+h(10)+h(11),2);

h(4)=rem(h(5)+h(6)+h(7),2);

h(8)=rem(h(9)+h(10)+h(11),2);

else if k==3

h(1)=rem(h(3)+h(5)+h(7),2);

h(2)=rem(h(3)+h(6)+h(7),2);

h(4)=rem(h(5)+h(6)+h(7),2);

else if k==2

h(1)=rem(h(3),2);

h(2)=rem(h(3),2);

endend

end

function h = hamingdecode(a,k)

%a=[1,0,1,1,0,1,0,1,1,1,0];

n=length(a(:)); %求輸入陣列長度

h=zeros(1,n-k); %解碼和解碼的n含義不同

check=zeros(1,k); %四個組的驗證陣列

che=0;

if k==4

if a(1)~=rem(a(3)+a(5)+a(7)+a(9)+a(11),2); %四個組,如果有任意乙個組驗證不通過,則相應陣列的變數變為1,標誌位che變成1,方便後面修改

check(1)=1

che=1

else if a(2)~=rem(a(3)+a(6)+a(7)+a(10)+a(11),2);

check(2)=1

che=1;

else if a(4)~=rem(a(5)+a(6)+a(7),2);

check(4)=1

che=1;

else if a(8)~=rem(a(9)+a(10)+a(11),2);

check(8)=1

che=1;

endend

endend

j=1;

z=1;

if che==1 %假如驗證生效

s= 2^(3*check(1))+2^(2*check(2))+2^(1*check(3))+2^(check(4)*0)

a(s)=1-a(s)

endfor i=1:n %跳過驗證碼,將陣列寫入輸出陣列

if i==2^(z-1)

z=z+1;

continue

else

h(j)=a(i);

j=j+1;

endend

end

本人對於漢明碼理解借鑑了其他博主文章,傳送門:

漢明碼詳細講解

漢明碼,是r.hamming與1940年於貝爾實驗室提出的。1.奇偶校驗碼 奇偶校驗碼。假設傳輸資訊位為k n 1位,表示為a1,an 1,加上一位奇偶校驗位 冗餘位 a0,構成乙個n位的碼字a0 an 1,在接收端校驗時,可按照關係式 s a0 a1 a2 an 1來計算。若s 0,則無錯,若s ...

計網筆記 海明碼(漢明碼)

海明碼是可以發現雙位元錯誤,並可以糾正單位元錯誤的編碼方案。一般來講,檢錯編碼不一定具有糾錯能力,但是糾錯編碼具有檢錯能力 其工作流程可以分為以下四個步驟 1 確定校驗碼位數r 2 確定校驗碼和資料的位置 3 求出校驗碼的值 4 檢錯並糾錯。在以下的工作流程中,我們要傳送的資料d 101101.我們...

海明碼(漢明碼)的工作機制

一 海明碼的形成方式 1 首先海明碼是由資訊位和校驗位組成的 2 資訊位校驗位的關係 校驗位的位數r 資訊位的位數i 2 r 1 i r 3 校驗位的位置是2的整數次方 如 1 2 4 8 4 海明碼位數分組 因為海明碼其實是分組的奇偶校驗碼,所以有個分組的概念 1 1 3 5 7 2 2 3 6 ...