You are on page 1of 27

HỌC VIỆN CÔNG NGHỆ BƯU CHÍNH VIỄN THÔNG

CƠ SỞ TẠI THÀNH PHỐ HỒ CHÍ MINH


KHOA VIỄN THÔNG 2
BỘ MÔN VÔ TUYẾN

BÀI TẬP THỰC HÀNH BUỔI 1


Môn học: Thực tập cơ sở.
Mã môn học: TEL 1492
Giáo viên: Lê Chu Khẩn
Họ và tên: Trần Minh Thương Nhóm: 3
Lớp: D21CQVT01-N MSSV: N21DCVT101

Đánh giá Giảng viên nhận xét và ký tên

A. Nội dung thí nghiệm:


- Mở phần mềm Matlab:
I. PCM (Pulse Code Modulation) là gì ?
Analog Digital Digital Analog
Sampling Quantization Decoding

- PCM (Pulse Code Modulation): là một phương pháp để biểu diễn tín hiệu
analog bằng cách chuyển đổi nó thành tín hiệu số rời rạc. Trong PCM, tín hiệu
analog liên tục được lấy mẫu và quan hệ thành các giá trị số rời rạc, sau đó mã
hóa thành dạng mã code tương ứng.
Source coding là gì?
+ Lượng tử hóa vô hướng là một quá trình ánh xạ tất cả các đầu vào trong một
phạm vi xác định tới một giá trị chung. Quá trình này ánh xạ các đầu vào trong
một phạm vi giá trị khác nhau thành một giá trị chung khác.
+ Trong thực tế, lượng tử hóa vô hướng sẽ số hóa tín hiệu tương
tự.
+ Hai tham số xác định lượng tử hóa: partition và codebook.
+ Một phân vùng lượng tử hóa xác định một số phạm vi giá trị liền kề, không
chồng chéo trong tập hợp số thực. Để chỉ định một phân vùng trong môi trường
Matlab, hãy liệt kê các điểm cuối riêng biệt của các phạm vi khác nhau trong
một vector.
II. Chức năng của từng khối.
1. Sampling (Lấy mẫu).
- Sampling (Lấy mẫu): Khối mẫu thực hiện quá trình lấy mẫu tín hiệu analog
liên tục để biến đổi thành tín hiệu số rời rạc. Tín hiệu analog được lấy mẫu tại
các điểm thời gian nhất định, tạo thành các giá trị mẫu rời rạc.
2. Khối quan hệ (Quantization)
- Khối quan hệ (Quantization): Khối quan hệ chịu trách nhiệm chuyển đổi các
giá trị liên tục từ khối mẫu thành các giá trị rời rạc. Quá trình quan hệ xác định
các mức giá trị số học mà tín hiệu mẫu sẽ được gán vào, tùy thuộc vào độ chính
xác và độ phân giải mong muốn.
- Số lượng mức quantization, hay số lượng giá trị quantization khác nhau, được
xác định bởi số lượng bit được sử dụng để biểu diễn mỗi mẫu quantization.
Ví dụ, nếu sử dụng một số lượng bit nhất định, chẳng hạn như 8 bit, thì số lượng
mức quantization sẽ là 2^8 = 256. Điều này có nghĩa là tín hiệu analog sẽ được
chia thành 256 mức quantization khác nhau.
3. Khối mã hóa (Encoding):
- Khối mã hóa (Encoding): Khối mã hóa biến đổi các giá trị số học rời rạc từ
khối quan hệ thành các mã (codes) tương ứng. Mục đích của quá trình này là
giảm dung lượng thông tin cần thiết để lưu trữ và truyền tải tín hiệu. Các mã
thường được biểu diễn dưới dạng một chuỗi các bit, trong đó sử dụng nhiều là
mã hóa nhị phân.
Ví dụ, nếu có 8 mức quantization, được biểu diễn bằng 3 bit, thì các giá trị
quantization sẽ được mã hóa thành các chuỗi nhị phân từ 000 đến 111.
B. Giải thích và mô phỏng trên Matlab.
- Khối Quantization: để chuyển các giá trị liên tục để chuyển thành giá trị rời rạc ta
sử dụng các phương pháp.
partition = [3,4,5,6,7,8,9];
index = quantiz([2 9 8],partition)

 The output is index = 0 6 5


Giải thích:
- Lệnh quantiz: xác định cách chia tín hiệu analog thành các khoảng và xác định
mức tương ứng cho mỗi giá trị đầu vào.
- Như đoạn code ở trên các giá trị được định nghĩa là partiton [3, 4, 5, 6, 7, 8, 9].
Điều này có nghĩa là các khoảng tương ứng sẽ được chia ra là (-∞, 3], (3, 4], (4, 5],
(5, 6], (6, 7], (7, 8], (8, 9], (9, +∞).
- Kết quả sẽ là chỉ số của khoảng mà giá trị đầu vào thuộc về. Trong trường hợp này,
với tập giá trị đầu vào [2, 9, 8], kết quả sẽ là [0,6,5] .Nghĩa là 2 sẽ thuộc đoạn (-∞,
3] là đoạn 0, 9 thuộc đoạn (8,9] là đoạn thứ 6,8 thuộc đoạn (8,9] là đoạn thứ 5.
Nếu khi ta thêm 1 vector codebook như trên và quants = codebook(index+1);

1. Optimize Quantization Parameters (tối ưu hóa các tham số để đạt được hiệu suất
tốt nhất trong quá trình)
- Example: Optimizing Quantization Parameters (Tối ưu hóa các tham số lượng tử
hóa)
+ Hàm lloyds tối ưu hóa phân vùng và sổ mã theo thuật toán Lloyd. Mã bên dưới tối
ưu hóa phân vùng và sổ mã trong một khoảng thời gian của tín hiệu hình sin, bắt đầu
từ phỏng đoán ban đầu sơ bộ. Sau đó, nó sử dụng các tham số này để lượng tử hóa tín
hiệu gốc bằng cách sử dụng các tham số đoán ban đầu cũng như các tham số được tối
ưu hóa. Đầu ra cho thấy độ méo bình phương trung bình sau khi lượng tử hóa ít hơn
nhiều đối với các tham số được tối ưu hóa. Hàm lượng tử tự động tính toán độ méo
bình phương trung bình và trả về nó dưới dạng tham số đầu ra thứ ba.
% Start with the setup from 2nd example in "Quantizing a Signal."
t = [0:.1:2*pi];
sig = sin(t);
partition = [-1:.2:1];
codebook = [-1.2:.2:1];
% Now optimize, using codebook as an initial guess.
[partition2,codebook2] = lloyds(sig,codebook);
[index,quants,distor] = quantiz(sig,partition,codebook);
[index2,quant2,distor2] = quantiz(sig,partition2,codebook2);
% Compare mean square distortions from initial and optimized
[distor, distor2] % parameters.

 The output is ans = 0.0148 0.0024


