Professional Documents
Culture Documents
TRẦN MINH THƯƠNG - N21DCVT101 - D21CQVT01-N - BUỔI 2
TRẦN MINH THƯƠNG - N21DCVT101 - D21CQVT01-N - BUỔI 2
- 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)
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.
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
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
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.
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
Columns 1 through 9
Columns 10 through 13
-----------------------------------------------------------------------------------------------------------------
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:
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