Tải bản đầy đủ (.doc) (42 trang)

Thuật toán viterbi tiểu luận môn mạng thông tin quang thế hệ mới

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (1.23 MB, 42 trang )




 
!"
#
Giảng viên hướng dẫn : TS.BÙI VIỆT KHÔI
Học viên cao học : LÊ HOÀI VIỆT
LƯƠNG HỒNG QUÝ
ĐINH VĂN HƯỜNG
ĐỖ HỮU TRỌNG
NGUYỄN HỮU MẠNH
Lớp : BK01-KTTT1B

Hà Nội, tháng 5/2012
$$
#
%&'()*)+,,-.'/0
Mã chập là một kỹ thuật mã hóa sửa sai. Mã chập thuộc họ mã lưới (mã hóa theo
Trellis) và được xây dựng dựa trên một đa thức sinh hoặc một sơ đồ chuyển trạng thái
(trellis mã) đặc trưng. Quá trình giải mã của mã chập phải dựa vào trellis mã thông qua
các giải thuật khác nhau, trong đó nổi tiếng nhất là giải thuật Viterbi.
Tại sao gọi là mã chập vì cấu trúc mã hóa có thể biểu diễn dưới dạng phép tính
chập giữa đa thức sinh mã và chuỗi tín hiệu được mã hóa.
Mã hóa chập và thuật toán giải mã Viterbi được sử dụng trong khoảng hơn một tỉ
điện thoại, có thể là lớn nhất trong các loại thuật toán được ứng dụng. Tuy nhiên, hiện tại
thì thuật toán xử lý viterbi được ứng dụng nhiều nhất trong các thiết bị âm thanh và hình
ảnh kỹ thuật số. Ngày nay, chúng còn được sử dụng trong các thiết bị bluetooth.
Mục đích của mã hóa kênh truyền là nhằm tăng dung lượng kênh truyền, bằng
cách cộng thêm vào tín hiệu những dữ liệu dư thừa được thiết kế một cách cẩn thận
trước khi truyền lên kênh truyền. Mã hóa chập và mã hóa khối là 2 dạng chính của mã


hóa kênh truyền. Mã hóa chập thì dựa trên dữ liệu nối tiếp, 2 hoặc một vài bit được
truyền một lúc, còn mã hóa khối thì dựa trên một khối dữ liệu lớn tương quan (đặc trưng
là khoảng vài trăm bytes). Ví dụ, mã Redsolomon là một mã hóa khối.
Sự khác nhau cơ bản giữa mã hóa khối và mã hóa chập là mã hóa khối là mã hóa
không nhớ. Cho một chuỗi dữ liệu K bit, thì ngõ ra của bộ mã hóa khối là một khối dữ
liệu n bit duy nhất. Mã hóa chập không kết nối các khối bit riêng vào trong một khối từ
mã, thay vào đó nó sẽ chấp nhận một chuỗi bit liên tục và taọ thành một chuỗi ngõ ra.
2
Hiệu quả hay tốc độ dữ liệu của mã hóa chập được đánh giá bằng tỉ lệ của số bit ngõ vào
k, và số bit ngõ ra n. Trong mã hóa chập là có một vài bộ nhớ dùng để ghi nhớ dòng bit
vào. Thông tin này được sử dụng để mã hóa các bit tiếp theo.
1&2'3*45.',-'6789*:,-.'/0
Mã chập là mã tuyến tính có ma trận sinh có cấu trúc sao cho phép mã hóa có thể
xem như một phép lọc (hoặc lấy tổng chập). Mã chập được sử dụng rộng rãi trong thực
tế. Bởi mã hóa được xem như một tập hợp các bộ lọc số tuyến tính với dãy mã là các đầu
ra của bộ lọc được ghép xen kẽ. Các mã chập là các mã đầu tiên được xây dựng các
thuật toán giải mã quyết định mềm hiệu quả.
Mã khối từ các khối k dấu (hay ký hiệu) tạo ra các khối n dấu. Với các mã chập
(thường được xem là các mã dòng), bộ mã hóa hoạt động trên dòng liên tục các bit vào
không được phân thành các khối tin rời rạc. Tuy nhiên tốc độ mã
X
[¿]
¿
ϵ F ¿
được hiểu là cứ có
k ngõ vào ở mỗi bước thời gian sẽ tạo ra n ngõ ra. Các phép tính số học sử dụng trong
hình thức mã hóa này có thể được thực hiệntrên một trường tùy ý nhưng thông thường
vẫn là trên GF(2).
Ta biểu thị các dãy và các hàm truyền đạt như các chuỗi lũy thừa của biến x(đôi
khi còn dùng ký hiệu D thay cho x). Dãy {…,m-2, m-1, m0, m1, m2, …} (với các phần

tử mi thuộc trường F) được xem như một chuỗi Laurent:
m
(
X
)
=

