Tuy nhiên với việc đưa các từ mã sửa lỗi vào dữ liệu ở phía truyền cũng
cần thuật toán để giải mã và sửa lỗi ở phía nhận, sau đó tiến hành thử nghiệm để
đánh giá hiệu quả của phương pháp này so với phương pháp cũ, nhưng vì thời
gian có hạn, luận văn dừng ở đây, với mong muốn công việc này được tiến hành
tiếp sau này bởi chính tác giả hoặc một người nào đó.
93 trang |
Chia sẻ: lylyngoc | Lượt xem: 3544 | Lượt tải: 1
Bạn đang xem trước 20 trang tài liệu Luận văn Nghiên cứu mã điều khiển lỗi trong mạng cảm biến không dây để nâng cao hiệu quả việc sử dụng năng lượng, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
sau khi chúng được nhận.
Lớp điều khiến đa truy cập Media – Access – Control (MAC) chuyển tiếp
lớp ứng dụng với radio chip :
+ Khi 1 gói tin được gửi đi nhờ 1 ứng dụng, gói tin được phân nhỏ thành
các byte. 1 chuỗi liên tiếp các byte đặc biệt được gọi là Preamble (phần mở đầu)
được gửi đi trước các byte dữ liệu do đó phía thu có thể đồng bộ và xác định
phần bắt đầu của 1 gói tin.
45
+ Sau khi nhận 1 byte, radio chip mã hoá bit dữ liệu và truyền chúng. Ở
phía nhận, radio chip báo hiệu việc đến của các byte sau khi xác định và giải mã
các bit dữ liệu.
+ Sau đó lớp MAC hợp lại gói đầu tiên sau gói preamble. Tiếp theo lớp
MAC báo hiệu việc đến của gói tin cho lớp trên.
Các byte dữ liệu có thể được mã hoá một cách tuỳ ý sau khi được phân
đoạn cùng với mã sửa lỗi (ECC – Error correction code) để khôi phục các bit dữ
liệu trong trường hợp có số lượng nhỏ các bit bị lỗi. Có một hay nhiều các byte
dữ liệu được xếp về phía trong của chuỗi các byte dữ liệu khác cái mà sau đó
cũng đã được truyền qua radio chip. Ở phía bộ thu, các byte dữ liệu đã được
nhận , và được mã hoá để trở về dạng các byte dữ liệu gốc.
Bộ điều biến bit chuyển 1 bit vào thành 1 chuỗi bit trong dạng tương tự.
Lược đồ điều biến bit đơn giản nhất là mã hoá NRZ (Non-Return to Zero). Mã
hoá NRZ 1 cách đơn giản tạo ra 1 dạng sóng (của tín hiệu) với mức điện áp
tương ứng: A cho đầu vào bit 0 và B cho đầy vào bit 1. Bộ thu phát radio giữ vết
của tín hiệu tương tự có nghĩa để phân biệt với các bit đang dồn đến. Bằng việc
so sánh các tính hiệu thu được với mức trung bình, bộ thu phát truyển đổi dạng
sóng tương tự thành bit nhị phận 0 hay 1. Việc này có thể sinh ra 1 vấn đề khi có
một chuỗi dài là 0 hay 1, cái mà lệch với mức tín hiệu tương tự có nghĩa, do đó
giảm khả năng phiên dịch đúng của bộ thu phát đối với tính hiệu số được truyền.
Trong mã hoá NRZ, việc nhồi bit, chính là chúng ta thêm vào phần bổ sung sau
chính bit đầu vào đó, nó là cần để thực hiện loại bỏ vấn đề này. Mã hoá
Manchester loại bỏ vấn đề này nhờ việc tạo ra các số 0 và 1 giống nhau cho bất
kỳ chuỗi bit nào. Lược đồ mã hoá này mã hoá một 0 thành sự chuyển đổi từ A
B và 1 thành sự chuyển đổi từ B A. Ví dụ được chỉ ra ở hình.
46
Hình 2.2 Mã hoá NRZ và mã hoá Manchester
ChipCon radio là bộ thu phát radio mà hiện tại được sử dụng trong phiên
bản mới nhất của các nút mạng cảm nhận không dây. Được so sánh với radio
RFM cái mà được sử dụng trong platform sớm hơn, ChipCon radio có một số
đặc tính được cải tiến. Đầu tiên, đó là các nút cảm biến không dây với các radio
ChipCon có phạm vi lớn hơn radio RFM. Trong quá trình kiểm nghiệm ngoài
trời, các nút cảm biến ChipCon đã có phạm vi khoảng 1000 feet, trong khi các
nút cảm biến RFM vào khoảng 400 feet. Thứ 2 đó là, các bit dữ liệu được điểu
chế sử dụng FSK (Frequency Shift Keying) khiến cho dữ liệu truyền đi có tính
đàn hồi so với ồn (noise). Cuối cùng , radio ChipCon hỗ trợ mã hoá Manchester
ở thiết bị phần cứng, cho phép các bit dữ liệu được truyền dẫn mà không cần
phải rõ ràng ; phần mềm sử dụng cân bằng DC (software-level DC balancing).
Hình 2.3 Mã hoá bit
47
Mã sửa lỗi của radio RFM không phù hợp so với radio ChipCon bởi vì nó
nhồi bít một cách không cần thiết cho sự cân bằng DC. Hình trên chỉ ra cách mà
1 byte được mã hoà thành 3 byte từ mã. Ví dụ, nếu bit thứ 8 của byte dữ liệu là
1, thì từ mã có 1 trong bit thứ 8 của byte thứ 3 và 0 trong bit thứ 7. Nếu bít thứ 8
của byte là 0, thì từ mã có 0 và 1 trong bit thứ 8 và 7 trong byte thứ 3.
2.2 Các loại lỗi bit
Khi truyền dữ liệu từ node này đến node khác, các tín hiệu dạng nhị phân
“0” và “1” nếu bị lỗi có thể biến đổi từ “0” thành “1” và từ “1” thành “0”, có ba
loại lỗi thường gặp đó là lỗi đơn bit, đa bit và đảo bit.
Hình 2.4 Lỗi bit trong quá trình truyền nhận dữ liệu
2.3 Phát hiện lỗi
Khi một node nhận gói tin từ node khác gửi đến, làm thế nào để nó có thể
biết một trong những lỗi trên xảy ra, trừ trường hợp nó phải gửi mỗi đơn vị dữ
liệu hai lần rồi node nhận so sánh hai đơn vị dữ liệu nhận được theo từng bit
một, từ đó phát hiện ra lỗi. Nhưng như vậy thì làm mất hai lần thời gian để so
sánh từng bit dữ liệu, cộng thêm thời gian để so sánh từng bit dữ liệu. Phương
pháp này không hiệu quả do thời gian xử lý một gói tin gấp hai lần bình thường,
và dữ liệu đến lần trước và lần sau cũng không biết được lần nào bị lỗi. Rõ ràng
phải có cơ chế phát hiện lỗi vừa đơn giản mà không làm tốn thời gian truyền của
gói tin trong mạng hay làm giảm hiệu năng mạng.
Chỉ bằng cách đưa vào các thông tin dư thừa trong quá trình truyền nhằm
mục đích so sánh, thay thế việc lặp toàn bộ dữ liệu, chỉ cần một nhóm nhỏ các
bit thêm vào cuối mỗi đơn vị dữ liệu. Kỹ thuật này gọi là dư thừa bởi vì một số
bit bên ngoài được thêm vào là thừa so với thông tin cần gửi đi. Những bit dư
48
thừa này sẽ được bỏ đi, khi thông tin truyền tới nơi nhận đã được kiểm tra và xác
nhận là không bị lỗi.
Hình 2.5 Phương pháp sử dụng bit dư thừa
Mỗi khi chuỗi bit dữ liệu được phát đi đều phải đi qua một thiết bị phân
tích và bổ sung vào một chuỗi dữ liệu đó, mã kiểm tra dư thừa thích hợp. Đơn vị
dữ liệu trở nên lớn hơn bởi một số bit thêm vào, tất cả được truyền lên đường
liên kết đến nơi nhận. Thiết bị nhận đặt toàn bộ chuỗi này vào một khối kiểm tra.
Nếu chuỗi dữ liệu nhận được, đi qua được khối kiểm tra thì phần dữ liệu sẽ được
nhận còn các bit dư thừa sẽ được bỏ qua.[4]
Có 4 cách để kiểm tra dư thừa đó là:
- Kiểm tra dư thừa đứng VRC, hay còn gọi là kiểm tra chẵn lẻ
- Kiểm tra dư thừa dài LRC
- Kiểm tra dư thừa tuần hoàn CRC
- Tổng kiểm tra Checksum
Kiểm lỗi dư thừa tuần hoàn CRC
Phương pháp kiểm lỗi này có độ tin cậy cao nhất. VRC và LRC dựa vào
việc bổ sung thêm số bit, còn CRC dựa vào phép chia nhị phân. Trong CRC
chuỗi các bit dư thừa được gọi là số dư CRC, sẽ bổ sung thêm vào cuối đơn vị
dữ liệu sao cho đơn vị dữ liệu mới này là chia không dư cho số nhị phân được
quy định trước và sử dụng ở nơi gửi. Khi đó đơn vị dữ liệu được xem là không
49
lỗi và sẽ được nhận. Trường hợp phép chia có dư, nghĩa là đơn vị dữ liệu đã bị
lỗi và không được nhận.
Các bit dư thừa CRC được nơi gửi tính bằng cách chia đơn vị dữ liệu cho
một số chia xác định trước, số dư chính là CRC. CRC phải có ít hơn số chia một
bit và phải bổ sung vào cuối dữ liệ. Hình dưới minh hoạ quá trình kiểm lỗi CRC:
Hình 2.6 Quá trình kiểm lỗi CRC
Đầu tiên thêm n bit “0” vào cuối đơn vị dữ liệu, số n ít hơn số chia 1 bit.
Tiếp theo đơn vị dữ liệu mới này được chia cho số chia. Số dư của phép chia
chính là CRC. CRC thu được, thay cho các bit “0” ở cuối đơn vị dữ liệu. Nếu số
dư ít hơn n bit thì bổ sung thêm số 0 vào các bit bên trái. Nếu phép chia không
dư thì n số 0 được đặt làm số dư và nó là CRC..
Đơn vị dữ liệu chuyển tiếp đến thiết bị nhận, dữ liệu đến trước và theo sau
là CRC. Thiết bị nhận xem toàn bộ dữ liệu này như một đơn vị và chia nó cho
cùng một số chia đã được sử dụng ở bên gửi.
Nếu chuỗi dữ liệu khi được kiểm tra CRC cho số dư bằng 0 được xem là
không lỗi và được nhận. Nếu chuỗi dữ liệu bị thay đổi trong quá trình truyền, số
dư sẽ khác 0 và đơn vị dữ liệu bị lỗi, không nhận được.
50
CRC phát hiện tất cả các lỗi, trừ khi giá trị các bit của khối chính xác bằng
giá trị của số chia. Số chia CRC thông dụng là 13, 17 và 33, bảo đảm phát hiện
hết lỗi.
Hình 2.7 Phép chia nhị phân để tìm CRC
Hình trên mô tả quá trình tạo ra CRC, dữ liệu là 111001, số chia là 11001.
Số chia trong phép chia phải được chọn sao cho thực hiện phép chia
nhị phân được dễ dàng và kết quả phép chia có dư. Nó được suy từ một đa
thức sinh:
Đa thức có thể biểu diễn dưới dạng khác:
51
Các hệ số trong đa thức lập thành 1011 là số chia. Do đó với CRC-12 thì
số chia có 13 bậc nhị phân, CRC-16 thì số chia có 17 bậc nhị phân, CRC-32 thì
số chia có 33 bậc nhị phân.
2.4 Sửa lỗi
Sửa lỗi được thực hiện bằng hai cách đó là thiết bị nhận yêu cầu thiết bị
gửi truyền lại toàn bộ dữ liệu đã gửi. Cách khác, thiết bị nhận sử dụng mã sửa lỗi
tự động sửa một số lỗi nhất định.[3]
Trên lý thuyết, có thể tự động sửa lỗi bất kỳ lỗi nhị phân nào. Mã sửa lỗi
đòi hỏi nhiều bit dư thừa hơn so với mã phát hiện lỗi. Số bit cần để sửa các lỗi
đa bit và lỗi đảo bit lớn đến nỗi trong nhiều trường hợp nó trở nên không còn
hiệu quả. Vì vậy trong hầu hết các thao tác sửa lỗi chỉ giới hạn ở một, hai, hoặc
ba bit lỗi trong một đơn vị dữ liệu.
Mã Hamming
Mã Hamming là một mã sửa lỗi tuyến tính (linear error-correcting code),
được đặt tên theo tên của người phát minh ra nó, Richard Hamming. Mã
Hamming có thể phát hiện một bit hoặc hai bit bị lỗi (single and double-bit
errors). Mã Hamming còn có thể sửa các lỗi do một bit bị sai gây ra.[4]
Xét dữ liệu 7 bit thì cần 4 bit dư thừa để thêm vào cuối đơn vị dữ liệu
hoặc chèn vào những bit dữ liệu gốc
Hình 2.8 Cách chèn các bit dư thừa vào dữ liệu
Trên hình vẽ, các bit dư thừa được đặt vào vị trí 1, 2, 4 và 8 và được ký
hiệu là r1, r2, r4, r8.
Trong mã Hamming mỗi bit r là VRC của một tổ hợp các bit dữ liệu. Các
tổ hợp được sử dụng để tính một trong bốn giá trị của r như sau:
r1: bit 1, 3, 5, 7, 9, 11
52
r2: bit 2, 3, 6, 7, 10, 11
r4: bit 4, 5, 6, 7
r8: bit 8, 9, 10, 11
Mỗi bit dữ liệu có thể tham gia vào nhiều tính toán VRC. Sự thể hiện nhị
phân của mỗi vị trí: ví dụ như bit r1 có đại diện nhị phân chứa 1 ở vị trí bên phải
nhất của các vị trí 1, 3, 5, 7, 9, 11
Lấy ví dụ chúng ta có một từ dữ liệu dài 7 bit với giá trị là "0110101". Để
chứng minh phương pháp các mã Hamming được tính toán và được sử dụng để
kiểm tra lỗi, xin xem bảng liệt kê dưới đây. Chữ d (data) được dùng để biểu thị
các bit dữ liệu và chữ p (parity) để biểu thị các bit chẵn lẻ (parity bits).
Đầu tiên, các bit của dữ liệu được đặt vào vị trí tương thích của chúng, sau
đó các bit chẵn lẻ cho mỗi trường hợp được tính toán dùng quy luật bit chẵn lẻ
số chẵn
Hình 2.9 Cách tính các bit chẵn lẻ trong mã Hamming
Nhóm dữ liệu mới (new data word) - bao gồm các bit chẵn lẻ - bây giờ là
"10001100101". Nếu chúng ta thử cho rằng bit cuối cùng bị thoái hóa (gets
corrupted) và bị lộn ngược từ 1 sang 0. Nhóm dữ liệu mới sẽ là "10001100100".
Dưới đây, sẽ phân tích quy luật kiến tạo mã Hamming bằng cách cho bit chẵn lẻ
giá trị 1 khi kết quả kiểm tra dùng quy luật số chẵn bị sai.
53
Hình 2.10 Kiểm tra các bit chẵn lẻ
Bước cuối cùng là định giá trị của các bit chẵn lẻ (nên nhớ bit nằm dưới
cùng được viết về bên phải - viết ngược lại từ dưới lên trên). Giá trị số nguyên
của các bit chẵn lẻ là 11, và như vậy có nghĩa là bit thứ 11 trong nhóm dữ liệu
(data word) - bao gồm cả các bit chẵn lẻ - là bit có giá trị không đúng, và bit này
cần phải đổi ngược lại.
Việc đổi ngược giá trị của bit thứ 11 làm cho nhóm 10001100100 trở lại
thành 10001100101. Bằng việc bỏ đi phần mã Hamming, chúng ta lấy được
phần dữ liệu gốc với giá trị làn0110101. Các bit chẵn lẻ không kiểm tra được lẫn
nhau, nếu chỉ một bit chẵn lẻ bị sai thôi, trong khi tất cả các bit khác là đúng, thì
chỉ có bit chẵn lẻ nói đến là sai mà thôi và không phải là các bit nó kiểm tra (not
any bit it checks). Cuối cùng, giả sử có hai bit biến đổi, tại vị trí x và y. Nếu x và
y có cùng một bit tại vị trí 2k trong đại diện nhị phân của chúng, thì bit chẵn lẻ
tương ứng với vị trí đấy kiểm tra cả hai bit, và do đó sẽ giữ nguyên giá trị, không
thay đổi. Song một số bit chẵn lẻ nào đấy nhất định phải bị thay đổi, vì x ≠ y, và
do đó hai bit tương ứng nào đó có giá trị x và y khác nhau. Do vậy, mã
Hamming phát hiện tất cả các lỗi do hai bit bị thay đổi, song nó không phân biệt
được chúng với các lỗi do 1 bit bị thay đổi.
Hiện thời, khi nói đến mã Hamming chúng ta thực ra là muốn nói đến mã
(7,4) mà Hamming công bố năm 1950. Với mỗi nhóm 4 bit dữ liệu, mã
Hamming thêm 3 bit kiểm tra. Thuật toán (7,4) của Hamming có thể sửa chữa
54
bất cứ một bit lỗi nào, và phát hiện tất cả lỗi của 1 bit, và các lỗi của 2 bit gây ra.
Điều này có nghĩa là đối với tất cả các phương tiện truyền thông không có chùm
lỗi đột phát (burst errors) xảy ra, mã (7,4) của Hamming rất có hiệu quả (trừ phi
phương tiện truyền thông có độ nhiễu rất cao thì nó mới có thể gây cho 2 bit
trong số 7 bit truyền bị đảo lộn). Nguyên lý của mã Hamming bắt nguồn từ việc
khai triển và mở rộng quan điểm chẵn lẻ. Việc khai triển này bắt đầu bằng việc
nhân các ma trận, được gọi là Ma trận Hamming (Hamming matrices), với nhau.
Đối với mã Hamming (7,4), chúng ta sử dụng hai mã trận có liên quan gần gũi,
và đặt tên cho chúng là:
và
Các cột vectơ trong He là nên tảng hạch của Hd và phần trên của He (4
hàng đầu) là một ma trận đơn vị (identity matrix). Ma trận đơn vị cho phép vectơ
dữ liệu đi qua trong khi làm tính nhân, và như vậy, các bit dữ liệu sẽ nằm ở 4 vị
trí trên cùng (sau khi nhân). Sau khi phép nhân hoàn thành, khác với cách giải
thích ở phần trước (các bit chẵn lẻ nằm ở vị trí 2k), trật tự của các bit trong từ
mã (codewords) ở đây khác với cách bố trí đã nói (các bit dữ liệu nằm ở trên,
các bit kiểm chẵn lẻ nằm ở dưới).
Chúng ta dùng một nhóm 4 bit dữ liệu (số 4 trong cái tên của mã là vì
vậy) chủ chốt, và cộng thêm vào đó 3 bit dữ liệu thừa (vì 4+3=7 nên mới có số 7
trong cái tên của mã). Để truyền gửi dữ liệu, chúng ta hãy nhóm các bit dữ liệu
55
mà mình muốn gửi thành một vectơ. Lấy ví dụ, nếu dữ liệu là "1011" thì vectơ
của nó là:
Giả sử, chúng ta muốn truyền gửi dữ liệu trên. Chúng ta tìm tích của He
và p, với các giá trị môđulô 2:
Máy thu sẽ nhân Hd với r, để kiểm tra xem có lỗi xảy ra hay không. Thi
hành tính nhân này, máy thu được:
Vì chúng ta được một vectơ toàn số không cho nên máy thu có thể kết
luận là không có lỗi xảy ra
Sở dĩ một vectơ toàn số không có nghĩa là không có lỗi, bởi vì khi He
được nhân với vectơ dữ liệu, một sự thay đổi trong nền tảng xảy ra đối với
không gian bên trong vectơ (vector subspace), tức là hạch của Hd. Nếu không có
vấn đề gì xảy ra trong khi truyền thông, r sẽ nằm nguyên trong hạch của Hd và
phép nhân sẽ cho kết quả một vectơ toàn số không.
Trong một trường hợp khác, nếu chúng ta giả sử là lỗi một bit đã xảy ra.
Trong toán học, chúng ta có thể viết:
56
trong đó ei là vectơ đơn vị đứng thứ i (ith unit vector), có nghĩa là, một
vectơ số 0 có một giá trị 1 trong vị trí i. Biểu thức trên nói cho chúng ta biết rằng
có một bit bị lỗi tại vị trí i.
Nếu bây giờ chúng ta nhân Hd với cả hai vectơ này:
Vì r là dữ liệu thu nhận được không có lỗi, cho nên tích của Hd và r bằng
0. Do đó
Vậy, tích của Hd với vectơ nền chuẩn tại cột thứ i (the ith standard basis
vector) làm lộ ra cột ở trong Hd, vì thế mà chúng ta biết rằng lỗi đã xảy ra tại vị
trí cột này trong Hd. Vì chúng ta đã kiến tạo Hd dưới một hình thức nhất định,
cho nên chúng ta có thể hiểu giá trị của cột này như một số nhị phân - ví dụ,
(1,0,1) là một cột trong Hd, tương đồng giá trị với cột thứ 5, do đó chúng ta biết
lỗi xảy ra ở đâu và có thể sửa được nó.
Lấy ví dụ, giả sử chúng ta có:
Nếu thi hành phép nhân:
Tích của phép nhân cho chúng ta một kết quả tương đương với cột thứ 2
("010" tương đương với giá trị 2 trong số thập phân), và do đó, chúng ta biết
rằng lỗi đã xảy ra ở vị trí thứ 2 trong hàng dữ liệu, và vì vậy có thể sửa được lỗi.
57
Chúng ta có thể dễ dàng thấy rằng, việc sửa lỗi do 1 bit bị đảo lộn gây ra,
dùng phương pháp trên là một việc thực hiện được. Bên cạnh đó, mã Hamming
còn có thể phát hiện lỗi do 1 bit hoặc 2 bit bị đảo lộn gây ra, dùng tích của Hd
khi tích này không cho một vectơ số không. Tuy thế, song mã Hamming không
thể hoàn thành cả hai việc.
58
Chương 3: MÃ ĐIỀU KHIỂN LỖI SỬ DỤNG TRONG WSN
3.1 Giới thiệu
Các nút cảm nhận thường nhỏ, và khi được lắp với các cảm nhận khác
như các cảm nhận nhiệt độ số nó sẽ làm việc giống như các truyền thông không
dây. Những tính năng này cho phép các mạng cảm cảm nhận dễ dàng được thực
hiện trong tất cả các kiểu môi trường, và chúng ta mong rằng các mạng trở nên
phổ dụng ở khắp mọi nơi trong tương lai không xa. Tuy nhiên, có một yếu tố
nhỏ khiến cho các cảm nhận bị giới hạn về năng lượng. Bảng sau cho thấy sự
tiêu thụ điện năng do các kiểu lệnh khác nhau được xác định:
Bảng 3.1 Sự tiêu thụ điện năng trong các node cảm biến
Từ bảng trên đã cho thấy rằng hầu hết điện năng bị tiêu thụ trong suốt quá
trình truyền dẫn và tiếp nhận dữ liệu. Bằng việc sử dụng mã sửa lỗi (ECC) mà ở
đây cụ thể là FEC, sẽ giảm được số lượng gói dữ liệu tái truyền phát, theo cách
đó giảm được sự tiêu hao năng lượng trong quá trình xử lý.
3.2 Lý thuyết về mã hoá
Lý thuyết mã hóa (Coding Theory) nhằm giải quyết tình trạng lỗi dễ xảy
ra trong quá trình truyền thông số liệu trên các kênh truyền có độ nhiễu cao
(noisy channels), dùng những phương pháp tinh xảo khiến phần lớn các lỗi xảy
ra có thể được chỉnh sửa. Nó còn xử lý những đặc tính của mã (codes), và do
vậy giúp phù hợp với những ứng dụng cụ thể.
Có hai loại mã hoá:
- Mã hóa nguồn (Mã hóa Entropy - Entropy encoding)
59
- Mã hóa trên kênh truyền (Sửa lỗi chuyển tiếp - Forward Error
Correction)
Mã hóa nguồn mục đích của phương pháp này là nén dữ liệu từ chính
nguồn của nó, trước khi truyền đi, giúp cho việc truyền thông có hiệu quả hơn.
Mã hóa trên kênh truyền thực hiện việc cộng thêm những bit mới vào
trong dữ liệu được truyền, còn gọi là bit chẵn lẻ (parity bits), kỹ thuật này giúp
cho việc truyền thông tín hiệu chính xác hơn trong môi trường nhiễu loạn của
kênh truyền thông. Có nhiều chương trình ứng dụng, sử dụng mã hóa trên kênh
truyền.
Vì mã hoá nguồn không phù hợp trong mạng cảm biến nên ở trong phần
này ta chỉ xét đến mã hoá kênh truyền. Mục đích lý thuyết của mã hóa trên kênh
truyền (channel encoding theory) là tìm những mã có thể truyền thông nhanh
chóng, chứa đựng nhiều mã ký (code word) hợp lệ và có thể sửa lỗi (error
correction) hoặc ít nhất phát hiện các lỗi xảy ra (error detection). Các mục đích
trên không phụ thuộc vào nhau, và mỗi loại mã có công dụng tối ưu cho một ứng
dụng riêng biệt. Những đặc tính mà mỗi loại mã này cần còn tuỳ thuộc nhiều
vào xác suất lỗi xảy ra trong quá trình truyền thông.
Mã hoá kênh truyền được chia làm hai loại chính:
- Mã khối tuyến tính (Linear block codes)
- Mã kết hợp (Convolutional codes)
Mã khối tuyến tính mang tính năng tuyến tính (linearity), chẳng hạn tổng
của hai mã ký nào đấy lại chính là một mã ký và chúng được ứng dụng vào các
bit của nguồn trên từng khối một.
Bất cứ mã khối tuyến tính nào cũng được đại diện là (n,m,dmin), trong đó:
- n là chiều dài của mã ký, ký hiệu symbols
- m là số ký hiệu nguồn (source symbols) được dùng để mã hóa tức thời
- dmin là khoảng cách Hamming tối thiểu của mã (The Minimum
Hamming Distance For The Code)
Có nhiều loại mã khối tuyến tính, như:
- Mã tuần hoàn (Cyclic codes) (Mã Hamming là một bộ phận nhỏ của mã
tuần hoàn)
- Mã tái diễn (Repetition codes)
- Mã chẵn lẻ (Parity codes)
60
- Mã Reed-Solomon (Reed Solomon codes)
- Mã BCH (BCH code)
- Mã Reed-Muller
- Mã hoàn hảo (Perfect codes)
Mã kết hợp (Convolutional Codes) được sử dụng trong các modem dải tần
âm (voiceband modems) và trong các điện thoại di động, cũng như trong các
thiết bị truyền thông của quân đội vũ trang và trong các thiết bị truyền thông với
vệ tinh.
3.3 Phương pháp sửa lỗi chuyển tiếp FEC
FEC được liên kết với một mã nhân chập khối bên trong để truyền dữ liệu
tới hạn một cách thông suốt, như các truy nhập điều khiển khung và truy nhập
khởi đầu.
Hình 3.2 Cơ chế sửa lỗi FEC
Mục tiêu của phương pháp này là xây dựng nguyên tắc sửa lỗi dựa vào
khoảng cách Hamming. Trên nguyên tắc này, phương pháp sửa lỗi “kiểm tra
chẵn lẻ (parity check)” được xây dựng và tạo ra quy trình sửa lỗi tối ưu và phù
hợp với công nghệ truyền tin hiện nay.
61
Xét v1 và v2 là 2 dãy nhị phân dài n bit, ta gọi khoảng cách Hamming
giữa 2 dãy v1 và v2 là số bit tương ứng khác nhau. Ký hiệu d(v1, v2).
Ví dụ :
v1 = 10101010
v2 = 10101111
Ta nhận thấy rằng bit thứ 6 và bit thứ 8 giữa v1 và v2 là khác nhau nên số
bit tương ứng khác nhau giữa v1 và v2 là 2. Do đó ta nói khoảng cách Hamming
giữa v1 và v2 là 2 hay d(v1,v2) = 2.
Bổ đề tự sửa lỗi được ứng dụng trong FEC
Xét bộ mã W= {w1 , w2, … , ws} gồm có s từ mã nhị phân dài n bit và 1
số nguyên dương e.
- Nếu khoảng cách hamming nhỏ nhất dmin >= 2e+1
Khi đó thì tất cả các dãy nhận được v có thể tự sửa được tối đa e bit lỗi.
- Nếu dmin >= 2e
Thì tất cả các dãy nhận được v sẽ có khả năng phát hiện tối đa e lỗi; nếu
tổng số bit lỗi < e thì v có thể tự điều chỉnh được, nếu số bit lỗi = e thì chỉ phát
hiện được lỗi và không thể điều chính được.
Trong bộ mã khối , gọi n là số bit trong một từ mã, k là số bit thông tin và
m là bit kiểm tra chẵn lẻ, e là số lỗi. khi đó:
0
2
e
m i
n
i
C
Điều kiện cần để bộ mã có thể tự sửa lỗi là
Điều kiện đủ để bộ mã có thể tự sửa lỗi (theo Vasharmov-Gilbert-
Sacks)
1
0
2
e
m i
n
i
C
62
Với:
!
!*( )!
i
n
nC
i n i
Ví dụ:
Mã 3 chiều (x, y, z) bắt đầu từ gốc 000. Cứ một tín hiệu t hay đổi thì mã
bị đẩy đi theo 1 cạnh, chẳng hạn :
000 cách 010, 001 bởi 1 cạnh
011 cách 010, 111 và 001 bởi 1 cạnh.
Như vậy, nếu ta chọn w1 = 010, w2 = 001, w3 = 111 thì khoảng cách giữa
chúng là 2 ; tức là d(w1,w2)=(w1,w3)=d(w2,w3)=2
Vậy nếu có lỗi phát sinh thì chỉ phát hiện chứ không sửa được.
Như vậy ta có thể phân dạng các loại lỗi sau:
- Lỗi có thể tự điều chỉnh: Gọi w i W là từ mã đúng được truyền tại
nơi phát; v là từ mã nhận được tại nơi thu (truyền đúng thì wi = v).
Trường hợp v # w; có thể xác định và tự điều chỉnh lại lỗi khi và chỉ khi
tồn tại duy nhất từ mã w*i W sao cho d(vj, w*i)=min d(vj, wi) => khi đó dựa
theo nguyên tắc ngần vẫn đúng vj được gải mã về w*i
- Lỗi chỉ phát hiện không thể tự điều chỉnh: Trong trường hợp này tồn
tại w* và w** sao cho d(vj,w*) = d(vj,w**) = min d(vj,wi) với mọi wi thuộc
W
=> không thể giải mã chính xác.
- Lỗi không phát hiện được: Trong trường hợp này ta giải mã ra w*I
nhưng khác với wi đã truyền.
3.3.1 Mã hoá khối tuyến tính Linear Block Codes
Mã hoá khối tuyến tính là một lớp mã được dùng rất phổ biến trong việc
chống nhiễu. Loại mã này được xây dựng dựa trên các kết quả của đại số tuyến
tính. Ở đây chúng ta chỉ nghiên cứu về mã nhị phân vì dữ liệu ở dạng nhị phân.
63
Hình 3.3 Mã hoá, truyền dẫn và giải mã dữ liệu
Mã hoá thông điệp m thành từ mã v có thể được thực hiện bằng việc nhân
m với ma trận sinh G. Xét một đơn vị dữ liệu gồm k bit, và r là số bit chẵn lẻ
được thêm vào.[5]
Ma trận sinh G sẽ có dạng:
Với Ik là ma trận đơn vị dạng kxk và C ma trận nhị phân dạng k x r.
Khi đó ta sẽ có phương trình : v = uG
Ở phía đầu cuối của bộ thu, syndrome s được tính toán để xác định khả
năng sửa các lỗi. Ma trận chẵn lẻ H được tạo ra từ ma trận sinh G với :
Nếu gọi vector lỗi là e thì chúng ta có:
Ở đây
64
s ≠ 0 nghĩa là có lỗi, sau đó tuỳ thuộc vào khả năng của mã sửa lỗi, s được
so sánh với hàng hay tổng của các hàng trong H.
Phía thu sau đó có thể giải mã các từ mã đã được sửa lỗi bằng việc giả
phương trình v=uG . Một cách đặc biệt, cho mã hệ thống đó là k cột đầu tiên của
ma trận sinh G chính là dạng của ma trận đơn vị v.
3.3.1.1 Cách mã hoá
Nếu:
là thông tin cần được mã hoá thì từ mã v tương ứng với u được xác định
công thức uxG
hay
Vì các từ mã tương ứng với các thông báo được sinh ra bởi G theo cách
như trên nên G được gọi là ma trận sinh của bộ mã.
3.3.1.2 Cách giải mã
Gọi thông báo là u = (a0,a1,a2,a3) và từ mã tương ứng là v =
(b0,b1,b2,b3,b4,b5,b6), ta có phương trình sau liên hệ giữa u và v:
65
Suy ra:
Hệ phương trình này gọi là hệ phương trình giải mã
Giải hệ phương trình trên thu được kết quả là:
Do đó dữ liệu thu được ở bên nhận
3.3.1.3 Các phát hiện lỗi
Nếu v là một từ mã được sinh ra từ ma trận sinh G có ma trận trực giao
tương
ứng là H, thì do v là một tổ hợp tuyến tính của các vectơ hàng của G nên:
Và ngược lại nếu:
thì v phải là một tổ hợp tuyến tính của các vectơ hàng của G do đó v là
một từ mã.
66
Syndrome – vectơ sửa sai (corrector) có dạng
Do đó ta có v là từ mã khi và chỉ khi s(v) = 0
Với tính chất này ta có H có thể được sử dụng để kiểm tra một tổ hợp có
phải là từ mã không hay nói cách khác H có thể được dùng để phát hiện sai. Vì
lý do này mà ma trận H còn được gọi là ma trận kiểm tra
Ma trận kiểm tra của một bộ mã ma trận sinh G(kxn) là ma trận H có kích
thước (n – k)xn sao cho:
3.3.1.4 Cách sửa lỗi
Xét vector lỗi là vectơ biểu diễn các vị trí lỗi giữa từ mã truyền và tổ hợp
nhận, mỗi vị trí lỗi được biểu diễn bằng bit 1, các vị trí còn lại sẽ có giá trị 0.
Nếu từ mã được truyền đi là w, vectơ lỗi là e và vectơ nhận là v thì:
Ví dụ nếu từ mã w = 1011011, vectơ lỗi là e = 0010100 có nghĩa là sai ở
vị trí số 3 và 5 (tính từ trái, bắt đầu bằng 1) thì vectơ nhận sẽ là v = w + e =
1001111. Ngược lại nếu từ mã w = 0110010 còn vec tơ nhận là v = 0010011 thì
vectơ lỗi là e = w + v = 0100001 có nghĩa là đã có sai xảy ra ở các vị trí số 2 và
số 7.
Trọng số của vectơ lỗi biểu diễn khoảng cách Hamming giữa từ mã phát
và tổ hợp nhận. Khái niệm trên gợi ý cho chúng ta một điều như sau, nếu vectơ
nhận là v thì chúng ta có thể tính được vectơ lỗi tương ứng với mỗi từ mã bằng
cách cộng v với lần lượt các từ mã và rồi dựa vào nguyên lý khoảng cách
Hamming tối thiểu chúng ta thấy rằng vectơ lỗi nào có trọng số nhỏ nhất thì từ
mã tương ứng chính là từ mã đã được phát đi.
Xét một mã tuyến tính C(7x4) có ma trận hệ thống như sau:
67
Với bộ ma trận kiểm tra của bộ mã trên như sau:
Bộ mã trên có khoảng cách Hamming d = 3. Vì vậy có thể phát hiện sai 2
bit và sửa sai được 1 bit. Giả sử đường truyền sai tối đa 1 bit. Và vectơ nhận là v
= 1010110, tìm từ mã đúng đã được phát đi. Để giải bài này chúng ta tính:
Trong đó hi (i = 1,2,3,…) là cột thứ i của H Chúng ta thấy s(v) ≡ h1 nên
suy ra lỗi sai ở vị trí số 1, vì vậy từ mã đúng đã được phát đi là
w = v + e = 1010110 + 1000000 = 0010110
Từ ý tưởng này gợi ý cho chúng ta một loại mã cho phép phát hiện sai 1
bit nhanh nhất. Mã này có tên gọi là mã tuyến tính Hamming.
Xét ví dụ về sửa lỗi theo mã tuyến tính Hamming
68
Xác định ma trận kiểm tra của mã Hamming với ma trận sinh G:
Giả sử có ma trận sinh G như sau:
Với:
Ma trận kiểm tra của mã Hamming (7x4) là:
69
Quá trình kiểm tra như sau:
Nếu d = 0 không lỗi
Nếu d ≠ 0 có lỗi, và bit ri bị lỗi trong quá trình truyền
Ví dụ r = 1100011
Suy ra không lỗi
Với r = 1010011
70
Suy ra có lỗi bit thư 7 bị truyền lỗi
Sửa lỗi 1010011 => 1010010
3.3.2 Kỹ thuật ghép xen Interleaving
Kỹ thuật ghép xen dữ liệu để nhận được sự phân tập không gian mà không
thêm bất kỳ thông tin overhead nào. Kỹ thuật này dùng để giải quyết vấn đề lỗi
cụm (bursty errors), các bit được phân tán nên không bị lỗi đồng thời khi xảy ra
fading sâu hay cụm nhiễu (bursty noise)[12]
Nếu khối sửa lỗi hướng trước FEC chỉ sửa được lỗi từ 1 đến 3 bit thì kỹ
thuật ghép xen lại sửa được lỗi với các chuỗi dài. Có hai kỹ thuật ghép xen dữ
liệu:
- Khối xen dữ liệu Interleaver
- Khối xen chập Convolution Interleaver
Để minh hoạ kỹ thuật này ta xét đoạn dữ liệu được truyền đi không áp
dụng kỹ thuật ghép xen và có kỹ thuật ghép xen.
Hình 3.4 Không có ghép xen dữ liệu
71
Hình trên là đoạn dữ liệu không ghép xen, khi xảy ra lỗi dữ liệu bị phá
huỷ hoàn toàn.
Hình 3.5 Hiệu quả của việc ghép xen dữ liệu
Hình trên mô tả có sử dụng xen dữ liệu, các block tín hiệu được tản đều,
khi bị nhiễu phá huỷ, thì các block tín hiệu không bị phá huỷ hoàn toàn.
3.3.2.1 Khối xen dữ liệu
Xét một khối interleaver với số cột D = 3, số hàng N = 7
72
Hình 3.6 Đặc trưng khối xen từ bộ FEC tới kênh với D=3, N=7
Các số trong khối biểu trưng sự xắp xếp các bit vào bộ xen. Các bit được
viết theo hàng và đọc ra theo cột. Một hàng đơn chứa hoàn toàn một từ mã FEC,
từ mã trong ví dụ trên là 7.
Hình 3.7 Đặc trưng bộ giải xen từ kênh tới FEC với D=3, N=7
Các bit ở đây đến từ kênh, được viết vào trong bộ giải xen theo cột và đọc
ra theo hàng. Hàng sắp xếp hợp thức các bit như định trước cho khối FEC.
73
Hình 3.8. Mô tả kết quả các giá trị xen dữ liệu
Hai hàng đầu tiên của bảng trình bày sự sắp xếp các bit này sẽ được gởi
lên kênh mà không cần thực hiện xen ở bộ xen. Nếu có lỗi xảy ra trong kênh thì
được chỉ ra ở hàng thứ 3 của bảng, hai hàng cuối của bảng chỉ các bit sẽ được
gửi tới khối FEC trong bộ thu trên cùng kênh. Khi dùng kỹ thuật xen, các bit bị
phá huỷ, thì FEC sẽ tự sửa lỗi.
3.3.2.2 Kỹ thuật xen chập Convolution Interleaving
Xét bộ xen chập với một từ mã có size N=7 và độ sâu D=3.
Hình 3.9 Bộ xen chập N=7, D=3
74
Các từ mã được viết vào trong bộ xen theo hàng và đọc ra theo côt. Sự
khác nhau giữa cách thực hiện này và cách thực hiện của bộ khối xen là từ mã
không luôn bắt đầu cùng cột trong xen chập như nó đã làm trong khối bộ xen.
Hơn nữa, các hàng không có kết thúc. Độ sâu và độ dài của bộ xen quyết định có
hoặc không từ mã tiếp theo sẽ được viết ở hàng kế tiếp hay hàng đầu tiếp theo
sau từ mã đã được viết trước đó.
Hình 3.10 Mô tả bộ giải xen chập trong bộ thu khi bộ phát dùng xen chập
Các giá trị đọc ra của bộ giải xen không rõ ràng như trong khối giải xen.
Các bit ở đây được viết theo cột và đọc ra theo hàng với sự xử lý lỗi của FEC.
Bộ giải xen chỉ đọc một từ mã đơn từ mỗi hàng và rồi xử lý tới hàng kế tiếp cho
đến hàng cuối cùng được đọc.
Sau khi đọc số hàng cuối cùng, bộ giải xen quay trở lại hàng đầu và đọc
tiếp từ mã ở vị trí kế tiếp chưa đọc.
3.3.3 Mã sửa lỗi kép - Double error correction codes
Một mã Double-Error-Correcting và Triple-Error-Detecting (DEC-TED)
(16,8) được đề xuất bởi Gulliver và Bhargave [5] với ma trận nhị phân P.
75
Ma trận sinh G được tạo ra với dạng G=[I8 , P] và ma trận chẵn lẻ H có
dạng H = [PT , I8]. Nếu 1 hay 2 bit lỗi xuất hiện, syndrome s sẽ hoặc là giống
với 1 cột trong H hoặc là bằng phép cộng tuyệt đối của 2 cột trong h; chỉ số của
các cột này chính là vị trí của bit lỗi.
Ví dụ:
Với ma trận sinh G được cho như sau :
8
1 0 0 0 0 0 0 0 0 1 1 0 1 0 1 0
0 1 0 0 0 0 0 0 0 0 1 1 0 1 0 1
0 0 1 0 0 0 0 0 1 0 0 1 1 0 1 0
0 0 0 1 0 0 0 0 0 1 0 0 1 1 0 1
[ : ]
0 0 0 0 1 0 0 0 1 0 1 0 0 1 1 0
0 0 0 0 0 1 0 0 0 1 0 1 0 0 1 1
0 0 0 0 0 0 1 0 1 0 1 0 1 0 0 1
0 0 0 0 0 0 0 1 1 1 0 1 0 1 0 0
G I P
8
0 0 1 0 1 0 1 1 1 0 0 0 0 0 0 0
1 0 0 1 0 1 0 1 0 1 0 0 0 0 0 0
1 1 0 0 1 0 1 0 0 0 1 0 0 0 0 0
0 1 1 0 0 1 0 1 0 0 0 1 0 0 0 0
[P :I ] =
1 0 1 1 0 0 1 0 0 0 0 0 1 0 0 0
0 1 0 1 1 0 0 1 0 0 0 0 0 1 0 0
1 0 1 0 1 1 0 0 0 0 0 0 0 0 1 0
0 1 0 1 0 1 1 0 0 0 0 0 0 0 0 1
TH
Khi đó nếu cho bản tin u = [0100 0010] thì từ mã v sẽ là:
v = uG = [0100 0010 1001 1100]
giả sử rằng bít thứ 2 và thứ 3 bị đảo do noise trong kênh không dây. Do
đó, thông tin nhận được sẽ là v’ = [0010 0010 1001 1100]. Bằng việc nhận v’
với ma trận chuyển vị của ma trận chẵn lẻ H, chúng ta sẽ tính được s:
s = v’HT = [1010 1111]
Hãy chú ý rằng syndrome đạt được bằng việc cộng tuyệt đối hàng thứ 2
và thứ 3 của ma trận HT . Do đó ở thiết bị đầu cuối bộ thu thì các bít thứ 2 và
thứ 3 đã bị đảo, để sửa lỗi, từ nhận định trên ta sẽ có từ mã đúng là v = [0100
0010 1001 1100]. Bởi vì ma trận sinh G là một mã hệ thống, nên chúng ta sẽ có
8 bit đầu tiên là dạng của dữ liệu nhận đúng là u =[0100 0010]
76
3.4 Hiệu quả trong việc sử dụng năng lượng
Forward Error Correction (sửa lỗi hướng trước) là 1 cách của việc sửa lỗi
các gói tin bằng cách thêm các bit thông tin vào quá trình truyền dẫn. Tiến hành
thí nghiệm và kiểm tra sự khác nhau giữa các mã sửa lỗi trong radio ChipCon.
Do sự hạn chế của việc tiêu thụ điện năng thấp và yếu tố về hình thức là nhỏ,
nên các mã sửa lỗi được thiết kế đơn giản và có thể sửa lỗi đơn bít hoặc lỗi kép.
Các thí nghiệm ECC của có hiệu quả khi tỷ lệ bít lỗi không cao và là các lỗi đơn
bit. Khi các lỗi là chùm thì các mã của chúng tôi không hiệu quả trong việc giảm
đi những mất mát trong gói tin. Tuy nhiên cũng như nhiều lược đồ khác thì nó
khá là phức tạp và yêu cầu năng lượng xử lý cao và bộ nhớ lưu trữ tính toán lớn.
Để xác định các đặc tính lỗi của radio ChipCon, chúng ta thực hiện vài
phép đo sơ bộ. 1 nút gửi 1000 lần 1 gói tin không được mã hoá, với các gói thu
được nhập vào trong PC ở thiết bị đầu cuối là bộ thu. Các thí nghiệm đã được
tiến hành bên ngoài trời. Hình dưới mô tả hầu hết các lỗi bit là đơn hoặc là lỗi
kép. Các chùm lỗi cũng có nhưng hiếm gặp. Do đó, cũng có thể coi rằng lược đồ
mã hoá mà sửa lỗi đơn và lỗi kép có thể giảm thiểu các lỗi.[12]
Hình 3.11 Bit lỗi đơn và lỗi kép
77
Phần tiếp theo là các tính toán để xác định tỷ lệ mất các gói tin, sự mất là
rất nhỏ khoảng 0.4 % trong khoảng cách là 135 feet.
Hình 3.12 Tính toán tỷ lệ mất gói tin
3.4.1 Kiểm tra ngoài trời
Khi không sử dụng FEC thì ta thấy với 5000 gói tin ở khoảng cách 600 ft
thì tỷ lệ mất gói tin ở môi trường ngoài trời là 0,26%[12]
78
3.4.2 Kiểm tra trong nhà
Khi thực hiện truyền dữ liệu ở 3 vị trí khác nhau trong nhà không sử dụng
FEC thì tỷ lệ mất gói tin cũng khá lớn.[12]
Hình 3.13 Các vị trí các node ở trong nhà
79
Chương 4. ĐIỀU KHIỂN LỖI ỨNG DỤNG CHIPCON CC1010
4.1 Giới thiệu
Trong khi 1 mã sửa lỗi ECC có thể được chỉ định trong bất kỳ lớp nào
trong network stack, thì thực tế ECC được sử dụng trong lớp MAC [4] như hình
minh hoạ :
Hình 4.1 Interfacing ECC module with network stack
Bởi vì với vị trí này sẽ không làm thay đổi sự chuyển giao với lớp ứng
dụng. Do đó, bất kỳ ứng dụng nào được viết mà không dùng ECC trong MAC
cũng có thể thực hiện mà không cần điểu chỉnh mã nguồn.
Quá trình thực hiện mã sửa lỗi ECC tương tác với network stack qua giao
diện RadioEncoding – Giao diện là 1 file được sử dụng ngôn ngữ TinyOS-nesC
chỉ rõ toàn bộ các phương pháp và những bộ điều khiển sự việc cái mà 1 module
sử dụng từ các module khác hay 1 module hiện hữu :
interface RadioEncoding
{
command result_t encode_flush();
command result_t encode(char data);
command result_t decode(char data);
event result_t decodeDone(char data, char error);
event result_t encodeDone(char data);
80
}
Mã hoá được thực hiện ở lớp MAC (ChannelMonC module) cho mỗi byte
dữ liệu trong gói tin. Dữ liệu vào được thông qua như một thông số được lưu trữ
trong cấu trúc dữ liệu của mô-đun ECC. Sau khi một số lượng đủ của các byte
dữ liệu vào – input được nhận, các byte dữ liệu đầu vào được mã hoá bởi hàm
radio_encode_thread (mạch mã hoá radio) và từ mã được chuyển tới
ChannelMonC qua hàm encodeDone.
Tương tự như trên, ChannelMonC đưa ra quá trình giải mã cho từng byte
của các gói tin nhận được. Sau khi đủ số lượng các byte dữ liệu vào được nhận,
các byte dữ liệu được nhận sẽ được giải mã nhờ hàm radio_decode_thread (
mạch giả mã radio ) và các byte dữ liệu gốc được gửi tới ChannelMonC qua
DecodeDone.
Quá trình thực thi của radio_encode_thread và radio_decode_thread
phụ thuộc vào loại mã sửa lỗi. radio_encode_thread tính toán các bit chẵn lẻ
nhờ vào việc so sánh từng bit trong các byte dữ liệu đầu vào. Quá trình này
tương đương với uG. Trong đó u là thông tin cần truyền và G là ma trận sinh.
Trong quá trình radio_decode_thread , syndrome – s được tính nhờ vào các bit
dữ liệu nhận được. Việc này cũng tương đương với thực hiện vHT , với v là dữ
liệu nhận được và HT là ma trận chuyển vị của ma trận H. Nếu syndrome – s
khác không (s # 0) có nghĩa là tồn tại lỗi và vị trí của các bit lỗi có thể được tìm
thấy bằng việc so sánh syndrome – s với các vec-tơ cột trong ma trận H . Và quá
trình tìm kiếm này có thể được thực hiện một cách nhanh chóng với việc sử
dụng các biểu đồ tương ứng giữa các giá trị syndrome – s với các vị trí bit lỗi
tương ứng.
4.2 Tìm hiểu chương trình truyền nhận dữ liệu trong CC1010
Thuật toán để xác định và sửa lỗi cho dữ liệu là CRC – 16 . Ta sẽ xem xét
từng quá trình truyền và nhận giữa hai nút mạng.
4.2.1 Quá trình truyền dữ liệu giữa 2 nút mạng [14]:
- Sử dụng hàm halRFSendPacket (…) để điều khiển việc gửi gói tin sử
dụng trong cấu hình RF hiện thời:
void halRFSendPacket(byte numPreambles, byte* packetData, byte
length) {
byte crcData, i;
word crcReg;
81
// Set the first byte to transmit & turn on TX
RFCON|=0x01; // Ensure that bytemode is selected
RF_SEND_BYTE(RF_PREAMBLE_BYTE);
RF_START_TX();
// Send remaining preambles
while (--numPreambles)
RF_WAIT_AND_SEND_BYTE(RF_PREAMBLE_BYTE);
// Send sync byte + length byte
RF_WAIT_AND_SEND_BYTE(RF_SUITABLE_SYNC_BYTE);
RF_WAIT_AND_SEND_BYTE(length);
- Nếu xuất hiện lệnh yêu cầu truyền ( tức là hàm halRFSendPacket được
gọi ) cùng với cặp RX/TX phù hợp với chế độ RF_TX thì quá trình truyền sẽ
được thực hiện : đầu tiên một byte đồng bộ sẽ được truyền đi để đảm bảo sự
đồng bộ giữa bên truyền và bên nhận, sau đó là byte Preamble ( byte này có vai
trò báo hiệu phần bắt đầu của gói tin ) và tiếp sau là dữ liệu cần truyền. Phần
kiểm lỗi CRC sẽ được đặt ở vị trí cuối cùng trong gói tin để thuận tiện cho việc
kiểm tra sau này.
word culFastCRC16(byte crcData, word crcReg) {
return (crcReg > 8)) ^ crcData];
} // culFastCRC16
word culFastCRC16Block(byte *crcData, word length, word crcReg) {
word i;
for (i = 0; i < length; i++) {
crcReg = (crcReg > 8)) ^
crcData[i]];
}
return crcReg;
} // culFastCRC16Block
82
crcReg=CRC16_INIT;
// Update CRC
RF_WAIT_AND_SEND_BYTE(crcData);
for (i=0; i<8; i++) {
if ( ((crcReg&0x8000)>>8) ^ (crcData&0x80) )
crcReg=(crcReg<<1)^CRC16_POLY;
else
crcReg=(crcReg<<1);
crcData<<=1;
}
}
// Send CRC-16
RF_WAIT_AND_SEND_BYTE((crcReg>>8)&0xFF);
RF_WAIT_AND_SEND_BYTE(crcReg&0xFF);
Trong đó từ mã chứa trong hàm crcLUT[256] không được đưa ra ở đây,
các dạng của từ mã đã được định trước trong CPU. Trường hợp này gồm có 256
từ mã.
Hàm sửa lỗi là hàm culFastCRC16(crcDaTa, CRC REg) .
Trong đó
+ crcData : là chuỗi dữ liệu gốc cần để thực hiện CRC-16 một cách hiệu
quả.
+ crcReg : giá trị hiện thời của thanh ghi CRC.
Quá trình thực hiện sửa lỗi dùng CRC 16 được xem là quá trình thực hiện
nhanh chóng , hàm được gọi cho từng byte trong chuỗi dữ liệu.Với mỗi byte
được gọi thì CRC được thêm vào phần cuối cuả byte dữ liệu đó, vị trí đặt như
vậy sẽ giúp thuận tiện cho việc kiểm tra CRC sau này.
Quá trình thêm vào CRC sau mỗi byte dữ liệu tương đương với việc uG
với u là dữ liệu gốc, G là ma trận sinh. Vì ở đây là kiểm lỗi CRC-16 nên số bit
được thêm vào là 8, đồng nghĩa với việc thanh ghi crcReg sẽ bị dịch trái đi 8 bit
83
sau khi thêm CRC, và trạng thái của nó sau đó cũng trở lại trạng thái lúc cuối
cùng được cấp.
return crcReg : là giá trị cập nhật của thanh ghi CRC16, giá trị này tương
ứng với giá trị syndrome - s. Quá trình kiểm lỗi kết thúc, giá trị này sẽ quay về 0
nếu dữ liệu không bị thay đổi gì.
Vì rằng để đảm bảo hiệu năng, hàm culFastCRC16 ở trên được thực hiện
trong các khối dữ liệu thay vì cho những byte đơn lẻ, do đó hàm
culFastCRC16Block(byte *crcData, word length, word crcReg) được sử dụng để
đảm bảo cho quá trình kiểm lỗi của khối dữ liệu này.
4.2.2 Quá trình nhận dữ liệu giữa 2 nút mạng [14]:
- Sử dụng hàm halRFReceivePacket (…) để điều khiển quá trình nhận các
gói tin được gửi tới từ hà halSendPacket trong một bộ CC1010 khác.
void halRFReceivePacket(...)
byte halRFReceivePacket(byte timeOut, byte* packetData, byte
maxLength, char* rssiByte, word clkFreq) {
byte receivedBytes, pkgLen, crcData, i;
word crcReg;
halConfigTimer23(TIMER3|TIMER23_NO_INT_TIMER, 10000,
clkFreq);
INT_SETFLAG(INUM_TIMER3, INT_CLR);
TIMER3_RUN(TRUE);
RF_SET_PREAMBLE_COUNT(16);
RF_SET_SYNC_BYTE(RF_SUITABLE_SYNC_BYTE);
MODEM1=(MODEM1&0x03)|0x24; // Make sure avg filter is free-
running + 22 baud settling time
INT_ENABLE(INUM_RF, INT_OFF);
INT_SETFLAG(INUM_RF, INT_CLR);
RF_START_RX();
84
while (1) {
// Check if 10 ms have passed
if (INT_GETFLAG(INUM_TIMER3)) {
// Clear interrupt flag and decrement timeout value
INT_SETFLAG(INUM_TIMER3, INT_CLR);
if (timeOut && !--timeOut) {
timeOut=255;
break; // Timeout
}
}
// Check if sync byte received
if (INT_GETFLAG(INUM_RF)) {
EXIF &= ~0x10; // Clear the flag
break;
}
}
receivedBytes=0;
// Timeout or sync byte received?
if (timeOut!=255) {
// Lock average filter and perform RSSI reading if desired
RF_LOCK_AVERAGE_FILTER(TRUE);
// Get length of package
RF_WAIT_AND_RECEIVE_BYTE( pkgLen );
pkgLen+=2; // Add the two CRC bytes
if (rssiByte)
*rssiByte=halRFReadRSSI();
85
Tính toán và kiểm tra FEC
// Calculate CRC-16 (CCITT)
for (i=0; i<8; i++) {
if ( ((crcReg&0x8000)>>8) ^ (crcData&0x80) )
crcReg=(crcReg<<1)^CRC16_POLY;
else
crcReg=(crcReg<<1);
crcData<<=1;
}
}
// Check if CRC is OK
if (crcReg != CRC_OK)
receivedBytes=0;
}
- Giả sử rằng RX đã được kích hoạt : khi đó bên nhận sẽ chờ nhận byte
đồng bộ. Nếu quá thời hạn cho phép mà không nhận được byte đồng bộ nào thì
hàm sẽ trở về 0, tức là sẽ tắt chế độ sẵn sàng nhận cho đến khi nhận được lệnh
nhận tiếp sau. Nếu một byte đồng bộ được nhận trong khoảng thời gian chờ cho
phép, thì các byte dữ liệu sau đó sẽ được nhận và được chuyển vào trong bộ đệm
. Thứ tự các byte được chỉ ra trong trường độ dài gói tin.
Tuy nhiên CRC chỉ ứng dụng được trong trường hợp số bít lỗi là nhỏ.
Chính vì vậy vẫn cần tồn tại thuật toán truyền dữ liệu trong mạng cảm nhận
không dây dựa vào gói trả lời ACK. Quá trình đảm bảo độ tin cậy của truyền dữ
liệu trong mạng cảm nhận không dây dựa vào gói trả lời ACK có thuật toán
phức tạp hơn quá trình CRC. Hơn nữa ta thấy nếu trong quá trình truyền mà
không nhận được ACK thì gói tin sẽ được yêu cầu truyền lại trong giới hạn n
lần. Điều này sẽ gây nên thời gian trễ lớn và tốn dung lượng bộ nhớ, cộng với
thuật toán phức tạp làm tiêu hao nhiều năng lượng hơn, đây là một điều rất đáng
quan tâm với các nút mạng cảm biến.
86
Nguyên lý truyền dẫn giữa 2 nút mạng được mô tả như sau:
+ Quá trình truyền :
Nếu bộ thu phát ở trạng thái rỗi (sẵn sàng truyền) thì thành phần phát sẽ
được kích hoạt. Qúa trình truyền được thực hiện trên RF ISR, và nút truyền chờ
nhận lại ack (nếu được yêu cầu).
Nếu tại bộ phát (nút truyền) được cấp yêu cầu truyền lại với (
sppSetting.TXAttempts = n ) thì gói tin sẽ được truyền lại (n-1) lần cho đến khi
nhận được gói tin phản hồi ACK.
Quá trình truyền được diễn ra liên tục ngay cả khi UART vẫn đang trong
quá trình nhận, trong suốt quá trình truyền nó được đặt vào chế độ TX_Mode
(chế độ đang truyền) hoặc chờ nhận ACK (TXACK_MODE). Kết thúc hoạt
động truyền trạng thái của đường truyền sppStatus ( ) sẽ trở lại trạng thái rỗi
(spp_IDLE_MODE).
+ Quá trình nhận:
Nếu bộ thu phát rỗi (ở trạng thái sẵn sàng truyền và nhận
spp_IDLE_MODE); khi đó nếu nhận được yêu cầu nhận, thì thành phần nhận
trong nút mạng sẽ được kích hoạt. Quá trình nhận được thực hiện nhờ RF ISR (
Radio-Frequency Interrrupt-Service-Routine ) và thực hiện truyền ACK ( nếu
được yêu cầu).
Kết thúc mỗi lần nhận. Bộ nhận sẽ được tắt nguồn. Nhưng chức năng
nhận sẽ được kích hoạt trở lại ngay khi ứng dụng được yêu cầu tiếp theo đó.
Trong suốt quá trình nhận bộ nhận luôn ở trạng thái chờ nhận gói tin
(RX_MODE) hoặc đang truyền ACK (RXACK_MODE).
Kết thúc hoạt động truyền, trạng thái của đường truyền sppStatus ( ) sẽ trở
lại trại thái rỗi ban đầu (spp_IDLE_MODE) .
Giữa hai nút mạng cảm biến thì quá trình truyền và nhận luôn được
chuyển đổi qua lại. Do đường truyền là bán song công nên trong cùng một thời
điểm chỉ có một bên được phép truyền, kết thúc quá trình truyền nhận thường bộ
thu phát sẽ thiết lập lại các giá trị. Dưới là một minh hoạ về cấu trúc chương
trình truyền nhận trên RF được thực hiện trong vòng lặp while [13] :
while (TRUE) {
87
// Receive a packet – Nếu nhận tin
if (sppReceive(&RXI) == SPP_RX_STARTED) {
do {
if (txRequest && (TXI.status == SPP_TX_FINISHED) &&
(RXI.status == SPP_RX_WAITING)) {
sppReset();
}
} while (SPP_STATUS() != SPP_IDLE_MODE
if (RXI.status == SPP_RX_FINISHED) {
if (SPP_SEQUENCE_BIT & (lastRXflags ^ RXI.flags)) {
while (uartRXPos != rxDataLen[uartRXBuffer]);
if ((rxDataLen[rfRXBuffer] = RXI.dataLen) != 0) dau
// Switch buffers and initiate UART0 transmission
GLED = ~GLED;
SWITCH(uartRXBuffer, rfRXBuffer);
RXI.pDataBuffer = pRXBuffer[rfRXBuffer];
uartRXPos = 0;
UART0_SEND(pRXBuffer[uartRXBuffer][uartRXPos]);
}
}
lastRXflags = RXI.flags;
}
}
// Transmit packet, if requested - truyền tin nếu nhận được yêu
cầu
if (txRequest) {
if (sppSend(&TXI) == SPP_TX_STARTED) {
// Wait for the transmission to finish
88
YLED = LED_ON; // đèn vàng bật đang truyền
} while (SPP_STATUS() != SPP_IDLE_MODE
Nếu đường truyền rỗi thi ta thực hiện truyền
YLED = LED_OFF;
// Check out the results
if (TXI.status == SPP_TX_FINISHED) {
sppSettings.rxTimeout = NORMAL_TIMEOUT;
RLED = LED_OFF;
txRequest = TX_REQUEST_OFF;
} else {
RLED = LED_ON;
sppSettings.rxTimeout = RETRY_TX_TIMEOUT;
}
}
}
// Recalibrate the transceiver if requested to --- xác lập lại tại bộ
thu phát nếu có lệnh yêu cầu
if (recalibRequest) {
sppSetupRF(&RF_SETTINGS, &RF_CALDATA, TRUE);
}
}
} // main
Qua việc nghiên cứu chương trình tuyến nhận dữ liệu của CC1010, ta thấy
chương trình này không sử dụng FEC. Hướng đến việc cải thiện hiệu quả sử
dụng năng lượng cho node mạng, luận văn đề xuất cải tiến tuyến truyền nhận nói
trên bằng cách sử dụng FEC. Sau đây là một số gợi ý cho việc cải tiến này.
4.3 Đề xuất sử dụng FEC cho tuyến truyền nhận dữ liệu giữa các
node mạng CC1010
89
4.3.1 Giả định bài toán và cách tính các từ mã
Giả sử đoạn dữ liệu đơn giản 1101
+ Xác định ma trận sinh G:
Thông tin cần mã hoá thì từ mã tương ứng sẽ là:
Ma trận sinh G sẽ được chọn sao cho đảm bảo nguyên tắc các hàng của G
phải độc lập tuyến tính.
Gọi v = (a1,a2,a3,a4,a5,a6,a7) là một từ mã, ta có:
Suy ra:
Hay:
Công thức này cho phép chúng ta mã hoá được thông báo u thành từ mã v.
Chẳng hạn nếu:
90
Biến đổi công thức trên thành dạng v = uxG, ta đưa được về dạng:
Ta suy ra được ma trận sinh G:
+ Xác định ma trận Hamming H:
Trong dạng mã hoá khối tuyến tính G có thể được chuyển thành dạng như
sau: G = [Ik:C] khi đó ma trận kiểm lỗi H = [CT:Ir]
Hoặc G = [C:Ik] khi đó ma trận kiểm lỗi H = [Ir:CT]
Do đó ta suy ra ma trận H:
91
+ Xác định từ mã:
Với dữ liệu cần gửi là u = 1101
Tại nơi thu dữ liệu u sẽ được mã hoá thành từ mã v:
Giả sử rằng truyền lỗi làm nơi nhận nhận sai bit thứ 5; nghĩa là từ mã v
nhận được tại nơi thu sẽ có dạng w = [0111101]
Syndrome (s) sẽ được xác định tại bên nhận theo công thức:
Suy ra s = [011] trùng với hàng thứ 5 trong ma trận HT, vậy ta có thể kết
luận dữ liệu thu được bị lỗi tại vị trí thứ 5. Khi đó dữ liệu đúng nhận được là
v=[01111001] và giải mã ra ta được từ mã đúng cần nhận là u = [1101]
4.3.2 Chương trình truyền dữ liệu sử dụng các từ mã
92
Trên cơ sở chương trình truyền dữ liệu đã nói ở mục 4.3.1 có thể chèn từ
mã vào mã nguồn ở các vị trí sau:
Tuy nhiên với việc đưa các từ mã sửa lỗi vào dữ liệu ở phía truyền cũng
cần thuật toán để giải mã và sửa lỗi ở phía nhận, sau đó tiến hành thử nghiệm để
đánh giá hiệu quả của phương pháp này so với phương pháp cũ, nhưng vì thời
gian có hạn, luận văn dừng ở đây, với mong muốn công việc này được tiến hành
tiếp sau này bởi chính tác giả hoặc một người nào đó.
4.4 Kết luận chương 4
Nghiên cứu chương trình truyền và nhận dữ liệu của mạng WSN trên cơ
sở CC1010 đã có. Đã đề xuất ứng dụng phương pháp FEC cho việc truyền dữ
liệu của CC1010. Đã giả thiết bài toán và tìm được các từ mã tương ứng.
Trên cơ sở nhữn kết quả này có thể vận dụng vào các chương trình tuyến
nhận dữ liệu nói trên, để thu được hiệu quả sử dụng năng lượng tốt hơn.
93
KẾT LUẬN
Đề tài “Nghiên cứu mã điều khiển lỗi trong mạng cảm biến không dây để
nâng cao hiệu quả việc sử dụng năng lượng” đã đạt được những kết quả sau:
- Đã tổng quan về mạng WSN
- Đã nghiên cứu phân tích về các kỹ thuật phát hiện lỗi và các kỹ thuật sửa
lỗi. Trong đó đặc biệt nhấn mạnh kỹ thuật sửa lỗi hướng thuận FEC, đây là kỹ
thuật sửa lỗi phù hợp với mạng WSN, hứa hẹn đưa lại hiệu quả sử dụng tốt năng
lượng của node mạng, kéo dài tuổi thọ toàn mạng.
- Đã tìm hiểu cụ thể các chương trình truyền nhận dữ liệu của mạng WSN
trên cơ sở CC1010 có ở phòng thí nghiệm và phát hiện phương pháp sửa lỗi ở
đây là truyền lại dữ liệu. Do vậy luận văn đề xuất và tính toán các từ mã để có
thể ứng dụng phương pháp sửa lỗi hướng thuận FEC cho mạng WSN.
Tuy nhiên công việc này đòi hỏi phải bổ sung vào chương trình nguồn đã
có các đoạn chương trình mới cho bên phát và bên nhận.
Do thời gian có hạn nên công việc này không kịp thực hiện. Tác giả đề
xuất hướng nghiên cứu tiếp là bổ sung các từ mã của phương pháp FEC vào bên
phát và bên gửi, sau đó tiến hành thực nghiệm đo hiệu quả truyền nhận dữ liệu
và đo năng lượng tiêu hao của node mạng để đánh giá tính ưu việt của phương
pháp FEC.
Các file đính kèm theo tài liệu này:
- LUẬN VĂN- NGHIÊN CỨU MÃ ĐIỀU KHIỂN LỖI TRONG MẠNG CẢM BIẾN KHÔNG DÂY ĐỂ NÂNG.pdf