DÒ TÌM VÀ SỬA LỖ
9.7 SỬA LỖI – ERROR CORRECTION
Các cơ chế mà chúng ta đã biết đến giờ chỉ cho phép dò tìm lỗi nhưng không phải là cơ chế sửa lỗi. Sửa lỗi có thể được xử lý bằng 2 cách. Trong cách thứ nhất, khi một lỗi được phát hiện, bên nhận có thể để người gửi gửi lại toàn bộ đơn vị dữ liệu. Trong cách thứ 2, bên nhận có thể sử dụng mã sửa lỗi để sửa một số lỗi nhất định một cách tự động.
Theo lý thuyết, có thể sửa bất kỳ lỗi mã nhị phân nào một cách tự động. Tuy nhiên các mã sửa lỗi phức tạp hơn nhiều so với các mà dò tìm lỗi và đòi hỏi nhiều bit dư thừa hơn. SỐ các bit cần để sửa một lỗi đa bit hoặc lỗi
hàng loạt bi quá lớn trong phần lớn các trường hợp do đó nó trở nên không hiệu quả. Vì lý do này, phần lớn các phương pháp sửa lỗi chỉ giới hạn sửa lỗi cho một, hai hoặc ba bit lỗi.
Sửa lỗi bit đơn – Single-bit error correction
Khái niệm dưới cách tiếp cận sửa lỗi có thể được hiểu một cách dễ dàng bằng việc kiểm tra trường hợp đơn giản nhất: Các lỗi bit đơn.
Như chúng ta đã thấy ở phần trước, các lỗi bit đơn có thể được dò tìm bằng việc bổ sung một bit (chẵn lẻ) dư thừa và đơn vị dữ liệu (VRC). Một bit đơn bổ sung có thể dò tìm các lỗi bit đơn theo bất kỳ trình tự nào của các bit bởi vì nó chỉ phải phân biệt hai điều kiện: lỗi hoặc không lỗi. Một bit có 2 trạng thái (0 và 1). Hai trạng thái này là vừa đủ cho mức độ dò tìm này.
Nhưng nếu chúng ta muốn sửa lỗi cũng như dò tìm các lỗi bit đơn thì sao? Hai trạng thái là đủ để dò tìm lỗi nhưng không đủ để sửa lỗi đó. Một lỗi xảy ra khi người nhận đọc bit 1 là bit 0 và bit 0 là bit 1. Để sửa lỗi đó, bên nhận đơn giản đảo ngược giá trị bị sửa đổi. Tuy nhiên đề làm điều đó, cần phải biết bit nào là bit lỗi. Do đó nhiệm vụ của sửa lỗi là định vị bit không hợp lệ hoặc các bit không hợp lệ.
Ví dụ, để sửa lỗi bit đơn trong một ký tự ASCII, mã sửa lỗi phải xác định bit nào trong 7 bit đó đã thay đổi. Trong trường hợp này, chúng ta phải phân biệt giữa 8 trạng thái khác nhau; không có lỗi, lỗi ở vị trí 1, lỗi ở vị trí 2…đến lỗi ở vị trí 7. Để làm được điều này đòi hỏi phải có đủ các bit dư thừa để thể hiện tất cả 8 trạng thái.
Thoáng qua, chúng ta thấy nó giống như mã 3 bit dư có thể là vừa đủ bởi vì 3 bit có thể thể hiện 8 trạng thái (000 tới 111) và do đó có thể xác định vị trí của 8 khả năng khác nhau. Nhưng nếu một lỗi xuất hiện ở chính các bit dư thừa thì sao? 7 bit của dữ liệu (ký tự ASCII) cộng với 3 bit dư thừa bằng 10 bit. Tuy nhiên 3 bit chỉ có thể xác định 8 khả năng khác nhau. Các bit bổ sung là cần thiết để xác định toàn bộ các vị trí gây lỗi có thể xảy ra.
Các bit dư thừa – redundancy bits
Để tính toán số các bit dư thừa r cần để sửa một số các bít dữ liệu (m bit) được cho, chúng ta phải tìm một mối quan hệ giữa m và r. Hình 9.16 thể hiện m bit của dữ liệu với r bit dư thừa được thêm vào. Chiều dài của mã kết quả sẽ là m+r. Hình 9.16 Dữ liệu và các bit dư thừa
Nếu tổng số các bit trong một đơn vị khả truyền là m+r, thì r phải có thể xác định ít nhất m+r+1 các trạng thái khác nhau. Tất nhiên một trạng thái có nghĩa không lỗi và m+r trạng thái xác định vị trí của lỗi trong từng m+r vị trí.
Vì vậy, m+r+1 trạng thái phải được xác định bằng r bit; và r bit có thể chỉ định 2r trạng thái khác nhau. Do đó, 2r phải bằng hoặc lớn hơn m+r+1:
2r>=m+r+1
Giá trị của r có thể được xác định bằng việc đặt giá trị của m (chiều dài nguyên bản của đơn vị dữ liệu được truyền). Ví dụ, nếu giá trị của m bằng 7 (7 bit – mã ASCII), giá trị r nhỏ nhất có thể thỏa mãn phương trình này là 4:
24>=7+4+1
Hình 9.1 thể hiện một vài giá trị m có thể có và các giá trị r tương ứng Bảng 9.1 Mối quan hệ giữa dữ liệu và các bit dư thừa
Số các bit dữ liệu (m) Số các bit dư thừa (r) Tổng số bit (m+r)
1 2 3 2 3 5 3 3 6 4 3 7 5 4 9 6 4 10 7 4 11 Mã Hamming
Từ trước tới nay chúng ta đã kiểm tra số các bit cần thiết để có thể kiểm soát toàn bộ các trạng thái lỗi bit đơn có thể xảy ra trong khi truyền. Nhưng làm cách nào chúng ta có thể xử lý các bit này để khám phá ra trạng thái nào đã xảy ra?. Một kỹ thuật được phát triển bởi R.W Hamming cung cấp một giải pháp thực tế.
Định vị trí các bit dư thừa – Positioning Redundancy Bits
Mã Hamming có thể được áp dụng cho các đơn vị dữ liệu có chiều dài bất kỳ và sử dụng mỗi quan hệ giữa dữ liệu và bit dư thừa được bàn luận ở phần trên. Ví dụ, một mã ASCII 7 bit cần phải có 4 bit dư thừa mà có thể được thêm vào cuối đơn vị dữ liệu hoặc đặt rải rác với các bit dữ liệu gốc. Trong hình 9.17, những bit này được đặt ở các vị trí 1,2,4 và 8 (các vị trí trong chuỗi tuần tự 11 bit là bình phương của 2). Để thấy rõ trong các ví dụ dưới đây, chúng ta cần xem các bit r1, r2, r4 và r8.
Trong mã Hamming, mỗi r bit là bit VRC cho một tổ hợp các bit dữ liệu; r1 là bit VRC cho một tổ hợp các bit dữ liệu, r là bit VRC cho tổ hợp các bit dữ liệu khác, vân vân…Các tổ hợp được sử dụng để tích toán từng giá trị r cho chuỗi 7 bit dữ liệu như sau:
r1: Các bit 1,3, 5, 7, 9, 11 r2: các bit 2, 3, 6,7, 10, 11 r4: các bit 4, 5, 6, 7
r8: các bit 8, 9, 10, 11
Mỗi bit dữ liệu này có thể bao gồm một hoặc nhiều tính toàn VRC. Trong các chuỗi trên, từng bit dữ liệu gốc được bao gồm trong ít nhất 2 tập hợp, trong khi r bit chỉ được bao gộp một lần.
Để xem mẫu theo giải pháp này, hãy xem biểu diễn nhị phân của từng vị trí bit. Bit r1 được tính toàn bằng cách sử dụng tất cả các vị trí mà biểu diễn nhị phân của nó bao gồm một bit 1 ở vị trí phải nhất. Bit r2 được tính toán bằng cách sử dụng tất cả các vị trí bit với một bit 1 ở vị trí thứ 2…. (xem hình 9.18).
Tính toán các giá trị r
Hình 9.19 thể hiện mã Hamming áp dụng đối với một ký tự ASCII. Trong bước đầu tiên, chúng ta thay thế từng bit của ký tự gốc trong các vị trí thích hợp của nó bằng đơn vị dữ liệu có chiều dài 11 bit. Trong các bước tiếp sau, chúng ta tính toán các giá trị chẵn lẻ đối với nhiều tổ hợp bit. Giá trị chẵn lẻ cho từng tổ hợp đó là giá trị tương ứng với r bit. Ví dụ, giá trị của r1 được tính toán để cung cấp tính chẵn lẻ-chẵn đối với tổ hợp các bit 3, 5, 7, 9 và 11. Giá trị của r2 được tính toán để cung cấp tính chẵn lẻ-chẵn với các bit 3, 6, 7, 10 và 11 vân vân… Mã 11 bit cuối cùng được gửi qua đường truyền dẫn.
Dò tìm và sửa lỗi
Giờ chúng ta hãy hình dung rằng theo thời gian khi dữ liệu được truyền tới bên nhận, số 7 bit đã bị thay đổi từ 1 thành 0 (xem hình 9.20).
Bên nhận lấy dữ liệu từ đường truyền và tính toán lại 4 VRC mới sử dụng cùng tập bit đã được sử dụng bởi bên gửi cộng với bit chẵn lẻ tương ứng (r) đối với từng tập hợp (xem hình 9.21). Sau đó nó lắp ghép các giá trị chẵn lẻ đó vào một số nhị phân theo thứ tự của r (r8, r4 ,r2 ,r1). Trong ví dụ của chúng ta, bước nay cho chúng ta số nhị phân 0111 (bằng 7 trong hệ mười), là vị trí chính xác của bit lỗi.
Một khi bit lỗi đã được xác định, bên nhận có thể đảo ngược giá trị của nó và thực hiện sửa lỗi đó.
Sửa lỗi hàng loạt bit
Mã Hamming có thể được thiết kế để sửa các lỗi hàng loạt bit có chiều dài cụ thể. Số các bit dư thừa cần thiết để tạo ra những sửa lỗi này là lớn hơn rất nhiều so với sửa lỗi bit đơn. Ví dụ, để sửa lỗi bit đôi, chúng ta cần phải xem xem hai bit đó có thể là tổ hợp của bất kỳ 2 bit bất kỳ trong toàn bộ chuỗi bit hay không. Sửa lỗi 3 bit của nghĩa là bất kỳ 3 bit nào trong toàn bộ chuỗi bit, vân vân…Vì thế, giải pháp đơn giản được sử dụng mã Hamming để sửa các lỗi bit đơn phải được thiết kế lại để có thể áp dụng cho sửa lỗi đa bit. Những phần sửa lỗi nhiều bit và lược đồ phức tạp của chúng nằm ngoài phạm vi của quyền sách này.
Hình 9.20. Lỗi bit đơn
Hình 9.21 Dò tìm lỗi
sử dụng mã