e=−∞
e=+∞
m
e
x
e
Tập tất cả các chuỗi Laurent trên F là một trường, ta ký hiệu trường này là F[[X]]
như vậy
m( X )ϵ F [
[
X
]
]
Đối với dòng nhiều bit vào ta dùng ký hiệu m
(1)
(x) biểu thị dòng đầu vào đầu tiên,
m
(2)
(x) biểu thị dòng đầu vào thứ hai. Tập các dòng vào xem như một vectơ:
m(x)=[ m
(1)
(x) m
(2)

(x)]
ϵ F [
[
X
]
]
2
Bộ mã hóa cho mã chập thường được coi là một tập các bộ lọc số. Hình 1 chỉ ra một ví
dụ về một bộ mã hóa
3
Hình 1. Bộ mã hóa cho mã chập tốc độ
R=
1
2
.
(các ô D biểu thị các ô nhớ một bít – các trigger D)
Dòng vào m
k
đi qua hai bộ lọc dùng chung các phần tử nhớ tạo ra hai dòng ra.
Hai dòng ra này được đưa ra xen kẽ để tạo ra dòng được mã hóa Ck. Như vậy cứ
mỗi bít vào lại có hai bít mã hóa được đưa ra, kết quả là ta có một mã có tốc độ R=1/2
Thông thường ta coi trạng thái ban đầu của các phần tử nhớ là 0. Như vậy, với
dòng vào m = {1, 1, 0, 0, 1, 0, 1} các đầu ra sẽ là:
C
(1)
= {1, 0, 0, 1, 1, 1, 0, 1, 1}
và C
(2)
= {1, 1, 1, 1, 1, 0, 0, 0, 1}
Dòng ra: C = {11, 01, 01, 11, 11, 10, 00, 10, 11}

Ở đây dấu phẩy phân cách các cặp bít ra ứng với mỗi bít vào.Ta có thể biểu thị
hàm truyền từ đầu vào m(x) từ đầu ra C(1)(x) như sau:
g
1
(x) = 1 + x +x
2
.
Tương tự ta có g
2
(x)= 1 + x
2
.
Dòng vào m = {1, 1, 0, 0, 1, 0, 1} có thể biểu thị như sau:
m (x) = 1+ x+ x4+ x6 GF(2)[[X]].
Các đầu ra sẽ là
4
C
(1)
(x) = m(x)g
1
(x) = (1+ x +x
4
+ x
6
)(1+ x + x
2
) = 1 +x
3
+x
4

+x
5
+x
7
+ x
8
C
(2)
(x) = m(x)g
2
(x) = (1+ x +x
4
+ x
6
)(1+ x
2
) = 1+x + x
2
+x
3
+x
4
+x
8

Với mỗi mã chập tốc độ
R=
k
n
có một hàm truyền ma trận k x n

∈( X )
(còn gọi là
ma trận truyền). Với mã tốc độ
R=
1
2
ở ví dụ trên ta có:
G
a
(x)=[1+x+x
2
1+x
2
]
Ma trận truyền này không chỉ có dạng các đa thức, ta có thể thấy thông qua ví dụ
sau:
58;"Xét ma trận truyền của mã chập sau:
G
b
(
x
)
=
[
1
1+x+x
2
1+x
2
]

Vì có “1” ở cột đầu tiên nên dòng vào sẽ xuất hiện trực tiếp ở đầu ra đan xen, bởi
vậy đây là một mã chập hệ thống. Bộ mã hóa cho mã này được mô tả ở hình 2:
Hình 2: Bộ mã hóa hệ thống với R= ½.
Với dòng vào: m (x) = 1+ x + x
2
+ x
3
+ x
4
+ x
8
các đầu ra C
(1)
k và C
(2)
k có dạng:
Một bộ mã hóa chỉ có các hàng đa thức trong ma trận truyền được gọi là bộmã
hóa có đáp ứng xung hữu hạn. Một bộ mã hóa có các hàm hữu tỷ trong ma trậntruyền
gọi là bộ mã hóa có đáp ứng xung vô hạn.
Với mã có tốc độ k/n với k > 1 dãy tin tức đầu vào (ta coi như được tách ra từ
một dãy tin tức thành k dòng), ta có:
5
m(x) = [m
(1)
( x), m
(2)
(x),…,m
(k)
(x)]