Giải thích:
 Tạo tín hiệu:
 t = [0:.1:2*pi];
 sig = sin(t);
 t là một vector thời gian từ 0 đến 2*pi với bước nhảy là 0.1, tạo ra một vector thời
gian.
 sig là vector tín hiệu, chứa các giá trị sin tương ứng với vector thời gian.
 Phân đoạn và codebook ban đầu:
 partition = [-1:.2:1];
 codebook = [-1.2:.2:1];
 partition là vector phân đoạn ban đầu, xác định ranh giới của các vùng lượng tử
hóa.
 codebook là đoán đoán ban đầu cho codebook, biểu thị các mức lượng tử hóa.
 Tối ưu hóa bằng thuật toán Lloyd:
 [partition2, codebook2] = lloyds(sig, codebook);
 Sử dụng thuật toán Lloyd để tối ưu hóa phân đoạn và codebook dựa trên tín hiệu
sig. Các giá trị tối ưu được lưu trong partition2 và codebook2.
 Lượng tử hóa sử dụng tham số ban đầu:
 [index, quants, distor] = quantiz(sig, partition, codebook);
 quantiz được sử dụng để lượng tử hóa tín hiệu sig dựa trên phân đoạn và codebook
ban đầu.
 index chứa các giá trị chỉ mục của các mức lượng tử hóa cho mỗi mẫu trong sig.
 quants chứa các giá trị lượng tử hóa tương ứng với mỗi mẫu.
 distor là sai số trung bình bình phương giữa tín hiệu gốc và tín hiệu lượng tử hóa.
 Lượng tử hóa sử dụng tham số tối ưu hóa:
 [index2, quant2, distor2] = quantiz(sig, partition2, codebook2);
 Lượng tử hóa tín hiệu sig một lần nữa, nhưng lần này sử dụng phân đoạn và
codebook đã tối ưu hóa.
 index2 chứa các giá trị chỉ mục của các mức lượng tử hóa cho mỗi mẫu trong sig
sử dụng các tham số tối ưu hóa.
 quant2 chứa các giá trị lượng tử hóa tương ứng với mỗi mẫu sử dụng các tham số
tối ưu hóa.
 distor2 là sai số trung bình bình phương giữa tín hiệu gốc và tín hiệu lượng tử hóa
sử dụng các tham số tối ưu hóa.
 So sánh sai số trung bình bình phương:
 [distor, distor2]
 Xuất và so sánh sai số trung bình bình phương giữa tín hiệu gốc và tín hiệu lượng
tử hóa sử dụng các tham số ban đầu và tối ưu hóa.
- Differential Pulse Code Modulation (Điều chế mã xung vi sai)
DPCM Terminology (Thuật ngữ DPCM)
Để xác định bộ mã hóa cho bộ lượng tử hóa như vậy, bạn không chỉ phải cung cấp
phân vùng và sổ mã như được mô tả trong Biểu diễn phân vùng và Biểu diễn sổ mã mà
còn phải cung cấp một bộ dự đoán. Bộ dự đoán là một chức năng mà bộ mã hóa
DPCM sử dụng để tạo ra dự đoán có căn cứ ở mỗi bước. Một bộ dự báo tuyến tính có
dạng
y(k) = p(1)x(k-1) + p(2)x(k-2) + ... + p(m-1)x(k-m+1) + p(m)x(k-m)

trong đó x là tín hiệu gốc, y(k) cố gắng dự đoán giá trị của x(k) và p là m-bộ số thực.
Thay vì lượng tử hóa chính x, bộ mã hóa DPCM lượng tử hóa lỗi dự đoán, x-y. Số
nguyên m ở trên được gọi là thứ tự dự đoán. Trường hợp đặc biệt khi m = 1 được gọi
là điều chế delta.
a. Represent Predictors (Đại diện dự đoán)
Nếu dự đoán giá trị thứ k của tín hiệu x, dựa trên các giá trị trước đó của x, là
y(k) = p(1)x(k-1) + p(2)x(k-2) +...+ p(m-1)x(k-m+1) + p(m)x(k-m)
thì vectơ dự đoán tương ứng cho các hàm của hộp công cụ là
predictor = [0, p(1), p(2), p(3),..., p(m-1), p(m)]
b. Example: DPCM Encoding and Decoding (Mã hóa và giải mã DPCM)
Một trường hợp đặc biệt đơn giản của DPCM lượng tử hóa sự khác biệt giữa giá trị
hiện tại của tín hiệu và giá trị của nó ở bước trước đó. Do đó, yếu tố dự đoán chỉ là
y(k) = x (k - 1). Mã dưới đây thực hiện lược đồ này. Nó mã hóa tín hiệu răng cưa, giải
mã nó và vẽ cả tín hiệu gốc và tín hiệu được giải mã. Đường liền nét là tín hiệu gốc,
trong khi đường đứt nét là tín hiệu được phục hồi. Ví dụ này cũng tính toán sai số bình
phương trung bình giữa tín hiệu gốc và tín hiệu được giải mã.
predictor = [0 1]; % y(k)=x(k-1)
partition = [-1:.1:.9];
codebook = [-1:.1:1];
t = [0:pi/50:2*pi];
x = sawtooth(3*t); % Original signal
% Quantize x using DPCM.
encodedx = dpcmenco(x,codebook,partition,predictor);
% Try to recover x from the modulated signal.
decodedx = dpcmdeco(encodedx,codebook,predictor);
plot(t,x,t,decodedx,'--')
legend('Original signal','Decoded signal','Location','NorthOutside');
distor = sum((x-decodedx).^2)/length(x) % Mean square error
Giải thích:
 Khởi tạo:
 predictor = [0 1]; % Các hệ số dự đoán cho DPCM (y(k) = x(k-1))
 partition = [-1:.1:.9]; % Vector phân đoạn ban đầu
 codebook = [-1:.1:1]; % Vector codebook ban đầu
 t = [0:pi/50:2*pi]; % Vector thời gian
 x = sawtooth(3*t); % Tín hiệu gốc (hàm sóng sawtooth với tần số 3)
 predictor đại diện cho các hệ số của bộ dự đoán cho DPCM. Trong trường hợp này, đó
