, 10log [(d 10 freec /dfreeu )/(E /E )] sc su
Hình 0.1: Mô hình tổng quát của hệ thống.
Trong Matlab, để xây dựng các bộ mã chập, đầu tiên ta phải xây dựng giản đồ lưới cho mã. Chương trình này cung cấp sẵn hàm convenc(input,trellis). Hàm có các đối số: input là chuỗi bit lối vào dạng nhị phân và trellis có dạng cấu trúc structure, mô tả giản đồ lưới của mã. Các giản đồ lưới có thể được xây dựng trực tiếp bằng hàm poly2trellis(). Nhược điểm của hàm này là chỉ sử dụng cách biểu diễn dạng hàm mũ của mã và không cho phép xây dựng các bộ mã hệ thống có phản hồi (trong khi tất cả các mã của Ungerboeck lại đều có dạng này). Do đó, tác giả đã xây dựng các hàm tạo lưới riêng cho từng loại mã. Ở đây chỉ xin trình bày chương trình tạo lưới cho mã: 4 trạng thái (tập tín hiệu điều chế 8 PSK), số bit lối vào m=2 và số lối vào bộ mã hoá m =2, các hệ số kiểm tra chẵn lẻ: h2=4, h1=2, h0=5. Sau đây là nội dung của hàm
tcm8psk2().
function [Trellis]=tcm8psk2(), clear Trellis;
k=2; % số bit lối vào. n=k+1; % số bit lối ra.
v=3; % độ dài ràng buộc của mã. state=2^v; % số trạng thái
for row=1:state
% Chạy từ trạng thái đầu đến trạng thái cuối % xác định giá trị các bit trạng thái ban đầu s=de2bi((row-1),v);
% ứng với các bit lối vào, x/đ trạng thái tiếp theo for col=1:(2^k)
% xác định các bit lối vào ứng với các cột x=de2bi((col-1),k);
% x/đ các bit trạng thái mới
% các pt sau phụ thuộc vào cấu trúc của từng mã nexts(1)= xor(s(1),x(1)); % s0,n+1 = (s1,n xor x1,n) nexts(2)= xor(x(2),s(2)); % s1,n+1 = (s2,n xor x0,n) nexts(3)= s(1); % s2,n+1 = (s0,n)
%Biểu diễn dạng cơ số 10
nextStates(row,col) = bi2de(nexts); % Tạo ma trận lối ra outputs
% chung cho tất cả các hệ thống + feedback. % y0,n+1 = s0,n
out(1)=s(1);
% y1,n+1->yk = x1,n+1->xn,n+1 for i=2:n
end
% dec2oct biến đổi thập phân -> cơ số 8. outputs(row,col)=dec2oct(bi2de(out)); end
end
% số symbol lối vào
Trellis.numInputSymbols=2^k; % số symbol lối ra.
Trellis.numOutputSymbols=2^n; % số trạng thái
Trellis.numStates=2^v;
% ma trận xác dinh trạng thái kế tiếp Trellis.nextStates=nextStates;
% ma trận xác định lối ra Trellis.outputs=outputs; end
Để kiểm tra kết quả ta có thể dùng hàm istrellis(tcm16qam), nếu đúng hàm sẽ trả ra giá trị 1, nếu không sẽ báo nguyên nhân lỗi. Với hàm tcm8psk2() ta có các giản đồ lưới như sau:
o Dùng lệnh conv_plotNextStates(trellis.nextStates) xác định ma trận trạng thái kế tiếp
Hình 0.3: Giản đồ lối ra của mã v=2, m =m=2, h2=4, h1=2, h0=5.
h2=4, h1=2, h0=5.
o Dùng lệnh conv_plotOutputs(trellis.outputs, trellis.numOutputSymbols) để xác định ma trận lối ra. Kết quả như trong hình 5.3.
Chú ý là các mã khác nhau sẽ có cấu trúc khác nhau nên mỗi mã cần phải xây dựng khác nhau. Công việc này đòi hỏi một lượng công việc rất lớn. Chương trình trên tổng quát hoá quá trình xây dựng mã, cung cấp khả năng linh hoạt cao do chỉ cần thay đổi các giá trị lối vào và các phương trình tạo trạng thái kế tiếp.
Các bộ mã hoá phức tạp hơn như mã 32 trạng thái (v=5), m=4, m =2 cũng được thực hiện tương tự với các phương trình tạo trạng thái như sau:
nexts(1)= xor(s(2),x(1)); % s0 nexts(2)= xor(s(3),x(1)); % s1 nexts(3)= xor(x(2),s(4)); % s2 nexts(4)= s(5); % s3 nexts(5)= s(1); % s4
Kết quả thu được được biểu diễn qua 2 hình sau:
o Kiểm tra ma trận chuyển trạng thái: conv_plotNextStates(trellis.nextStates)
Hình 0.4: Giản đồ chuyển trạng thái của mã v=5, m =2, m=4,
h2=10, h1=06, h0=41.
conv_plotOutputs(trellis.outputs,trellis.numOutputSymbols)
Các kết quả thu được này là hoàn toàn chính xác theo lý thuyết, khoảng cách giữa các tập con cũng giống như các kết quả tính toán của Ungerboeck đã được chỉ ra trong mục 2.3.
Hình 0.5: Giản đồ lối ra của mã v=5, m =2, m=4,
h2=10, h1=06, h0=41.