Dãy ra được biểu thị như sau:
C(X) = [C
(1)
(x), C
(2)
(x),…,C
(n)
(x)] = m(x)G(x)
Ma trận truyền G(x) được gọi là hệ thống nếu có thể xác định được một ma trận
đơn vị trong các phần tử của G(x) (chẳng hạn nếu bằng các phép hoán vị hàng và/hoặc
cột của G(x) có thể thu được một ma trận đơn vị).
Từ các ví dụ trên ta có định nghĩa sau cho mã chập
<*'*:'=7: Mã chập tốc độ R = k/n trên trường các chuỗi Laurent hữu tỷ F[[X]]
trường F là ảnh của một ánh xạ tuyến tính đơn ánh của các chuỗi Laurent k chiều m(x)
ϵ F [
[
X
]
]
k
vào các chuỗi Laurent C(x)
ϵ F [
[
X
]
]
n
>&?@4AB.,-.'/0
Mã chập được tạo ra bằng cách cho chuỗi thông tin truyền qua hệ thống các thanh
ghi dịch tuyến tính có số trạng thái hữu hạn. Cho số lượng thanh ghi dịch là m (cũng ký

hiệu là N), bộ mã có k bit ngõ vào và đầu ra bộ mã chập có n bit ngõ ra (n hàm đại số
tuyến tính hoặc n ngõ ra cộng modulo). Tốc độ mã là R = k/n, số ô nhớ của bộ ghi dịch
là m×k và tham số L gọi là chiều dài ràng buộc (Constraint length) của mã chập (với
L=k(m-1)).
Các thông số k,n có phạm vi giới hạn trong khoảng giá trị từ 1 đến 8, thông số m
trong khoảng từ 2 đến 10, và tốc độ mã R từ 1/8 đến 7/8 ngoại trừ các bộ mã hóa được
sử dụng trong viễn thông vũ trụ có thể có tốc độ 1/100 hoặc thậm chí cao hơn.
Trong một số tài liệu, khi nói đến mã chập, người ta còn đặc trưng cho bộ mã hóa
chập bằng chiều dài ràng buộc K và tốc độ mã R. Tốc độ mã, R=k/n, được hiểu là tỉ số
giữa số bit ngõ vào và số ký hiệu ngõ ra của bộ mã hóa. Thông số chiều dài ràng buộc,
K, cho biết “chiều dài” của bộ mã hóa mã chập, ví dụ, có bao nhiêu trạng thái k-bit có
thể đưa đến mạch logic tổ hợp để tạo ra ký hiệu ngõ ra. Trong nội dung đề tài này, chúng
6
tôi sử dụng bộ mã với bộ dữ liệu bao gồm chiều dài ràng buộc K và tốc độ bộ mã R như
đã đề cập ở trên.
Khi thực hiện với mã chập trong các ứng dụng thông thường, người ta thường chỉ
chọn số thanh ghi giới hạn, mỗi thanh ghi chỉ có 1 ô nhớ để đơn giản cho việc thiết kế
mà vẫn đảm bảo tính năng mã hóa tốt. Tương ứng với mỗi tốc độ mã hóa (các bộ mã
đơn giản), người ta cũng đã thử nghiệm và chọn ra chỉ một số đa thức sinh cho hiệu quả
mã hóa cao để sử dụng.
Giả thiết, bộ mã chập làm việc với các chữ số nhị phân, thì tại mỗi lần dịch sẽ có
k bit thông tin đầu vào được dịch vào thanh ghi dịch thứ nhất và tương ứng có k bit
thông tin trong thanh ghi dịch cuối cùng được đẩy ra ngoài mà không tham gia vào quá
trình tạo chuỗi bit đầu ra. Đầu ra nhận được chuỗi n bit mã từ n bộ cộng môđun-2 (xem
hình 2.5). Như vậy, giá trị chuỗi đầu ra kênh không chỉ phụ thuộc vào k bit thông tin đầu
vào hiện tại mà còn phụ thuộc vào (m-1)k bit trước đó, và được gọi là mã chập (n,k,m).
Chuỗi thông tin
Đầu vào k bit

Hình 3. Sơ đồ tổng quát bộ mã chập.

Giả sử u là véctơ đầu vào, x là véctơ tương ứng được mã hoá, bây giờ chúng ta
mô tả cách tạo ra x từ u. Để mô tả bộ mã hoá chúng ta phải biết sự kết nối giữa thanh ghi
đầu vào vào đầu ra hình 2.5. Cách tiếp cận này có thể giúp chúng ta chỉ ra sự tương tự và
khác nhau cũng như là với mã khối. Điều này có thể dẫn tới những ký hiệu phức tạp và
nhằm nhấn mạnh cấu trúc đại số của mã chập. Điều đó làm giảm đi tính quan tâm cho
mục đích giải mã của chúng ta. Do vậy, chúng ta chỉ phác hoạ tiếp cận này một cách sơ
lược. Sau đó, mô tả mã hoá sẽ được đưa ra với những quan điểm khác.
Để mô tả bộ mã hoá hình 2.5 chúng ta sử dụng N ma trận bổ sung G1,G2…,GN
bao gồm k hàng và n cột. Ma trận Gi mô tả sự kết nối giữa đoạn thứ i của k ô nhớ trong
thanh ghi ngõ vào với n ô của thanh ghi ngõ ra. N ngõ vào của hàng đầu tiên của Gi mô
tả kết nối của ô đầu tiên của đoạn thanh ghi đầu vào thứ i với n ô của thanh ghi ngõ ra.
7
Kết quả là “1” trong Gi nghĩa là có kết nối, là “0” nghĩa là không kết nối. Do đó chúng ta
có thể định nghĩa ma trận sinh của mã chập:
Và tất cả các các ngõ vào khác trong ma trận bằng 0. Do đó nếu ngõ vào là véctơ
u, tương ứng véctơ mã hoá là:
x=u.G

Bộ mã chập là hệ thống nếu trong mỗi đoạn của n chữ số đuợc tạo, k số đầu là
mẫu của các chữ số đầu vào tương ứng. Nó có thể xác định rằng điều kiện này tương
đương có các ma trận k×n theo sau:
Chúng ta xét một vài ví dụ minh hoạ sau đây:
58;" Xét mã (3,2,2). Bộ mã hoá được chỉ trong hình 2.6. Bây giờ mã được định nghĩa
thông qua 2 ma trận:
Bộ mã hoá là hệ thống, ma trận sinh được tạo ra:
8
Chuỗi thông tin u = ( 11011011…) được mã hóa thành chuỗi mã x = (111010100110…)
Hình 4.Bộ mã chập (3,2,2)
Một cách tương tự ta cũng có thể biểu diễn ma trận sinh G = (G1,G2,…,GN).
Như vậy ý nghĩa của ma trận sinh là nó chỉ ra phải sử dụng các hàm tương ứng nào để