là một bộ dự đoán bậc một đơn giản với công thức y(k) = x(k-1).
 partition là vector phân đoạn ban đầu, xác định ranh giới của các vùng lượng tử hóa.
 codebook là vector codebook ban đầu, biểu thị các mức lượng tử hóa.
 t là vector thời gian.
 x là tín hiệu gốc, được tạo ra dưới dạng sóng sawtooth với tần số 3.
 Mã hóa DPCM:
 encodedx = dpcmenco(x, codebook, partition, predictor);
 dpcmenco được sử dụng để lượng tử hóa và mã hóa tín hiệu x bằng cách sử dụng
thuật toán DPCM, với codebook, phân đoạn và dự đoán cung cấp.
 Giải mã DPCM:
 decodedx = dpcmdeco(encodedx, codebook, predictor);
 dpcmdeco được sử dụng để giải mã tín hiệu đã được biên dạng (encodedx) bằng cách
sử dụng codebook và dự đoán.

 Vẽ đồ thị:
 plot(t, x, t, decodedx, '--')
 legend('Tín hiệu gốc', 'Tín hiệu giải mã', 'Location', 'NorthOutside');
 Vẽ đồ thị của tín hiệu gốc và tín hiệu đã giải mã để so sánh.
 Tính toán sai số trung bình bình phương:
 distor = sum((x - decodedx).^2) / length(x);
 Tính toán sai số trung bình bình phương giữa tín hiệu gốc (x) và tín hiệu đã giải mã
(decodedx).
 Kết quả:
 distor
 Xuất giá trị sai số trung bình bình phương đã tính.
 Trong ví dụ cung cấp, giá trị sai số trung bình bình phương (distor) là khoảng 0.0327,
chỉ ra sự chênh lệch bình phương trung bình giữa tín hiệu gốc và tín hiệu đã giải mã.
Giá trị này cung cấp một đánh giá về khả năng hệ thống DPCM khôi phục lại tín hiệu
gốc sau quá trình lượng tử hóa.
2. Optimize DPCM Parameters (Tối ưu hóa thông số DPCM)
- Example: Comparing Optimized and Nonoptimized DPCM Parameters (So sánh các
thông số DPCM được tối ưu hóa và không được tối ưu hóa)
Ví dụ này tương tự như ví dụ ở phần trước. Tuy nhiên, trong đó ví dụ trước đã tạo bộ
dự đoán, phân vùng và sổ mã theo cách đơn giản nhưng lộn xộn, ví dụ này sử dụng
cùng một sổ mã (bây giờ được gọi là initcodebook) làm dự đoán ban đầu cho tham số
sổ mã được tối ưu hóa mới. Ví dụ này cũng sử dụng thứ tự dự đoán, 1, làm thứ tự
mong muốn của bộ dự đoán được tối ưu hóa mới. Hàm dpcmopt tạo ra các tham số
được tối ưu hóa này, sử dụng tín hiệu răng cưa x làm dữ liệu huấn luyện. Ví dụ tiếp tục
lượng tử hóa dữ liệu huấn luyện; về lý thuyết, các tham số được tối ưu hóa phù hợp để
lượng tử hóa các dữ liệu khác tương tự x. Lưu ý rằng độ méo bình phương trung bình
ở đây nhỏ hơn nhiều so với độ méo trong ví dụ trước.
t = [0:pi/50:2*pi];
x = sawtooth(3*t); % Original signal
initcodebook = [-1:.1:1]; % Initial guess at codebook
% Optimize parameters, using initial codebook and order 1.
[predictor,codebook,partition] = dpcmopt(x,1,initcodebook);
% Quantize x using DPCM.
encodedx = dpcmenco(x,codebook,partition,predictor);
% Try to recover x from the modulated signal.
decodedx = dpcmdeco(encodedx,codebook,predictor);
distor = sum((x-decodedx).^2)/length(x) % Mean square error

 The output is distor = 8.6801e-04


Giải thích:
 Tạo tín hiệu:
 t = [0:pi/50:2*pi];
 x = sawtooth(3*t); % Tín hiệu gốc (sóng sawtooth với tần số 3)
 t là một vector thời gian.
 x là tín hiệu gốc, được tạo ra dưới dạng sóng sawtooth với tần số 3.
 Codebook ban đầu và tối ưu hóa tham số:
 initcodebook = [-1:.1:1]; % Đoán đoán ban đầu cho codebook
 [predictor, codebook, partition] = dpcmopt(x, 1, initcodebook);
 initcodebook là đoán đoán ban đầu cho codebook.
 dpcmopt được sử dụng để tối ưu hóa các tham số cho DPCM, bao gồm dự đoán,
codebook và phân đoạn. Bậc của dự đoán được đặt là 1.
 Mã Hóa DPCM:
 encodedx = dpcmenco(x, codebook, partition, predictor);
 dpcmenco được sử dụng để lượng tử hóa và mã hóa tín hiệu x bằng cách sử dụng các
tham số được tối ưu hóa.
 Giải Mã DPCM:
 decodedx = dpcmdeco(encodedx, codebook, predictor);
 dpcmdeco được sử dụng để giải mã tín hiệu đã được biên dạng (encodedx) bằng cách
