• 沒有找到結果。

4.2 組成元件介紹

4.2.5 Viterbi 解碼器

在吾人的實作當中,吾人選擇了 Viterbi 演算法當作在 802.11n 中所使用的迴旋編 碼器的解碼器。一般而言,為了達到模組化及管線式處理,可以將解碼器的電路 分成四個主要的處理單元,如圖 4-5 所示。其中包括:分支計量值單元

BMU(Branch Metric Unit ;BMU)、相加-比較-選擇單元(add-Compare-Select Unit ; ACSU)、路徑計量值記憶單元(Path Metric Memory Unit ; PMMU)及存活路徑記憶 單元(Survivor Memory Unit ; SMU)。各單元的功能簡述如下:

I. 分支計量值單元(BMU):根據所收到的值計算在格狀圖(trellis)每一級的分支 計量值。

II. 相加-比較-選擇單元(ACSU):對每個狀態執行相加-比較-選擇運算,用來計算 所有狀態的存活計量值和產生決策位元(或存活路徑)

III. 路徑計量值記憶單元(PMMU):用來儲存存活計量值,以供下一級在 ACSU 中計算路徑計量值及存活計量值。

IV. 存活計憶單元(SMU):負責記錄 ACSU 所產生的決定位元,並找出存活路徑 中最早時間點的位元,而當作解碼輸出。

圖 4-5 Viterbi 解碼器方塊圖

在本節的安排中,我們將先對 Viterbi 的原理做介紹,再將上述的四個單元一一 做較詳細的介紹。

4.2.5.1 Viterbi 演算法

Viterbi 演算法是在 1967 年由 Viterbi 所提出來的[23]來對迴旋碼進行解碼 的,近年來,Viterbi 演算法則有非常廣泛的應用,例如數位通訊系統、語音辨識 等。此演算法為最大近似解碼(Maximum Likelihood Decoding ; MLD),簡單地說 便是依據接收訊號來尋找在格狀圖上所有可能的路徑,最後選擇一條最短路徑來 當作最佳解碼路徑。演算法中包括了計算各個路徑與所收到訊號之間的相似度,

並且去除掉一些不可能成為最佳選擇的路徑。當幾個路徑進入同一狀態時,在這 幾個路徑之間的其中一個會因有「適當」的計量值(metric)而被選擇,而這被選 擇的路徑也就是存活路徑(survivor path)。所謂的「適當」則要根據計量值的定義。

在格狀圖中的所有狀態都要進行這樣的存活路徑選擇。在接下來的時間也是根據 這樣的法則來去除不可能的路徑,如此,在收集到一定長度的訊號後便可以將解 碼位元輸出了。底下我們用一個例子來說明這演算法。

為了描述 Viterbi 演算法是如何動作之前,我必需先定義出格狀圖,這是根 據編碼器而產生的。如圖 4-6 所示,我們用一個簡單的(n,k,m)=(2,1,2)的迴旋碼 編碼器來舉例說明,它由 2 個移位暫存器,2 個模 2(Modulo-2)加法器所組成,

而模 2(Modulo-2)的加法器可以由 XOR 閘來實現。迴旋碼編碼器基本上是一個有 限狀態機(Finite state Machines),我們可以用狀態圖來描述其輸入輸出的關係,

由之編碼器可以建立如圖 4-7 所示的狀態圖。其中每一狀態點為編碼器內暫存器 之值,輸入與輸出位元則表為v v(1) (2)/u 。通常我們會將這狀態圖轉成格狀圖來說 明,因為對於時間與狀態之間的轉換有較好的表達能力。如圖 4-8 所示,實線代 表輸入 0,虛線代表輸入 1。對圖 4-8 來說,因為編碼器有二個移位暫位器,所 以共會有 4 個狀態,分別為 S0(0,0),S1(1,0),S2(0,1),S3(1,1),每一個狀態有 2 條路徑指向下一個狀態,一條為當輸入位元 0 時,另一條則是輸入位元為 1 時。

圖 4-6 (2,1,2)之迴旋碼編碼器

圖 4-7 (2,1,2)迴旋碼編碼器之狀態圖 圖 4-8 (2,1,2) 迴旋碼編碼器之格狀圖

為了說明方便,我們使用 Hard Decision 的 Viterbi 來說明 Viterbi 是如何運作的,

然而在吾人的實作中是使用 Soft Decision 的 Viterbi,而二者的差別只需將底下所 使用的漢明距離改為歐幾里德(Euclidean)距離即可。在說明 Viterbi 演算法之前,