tạo ra véc tơ dài n mỗi phần tử có một bộ cộng môđun-2, trên mỗi véc tơ có N×k tham
số biểu diễn có hay không các kết nối từ các trạng thái của bộ ghi dịch tới bộ cộng
môđun-2 đó. Xét véc tơ thứ i (gi, n ≥ i ≥ 1), nếu tham số thứ j của gi (L×k ≥ j ≥1) có giá
trị “1” thì đầu ra thứ j tương ứng trong bộ ghi dịch được kết nối tới bộ cộng môđun-2
thứ i và nếu có giá trị “0” thì đầu ra thứ j tương ứng trong bộ ghi dịch không được kết
nối tới bộ cộng môđun-2 thứ i.
C&)D@8)E*,-.'/0
Có ba phương pháp để biểu diễn mã chập đó là: sơ đồ lưới, sơ đồ trạng thái, và sơ
đồ hình cây. Để làm rõ phương pháp này ta tập trung phân tích dựa trên ví dụ hình 1 với
bộ mã (2,1,3), đa thức sinh (7,5).
9
FGHI'J*'.3K"
Từ ví dụ hình 1, giả thiết trạng thái ban đầu của các thanh ghi dịch trong bộ mã
đều là trạng thái “toàn 0”. Nếu bit vào đầu tiên là bit “0” thì đầu ra ta nhận được chuỗi
“00”, còn nếu bit vào đầu tiên là bit “1” thì đầu ra ta nhận được chuỗi “11”. Nếu bit vào
đầu tiên là bit “1” và bit vào tiếp theo là bit “0” thì chuỗi thứ nhất là “11” và chuỗi thứ
hai là chuỗi “10”. Với cách mã hoá như vậy, ta có thể biểu diễn mã chập theo sơ đồ có
dạng hình cây (xem hình 5).Với hướng lên là hướng của bit 0 đi vào bộ mã, nhánh đi
xuống biểu hiện cho bit 1 được dịch vào. Từ sơ đồ hình cây ta có thể thực hiện mã hoá
bằng cách dựa vào các bit đầu vào và thực hiện lần theo các nhánh của cây, ta sẽ nhận
được tuyến mã, từ đó ta nhận được dãy các chuỗi đầu ra.
10
Hình 5. Sơ đồ hình cây của bộ mã (2,1,3).
FGHI'J*'LMN)"
Do đặc tính của bộ mã chập, cấu trúc vòng lặp được thực hiện như sau: chuỗi n
bit đầu ra phụ thuộc vào chuỗi k bit đầu vào hiện hành và (N-1) chuỗi đầu vào trước đó
hay (N-1) × k bit đầu vào trước đó. Từ ví dụ hình 1 ta có chuỗi 2 bit đầu ra phụ thuộc
vào 1 bit đầu vào là “1” hoặc “0” và 4 trạng thái có thể có của hai thanh ghi dịch, là
“00”; “01”; “10”; “11”. Từ sơ đồ hình cây trên, ta thấy rằng tại tầng thứ 3, cứ mỗi trạng
thái 00, 01, 10, 11 đều có 2 nhánh đến từ các trạng thái trước đó tùy thuộc vào bit được

dịch vào bộ mã là bit 0 hay bit 1. Với tính chất đó ta có thể biểu diễn mã chập bằng sơ
đồ có dạng hình lưới gọn hơn, trong đó các đường liền nét được ký hiệu cho bit đầu vào
là bit “1” và đường đứt nét được ký hiệu cho các bit đầu vào là bit “0” (xem hình 6). Ta
thấy rằng từ sau tầng thứ hai hoạt động của lưới ổn định, tại mỗi nút có hai đường vào
nút và hai đường ra khỏi nút. Trong hai đường đi ra thì một ứng với bit đầu vào là bit
“0” và đường còn lại ứng với bit đầu vào là bit “1”.
11
Hình 6. Sơ đồ hình lưới bộ mã chập (2,1,3) và bộ phát mã (7,5).
Trạng thái ban đầu toàn bằng “0”
FGHI4AO*:4'()"
Sơ đồ trạng thái được thực hiện bằng cách đơn giản sơ đồ 4 trạng thái có thể có
của bộ mã (00, 01, 10 và 11) và trạng thái chuyển tiếp có thể được tạo ra từ trạng thái
này chuyển sang trạng thái khác, quá trình chuyển tiếp có thể là:
Kết quả ta thu được sơ đồ trạng thái trong hình 7 như sau:
12
Hình 7. Sơ đồ trạng thái của bộ mã chập (2,1,3)
Từ sơ đồ trạng thái hình 2.10, các đường liền nét được ký hiệu cho bit đầu vào là
bit “0” và đường đứt nét được ký hiệu cho các bit đầu vào là bit “1”. So với sơ đồ hình
lưới và sơ đồ hình cây thì sơ đồ trạng thái là sơ đồ đơn giản nhất.
P&@*'MQ.H)D,.R7,-.'/0
P&%@H)D,
Cũng như các mã sửa sai khác, mã chập cho phép chúng ta có thể sửa lại dữ liệu
đã bị sai lệch khi truyền qua kênh truyền để khôi phục chính xác tín hiệu gốc.
Việc thực hiện mã hóa dùng mã chập tương đối đơn giản hơn các loại mã sửa sai
khác mà chất lượng mã hóa lại tốt.
Việc thực hiện mã hóa dùng mã chập có thể được thực hiện bằng phần cứng và
phần mềm.
Dựa trên hình thức mã hóa mã chập cùng thuật giải Viterbi cho nó, các bộ mã hóa
sau này đều kế thừa những đặc tính ưu việt của nó.
P&1&'MQ.H)D,

