卷積碼譯碼之維特比譯碼算法(Viterbi decoding algorithm)

卷積碼譯碼之維特比譯碼算法
(Viterbi decoding algorithm)
       本文主要介紹了卷積碼的一種譯碼方法——維特比譯碼(Viterbi decoding)。
       關鍵詞:卷積碼譯碼 維特比譯碼算法 

       卷積碼簡介:點擊打開鏈接

       ============================================================== 

       目錄結構:

       1、維特比譯碼簡介

       2、維特比譯碼過程

        ==============================================================


1、維特比譯碼簡介

       Viterbi算法是由美國科學家Viterbi在1967年提出的卷積碼的概率譯碼算法,後來學者深入研究中證明Viterbi算法是基於卷積碼網格圖的最大似然譯碼算法。何爲最大似然譯碼?在這裏我們可以進行以下簡單的理解:即根據已經接收到的信息,得到最接近編碼碼字的一種譯碼碼字。得到這種碼字使用的譯碼準則爲最大似然譯碼。(如果覺得繁瑣,第1部分可先略過)
       定義以下信號如圖1所示:
       (1)發送端
       信源:u
       編碼器輸出編碼碼字:v
       (2)接收端
       譯碼器輸入信息:r
       譯碼器輸出:u_dec
 
圖1、經典通信系統
       譯碼器輸出序列u_dec是u的一個估計值。譯碼器根據一定的譯碼規則,由接收序列r產生u_dec序列。由於信息序列u與碼字v有對應關係,所以等效於譯碼器產生一個碼字v的估值v’。當v‘=v是,u_dec=u。所以,當v‘不等於v時,譯碼出現錯誤。
       譯碼器的條件錯誤概率定義爲:
       譯碼器的錯誤概率定義如下:
       其中接收序列r是譯碼前產生的,所以p(r)與譯碼規則無關。爲了是譯碼錯誤概率最小的最佳的譯碼準則必須滿足對所有的r使p(E|r)最小。所以有
       根據以上公式可知,對於給定的接收序列r,如果選擇適合的v’,使p(v’=v|r)最大,則一定是最佳的。
根據貝葉斯公式:
       如果發送碼字的概率p(v)相同,p(r)又與譯碼規則無關,則
       所以,譯碼器如果可以選擇一個估計值使得上式最大,則這種譯碼器稱爲最大似然譯碼。p(r|v)稱爲似然函數。對數似然函數則如下:
       如果碼字不是等可能的,最大似然譯碼不一定是最佳的。在這種情況下,在決定哪個碼字能使p(v|r)最大時,必須以概率p(v)對條件概率log p(ri|vi)加權。但在許多系統的接收端不知道發送碼字的概率,所以最佳譯碼是不可能的,最大似然譯碼就成了可行的譯碼規則。
       轉移概率p<1/2的二進制對此信道(BSC),接收序列r是二元的。對於卷積碼,對數似然函數如下:
       其中d(r,v)是r和v之間的漢明距離。由於對所有的v,log p/(1-p) < 0且N log(1-p)是常熟,因此,對於BSC而言,最大似然譯碼是選擇使r和v之間距離最小的v‘作爲碼字v。

