實驗目的
加深理解Hamming(7,4)碼的編碼方法和抗干擾性能。通過編程實現Hamming
(7,4)碼的便拿碼算法,進一步掌握按位二進制加法的實現原理。
實驗要求
輸入:長度爲4的任意二進制序列
輸出:輸入數據經Hamming(7,4)編碼器編碼之後,通過作業3(2)二元對稱信道模擬器
(錯誤概率爲0.1)傳輸後,再經過Hamming(7,4)譯碼器輸出得到新宿的長度爲4的二進制
序列。
實驗原理
基本定義
定義1:設一個D元(N, L)線性分組碼的生成矩陣G,校驗矩陣H。則H是一個D源(N,N-L)
線性分組碼的生成矩陣,G是此碼的一個校驗矩陣。稱這兩個碼互爲對偶碼。定義2:一個N維向量的Hamming重量爲它的對應位置值不等於0的位數。
定義3:兩個N維向量的Hamming距離定義爲他們的對應位置不同的位數。
信道的輸入爲碼字U,信道的輸出爲向量Y,稱向量
e=Y−U 爲差錯向量。設H是校驗矩陣,對於N維行向量t,記
s=tHT 爲向量t的伴隨式。
基本定理
定理1:設信道輸入碼字U,輸出向量爲Y,差錯向量
e=Y−U ,則e的伴隨式等於Y的
伴隨式。- 定理2:設輸出向量爲Y,並計算出了Y的伴隨式
s=YHT 。則此時所有可能的差錯向量
恰好就是任何一個可能的差錯向量加上全體碼字。即此時所有可能的差錯向量恰好就是方程
s=tHT 的任何一個固定解t加上全體碼字。
- 定理2:設輸出向量爲Y,並計算出了Y的伴隨式
實現原理
二元碼和非二元碼都存在漢明碼,我們以二元漢明碼爲例。漢明碼不是一個碼,而是一類碼,
悽慘數具有下列形式
其中m爲正整數。例如當
,對於二元碼,它的
校驗矩陣
漢明碼器最小漢明距離
由於漢明碼的校驗矩陣 包含了所有非零m維向量,通過編排列矢量的順序可以很容易地得到具有
式
矩陣。例如觀察如下校驗矩陣,其列矢量爲(001),(010),(011),(100),(101),(110),(111)。
算法實現
漢明碼的定義是一個線性分組碼,它的最小Hamming距離爲3,能糾正全部一位錯誤。
而且編碼譯碼都非常簡單,接收矢量的伴隨式等於校驗矩陣H中與出錯位對應的矢之和。
\subsection{算法步驟}
1. 通過線性變換由信源端產生的L長的信號x生成信道編碼後的N長的信號Y,
2. 將步驟1產生的信號Y通過二元對稱信道,二元對稱信道需設置錯誤概率。通過
二元對稱信道的信號計爲
3.由公式
和差錯向量e的伴隨式相等,將
找到可能的差錯向量。
4. 在以s爲伴隨式的全體“可能的差錯向量中”,取一個Hamming重量最小的向量作爲
s的培集首,記爲
5. 計算通過信道前的信號Y,
6. 輸出線性U的線性逆變換即爲經過信道傳輸並經過Hamming編碼譯碼的信號。
算法程序實現
主函數部分依次執行各個模塊的功能
int main()
{
int n;
cout<<"請輸入四位信息位"<<endl;
for(n=0;n<4;n++)
{
cin>>message[n];
}
creat_code(message,G);
cout<<"發送的七位代碼爲:"<<endl;
for(n=0;n<7;n++)
{
cout<<send[n]<<" ";
}
cout<<endl;
cout<<"請輸入收到的七位代碼"<<endl;
for(n=0;n<7;n++)
{
cin>>Y[n];
}
syndrome(Y,H);
cout<<"校正子爲:"<<endl;
for(n=0;n<3;n++)
{
cout<<S[n]<<" ";
}
cout<<endl;
comp(S,H) ;
cout<<"糾正子爲:"<<endl;
for(n=0;n<7;n++)
{
cout<<e[n]<<" ";
}
cout<<endl;
correct_code(Y,e);
cout<<"接收到的七位碼爲:"<<endl;
for(n=0;n<7;n++)
{
cout<<C[n]<<" ";
}
cout<<endl << endl;
cout<<"接收到的四位信息爲:"<<endl;
for(n=0;n<4;n++)
{
cout<<get_code[n]<<" ";
}
cout<<endl;
return 0;
}
可以看到主函數一次執行的功能包括:
輸入四位的原始信息
產生7位信道編碼
7位編碼經過二元對稱信道後的編碼
生成矯正子和糾正子(也就是原理中對應的差錯編碼)
輸出接收到的7位編碼
輸出解碼後的4位信息碼
核心函數包括
- void creat_code(int array1[4],int array2[4][7])
該函數用來生成7位的信道編碼,輸入的參數是4位的信源符號和4×7的生成矩陣。
void creat_code(int array1[4],int array2[4][7]) //生成七位發送的代碼
{
int i,j,m=0;
for(j=0;j<7;j++)
{
for(i=0;i<4;i++)
{
m=(array1[i]*array2[i][j])^m;
}
send[j]=m;
m=0;
}
}
void syndrome(int array[7],int array1[3][7])
該函數用來計算矯正子也就是原理中提到的輸出向量的伴隨式,
輸入參數1是經過二元對稱信道的信號編碼,參數2是校驗矩陣。
“`
void syndrome(int array[7],int array1[3][7]) //得出矯正子S
{
int k=0,a,b;
for(a=0;a<3;a++)
{
for(b=0;b<7;b++)
{
k=k^(array1[a][b]*array[b]);
}
S[a]=k;
k=0;
}
}
3. void comp(int array1[3],int array[3][7])
該函數用來生成糾正子,也就是我們原理那部分的差錯向量e,輸入參數1是函數2產生的伴隨式,
輸入參數2是校驗矩陣。
```
void comp(int array1[3],int array[3][7]) //得出糾正子e
{
int i=0,j=0,m=1,p;
while(m)
{//j=j+1;
if((array1[0]==array[0][i])&&(array1[1]==array[1][i])&&(array1[2]==array[2][i]))
{
m=0;
row=j;
for(p=0;p<7;p++)
{
if(p==row)e[p]=1;else e[p]=0;
}
}
else
{
j=j+1;i++;
if(i==7)
{
for(p=0;p<7;p++)
{
e[p]=0;
}
m=0;
}
}
}
}
- void correct_code(int array3[7],int array4[7])
該函數的功能是得出更正後的碼字,輸入參數1是校驗矩陣,輸入參數2是最小Hamming距離的差錯向量。
void correct_code(int array3[7],int array4[7]) //得出正確的碼字
{
int z;
for(z=0;z<7;z++)
{
C[z]=Y[z]^e[z];
}
for(z=0;z<4;z++)
{
get_code[z]=C[z+3];
}
}
我們測試的輸入向量爲[1 0 1 0],生成的7位編碼爲[0 0 1 1 0 1 0],假設通過二元對稱信道後的編碼
爲[0 0 1 1 0 1 1]即最後一位發生錯誤,那麼得到的伴隨式爲[1 0 1],最小Hamming距離對應的
差錯向量爲[0 0 0 0 0 0 1],所以得出接收到的7位編碼爲[0 0 1 1 0 1 0],最後的出糾正後的
編碼爲[1 0 1 0],和我們輸入的向量是一樣的,所以按此方法可以做到信道編碼的糾錯。
總結
此次實驗通過模擬Hamming編碼譯碼器的功能,從原理上分析了信道編碼的基本流程,和相應的實現方法,
以Hamming編碼譯碼器爲例展開討論,深化了我們對信道編碼和信道傳輸的理解。