Việc mã hóa và giải mã liên quan đến mã chập chỉ giải quyết được các lỗi một bit
còn đối với các kênh truyền xuất hiện nhiều bit liên tiếp thì thuật toán mã hóa và giải mã
này sẽ không còn hoàn hảo nữa.
Kênh truyền ở đây phải là kênh truyền ít nhiễu, vì nếu kênh truyền nhiễu quá lớn,
mã hóa chập sẽ không còn tốt nữa. Khi đó ta phải cần tới trải phổ tín hiệu để đưa tín hiệu
xuống dưới mức nhiễu để giảm thiểu ảnh hưởng.
13
S&<*'*:'T
U
74'@/44V(*)4WAX)
Thuật toán Viterbi là một giải pháp được sử dụng phổ biến để giải mã chuỗi bit
được mã hóa bởi bộ mã hóa tích chập. Chi tiết của một bộ giải mã riêng phụ thuộc vào
một bộ mã hóa tích chập tương ứng. Thuật toán Viterbi không phải là một thuật toán đơn
lẻ có thể dùng để giải mã những chuỗi bit mà được mã hóa bởi bất cứ một bộ mã hóa
chập nào.
Thuật toán Viterbi được khởi xướng bởi Andrew Viterbi năm 1967 như là một
thuật toán giải mã cho mã chập qua các tuyến thông tin số có nhiễu. Nó được sử dụng
trong cả hai hệ thống CDMA và GSM, các modem số, vệ tinh, thông tin vũ trụ, và các hệ
thống mạng cục bộ không dây. Hiện nay còn được sử dụng phổ biến trong kỹ thuật nhận
dạng giọng nói, nhận dạng từ mã, ngôn ngữ học máy tính.
Thuật toán giải mã Viterbi là một trong hai loại thuật toán giải mã được sử dụng
với bộ mã hóa mã chập- một loại khác đó là giải mã tuần tự. Ưu điểm của giải mã tuần
tự so với Viterbi là nó có thể hoạt động tốt với các mã chập có chiều dài ràng buộc lớn,
nhưng nó lại có thời gian giải mã biến đổi.
Còn ưu điểm của thuật toán giải mã Viterbi là nó có thời gian giải mã ổn định.
Điều đó rất tốt cho việc thực thi bộ giải mã bằng phần cứng. Nhưng mà yêu cầu về sự
tính toán của nó tăng theo hàm mũ như là một hàm của chiều dài ràng buộc, vì vậy,
trong thực tế, người ta thường giới hạn chiều dài ràng buộc của nó K = 9 hoặc nhỏ hơn.
Stanford Telecom tạo ra một bộ giải mã Viterbi K = 9 hoạt động ở tốc độ đến 96 kbps,
và một bộ giải mã với K = 7 hoạt động với tốc độ lên đến 45 Mbps. Các kỹ thuật không

dây nâng cao có thể tạo ra một bộ giải mã Viterbi với K = 9 hoạt động ở tốc độ lên đến 2
Mbps. NTT tuyên bố rằng họ đã tạo được bộ giãi mã Viterbi hoạt động ở tốc độ 60
Mbps, nhưng tính khả thi của nó vẫn chưa được kiểm chứng.
Y&2'3*45.'4'@/4:)Z))4WAX)
Chúng ta sẽ lấy ví dụ về mã chập có tốc độ mã là
k
n
=
1
2
Hình 8. Bộ mã chập tốc độ ½.
14
FF: thanh ghi dịch. Tại mỗi xung clock, nội dung của thanh ghi dịch được dịch qua phải
1 bit. Bit đầu tiên sẽ là ngõ vào, và bit cuối cùng sẽ là ngõ ra. Một thanh ghi dịch có thể
sẽ xem xét việc cộng trễ vào ngõ vào. Các thanh ghi dịch có thể được hiểu như là bộ nhớ
của bộ mã hóa. Nó ghi nhớ những bit đầu của chuỗi.
Thanh ghi dịch được khởi đầu với tất cả giá trị là 0.
Thuật toán XOR:
Nếu chúng ta làm việc trên một chuỗi ngõ vào là 01011101, ngõ ra là 00 1110 00
01 10 01 002. Bộ mã hóa này cũng có thể được mô hình bởi một bảng trạng thái hữu
hạn. Mỗi một trạng thái được quy định bởi 2 bit nhị phân- trạng thái của 2 thanh ghi
dịch. Mỗi một sự chuyển trạng thái được quy định bởi w/v1v2 với w đại diện cho bit ngõ
vào, và v1v2 là đại diện cho 2 bit ngõ ra, trong trường hợp này chúng ta luôn luôn có w
= v1.
Bảng 1 Trạng thái ngõ vào và ngõ ra của bộ mã hóa tốc độ ½
Hình 9. Đồ hình trạng thái của mã chập ½
15
Bậy giờ chúng ta có thể mô tả thuật toán giải mã, phần chính là thuật toán Viterbi.
Có lẽ, khái niệm quan trọng nhất để hỗ trợ cho việc hiểu được thuật toán Viterbi đó là sơ
đồ Trellis. Hình bên dưới cho chúng ta thấy sơ đồ trellis cho ví dụ của chúng ta ở tốc độ