sử dụng codebook và dự đoán tối ưu hóa.
 Tính toán sai số trung bình bình phương:
 distor = sum((x - decodedx).^2) / length(x);
 Tính toán sai số trung bình bình phương giữa tín hiệu gốc (x) và tín hiệu đã giải mã
(decodedx).
 Kết Quả:
 distor
 Xuất giá trị sai số trung bình bình phương đã tính.
 Trong ví dụ này, giá trị sai số trung bình bình phương (distor) là khoảng 0.0063. Giá trị
này biểu thị sự chênh lệch bình phương trung bình giữa tín hiệu gốc và tín hiệu đã giải
mã, cho thấy khả năng của hệ thống DPCM, với các tham số được tối ưu hóa, trong
việc tái tạo lại tín hiệu gốc sau quá trình lượng tử hóa. Một giá trị sai số trung bình
bình phương thấp hơn cho thấy một quá trình tái tạo tốt hơn.
3. Compand a Signal (Nén và giãn nén một tín hiệu)
- Companding là một kỹ thuật trong xử lý tín hiệu âm thanh để giảm độ động của tín
hiệu trước khi nén hoặc mã hóa. Kỹ thuật này tập trung vào việc tăng độ nhạy của tín
hiệu ở mức âm thanh thấp và giảm độ nhạy ở mức âm thanh cao để cân bằng độ động
của tín hiệu.
Trong quá trình companding, hai quy luật phổ biến được sử dụng là A-law và μ-law:
+ A-law Companding:
Quy luật A-law companding được sử dụng trong hệ thống PCM ở châu Âu và nhiều
quốc gia khác.
Hàm companding A-law tăng độ nhạy của tín hiệu ở mức âm thanh thấp và giảm độ
nhạy ở mức âm thanh cao.
+ μ-law Companding:
Quy luật μ-law companding được sử dụng trong hệ thống PCM ở Bắc Mỹ, Nhật Bản
và một số quốc gia khác.
Hàm companding μ-law tăng độ nhạy của tín hiệu ở mức âm thanh thấp và giảm độ
nhạy ở mức âm thanh cao.
a. Compress and Expand Data Sequence Using Mu-Law (Nén và giải nén chuỗi
dữ liệu bằng phương pháp Mu-Law).
OPEN LIVE SCRIPT
Generate a data sequence.
data = 2:2:12

data = 1×6
 data = 2 4 6 8 10 12
Giải thích:
- “data = 2:2:12” tạo 1 dãy data từ 2 đến 12 với bước nhảy là 2 [2, 4, 6, 8, 10, 12].

Nén chuỗi dữ liệu bằng cách sử dụng máy nén mu-law. Đặt giá trị cho mu thành
255. Chuỗi dữ liệu nén hiện nằm trong khoảng từ 8,1 đến 12.
compressed = compand(data,255,max(data),'mu/compressor')
compressed = 1×6

 Compressed = 8.1644 9.6394 10.5084 11.1268 11.6071 12.0000


Giải thích:
“compressed = compand(data,255,max(data),'mu/compressor')”
+ Hàm compand này được sử dụng để nén dãy số data.
+ Tham số đầu tiên là data, là dãy số gốc cần nén.
+ Tham số thứ hai là 255, là giá trị của tham số μ (mu) trong companding μ-law.
+ Tham số thứ ba là max(data), là giá trị tối đa trong dãy số gốc, được sử dụng để xác
định phạm vi động.
+ Tham số thứ tư là 'mu/compressor', chỉ định rằng chúng ta đang sử dụng
companding μ-law và muốn thực hiện bước nén.
 Kết quả là dãy số nén compressed.
Mở rộng chuỗi dữ liệu nén bằng cách sử dụng bộ mở rộng mu-law. Chuỗi dữ liệu
mở rộng gần giống với chuỗi dữ liệu gốc.
expanded = compand(compressed,255,max(data),'mu/expander')
expanded = 1×6

 expanded = 2.0000 4.0000 6.0000 8.0000 10.0000 12.0000


Giải thích:
“expanded = compand(compressed,255,max(data),'mu/expander')”
+ Hàm compand này được sử dụng để giãn dãy số compressed.
+ Tham số đầu tiên là compressed, là dãy số nén cần được giãn.
+ Tham số thứ hai là 255, là giá trị của tham số μ (mu) trong companding μ-law, giống
như bước nén.
+ Tham số thứ ba là max(data), là giá trị tối đa trong dãy số gốc, giống như bước nén.
+ Tham số thứ tư là 'mu/expander', chỉ định rằng chúng ta đang sử dụng companding
μ-law và muốn thực hiện bước giãn.
 Kết quả là dãy số giãn expanded.

Tính sự khác biệt giữa chuỗi dữ liệu gốc và chuỗi mở rộng.


diffvalue = expanded – data

diffvalue = 1×6
10-14 ×
 -0.0444 0.1776 0.0888 0.1776 0.1776 -0.3553
Giải thích:
“diffvalue = expanded - data”
 Dòng này tính toán độ chênh lệch giữa dãy số giãn expanded và dãy số gốc data.
b. Compress and Expand Data Sequence Using Mu-Law (Nén và giải nén chuỗi dữ
liệu bằng phương pháp A-Law)
OPEN LIVE SCRIPT
data = 1:5;
Nén chuỗi dữ liệu bằng cách sử dụng máy nén luật A. Đặt giá trị cho A thành
87,6. Chuỗi dữ liệu nén hiện nằm trong khoảng từ 3,5 đến 5
compressed = compand(data,87.6,max(data),'A/compressor')

Compressed = 1×5
 3.5296 4.1629 4.5333 4.7961 5.0000
Giải thích:
- “data = 1:5” tạo 1 dãy data từ 1 đến 5 với bước nhảy không có [1, 2, 3, 4, 5].
“compressed = compand(data,87.6,max(data),'A/compressor')”
+ Hàm compand sử dụng để nén dãy số data.
+ Tham số đầu tiên là data.
+ Tham số thứ hai là 87.6, là giá trị của tham số A trong companding A-law.
+ Tham số thứ ba là max(data), là giá trị tối đa trong dãy số gốc, được sử dụng để xác
định phạm vi động.
+ Tham số thứ tư là 'A/compressor', chỉ định rằng chúng ta đang sử dụng companding
A-law và muốn thực hiện bước nén.
 Kết quả là dãy số nén compressed.
