簡單理解卷積碼

  卷積碼(convolutional code)是信道編碼的一種。信道編碼被用於物理層,目的是減少因不完美信道造成的誤碼。卷積碼的生成方式是將待傳輸的信息序列通過線性有限狀態移位寄存器。接收方使用最大似然法解碼(maximum likelihood decoding)。

1. 編碼

1.1. 從編碼器的角度理解編碼過程

圖 1. 卷積碼編碼器(n=3,k=1,K=3)

  卷積碼的編碼器如圖 1 所示,由 KK 個能存儲 kk 個比特的 stage 和 nn 個莫二加法運算器以及一個 nn 位寄存器組成。它的功能是將 kk 個比特的原始信息比特編成 nn 比特的信道碼。每輪編碼只能有 kk 個比特作爲輸入,nn 個比特作爲輸出。

  當編碼器運作時執行以下操作:

  1. stage KK 先將原先存儲的比特丟棄,stage ii 將存儲的比特轉移至 stage i+1i+1
  2. 向 stage 11 輸入 k 個欲被編碼的信息比特;向 stage 11 輸入 k 個欲被編碼的信息比特;
  3. 每個 stage 將其所存儲的比特按照預先設定的方式輸入至莫二加法器做莫二加法運算,所得結果被存儲在 nn 位寄存器中;每個 stage 將其所存儲的比特按照預先設定的方式輸入至莫二加法器做莫二加法運算,所得結果被存儲在 nn 位寄存器中;
  4. nn 位寄存器的存儲作爲該輪輸入的編碼結果輸出。將 nn 位寄存器的存儲作爲該輪輸入的編碼結果輸出。
  5. 以上步驟執行至所有信息比特被編碼爲止。以上步驟執行至所有信息比特被編碼爲止。

  圖 1 爲 n=3n=3k=1k=1K=3K=3 卷積碼編碼器,這意味着每輪編碼只能輸入一個比特,有三個比特作爲輸出。輸出序列 C=C1C2C3C=C_1 C_2 C_3 與 stage 之間的關係爲:C1=S1C_1=S_1C2=S1S2S3C_2=S_1⨁S_2⨁S_3C3=S1S3C_3=S_1⨁S_3

  以輸入比特“11”作爲例子,編碼器需要執行以下操作:

  1. stage 33 將原先存儲的比特“00” 丟棄,stage 22 將存儲的比特“00”轉移至 stage 33,而 stage 11 將存儲的比特“0” 轉移至 stage 22
  2. 輸入比特“11”最後被存入 stage 11 中;輸入比特“11”最後被存入 stage 11 中;
  3. 通過莫二加法運算後輸出序列爲 C=C1C2C3=111C=C_1 C_2 C_3=111;通過莫二加法運算後輸出序列爲 C=C1C2C3=111C=C_1 C_2 C_3=111
  4. 該輪編碼結果“111111”被輸出。該輪編碼結果“111111”被輸出。

1.2. 從 trellis diagram 的角度理解編碼過程

圖 2. trellis diagram

  一般會將編碼的結果在如圖 2 所示的 trellis diagram上用箭頭表示,這些箭頭被稱爲 branch。trellis diagram 上每一行代表編碼的 state,其由 stage 22 至 stage KK 內存儲的比特排列而成,記爲 S=S2S3SKS=S_2 S_3…S_K; trellis diagram 上每一列代表被編碼比特的第幾輪輸入。trellis diagram 上每一行與每一列的交匯點被稱爲 node,代表每輪編碼時的 state; branch 上標有一些碼字,代表每輪編碼的結果,也即上文提到的 nn 位寄存器的存儲內容;所有 branch 組合成一條 path,標識整個編碼過程中 state 的變化情況。

  圖 2 是以“110110”作爲圖 1 編碼器編碼輸入的 trellis diagram,編碼步驟如下:

  1. 當時刻爲 t=t1t=t_1 時,輸入比特“11”,此時移位寄存器的存儲爲 S1S2S3=100S_1 S_2 S_3=100,state 爲 S=S2S3=00S=S_2 S_3=00,編碼輸出爲 C=C1C2C3=111C=C_1 C_2 C_3=111
  2. 當時刻爲 t=t2t=t_2 時,再次輸入比特“11”,此時移位寄存器的存儲爲 S1S2S3=110S_1 S_2 S_3=110,因此 state 變爲 S=S2S3=10S=S_2 S_3=10,而編碼輸出爲 C=C1C2C3=101C=C_1 C_2 C_3=101;當時刻爲 t=t2t=t_2 時,再次輸入比特“11”,此時移位寄存器的存儲爲 S1S2S3=110S_1 S_2 S_3=110,因此 state 變爲 S=S2S3=10S=S_2 S_3=10,而編碼輸出爲 C=C1C2C3=101C=C_1 C_2 C_3=101
  3. 當時刻爲 t=t3t=t_3 時,輸入比特“00”,此時移位寄存器的存儲爲 S1S2S3=011S_1 S_2 S_3=011,因此 state 變爲 S=S2S3=11S=S_2 S_3=11,而編碼輸出爲 C=C1C2C3=001C=C_1 C_2 C_3=001;當時刻爲 t=t3t=t_3 時,輸入比特“00”,此時移位寄存器的存儲爲 S1S2S3=011S_1 S_2 S_3=011,因此 state 變爲 S=S2S3=11S=S_2 S_3=11,而編碼輸出爲 C=C1C2C3=001C=C_1 C_2 C_3=001

  完整信道編碼的結果爲“111101001111 101 001”。值得說明的是,在編碼前所有的 stage 默認攜帶比特“00”,所以無論編碼器的輸入是什麼,trellis diagram 上的 path 都從“0000” state 開始。