½, mã hóa chập với chiều dài ràng buộc K = 3 với bản tin 8 bit.
Hình 10. Các nhánh trong bộ mã hóa.
Bốn trạng thái có thể của bộ mã hóa được mô tả như 4 hàng của những dấu chấm
theo chiều ngang. Có một cột của 4 chấm cho trạng thái khởi đầu của bộ mã hóa và một
ở mỗi thời điểm của bản tin. Các đường in đậm kết nối các điểm trong sơ đồ biểu diễn
cho sự chuyển trạng thái khi ngõ vào là một bit 1. Đường chấm chấm là biểu diễn cho sự
chuyển trạng thái khi ngõ vào là bit 0. Ta có thể thấy rõ sự phù hợp giữa sơ đồ trellis và
đồ hình trạng thái đã nói ở trên.
Hình vẽ bên dưới cho ta thấy trạng thái trellis cho toàn bộ 8 bit ngõ vào. Các bit
ngõ vào bộ mã hóa và ký hiệu ngõ ra được thể hiện ở bên dưới của hình.
Hình 11. Đường đi hoàn chỉnh khôi phục chính xác tín hiệu tại ngõ ra.
Các bit ngõ vào và các ký hiệu ngõ ra của bộ mã thì có thể xem ở dưới cùng của hình
trên. Chú ý sự phù hợp giữa các ký hiệu ngõ ra và bảng ngõ ra chúng ta đã đề cập ở trên.
16
Hãy xem xét một cách chi tiết hơn, sử dụng phiên bản mở rộng của sự chuyển đổi từ một
trạng thái tức thời đến một trạng thái kế tiếp như hình bên dưới:
Giờ chúng ta sẽ xem xét cách thức giải mã của thuật toán Viterbi. Bây giờ chúng
ta giả sử là chúng ta có một mẫu tin đã mã hóa (có thể có vài lỗi) và chúng ta muốn khôi
phục lại tín hiệu gốc.
Giả sử chúng ta nhận được mẫu tin đã mã hóa ở trên với 1 bit lỗi.
Hình 12. Tín hiệu nhận có 1 bit sai tại t =2
Ở mỗi thời điểm chúng ta nhận được 2 bit trong ký hiệu. Chúng ta sẽ tính toán
thông số metric để đo “khoảng cách” giữa những gì mà chúng ta nhận được với tất cả
các cặp bit ký hiệu kênh truyền có thể mà chúng ta có thể nhận được. Đi từ thời điểm
t=0 đến t=1, chỉ có 2 trạng thái mà chúng ta có thể nhận được là 00 và 11. Đó là bởi vì
chúng ta biết được bộ mã hóa tích chập bắt đầu với trạng thái tất cả đều là 0 và cho 1 bit
17
vào là 0 hay 1 thì chỉ có 2 trạng thái mà chúng ta có thể đi đến và 2 ngõ ra của bộ mã
hóa. Những ngõ ra này có trạng thái là 00 và 11.
Thông số metric mà chúng ta sẽ sử dụng là khoảng cách Hamming giữa cặp bit

của ký hiệu nhận được và cặp bit có thể của kênh truyền. Khoảng cách Hamming được
tính một cách đơn giản bằng cách đếm có bao nhiêu bit khác giữa cặp bit nhận được từ
kênh truyền và cặp bit so sánh. Kết quả chỉ có thể là 0, 1, 2. Giá trị của khoảng cách
Hamming (hay thông số metric) mà chúng ta tính toán ở mỗi khoảng thời gian cho
đường dẫn của trạng thái tại thời điểm trước và trạng thái hiện tại được gọi là metric
nhánh (branch metric). Ở thời điểm đầu tiên, chúng ta sẽ lưu những kết quả này như là
“thông số metric tích lũy”, được liên kết đến các trạng thái. Ở thời điểm thứ 2, thông số
metric tích lũy sẽ được tính toán bằng cách cộng thêm thông số metric tích lũy trước đó
vào metric nhánh hiện tại.
Ở thời điểm t=1, ta nhận được 2 bit “00”. Chỉ có một cặp ký hiệu kênh truyền mà
chúng ta có khả năng nhận được là “00” và “11”. Khoảng cách Hamming giữa “00” và
“00” là bằng 0. Khoảng cách Hamming giữa “00” và “11” là 2. Do đó, giá trị thông số
metric nhánh cho nhánh ứng với sự chuyển trạng thái từ “00” đến “00” là 0 và cho
nhánh từ “00” đến “10” là 2. Khi mà thông số metric tích lũy trước đó là 0 thì thông số
metric tổng sẽ chính bằng thông số metric của nhánh vừa xét. Tương tự ta tính được
thông số metric cho 2 trạng thái kia. Hình bên dưới minh họa kết quả tại thời điểm t= 1
Hình 13. Tại thời điểm t=1.
Điều gì sẽ xảy ra ở thời điểm t=2, chúng ta nhận được một cặp kí hiệu kênh
truyền là “11”, trong khi đó cặp ký hiệu kênh truyền mà chúng ta có thể nhận được là
“00” nếu chuyển từ trạng thái “00” sang trạng thái “00” và “11” khi chuyển từ trạng thái
“00” đến trạng thái “10”, “10” khi chuyển từ trạng thái “10” đến trạng thái “01”, “01”
khi chuyển từ trạng thái “10” đến trạng thái “11”. Khoảng cách Hamming giữa 00 và 11
18
là 2, giữa 11 và 11 là 0, giữa 01 hoặc 10 với 11 là 1. Chúng ta cộng các thông số metric
ở mỗi nhánh lại với nhau. ở thời điểm t=1 thì trạng thái chỉ có thể là 00 hoặc 10, thông
số metric tích lũy sẽ được cộng vào là 0 hoặc là 2 một cách tương ứng. Hình bên dưới
thể hiện sự tính toán thông số metric tích lũy ở thời điểm t=2.
Hình 14. Tại thời điểm t=2.
Đó là tất cả sự tính toán cho thời điểm t=2. Đường nét đậm là metric nhánh được
lựa chọn vì theo các nhánh đó, thông số metric là nhỏ nhất. Giờ chúng ta sẽ tính thông số