Mở rộng chuỗi dữ liệu nén bằng cách sử dụng bộ mở rộng luật A. Chuỗi dữ
liệu mở rộng gần giống với chuỗi dữ liệu gốc.
expanded = compand(compressed,87.6,max(data),'A/expander')

expanded = 1×5
 1.0000 2.0000 3.0000 4.0000 5.0000
Giải thích:
“expanded = compand(compressed,87.6,max(data),'A/expander')”
+ Hàm compand giãn dãy số compressed.
+ Tham số đầu tiên là compressed, là dãy số nén cần được giãn.
+ Tham số thứ hai là 87.6, là giá trị của tham số A trong companding A-law, giống như
bước nén.
+ Tham số thứ ba là max(data), là giá trị tối đa trong dãy số gốc, giống như bước nén.
+ Tham số thứ tư là 'A/expander', chỉ định rằng chúng ta đang sử dụng companding A-
law và muốn thực hiện bước giãn.
 Kết quả là dãy số giãn expanded.
Tính sự khác biệt giữa chuỗi dữ liệu gốc và chuỗi mở rộng.
diffvalue = expanded – data

diffvalue = 1×5
10-14 ×
0 0 0.1332 0.0888 0.0888
Giải thích:
“diffvalue = expanded - data”
 Dòng này tính toán độ chênh lệch giữa dãy số giãn expanded và dãy số gốc data.

4. Huffman Coding (Mã hóa Huffman)


Ví dụ: hãy xem xét một nguồn dữ liệu tạo ra số 1 với xác suất 0,1, 2 giây với xác suất
0,1 và 3 giây với xác suất 0,8. Bước tính toán chính trong việc mã hóa dữ liệu từ
nguồn này bằng mã Huffman là tạo một từ điển liên kết từng ký hiệu dữ liệu với một
từ mã. Ví dụ ở đây tạo một từ điển như vậy và sau đó hiển thị vectơ từ mã được liên
kết với một giá trị cụ thể từ nguồn dữ liệu.
a. Create a Huffman Code Dictionary Using MATLAB (Tạo từ điển mã Huffman
bằng MATLAB)
- Huffman Coding là một thuật toán nén dữ liệu mà nó sử dụng mã hóa biến độ dài để
biểu diễn các ký tự dựa trên tần suất xuất hiện của chúng trong dữ liệu nguồn.
OPEN LIVE SCRIPT
Tạo một vectơ ký hiệu dữ liệu và gán xác suất cho mỗi ký hiệu.
symbols = [1 2 3];
prob = [0.1 0.1 0.8];
Tạo từ điển mã Huffman. Ký hiệu dữ liệu có khả năng xảy ra cao nhất, 3, được liên kết
với từ mã một chữ số, trong khi các ký hiệu dữ liệu ít có khả năng xảy ra hơn được
liên kết với từ mã có hai chữ số.
dict = huffmandict(symbols,prob)

dict=3×2 cell array


{[1]} {[1 1]}
{[2]} {[1 0]}
{[3]} {[ 0]}
Giải thích:
“symbols = [1 2 3];”
Tạo một mảng symbols chứa các ký tự [1, 2, 3]. Đây là bảng chữ cái mà chúng ta
muốn mã hóa bằng Huffman.
“prob = [0.1 0.1 0.8];”
Tạo một mảng prob chứa các xác suất tương ứng với mỗi ký tự trong bảng chữ cái.
Trong ví dụ này, xác suất của ký tự "1" là 0.1, của ký tự "2" là 0.1 và của ký tự "3" là
0.8.
“dict = huffmandict(symbols,prob);”
Sử dụng hàm huffmandict để tạo từ điển Huffman dựa trên bảng chữ cái symbols và
xác suất prob. Kết quả trả về là một ma trận cell dict, trong đó mỗi hàng chứa một cặp
cell, một cell chứa ký tự
Display the second row of the dictionary. The output also shows that a Huffman
encoder receiving the data symbol 2 substitutes the sequence 1 0.
dict{2,:}
ans = 2
ans = 1 0
Giải thích:
“dict{2,:}”
Dòng này truy cập vào hàng thứ hai của từ điển Huffman dict. dict{2,:} trả về một
mảng cell chứa các phần tử trong hàng thứ hai của dict.
 Kết quả:
Dòng này hiển thị kết quả của biểu thức trước đó, tức là mảng cell trả về từ dict{2,:}.
b. Create and Decode a Huffman Code Using MATLAB (Tạo và giải mã mã
Huffman bằng MATLAB)
Ví dụ này thực hiện mã hóa và giải mã Huffman bằng cách sử dụng nguồn có bảng
chữ cái có ba ký hiệu. Lưu ý rằng các hàm huffmanenco và huffmandeco sử dụng từ
điển được tạo bởi huffmandict.
OPEN LIVE SCRIPT
Tạo chuỗi dữ liệu để mã hóa.
sig = repmat([3 3 1 3 3 3 3 3 2 3],1,50);
Xác định tập hợp các ký hiệu dữ liệu và xác suất liên quan đến từng phần tử.
symbols = [1 2 3];
p = [0.1 0.1 0.8];
Tạo từ điển mã Huffman.
dict = huffmandict(symbols,p);
Mã hóa và giải mã dữ liệu. Xác minh rằng dữ liệu gốc, sig và dữ liệu được giải mã,
dhsig, giống hệt nhau.
hcode = huffmanenco(sig,dict);
dhsig = huffmandeco(hcode,dict);
isequal(sig,dhsig)
ans = logical 1
Giải thích:
+ Dòng lệnh 1:
Tạo một chuỗi sig bằng cách lặp lại mẫu [3 3 1 3 3 3 3 3 2 3] 50 lần.
 Mục đích là sử dụng chuỗi này để thực hiện quá trình mã hóa và giải mã Huffman.
