Mã hóa kênh truyền
268
Hàm decode thực hiện giải mã thông điệp mã hoá bằng các mã khối tuyến tính nói trên.
Ngoài các thông số giống như đối với hàm encode, có thể đưa thêm bảng giải mã syndrome
để sửa lỗi cho thông điệp. Nếu không có bảng giải mã, hàm decode không sửa lỗi nhưng có
khả năng đánh dấu các vị trí lỗi phát hiện được. Ví dụ:
>> [msg, err, ccode, cerr] = decode(code, n, k, ’cyclic’, cyc_poly,
dec_table)
>> [msg, err, ccode, cerr] = decode(code, n, k, ‘linear’, genmat,
dec_table)
trong đó, err là tổng số lỗi phát hiện được, ccode là từ mã đã được sửa sai, cerr là ma
trận xác định các vị trí lỗi. Nếu số lỗi vượt quá khả năng sửa lỗi của bộ mã thì err sẽ có giá trị
âm.
Ví dụ 17-6. Sử dụng mã khối tuyến tính [4,2] để mã hoá và giải mã một thông điệp cụ thể.
Trong thí dụ này, ta tạo một thông điệp gồm 3 từ msg = [0 1; 0 0; 1 0], mã hoá, cộng nhiễu
ngẫu nhiên và giải mã. Kết quả dưới đây cho thấy thông điệp bị sai một lỗi ở từ thứ 3 và bộ
giải mã đã sửa được lỗi này.
n = 4; k = 2;
genmat = [[1 1; 1 0], eye(2)]; % Ma trận sinh
msg = [0 1; 0 0; 1 0]; % Thông điệp gồm 3 từ, mỗi từ 2 bit
% Tạo ba từ mã, mỗi từ 4 bit.
code = encode(msg,n,k,'linear',genmat);
noisycode = rem(code + randerr(3,4,[0 1;.7 .3]),2); % Cộng nhiễu.
trt = syndtable(gen2par(genmat)); % Tạo bảng giải mã syndrome
% Giải mã, sửa sai và đánh dấu các vị trí bị sai.
[newmsg,err,ccode,cerr] = decode(noisycode,n,k,'linear',genmat,trt)
err_words = find(err~=0) % Xác định từ đã bị lỗi.
Kết quả:
newmsg =
0 1
0 0
1 0
err =
0
0
1
ccode =
1 0 0 1
0 0 0 0
1 1 1 0
cerr =
0
0