我們先定義一些名詞:

z 碼句(code word) Cw i j :由狀態( , ) S 轉移到狀態i S 所對應的編碼器輸j 出。

z 分支計量值(Branch metric) Bm i j t :在時間 t ,接收到的訊號( ( )( , , ) r t )和 碼句之間的相似度(Likelihood),可用漢明距離表示。

移到狀態S 之間的相似度。 j where ** is hamming distance calculation Bm i j t Cw i j r t

Pm i j t Bm i j t Sm j t

=

= + − (4-16)

假設有一全零資料序列u=(0000000),經過編碼後,我們可以得到編碼後的輸出 序列為v=(00,00,00,00,00,00,00),而 v 序列在經過通道的輸輸過程中受到雜訊的 干擾,使得第 1 及第 3 位元由 0 變成 1,而解碼器所收到的序列為

(10,00,00,00,10,00,00),經由以下的 Viterbi 演算法,可求得解碼之結果為 ˆ

圖 4-9 Viterbi 演算法步驟 I

II. 重覆 I。如圖 4-10 所示,在 t = 3 時,每一狀態都有二條路徑進入,我們選 擇路徑較小的為存活計量值,此一路徑稱為存活路徑,同時把另一較大的路 徑刪除。若兩路徑計量值相同時,則任取一條路徑為存活路徑。因此,S 、0

S 、0 S 、0 S 的存活計量值3 Sm(0, 3)、Sm(1, 3)、Sm(2,3)、Sm(3, 3)分別為 1、

2、3、3。

圖 4-10 Viterbi 演算法步驟 II 重覆 II,經過時間 t = 4 ~ 7。如

存活路徑,由存活路徑,也就是在圖中線條較粗者的,得到解碼之結果為 uˆ=(0000000)= u,在此路徑中,實線為 0 而虛線為 1。

圖 4-11 Viterbi 演算法步驟 III

最後 Vitebi 演算法總結如下:

I. 從單元時間 t=1 開始,計算進入每一狀態之單一路踁的路徑計量值(path metric) ( , , )Pm i j t ,並記錄每一狀態之存活路徑和存活計量值(survivor metric)Sm i j t 。 ( , , )

II. t 增加 1,對於每一個狀態中,比較進入此狀態的路徑,且將含有最小路徑 計量值的路徑和其值記錄起來,而這個記錄起來的計量值便是存活計量值,

而其它路徑便給予刪除。

III. 如果 t<L+m,則重覆步驟 2,否則停止。其中 L 為資料的長度,m 為編碼器 中移位暫存器的個數。最後,比較在所有狀態的存活路徑計量值,有最小計 量值的存活路徑便可以當作解碼路徑。

在 Viterbi 演算法中,我們必須將所有狀態及其對應的存活路徑儲存起來,

若路徑很長(也就是訊號序列長),則需要一個很大的記憶體。因此,我們必須在

路徑到達一定長度時加以截斷。當我們要截斷最前面的路徑時,必須要將其資料 取出(解碼)。一般而言,若路徑之截斷長度(也就是被截斷存活路徑的長度)為 5.8m 時,不管任何一種路徑取出資料,所增加的解碼錯誤率是可以忽略的,也就是說,

其最後面的一個分支都會重合成一條,如圖 4-12 所示。

圖 4-12 Viterbi 演算法之截斷長度示意圖

4.2.5.2 分支計量值單元

分支計量值單元(BMU),是根據所收到的值計算在格狀圖(trellis)每一級的分支計 量值,也就是在計算在格狀圖上任二個節點之間的計量值。舉例說明,在 圖 4-11 中,由節點 S1走到節點 S2的路徑是 01,所以假設我們收到的訊號是 r(t)=01,則此二節點的計量值便是 0,如果 r(t)=11,則此二節點的計量值便是 1。

而在這個單元中的目的便是要計算出任二節點之間的計量值,而在 圖 4-11 中,任二節點之間的路徑只有 00、01、10、11 四種,所以只要計算 所收到的訊號跟 00、01、10、11 之間的距離,而任二個節點之間的計量值,便 是這四個值的其中一個。在 VLSI 中,BMU 主要有二個實現的架構: (1)由記憶體 產生,也就是說 BMU 是以查表的方式由 ROM 或 RAM 實現,而節省硬體面積。