+ Dòng lệnh 2: symbols = [1 2 3];
Chúng ta tạo một mảng symbols chứa bảng chữ cái, trong trường hợp này là [1, 2, 3].
+ Dòng lệnh 3: p = [0.1 0.1 0.8];
Tạo một mảng p chứa xác suất tương ứng với mỗi ký tự trong bảng chữ cái. Trong
trường hợp này, xác suất của ký tự "1" là 0.1, ký tự "2" là 0.1 và ký tự "3" là 0.8.
+ Dòng lệnh 4: dict = huffmandict(symbols,p);
Chúng ta sử dụng hàm huffmandict để tạo từ điển Huffman dựa trên bảng chữ cái
symbols và xác suất p. Kết quả được lưu trữ trong biến dict.
+ Dòng lệnh 5: hcode = huffmanenco(sig,dict);
Sử dụng hàm huffmanenco để mã hóa chuỗi sig bằng cách sử dụng từ điển Huffman
dict. Kết quả mã hóa được lưu trữ trong biến hcode.
+ Dòng lệnh 6: dhsig = huffmandeco(hcode,dict);
Sử dụng hàm huffmandeco để giải mã vector mã hóa hcode bằng cách sử dụng từ điển
Huffman dict. Kết quả giải mã được lưu trữ trong biến dhsig.
+ Dòng lệnh 7: isequal(sig,dhsig)
So sánh chuỗi ban đầu sig với chuỗi đã giải mã dhsig bằng cách sử dụng hàm isequal.
Kết quả trả về là một giá trị logic, trong trường hợp này là 1, cho thấy rằng chuỗi
ban đầu và chuỗi đã giải mã là giống nhau.
- Arithmetic Coding
Represent Arithmetic Coding Parameters
Mã hóa số học yêu cầu thông tin thống kê về nguồn dữ liệu được mã hóa. Cụ thể, đối
số đầu vào count trong hàm arithenco và arithdeco liệt kê tần suất mà nguồn tạo ra mỗi
ký hiệu trong bảng chữ cái của nó. Bạn có thể xác định tần số bằng cách nghiên cứu
một bộ dữ liệu thử nghiệm từ nguồn. Tập dữ liệu thử nghiệm có thể có bất kỳ kích
thước nào bạn chọn, miễn là mỗi ký hiệu trong bảng chữ cái có tần số khác 0.
Ví dụ: trước khi mã hóa dữ liệu từ một nguồn tạo ra 10 x, 10 y và 80 z trong bộ dữ liệu
thử nghiệm 100 ký hiệu điển hình, hãy xác định
counts = [10 10 80];
Ngoài ra, nếu một tập dữ liệu thử nghiệm lớn hơn từ nguồn chứa 22 x, 23 y và 185 z
thì hãy xác định
counts = [22 23 185];
Create and Decode an Arithmetic Code Using MATLAB (Tạo và giải mã mã số học
bằng MATLAB)
OPEN LIVE SCRIPT
Mã hóa và giải mã một chuỗi từ một nguồn có ba ký hiệu.
Tạo một vectơ trình tự chứa các ký hiệu từ tập hợp {1,2,3}.
seq = [3 3 1 3 3 3 3 3 2 3];
Đặt vectơ đếm để xác định bộ mã hóa tạo ra 10 đơn vị, 20 đơn vị và 70 đơn vị ba từ bộ
dữ liệu thử nghiệm 100 ký hiệu điển hình.
counts = [10 20 70];
Áp dụng các hàm mã hóa và giải mã số học.
code = arithenco(seq,counts);
dseq = arithdeco(code,counts,length(seq));
Xác minh rằng đầu ra của bộ giải mã khớp với chuỗi đầu vào ban đầu.

isequal(seq,dseq)
ans = logical
1
5. Quantize a Signal (định mức hóa tín hiệu)
- Là quá trình chia các giá trị liên tục trong tín hiệu thành các giá trị rời rạc, thường là các
mức định sẵn hoặc số lượng giới hạn. Trong quá trình này, tín hiệu liên tục được xấp xỉ
hoặc làm tròn để gán cho giá trị rời rạc gần nhất.
a. Scalar Quantization Example 1 (Lượng tử hóa vô hướng )
Đoạn mã bên dưới cho thấy cách hàm lượng tử hóa sử dụng phân vùng và sổ mã để
ánh xạ một vectơ thực, samp, sang một vectơ mới, được lượng tử hóa, có các mục
nhập là -1, 0,5, 2 hoặc 3.
partition = [0,1,3];
codebook = [-1, 0.5, 2, 3];
samp = [-2.4, -1, -.2, 0, .2, 1, 1.2, 1.9, 2, 2.9, 3, 3.5, 5];
[index,quantized] = quantiz(samp,partition,codebook);
quantized

The output is below quantized =

Columns 1 through 9

-1.0000 -1.0000 -1.0000 -1.0000 0.5000 0.5000 2.0000 2.0000 2.0000

Columns 10 through 13

2.0 2.0000 2.0000 3.0000 3.0000


