信息論實驗-Hamming編碼

實驗目的

加深理解Hamming(7,4)碼的編碼方法和抗干擾性能。通過編程實現Hamming
(7,4)碼的便拿碼算法,進一步掌握按位二進制加法的實現原理。

實驗要求

輸入:長度爲4的任意二進制序列
輸出:輸入數據經Hamming(7,4)編碼器編碼之後,通過作業3(2)二元對稱信道模擬器
(錯誤概率爲0.1)傳輸後,再經過Hamming(7,4)譯碼器輸出得到新宿的長度爲4的二進制
序列。

實驗原理

基本定義

  1. 定義1:設一個D元(N, L)線性分組碼的生成矩陣G,校驗矩陣H。則H是一個D源(N,N-L)
    線性分組碼的生成矩陣,G是此碼的一個校驗矩陣。稱這兩個碼互爲對偶碼。

    1. 定義2:一個N維向量的Hamming重量爲它的對應位置值不等於0的位數。

    2. 定義3:兩個N維向量的Hamming距離定義爲他們的對應位置不同的位數。

    3. 信道的輸入爲碼字U,信道的輸出爲向量Y,稱向量e=YU 爲差錯向量。

    4. 設H是校驗矩陣,對於N維行向量t,記s=tHT 爲向量t的伴隨式。

基本定理

  1. 定理1:設信道輸入碼字U,輸出向量爲Y,差錯向量e=YU ,則e的伴隨式等於Y的
    伴隨式。

    1. 定理2:設輸出向量爲Y,並計算出了Y的伴隨式s=YHT 。則此時所有可能的差錯向量
      恰好就是任何一個可能的差錯向量加上全體碼字。即此時所有可能的差錯向量恰好就是方程
      s=tHT 的任何一個固定解t加上全體碼字。

實現原理

二元碼和非二元碼都存在漢明碼,我們以二元漢明碼爲例。漢明碼不是一個碼,而是一類碼,
悽慘數具有下列形式

(n,k)=(2m1,2mm1)

其中m爲正整數。例如當m=3 時,就得到了(7,4)漢明碼。漢明碼的校驗矩陣具有特殊的性質
,對於二元碼,它的2m1 個列包含了除0之外的所有nk=m 維向量。通過觀察可以發現,
校驗矩陣H 中任何兩個列矢量是線性獨立的,但是可以找到3個列矢量之和爲0.所以對於所有的
漢明碼器最小漢明距離dmin=3

由於漢明碼的校驗矩陣 包含了所有非零m維向量,通過編排列矢量的順序可以很容易地得到具有

H=[PT|Ink]
形式的系統漢明碼的校驗矩陣H ,進而可以得到系統漢明碼的生成
矩陣。例如觀察如下校驗矩陣,其列矢量爲(001),(010),(011),(100),(101),(110),(111)。
 A=1000010000100001111001111101=[I4|P] 

算法實現

漢明碼的定義是一個線性分組碼,它的最小Hamming距離爲3,能糾正全部一位錯誤。
而且編碼譯碼都非常簡單,接收矢量的伴隨式等於校驗矩陣H中與出錯位對應的矢之和。
\subsection{算法步驟}
1. 通過線性變換由信源端產生的L長的信號x生成信道編碼後的N長的信號Y,

Y=XG
其中G是生成矩陣。
2. 將步驟1產生的信號Y通過二元對稱信道,二元對稱信道需設置錯誤概率。通過
二元對稱信道的信號計爲Y
3.由公式s=YHT 計算出Y 的伴隨式s,根據定理可知信道輸出Y 的伴隨式
和差錯向量e的伴隨式相等,將Y 產生的伴隨式當作差錯向量e產生的伴隨式進一步
找到可能的差錯向量。
4. 在以s爲伴隨式的全體“可能的差錯向量中”,取一個Hamming重量最小的向量作爲
s的培集首,記爲e(s)
5. 計算通過信道前的信號Y,U=Ye(s)
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;
}

可以看到主函數一次執行的功能包括:

  1. 輸入四位的原始信息

  2. 產生7位信道編碼

  3. 7位編碼經過二元對稱信道後的編碼

  4. 生成矯正子和糾正子(也就是原理中對應的差錯編碼)

  5. 輸出接收到的7位編碼

  6. 輸出解碼後的4位信息碼

 核心函數包括

  1. 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;
    }
}
  1. 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;
      }
      }
      }
}
  1. 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編碼譯碼器爲例展開討論,深化了我們對信道編碼和信道傳輸的理解。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章