Mã hóa nguồn
209
Sau khi tối ưu hoá, nhiễu lượng tử đã giảm đi: 0.0148/0.0024 = 6.2 lần.
14.4. ÑIEÀU CHEÁ MAÕ XUNG VI SAI DPCM (DIFFERENTIAL PULSE CODE
MODULATION)
Như trên đã đề cập, thông thường người ta sẽ phân hoạch miền xác định của tín hiệu thành
v
2
khoảng, sau đó mỗi khoảng tín hiệu sẽ được lượng tử hoá, sau đó mã hoá bằng một từ mã
nhị phân có chiều dài v bit. Phương pháp lượng tử hoá này được gọi là phương pháp điều mã
xung (Pulse Code Modulation). Phương pháp này không cần đòi hỏi bất kỳ thông tin nào về
tín hiệu ở các thời điểm trước đó. Trong thực tế, vì tín hiệu thường thay đổi chậm từ thời điểm
lấy mẫu này sang thời điểm lấy mẫu kế tiếp nên nếu ta thực hiện lượng tử và mã hoá các giá
trị sai biệt giữa thời điểm hiện tại với thời điểm trước đó thì sẽ tốn ít giá trị hơn so với mã hoá
đầy đủ độ lớn của tín hiệu. Trên cơ sở này, ta có một phương pháp lượng tử hoá mới, gọi là
lượng tử hoá tiên đoán,
trong đó giá trị của tín hiệu ở thời điểm hiện tại sẽ được tính thông
qua một số các giá trị của tín hiệu ở các thời điểm quá khứ. Tiêu biểu cho loại lượng tử hoá
này là kỹ thuật điều mã xung vi sai (DPCM – Differential Pulse Code Modulation).
Để thực hiện mã hoá DPCM, ta không những phải xác định sự phân hoạch và bộ mã lượng tử
mà còn phải xác định hàm dự đoán, để dự đoán giá trị của tín hiệu ở thời điểm hiện tại. Thông
thường, người ta sử dụng hàm dự đoán tuyến tính:
y(k) = p(1)x(k-1) + p(2)x(k-2) + ... + p(m-1)x(k-m+1) + p(m)x(k-m) (14.1)
trong đó x là tín hiệu gốc còn y(k) là giá trị dự đoán của x(k); p là một vector gồm các hằng số
thực.
Thay vì lượng tử hoá tín hiệu x, ta sẽ thực hiện lượng tử hoá tín hiệu sai số dự đoán y – x.
m được gọi là bậc dự đoán. Trường hợp đặc biệt m = 1 được gọi là điều chế delta.
Trong MATLAB Communications Toolbox, hàm dự đoán được sử dụng là hàm dự đoán
tuyến tính như trên và được biểu diễn bằng vector:
>> predictor = [0, p(1), p(2), p(3),..., p(m-1), p(m)]
Các hàm dpcmenco và dpcmdeco sẽ lần lượt thực hiện quá trình mã hoá và giải mã DPCM.
>> [indx,quant] = dpcmenco(sig,partition,codebook,predictor)
quant là vector chứa các giá trị lượng tử còn indx là vector chứa các chỉ số tương ứng
trong bộ mã.
>> [sig, quant] = dpcmdeco(indx, codebook, predictor)
sig là tín hiệu tin tức được khôi phục còn quant là tín hiệu sai số dự đoán.
Ví dụ 14-4. Thực hiện mã hoá DPCM đối với tín hiệu sóng răng cưa, sử dụng hàm dự
đoán y(k) = x (k - 1) (điều chế delta). Giải mã và phục hồi tín hiệu ban đầu. Đánh giá sai số
bình phương trung bình giữa tín hiệu gốc và tín hiệu khôi phục.
predictor = [0 1]; % Hàm dự đoán y(k)=x(k-1)
partition = [-1:.1:.9]; % Sai số chỉ nằm trong khoảng [-1,1]
codebook = [-1:.1:1];
t = [0:pi/50:2*pi];
x = sawtooth(3*t); % Tín hiệu gốc
% Lượng tử hoá tín hiệu x theo phương pháp DPCM.
encodedx = dpcmenco(x,codebook,partition,predictor);