metric tích lũy cho mỗi trạng thái tại thời điểm t=3.
Giờ chúng ta hãy nhìn vào hình minh họa cho thời điểm t=3. Chúng ta sẽ gặp phải
một ít phức tạp hơn ở đây, tại mỗi trạng thái trong 4 trạng thái tại t=3 sẽ có 2 đường đến
từ 4 trạng thái của thời điểm t=2. Chúng ta sẽ xoay sở thế nào? Câu trả lời là, chúng ta sẽ
tính toán thông số metric tích lũy liên quan của mỗi nhánh, và chúng ta sẽ bỏ đi giá trị
metric lớn hơn, tức là sẽ loại bỏ nhánh đó đi. Nếu cặp thông số metric ở mỗi trạng thái là
bằng nhau thì chúng ta sẽ giữ lại cả 2 trạng thái. Chúng ta sẽ kế thừa những tính toán đã
thực hiện ở thời điểm t=2. Thuật toán cộng thông số metric tích lũy trước đó vào nhánh
mới, so sánh kết quả và chọn thông số metric nhỏ hơn (nhỏ nhất) để tiếp tục dùng cho
thời điểm kế tiếp, được gọi là thuật toán cộng-so sánh-chọn. Hình bên dưới cho thấy kết
quả của việc xử lý tại thời điểm t=3.
19
Hình 15. Tại thời điểm t=3.
Chú ý là cặp ký hiệu kênh truyền thứ 3 mà chúng ta nhận được sẽ có một lỗi.
Thông số metric nhỏ nhất hiện tại là 1.
Chúng ta hãy xem điều gì xảy ra ở thời điểm t=4. Tiến trình xử lý cũng giống như
ở thời điểm t=3. Kết quả xem ở hình bên dưới
Hình 16. Tại thời điểm t=4.
Chú ý là ở thời điểm t=4, đường trellis của tin tức thực sự truyền đi được xác định bằng
đường in đậm, với thông số metric tích lũy là nhỏ nhất. Hãy xem xét ở thời điểm t=5:
20
Hình 17. Tại thời điểm t=5.
Ở thời điểm t=10, sơ đồ trellis sẽ như thế này, các nhánh ko được chọn đã được
bỏ đi:
Hình 18: Tất cả dữ liệu đã được giải mã và sửa sai chính xác.
Kết quả ở đây cho thấy chúng ta đã giải mã đúng chuỗi dữ liệu gốc. Nếu chúng ta
nhìn lại con đường để chúng ta tìm ra dữ liệu gốc là bằng cách so sánh dữ liệu nhận
được với dữ liệu so sánh của bộ giải mã có được từ bảng trạng thái. Điều này cho thấy
chúng ta đang sử dụng thuật toán giải mã dựa trên sự giống nhau lớn nhất.
21

Việc xử lý giải mã bắt đầu với xây dựng một thông số metric tích lũy cho một số
cặp ký hiệu kênh truyền nhận được, và lưu giữ trạng thái ở mỗi thời điểm t mà thông số
metric là nhỏ nhất. Một khi thông tin này được dựng lên thì bộ giải mã viterbi sẵn sàng
để khôi phục lại chuỗi bit đã đưa vào bộ mã hóa chập, khi mẫu tin được mã hóa để
truyền đi. Điều này đạt được bằng những bước sau:
o Đầu tiên, chọn một trạng thái có thông số metric nhỏ nhất và lưu lại số trạng
thái của trạng thái đó.
o Sử dụng lặp lại cho những bước kế tiếp mãi cho đến khi bắt đầu của trellis đạt
được: dựa vào bảng ghi nhớ trạng thái cho trạng thái được chọn, chọn một trạng thái mới
được liệt kê trong bảng ghi nhớ trạng thái khi chuyển từ trạng thái trước đến trạng thái
đó. Lưu số trạng thái của mỗi trạng thái được chọn. Bước này được gọi là truy hồi
(traceback).
o Chúng ta làm việc tiếp với danh sách những trạng thái được chọn đã được lưu
trong bước xử lý trước đó. Chúng ta tra xem bit ngõ vào nào phù hợp với sự truyền dẫn
từ mỗi trạng thái trước đến trạng thái kế tiếp. Đây là bit mà phải được mã hóa bằng mã
tích chập.
Bảng sau cho chúng ta thấy ma trận tích lũy của đầy đủ 8 bit (cộng với 2 bit phụ
thêm) của bản tin ở mỗi thời điểm t:
Bảng 2: Bảng ma trận tích lũy của cả 8 bit của bản tin
Chú ý rằng ở ví dụ về bộ giải mã Viterbi ngõ vào quyết định cứng này, thông số
metric tích lũy nhỏ nhất ở trạng thái cuối chỉ ra được có bao nhiêu lỗi ký hiệu kênh
truyền xảy ra.
Bảng lịch sử trạng thái bên dưới cho thấy trạng thái tồn tại trước đó cho mỗi trạng
thái tại thời điểm t:
22
Bảng 3: Bảng lịch sử trạng thái
Tương ứng 0,1,2,3 là các vị trí 00,01,10,112.
Bảng sau cho thấy trạng thái được lựa chọn khi truy hồi đường dẫn từ bảng trạng thái
tồn tại ở trên:
Bảng 4: Bảng các trạng thái được lựa chọn khi truy hồi