2. 解碼

  卷積碼解碼利用最大似然法(maximum likelihood),其包含兩個步驟:

  1. 對於一串接收的序列 R\bf R,在所有輸入方式所能產生的編碼序列 C\bf C 中找到一串與 R 最相似的序列 C\bf C^{* } 作爲接收原碼;
  2. 根據 C\bf C^{*} 在 trellis diagram 中表示的 path 反推出所有輸入的原始信息比特。

  最大似然法解碼在 trellis diagram 上的表現爲尋找一條與代表接收序列 R\bf R 的 path PathRPath_{\bf R} 相似度最高的一條 path PathCPath_{\bf C^{* }}

  然而遍歷所有可能產生的序列伴隨着巨大的開銷,所以在實際中採用 Viterbi 算法解碼 [11]。Viterbi 算法在解碼的過程中刪減去與接收序列相似度較低的序列,在 trellis diagram 上表現爲刪除與代表 R\bf R 的 path PathRPath_{\bf R} 中 branch 相似度低的 branch。

  卷積碼的解碼還分爲硬解碼(hard decision decoding)和軟解碼(soft decision decoding)兩種,前者先將所採樣的信號做判別再進行解碼,後者直接用被採樣信號做解碼運算。

  下面以硬解碼爲例結合 trellis diagram 解釋 Viterbi 算法。

圖 3. Viterbi 解碼算法

  在硬解碼中,判斷序列相似度的指標是漢明距離,即要判斷 R\bf RC\bf C 對應比特不同的位數。在使用 Viterbi 算法進行解碼時,需要計算累計錯誤度量(accumulated error metrics),即每一條可能屬於 PathCPath_{\bf C^{* }} 的 branch 所能產生的碼字與 PathRPath_{\bf R} 對應 branch 的漢明距離之累加。圖 1 的 trellis diagram 說明了 Viterbi 算法的執行過程,其假設發送端使用圖 1 的接收機如圖 2 編碼,所發送序列爲 C=111101001C=111101001;又假設所接收的序列爲 R=110100001R=110100001

  Viterbi 算法具體執行過程如下:

  1. 卷積碼的編碼都從“0000” state 開始,所以從該 state 開始搜尋屬於 PathCPath_{\bf C^{* }} 的 branch。因爲 k=1k=1,發送方發送的被編碼比特只有“0”或者“1”兩種可能,當 t=t1t=t_1 時,按照圖 1 中編碼器的編碼方式,若發送方編碼前輸入的比特爲“00”,則產生的碼字爲“000000”,其對應 branch 的累計錯誤度量爲 22;若發送方編碼前輸入的比特爲“11”,則產生的碼字爲“111111”,其對應 branch 的累計錯誤度量爲 11。說明輸入“11”產生的 branch 於 PathRPath_{\bf R} 的第一條 branch 最相似,因此被保留,而輸入“00”產生的 branch 被刪除。
  2. 而後承接上一步,當 t=t2t=t_2 時,由於只有到達“1010” state 的 branch 被保留,因此解碼由“1010” state 開始,按照圖 1 中編碼器的編碼方式,若發送方編碼前輸入的比特爲“00”,則產生的碼字爲“010010”,其對應 branch 的累計錯誤度量爲 1+2=31+2=3;若發送方編碼前輸入的比特爲“11”,則產生的碼字爲“101101”,其對應 branch 的累計錯誤度量爲 1+1=21+1=2,少於前者,所以該 branch 被保留、前者被刪除。
  3. 承接上一步,當 t=t3t=t_3 時,由於只有到達“1111” state 的 branch 被保留,因此解碼由“11” state 開始,按照圖 1 中編碼器的編碼方式,若發送方編碼前輸入的比特爲“00”,則產生的碼字爲“001001”,其對應 branch 的累計錯誤度量爲 2+0=22+0=2;按照圖 1 中編碼器的編碼方式,若發送方編碼前輸入的比特爲“11”,則產生的碼字爲“110110”,其對應 branch 的累計錯誤度量爲 2+2=42+2=4,多於前者,所以該 branch 被刪除、前者被保留。

  由此判斷 C=111101110C^{*}=111101110,而被編碼的序列應爲“110110”。

  軟解碼執行 Viterbi 算法的方式和硬解碼執行 Viterbi 算法的方式相似,唯一的區別在於軟解碼計算累計誤差度量 Errsoft{\bf Err}_{soft} 如下公式而非漢明距離。
Errsoft=i=1N(RiCi)2{\bf Err}_{soft}=\sum_{i=1}^N (R_i-C_i )^2

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