Giải thích:
“partition = [0, 1, 3];”
Biến partition chứa các giá trị phân đoạn [0, 1, 3], gồm 3 phân đoạn.
“codebook = [-1, 0.5, 2, 3];”
Chứa các giá trị định mức tương ứng với từng phân đoạn là [-1, 0.5, 2, 3].các giá trị
trong phân đoạn đầu tiên (-∞ đến 0) sẽ được ánh xạ thành -1, trong phân đoạn thứ hai
(0 đến 1) sẽ được ánh xạ thành 0.5, trong phân đoạn thứ ba (1 đến 3) sẽ được ánh xạ
thành 2, và giá trị lớn hơn 3 sẽ được ánh xạ thành 3.
“samp = [-2.4, -1, -0.2, 0, 0.2, 1, 1.2, 1.9, 2, 2.9, 3, 3.5, 5];
[index,quantized] = quantiz(samp,partition,codebook);”
Sử dụng hàm quantiz để ánh xạ vector samp vào vector quantized. Kết quả được lưu
trong hai biến index và quantized.
+ Giá trị -2.4 trong samp đã được ánh xạ thành -1
+ Giá trị -1 đã được ánh xạ thành -1
+ Giá trị -0.2 đã được ánh xạ thành -1
+ Giá trị 0 đã được ánh xạ thành -1
+ Giá trị 0.2 đã được ánh xạ thành 0.5
+ Giá trị 1 đã được ánh xạ thành 0.5
+ Giá trị 1.2 đã được ánh xạ thành 2
+ Giá trị 1.9 đã được ánh xạ thành 2
+ Giá trị 2 đã được ánh xạ thành 2
+ Giá trị 2.9 đã được ánh xạ thành 2
+ Giá trị 3 đã được ánh xạ thành 3
+ Giá trị 3.5 đã được ánh xạ thành 3
+ Giá trị 5 đã được ánh xạ thành 3.
b. Scalar Quantization Example 2 (Lượng tử hóa vô hướng )
Ví dụ này minh họa bản chất của lượng tử hóa vô hướng rõ ràng hơn. Sau khi lượng tử
hóa một sóng hình sin được lấy mẫu, nó vẽ đồ thị các tín hiệu gốc và tín hiệu lượng tử
hóa. Đồ thị đối chiếu các dấu x tạo nên đường cong hình sin với các dấu chấm tạo nên
tín hiệu lượng tử hóa. Tọa độ dọc của mỗi dấu chấm là một giá trị trong sổ mã vectơ.
t = [0:.1:2*pi]; % Times at which to sample the sine function
sig = sin(t); % Original signal, a sine wave
partition = [-1:.2:1]; % Length 11, to represent 12 intervals
codebook = [-1.2:.2:1]; % Length 12, one entry for each interval
[index,quants] = quantiz(sig,partition,codebook); % Quantize.
plot(t,sig,'x',t,quants,'.')
legend('Original signal','Quantized signal');
axis([-.2 7 -1.2 1.2])
Giải thích:
Đồ thị được được vẽ bởi các tín hiệu rời rạc theo dạng tín hiệu hình sin(t), với bước
nhảy 0.2
 Vector Thời Gian và Tạo Tín Hiệu:
 t = [0:.1:2*pi]; % Thời điểm để lấy mẫu hàm sin
 sig = sin(t); % Tín hiệu gốc, một sóng sin
 t là một vector thời gian từ 0 đến 2*pi với bước nhảy là 0.1.
 sig là tín hiệu gốc, là một sóng sin được lấy mẫu tại các điểm thời gian đã xác định.
 Xác định phân đoạn và Codebook:
 opartition = [-1:.2:1]; % Độ dài 11, đại diện cho 12 khoảng
 ocodebook = [-1.2:.2:1]; % Độ dài 12, một giá trị cho mỗi khoảng
 opartition là vector xác định ranh giới của các khoảng lượng tử hóa.
 ocodebook là vector xác định các mức lượng tử hóa liên kết với mỗi khoảng.
 Quá trình lượng tử hóa:
 [index, quants] = quantiz(sig, partition, codebook); % Lượng tử hóa.
 quantiz được sử dụng để lượng tử hóa tín hiệu gốc sig dựa trên phân đoạn và
codebook đã xác định.
 index chứa các chỉ mục của các mức lượng tử hóa cho mỗi mẫu trong sig.
 quants chứa các giá trị lượng tử hóa tương ứng với mỗi mẫu.
 Vẽ Đồ Thị:
 plot(t, sig, 'x', t, quants, '.')
 legend('Tín hiệu gốc', 'Tín hiệu lượng tử hóa');
 axis([-.2 7 -1.2 1.2])
 Vẽ đồ thị của tín hiệu gốc và tín hiệu lượng tử hóa để so sánh.
 'x' đại diện cho các điểm của tín hiệu gốc, và '.' đại diện cho các điểm của tín hiệu
lượng tử hóa.
 legend thêm một chú thích vào đồ thị.
 axis đặt giới hạn của trục để có được hiển thị tốt hơn.
 Tóm lại, đoạn mã này thực hiện quá trình lượng tử hóa của một tín hiệu sóng sin
bằng cách sử dụng phân đoạn và codebook đã xác định, sau đó vẽ đồ thị của tín hiệu
gốc và tín hiệu lượng tử hóa để so sánh. Quá trình lượng tử hóa có thể thấy rõ trong
đồ thị, nơi các điểm của tín hiệu lượng tử hóa được biểu diễn bằng dấu chấm.

-----------------------------------------------------------------------------------------------------------------
Quantize and Compand an Exponential Signal
(Lượng tử hóa và nén một tín hiệu mũ)
- Khi truyền tín hiệu có dải động cao, lượng tử hóa sử dụng các khoảng thời gian có
độ dài bằng nhau có thể dẫn đến mất độ chính xác và méo tín hiệu.
- Nén là một thao tác áp dụng tính toán logarit để nén tín hiệu trước khi lượng tử hóa
ở phía phát và áp dụng thao tác nghịch đảo để mở rộng tín hiệu nhằm khôi phục tín
hiệu về quy mô đầy đủ ở phía nhận.
- Việc nén sẽ tránh hiện tượng méo tín hiệu mà không cần chỉ định nhiều mức lượng
tử hóa. So sánh độ méo khi sử dụng lượng tử hóa 6 bit trên tín hiệu hàm mũ có và
không có tính năng nén. Vẽ đồ thị tín hiệu hàm mũ ban đầu, tín hiệu lượng tử hóa
và tín hiệu mở rộng.
- Companding là một phép toán áp dụng phép tính logarit để nén tín hiệu trước khi
quantization ở phía phát và áp dụng một phép toán nghịch đảo để mở rộng tín hiệu
để khôi phục nó về mức tối đa ở phía nhận. Companding tránh biến dạng tín hiệu
mà không cần xác định nhiều mức định mức. So sánh biến dạng khi sử dụng
quantization 6 bit trên một tín hiệu mũ có và không có companding. Vẽ đồ thị của
tín hiệu mũ gốc, tín hiệu đã quantized và tín hiệu đã mở rộng.
 Tạo tín hiệu hàm mũ và tính giá trị tối đa của nó.
sig = exp(-4:0.1:4);
V = max(sig);

 Lượng tử hóa tín hiệu bằng cách sử dụng các khoảng thời gian có độ dài bằng nhau.
