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
93 trang | 
Chia sẻ: lylyngoc | Lượt xem: 3940 | 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 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