CHƯƠNG 8: THIẾT BỊ NGOẠI VI VÀ GHÉP NỐI
8.5. Lỗi truyền thông và các phương pháp phát hiện lỗi
8.5.2. Phát hiện lỗi và sửa lỗi single-bit-error
Một phương pháp đơn giản và lâu đời nhất để phát hiện lỗi trong quá trình truyền và nhận ký tự là kiểm tra chẵn lẻ parity bit. Một bit parity, mang giá trị
0 hoặc 1 được thêm vào mỗi một ký tự để kiểm tra tổng số bit mang giá trị 1 trong ký tự đó là chẵn hay lẻ. Trong ví dụ về truyền ký tự ‘b’ theo mã ASCII ở trên, chuỗi 1100010 nếu được kiểm tra chẵn, một bit mang giá trị 1 sẽ được thêm vào vì tổng số bit mang giá trị 1 trong chuỗi là lẻ. Cuối cùng, chuỗi truyền đi là 11000101. Hệ thống nhận sẽ nhận và đếm số bit mang giá trị 1 trong chuỗi nhận được là chẵn hay lẻ. Nếu kết quả là chẵn, quá trình truyền không có lỗi và hệ thống sẽ khôi phục nội dung đã được truyền. Ngược lại thì chuỗi nhận được đã bị lỗi. Phương pháp này không phát hiện ra lỗi nếu số bit bị lỗi trong chuỗi là 2 hoặc nhiều hơn (nhưng là số chẵn). Trong trường hợp đó, ta có thể sử dụng phương pháp khác sẽ được thảo luận trong phần dưới đây.
Hamming Codes
Những bit thêm vào dữ liệu ngoài chức năng phát hiện lỗi, nó còn cần có khả năng tự sửa lỗi. Một số phương pháp mã hóa phổ biến được sử dụng rộng rãi là mã Hamming. Phương pháp này được thực hiện dựa trên các nghiên cứu của Richard Hamming tại Bell Telephone Laboratories, hiện nay hoạt động dưới sự quản lý của Lucent Technologoies
Khoảng cách Hamming HD được định nghĩa là số lượng bit lỗi tối thiểu mà không đảm bảo chắc chắn phát hiện được trong một chuỗi bit. Khi truyền một chuỗi ký tự ASCII và nhận được 1 chuỗi ký tự ASCII khác, bên nhận không có khả năng phát hiện ra có lỗi trên đường truyền, do đó HD = 1. Nếu bây giờ bằng một phương pháp nào đó, ta tăng khoảng cách HD = 2 thì có nghĩa là ta có thể phát hiện tất cả các lỗi đơn (single-bit error)
Một phương pháp để tăng khoảng cách HD đơn giản là thêm 1 bit kiểm tra chẵn lẻ pariy bit như đã trình bày ở trên. Nếu thực hiện kiểm tra chẵn với bit kiểm tra được đặt ở phía bên trái. Ký tự ‘a’ khi đó sẽ được biểu diễn bởi chuỗi 11100001. Tương tự, ta có thể xác định được chuỗi thể hiện ký tự ‘b’, ‘c’, ‘z’
hoặc ‘A’ như thể hiện trên hình 8.29. Bảng mã ASCII lúc này sẽ có tổng số 28 = 256 trạng thái khác nhau. Một nửa trong số đó thể hiện mã ký tự sai. Khi bên nhận nhận được mã ký tự sai, bên nhận sẽ yêu cầu thực hiện truyền lại mã ký tự đó.
Quá trình truyền lại ký tự bị sai không phải lúc nào cũng có thể thực hiện được.
Do đó cần có một phương pháp nào đó để đồng thời phát hiện lỗi và tự sửa lỗi.
Phương pháp kiểm tra chẵn lẻ có thể phát hiện lỗi nhưng nó không thể xác định được vị trí lỗi. Giả sử như ta nhận được 11100011 và phương pháp kiểm tra là
Hình 8.29. Kiểm tra chẵn một số ký tự
chẵn, ta biết chắc chắn là đã có lỗi xảy ra vì tổng số bit mang giá trị logic 1 là lẻ. Nhưng ta không có đủ thông tin để xác định bit truyền đi là ‘a’, ‘b’ hay bất kỳ một ký tự nào khác.
Để có thể xây dựng được một loại mã có khả năng phát hiện và tự sửa lỗi dạng single-bit-error, ta phải thêm nhiểu hơn 1 bit dự phòng trong chuỗi dữ liệu 7 bit ban đầu. Thực tế ta sẽ phải thêm 4 bit dự phòng để có thể loại bỏ các trường hợp lỗi 1 bit trong chuỗi có thể xảy ra. Giả sử chuỗi ký tự ‘a’ cần truyền đi là 1100001 thì ta phải loại bỏ các trường hợp lỗi là 0100001, 1000001, 1110001, 1101001, 1100101, 1100011, 1100000. Như vậy, ta sẽ sử dụng 11bit để mã hóa lại bảng mã ASCII.
Quá trình mã hóa được thực hiện theo các bước như sau
1. Các bit dự phòng được thêm vào ở các vị trí C1, C2, C4, C8 như sau
2. Bit C1 là kiểm tra chẵn hoặc lẻ của tổ hợp các bit số {1, 3, 5, 7, 9, 11}.
Như ví dụ trên hình, C1 = 0 vì chỉ có các bit số 3 và 11 bằng 1 (kiểm tra chẵn)
3. Bit C2 là kiểm tra chẵn lẻ của tổ hợp các bit {2, 3, 6, 7, 10, 11}. Tương tự với phân tích trên ta có C2 = 1
4. Bit C4 là kiểm tra chẵn lẻ của tổ hợp các bit {4, 5, 6, 7}. C4 trong trường hợp này là 0
5. Bit C8 là kiểm tra chẵn lẻ của {8, 9, 10, 11}. C8 = 0 6. Chuỗi bit truyền đi sẽ là
Ở thiết bị nhận, ta sẽ tiến hành kiểm tra theo quy trình sau
1. Kiểm tra chẵn lẻ các bit dự phòng C1, C2, C4, C8 với các tổ hợp tương ứng.
2. Nếu kết quả kiểm tra đều phù hợp, thì dữ liệu truyền không lỗi
3. Nếu có lỗi tức là ít nhất một giá trị Ci có kết quả kiểm tra là lẻ thì vị trí lỗi được tính là =∑
Tiếp tục ví dụ trên, giả sử ta nhận được chuỗi 10010111001.
Ta sẽ kiểm tra chẵn lẻ
Kiểm tra C1 {1, 3, 5, 7, 9, 11} Kết quả lẻ Kiểm tra C2 {2, 3, 6, 7, 10, 11} Kết quả chẵn Kiểm tra C4 {4, 5, 6, 7} Kết quả lẻ Kiểm tra C8 {8, 9, 10, 11} Kết quả chẵn
Kết quả lẻ ở C1 và C4 do đó vị trí bit bị lỗi là n = 1 + 4 = 5. Chuỗi được sửa lại là 10010101001. Dữ liệu thu được 1000100. Đây chính là ký tự ‘D’ trong bảng mã ASCII