Đặt giá trị phân vùng và sổ mã, giả sử lượng tử hóa 6 bit. Tính toán độ biến dạng bình
phương trung bình.
partition = 0:2^6 - 1;
codebook = 0:2^6;
[~,qsig,distortion] = quantiz(sig,partition,codebook);
 Nén tín hiệu bằng cách sử dụng chức năng được cấu hình để áp dụng phương pháp mu-
law. Áp dụng lượng tử hóa và mở rộng tín hiệu lượng tử hóa. Tính độ méo bình phương
trung bình của tín hiệu nén.compand
mu = 255; % mu-law parameter
csig_compressed = compand(sig,mu,V,'mu/compressor');
[~,quants] = quantiz(csig_compressed,partition,codebook);
csig_expanded = compand(quants,mu,max(quants),'mu/expander');
distortion2 = sum((csig_expanded - sig).^2)/length(sig);

 So sánh độ méo bình phương trung bình của lượng tử hóa với sự nén và lượng tử hóa
kết hợp. Độ méo của tín hiệu nén và lượng tử hóa thấp hơn một bậc so với độ méo của
tín hiệu lượng tử hóa. Các khoảng có độ dài bằng nhau rất phù hợp với logarit của tín
hiệu hàm mũ nhưng không phù hợp lắm với chính tín hiệu hàm mũ.
[distortion, distortion2]

Giải thích code:


Đoạn mã trên thực hiện quantization và companding trên một tín hiệu mũ `sig` và tính
toán độ méo (distortion) của tín hiệu quantized và tín hiệu đã mở rộng.
- Dòng 1 sig = exp(-4:0.1:4); tạo ra một tín hiệu mũ sig với các giá trị từ 4 đến 4 với bước
nhảy là 0.1.
- Dòng 2 V = max(sig) tính giá trị lớn nhất của tín hiệu “sig”.
- Dòng 3“partition = 0:2^6 - 1;” tạo ra một mảng partition với 64 giá trị từ 0 đến 63, đại
diện cho các khoảng quantization.
- Dòng 4”codebook = 0:2^6;” tạo ra một mảng codebook với 65 giá trị từ 0 đến 64, đại
diện cho các giá trị quantization.
- Dòng 5 [~,qsig,distortion] = quantiz(sig,partition,codebook); thực hiện quantization trên
tín hiệu `sig` bằng cách áp dụng hàm quantiz với các tham số partition và codebook đã
được xác định trước. Kết quả là một tín hiệu quantized `qsig` và độ méo distortion được
tính toán.
- Dòng 6 “mu = 255;” đặt giá trị của tham số mu trong companding.
- Dòng 7csig_compressed = compand(sig,mu,V,'mu/compressor'); áp dụng companding
trên tín hiệu `sig` bằng cách sử dụng hàm compand với các tham số mu, V và
'mu/compressor'. Kết quả là một tín hiệu đã nén `csig_compressed`.
- Dòng 8 [~,quants] = quantiz(csig_compressed,partition,codebook); thực hiện
quantization trên tín hiệu đã nén `csig_compressed` bằng cách áp dụng hàm quantiz với
các tham số partition và codebook. Kết quả là một tín hiệu quantized `quants`.
- Dòng 9 csig_expanded = compand(quants,mu,max(quants),'mu/expander'); áp dụng
companding trên tín hiệu quantized `quants` bằng cách sử dụng hàm compand với các
tham số mu, giá trị lớn nhất của `quants` và 'mu/expander'. Kết quả là một tín hiệu đã mở
rộng `csig_expanded`.
- Dòng10 `distortion2 = sum((csig_expanded - sig).^2)/length(sig);` tính toán độ méo hài
hòa distortion2 bằng cách tính tổng bình phương của hiệu giữa `csig_expanded` và `sig`
chia cho độ dài của tín hiệu `sig`.
- Dòng 11 `[distortion, distortion2]` trả về giá trị của distortion và distortion2.
 Vẽ tín hiệu hàm mũ ban đầu, tín hiệu lượng tử hóa và tín hiệu mở rộng. Phóng to trục
để làm nổi bật lỗi tín hiệu lượng tử hóa ở mức tín hiệu thấp hơn.

Giải thích:

 Vẽ Đồ Thị:
o plot([sig' qsig' csig_expanded']);
o Sử dụng hàm plot để vẽ đồ thị cho ba tín hiệu trên cùng một trục. Các tín hiệu được
xếp chồng lên nhau trong đồ thị để dễ so sánh.
 Đặt Tiêu Đề cho Đồ Thị:
o title('So sánh giữa Tín hiệu Gốc, Lượng tử hóa và Mở rộng');
o Sử dụng title để đặt tiêu đề cho đồ thị, giúp người đọc hiểu nhanh nội dung của đồ thị.
 Đặt Nhãn Cho Trục X và Y:
o xlabel('Khoảng');
o ylabel('Biên độ');
o xlabel và ylabel được sử dụng để đặt nhãn cho trục x và trục y, giúp người đọc hiểu ý
nghĩa của các trục trên đồ thị.
 Thêm Chú Thích (Legend):
o legend('Gốc', 'Lượng tử hóa', 'Mở rộng', 'Vị trí', 'nw');
o legend thêm chú thích vào đồ thị, hiển thị tên của mỗi đường trên đồ thị.
o Tham số 'Vị trí', 'nw' đặt chú thích ở góc tây bắc của đồ thị.
 Đặt Giới Hạn Trục:
o axis([0 70 0 20]);
o axis được sử dụng để đặt giới hạn của trục x và trục y trên đồ thị.
o Trục x nằm trong khoảng từ 0 đến 70, và trục y nằm trong khoảng từ 0 đến 20.

 Tóm lại, đoạn mã này tạo ra một đồ thị so sánh giữa tín hiệu gốc, tín hiệu lượng tử hóa
và tín hiệu mở rộng. Đồ thị được trang bị đầy đủ tiêu đề, nhãn trục, chú thích và giới
hạn trục để cung cấp một hiểu quả tốt và dễ hiểu cho người đọc

You might also like