2、維特比譯碼過程

       由於最大似然譯碼等效於最小距離譯碼,因此具有最小d(r,v)累積值的路徑就是log p(r|v)的最大路徑,該路徑被稱爲倖存路徑。定義BM=d(ri,vi),稱爲分支度量值。PM稱爲最小累積度量值,是對所有分支度量值的累積。
       卷積碼的編碼過程與網格圖中的一條路徑對應,即輸入序列的編碼過程與網格圖中的路徑一一對應。當序列長度爲x時,網格中有2^x條不同的路徑和編碼器的2^x種輸入序列對應。在網格圖中,每個狀態轉移的過程中都會輸出編碼碼字。由於譯碼過程也建立在網格圖中,並且從全零狀態開始,從全零狀態結束。所以,在每個符合輸入的分支中,都可以計算出分支度量值。
       維特比譯碼算法步驟如下:
       (1)在j=L-1個時刻前,計算每一個狀態單個路徑分支度量。
       (2)第x-1個時刻開始,對進入每一個狀態的部分路徑進行計算,這樣的路徑有2^k條,挑選具有最大部分路徑值的部分路徑爲倖存路徑,刪去進入該狀態的其他路徑,然後,倖存路徑向前延長一個分支。
       (3)重複步驟(2)的計算、比較和判決過程。若輸入接收序列長爲(x+L-1)k,其中,後L-1段是人爲加入的全0段,則譯碼進行至(x+ L-1)時刻爲止。
       若進入某個狀態的部分路徑中,有兩條部分路徑值相等,則可以任選其一作爲倖存路徑。
       該譯碼算法的核心思想在於“加、比、選”,務必牢記,
       指的是將每個路徑的分支度量進行累積。度量的方法有漢明距或者歐式距離等方法。
       指的是將到達節點的兩條路徑進行對比。

       指的是選出到達節點的兩條路徑中度量值小的一條路徑作爲倖存路徑。

       

       以(2,1,2)卷積碼例子說明維特比譯碼過程:
       輸入數據:u = [1 1 0 1 1]
       編碼碼字:V = [11 01 01 00 01]
       接收碼字:R = [11 01 01 10 01]

       (2,1,2)卷積碼在以上算法中的參數,x=5,L=3,k=1,j從0開始計時。


       該卷積碼的編碼結構如下圖所示:
 
圖2.(2,1,2)卷積碼編碼結構圖

 
圖3. 各個分支的編碼輸出如圖所示

 
圖4. 解碼步驟1

       解碼步驟(1),j=0,1,2這3個時刻中計算出每個路徑的分支度量值和,即漢明距離,在圖中以藍色的數字表示。比如接收序列R中的第一個符合“11”,與第一回合的兩條路徑中的“00”,“11”的漢明距分別爲2和0,改數字被標註在每條線對應的下方或附近。
       在每個狀態節點具有兩條路徑時,譯碼算法纔開始根據分支度量的大小選擇倖存路徑,再刪除其他路徑。該步驟如下圖所示。
 
圖5. 第一個節點的倖存路徑選擇

       圖5. 第一個節點的倖存路徑選擇,由於進入狀態S0的兩條路徑的度量值3<4,所以選擇度量值爲3的圖中紅色線爲倖存路徑。
 
圖6. 第二個節點的倖存路徑選擇

 
圖7. 第三個節點的倖存路徑選擇

 
圖8. 第四個節點的倖存路徑選擇

       至此,第一次倖存路徑選擇完成,現在刪除其他路徑,將接下來的路徑的分支度量值都標註在圖中,如下圖示。
 
圖9. 剩餘譯碼路徑的分支度量值計算標註

       以上圖中在每個節點進行比較分支度量值比較,勝出的分支度量值被標註在狀態節點的上方。
       以上圖中在最後一個符號的譯碼得出一條分支度量值最小的路徑,如下圖所示,該條路徑即譯碼的最佳路徑。
 
圖10. 最佳路徑輸出
       根據該路徑得出的譯碼輸出爲【11 01 01 00 01】與例子中編碼碼字V相同。該碼字對應的輸入數據可以根據以上最佳路徑實線或者虛線讀出,即【1 1 0 1 1】。

       網格圖中的每一條路徑的編碼輸出matlab代碼如下所示:

clc;close all;clear
fid = fopen('test.txt','wt');
d1  = 0;
d2  = 0;
N   = 5;
for i = 0:31
    data = dec2bin(i,N);
    for j = 1:N
        %output calculation
        x   = str2num(data(j)); 
        y1  = mod(x + d1 + d2,2);
        y2  = mod(x + d2,2);
        y   = [y1,y2];
        %shift
        d2 = d1;
        d1 = x;
        fprintf(fid,'%d%d ',y1,y2);
    end
    fprintf(fid,' %s\n',dec2bin(i,5));
    d1 = 0;
    d2 = 0;
end
fclose('all')



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