Sử dụng bảng ta thấy được sự chuyển đổi trạng thái đến các ngõ vào gây ra
chúng, giờ chúng ta đã có thể tạo lại bản tin gốc. Bảng này rất giống với ví dụ của chúng
ta ở bộ mã hóa chập tốc độ ½ và K= 3.
Bảng 5: Bảng trạng thái kế tiếp
Ghi chú: trong bảng ở trên, “x” chỉ ra là một sự chuyển trạng thái không thể xảy ra từ
một trạng thái đến một trạng thái khác.
23
Bây giờ chúng ta đã có tất cả các công cụ cần thiết để tái tạo lại bản tin gốc từ bản tin mà
chúng ta nhận được.
Bảng 6: Bảng chứa các dữ liệu của bản tin gốc đã được khôi phục
Hai bit phụ đã được bỏ qua.
Làm thế nào mà thuật toán truy hồi cuối cùng cũng tìm ra con đường đi đúng nhất của
nó thậm chí nếu nó chọn trạng thái ban đầu là sai. Điều này có thể xảy ra nếu có hơn một
trạng thái có thông số metric tích lũy là nhỏ nhất. Chúng ta sẽ dùng lại hình 15 để làm
sáng tỏ điều này:
Ở thời điểm t=3, cả 2 trạng thái “01” và “11” đều có thông số metric là 1. Đường
đi đúng đi đến trạng thái “01”, chú ý là đường in đậm là đường đi thực sự của bản tin để
đến trạng thái này. Nhưng giả sử chúng ta chọn trạng thái “11” để bắt đầu quá trình truy
hồi của chúng ta. Trạng thái trước đó của trạng thái “11” là trạng thái “10”, cũng là trạng
thái trước đó của trạng thái “01”. Điều này là bởi vì ở thời điểm t=2, trạng thái “10” có
thông số metric tích lũy là nhỏ nhất. Vì vậy, sau trạng thái bắt đầu sai, chúng ta có thể
ngay lập tức trở lại với tuyến đường đúng.
Với ví dụ về bản tin 8 bit, chúng ta tiến hành xây dựng một sơ đồ trellis cho toàn
bộ bản tin trước khi bắt đầu quá trình truy hồi. Với các bản tin dài hơn hoặc các chuỗi dữ
24
liệu liên tục, điều này là không thực tế, bởi vì bộ nhớ chiều dài ràng buộc và sự trì hoãn
trong giải mã. Nghiên cứu cho thấy là độ sâu truy hồi của Kx5 chỉ đủ cho việc giải mã
viterbi với loại bộ mã mà chúng ta đang thảo luận. Bất cứ một sự truy hồi sâu hơn sẽ làm
tăng thời gian delay giải mã và bộ nhớ yêu cầu cho. việc giãi mã và cũng ko làm tăng
hiệu quả việc giải mã, ngoại trừ bộ mã hóa thủng (punctured code) mà chúng ta sẽ nói

sau.
• Để thực thi một bộ giải mã Viterbi bằng phần mềm, bước đầu tiên là phải
xây dựng một vài cấu trúc dữ liệu xoay quanh thuật giải mã sẽ được thực
thi. Những cấu trúc dữ liệu này được thực thi tốt nhất khi là các mảng. Sáu
mảng chính mà chúng ta cần cho bộ giải mã viterbi là:
• Một bản sao của “Bảng trại thái kế tiếp” của bộ mã hóa mã chập, bảng
chuyển trạng thái của bộ mã hóa. Kích cỡ của bảng này (hàng x cột) là 2
(K-
1)
x 2
K
. Mảng này phải được khởi đầu trước khi bắt đầu tiến trình giải mã.
• Một bản sao của “bảng ngõ ra” của bộ mã hóa mã chập. Kích cỡ của bảng
này là 2
(K-1)
x 2
K
. Mảng này cũng cần phải được khởi đầu trước khi bắt đầu
tiến trình giải mã.
• Một mảng để lưu trữ trạng thái hiện tại và trạng thái kế của bộ mã hóa mã
chập, với giá trị ngõ vào (0 hoặc 1) sẽ cho ra trạng thái kế tiếp và trạng
thái hiện tại. Chúng ta sẽ gọi bảng này là “bảng ngõ vào”. Kích thước của
bảng là 2
(K-1)
x 2
(K-1)
. Mảng này cũng cần phải được khởi đầu trước khi bắt
đầu tiến trình giải mã.
• Một mảng để lưu trữ lịch sử các trạng thái trước cho mỗi trạng thái của bộ
mã hóa cho Kx5 + 1 cặp kí hiệu kênh truyền nhận được. Chúng ta sẽ gọi

bảng này là “bảng lịch sử trạng thái”. Kích thước của mảng này là 2
(K-1)
x(Kx5 +1). Mảng này không cần khởi động trước khi bắt đầu tiến trình
giải mã.
• Một mảng để lưu trữ thông số metric tích lũy cho mỗi trạng thái được tính
toán sử dụng nguyên tắc cộng- so sánh- lựa chọn. Mảng này sẽ được gọi là
“mảng thông số metric tích lũy”. Kích thước của mảng này là 2
(K-1)
x 2.
Mảng này không cần khởi động trước khi bắt đầu tiến trình giải mã.
• Một mảng dùng để lưu trữ danh sách các trạng thái đã được quyết định
trong suốt quá trình truy hồi. Nó được gọi là “mảng chuỗi trạng thái”.
Kích thước của mảng này là (Kx5 + 1). Mảng này không cần khởi động
trước khi bắt đầu tiến trình giải mã.
Giờ chúng ta hãy nói về tốc độ của những bộ mã hóa chập mà có thể được giải
mã bởi các bộ giải mã Viterbi. Ở trên chúng ta đã đề cập đến bộ mã hóa thủng, là một
hướng chung của bộ mã hóa tốc độ cao, tốc độ lớn hơn từ k đến n. Punctured code được
tạo ra bởi dữ liệu mã hóa đầu tiên sử dụng một bộ mã hóa tốc độ 1/n như là bộ mã hóa
25

×