(2)由運算單元產生,將接收訊號直接運算出在格狀圖中所需的計量值,而這種 方法的硬體複雜度則根據計量值的定義。在吾人的實作中是以絕對值,做為計算 計量值的方法,且採用(2)由運算單元產生計量值的架構。圖 4-13 便是吾人使用 的 BMU 架構。

圖 4-13 BMG 方塊圖

4.2.5.3 相加-比較-選擇單元(ACSU)

ACSU 是整個 Viterbi 解碼器的核心,在高速傳輸的應用中(如 WLAN),平行 架構的 ACSU 則是必要的,因此在格狀圖的每一節點,便代表著一個 ACS 處理 單元。

圖 4-14 為 ACSU 架構的例子,這是在 4.2.5.1 中所用使(2,1,2)的架構。這 ACS 處理單元有四個輸入(2 個分支計量值及 2 個存活計量值)和 2 個輸出(下一級 的存活計量值及決定位元)。我們先由格狀圖畫分出有幾個蝴蝶模組,且決定各 蝴蝶模組的輸入輸出關係,而一個蝴蝶模組是由二個 ACS 所組成。在 ACS 中,

其主要功能有二:

1. 在路徑計量值中選擇最小的當作存活路徑值,並儲存之。

2. 產生存活路徑之決定位元,並送至存活路徑記憶單元(SMU)。

決定位元是在 ACS 中所產生最重要的資訊。它暗示了下一級的存活計量值 是由哪一組存活計量值及分支計量值之和所產生的。假設決定位元為 0,代表著 在 ACS 中上面那條是被選擇為下一級的存活路徑。反之決定位元為 1 的話,存 活路徑便是挑下面那條。代表著所有節點的 ACS 所產生的決定位元,將會被送

到 SMU 中做解碼而產生出最後的輸出。

然而在吾人的實作中,是使用 6 個移位暫存器的編碼器,這代表了格狀圖會 有 64 個狀態節點,便有 32 個蝴蝶模組、64 個 ACS,蝴蝶模組的目的為指示 ACS 應該抓取怎樣的路徑計量值及分支計量值,其架構如圖 4-15 所示。

圖 4-14 ACS 設計流程圖

圖 4-15 平行 ACS 架構方塊圖

然而當資料不斷的進來,因為存活計量值會一直累加,為避免溢位(overflow) 所造成的錯誤,我們必須對存活計量值做正規化,而正規化的方法有很多,最直 覺的想法是將所有狀態之存活計量值同減去一個固定的值,但這造成了額外的硬 體面積,於是在吾人的實作中採用[24]的修改過的模正規化(Modified Modulo Normalization),其架構如圖 4-16 所示。

圖 4-16 模正規化架構方塊圖

在模(modulo)的技術中,所有的計量值(metric)m 都要依(4-17)被轉換為正規j

[25](register-exchange method ; REM)及後向追溯方法[26]-[28](trace back method ; TBM )。暫存器交換方法有著架構簡單、快速的優點,但使用的暫存器所增加的

相對的也有 64 組存活路徑產生而需要被記錄。

2. 回溯讀取(Trace-back Read ; TB):TB 這動作主要是將讀取寫在記憶體中的存 活路徑,將讀出的值當作一個指標,而這指標指向上個狀態,而能找到上一 個狀態數。這動作的目的為希望能讓所有路徑重合。

3. 解碼讀取(Decode Read ; DC):這動作和 TB 相同,同樣讀出一個指標而找到 上個狀態。但是這個動作的對像是更舊的資料,而且是從已經作過完整的 TB 之後所找到的狀態數開始做 DC 這動作。在 DC 中,讀出的指標值除了 指向上一個狀態數之外,在搭配上現在的狀態數,便可以得到當初輸入而解 碼輸出了。

k=3 的 k point even 方法如圖 4-17 所示。在這方法中使用了 k 個讀取指標(包 括回溯讀取指標及解碼讀取指標),由 2k 塊大小為 M/2 的記憶體所組成,M 是指 截斷長度。寫入的指標是從左到右的,而讀取指標是由右而左的。在一個時間點 中,六塊記憶體中有一個是執行寫入、一個解碼讀取、二個回溯讀取及二個閒置。

第一個位元輸出是在當寫入指標寫到整個記憶體的最後時,所以全部的延遲為 3M。然而在因為解碼讀取是由右而左的,所以位元是以一個倒反的順序輸出的,

第一個位元輸出是在當寫入指標寫到整個記憶體的最後時,所以全部的延遲為 3M。然而在因為解碼讀取是由右而左的,所以位元是以一個倒反的順序輸出的,

相關文件