Giáo trình
Xử lý tín hiệu nâng cao
Chương 1. TỔNG QUAN VỀ CÔNG CỤ MATLAB 6
1.1. Giới thiệu 6
1.2. Sử dụng biến trong matlab 7
1.2.1. Quy cách đặt tên 7
1.2.2. Véc tơ và matrận 7
1.3. Một số lệnh thông dụng trong Matlab 10
1.4. Các toán tử và hàm 11
1.4.1. Các toán tử và các hàm cơ bản 11
1.4.2. Các toán tử và các hàm thao tác với ma trận 11
1.5. Sử dụng đồ thị trong Matlab 13
1.5.1. Đồ thị trong hệ tọa độ phẳng 13
1.5.2. Đồ thị trong không gian ba chiều 15
1.6. Lập trình trong Matlab 17
1.7. Matlab GUI 18
1.7.1. Môi trường làm việc 18
1.7.2. Thuộc tính của các điều khiển 19
1.7.3. Viết sự kiện cho các điều khiển 20
1.7.4. Debug trong Matlab 21
1.7.5. Vẽ đồ thị - sử dụng component AXES 21
1.7.6. Điều khiển Toggle – nút bấm 2 trạng thái 22
1.7.7. Điều khiển Slider – thanh trượt 22
1.8. Bài tập chương 1 22
Chương 2. TÍN HIỆU RỜI RẠC 24
2.1. Khái niệm về tín hiệu rời rạc và lấy mẫu tín hiệu 24
2.2. Các tín hiệu cơ sở 24
2.2.1. Dãy xung đơn vị 24
2.2.2. Dãy nhảy bậc đơn vị 25
2.2.3. Dãy tín hiệu hình sin 27
2.2.4. Dãy e-mũ phức 28
3.6. Bài tập chương 3 58
Chương 4. BIỂU DIỄN HỆ THỐNG VÀ TÍN HIỆU RỜI RẠC TRONG MIỀN
Z 61
4.1. Phép biến rổi Z hai phía 61
4.2. Một số tính chất của biến đổi Z 62
4.2.1. Tính tuyến tính 62
4.2.2. Dịch mẫu – tính chất trễ 62
4.2.3. Dịch tần số 63
4.2.4. Biến số đảo 63
4.2.5. Liên hợp phức 63
4.2.6. Tích của hai dãy 63
4.2.7. Tích chập của hai dãy 63
4.3. Biến đổi Z của một số dãy cơ bản 64
4.4. Biến đổi Z ngược 64
4.5. Hàm truyền đạt của hệ thống rời rạc 67
4.6. Bài tập chương 4 69
4.6.1. Bài tập sinh viên tự giải 70
Chương 5. BỘ LỌC SỐ 72
5.1. Phân tích các mạnh lọc FIR đơn giản 72
5.1.1. Mạch lọc FIR thông thấp 72
5.1.2. Mạch lọc FIR thông cao 74
5.2. Mạch lọc số IIR 75
5.2.1. Mạch lọc IIR thông thấp 75
5.2.2. Mạch lọc IIR thông cao 76
5.2.3. Mạch lọc IIR thông dải 77
5.2.4. Mạch lọc IIR chặn dải 78
Chương 6. XỬ LÝ ẢNH TRONG MATLAB 79
6.1. Nâng cao chất lượng ảnh bằng xử lý histogram 79
6.1.1. Phép dãn Histogram sử dụng imtool của Matlab 79
6.1.2. San phẳng (cân bằng) histogram 80
Các biến đặc biệt Giá trị
ans Biến mặc định trả về kết quả
pi số pi
esp Số nhỏ nhất lớn hơn 0
inf Để chỉ số vô cùng
NaN hoặc nan Để chỉ số ko xác định như kết quả của 0/0
i và j Số phức, i=j=sqrt(-1)
realmin Số dấu chấm động nhỏ nhất (2
-1022
= 2.2251e-308)
realmax Số dấu chấm động lớn nhất (2
1024
= 1.7977e+308)
1.2.2. Véc tơ và matrận
Các bài toán trong Matlab thông thường được quy về việc tính toán và xử lý trên ma
trận. Các biến, dữ liệu trong Matlab được coi như một ma trận thực hoặc phức. Ví
dụ, một giá trị vô hướng được coi là một mà trận có kích thước 1x1, một vector cột
là một chỉ có 1 cột, một véc tơ hàng, hay một chuỗi số là một ma trận chỉ có một
hàng. Một ma trận có kích thước (m x n) trong Matlab là một ma trận có m hàng và
n cột.
Ví dụ, tạo một ma trận trong Matlab:
>> M=[3 4 5 ; 2 1 4]
M =
3 4 5
2 1 4
Như vậy giá trị nhập đã được gán cho các thành phần của ma trận, các phần tử trong
mỗi cột được cách nhau bằng một dấu cách (space) hoặc một dấu phảy, Các hàng
được cách nhau bằng dấu “;”. Về cách đánh chỉ số, trong Matlab, các phần tử được
đánh chỉ số từ 1.
Xét trong ví dụ trên:
>> M=(1:2:10)
M =
1 3 5 7 9
Trong trường hợp step=1, ta có thể sử dụng công thức thu gọn: M=(start:end)
Ví dụ:
>> M=[1:3;4:6]
M =
1 2 3
4 5 6
Kích thước của ma trận cũng có thể thay đổi, xét trong ví dụ trên nếu ta gán
M(3,3)=1, ta sẽ có:
>> M(3,3)=1
M =
1 2 3
4 5 6
0 0 1
Tương tự ma trận có thể mở rộng kích thước bằng cách gộp các ma trận lại.
Ví dụ:
>> N=ones(3)
N =
1 1 1
1 1 1
1 1 1
>> M=[M,N]
M =
1 2 3 1 1 1
4 5 6 1 1 1
0 0 1 1 1 1
Hoặc:
>> M=[M;N]
Phép trừ -
Phép nhân *
Phép chia / hoặc \
Phép lũy thừa ^
Chuyển vị ma trận '
Các toán tử quan hệ =, >, <, >=, <=, ==
Các toán tử logic &, |, ~
Matlab cũng cung cấp hàm toán học, các hàm đặc biệt và các thuật toán hữu ich,
dưới đây là một số hàm thông dụng nhất:
Tên hàm Ý nghĩa
sin(x), cos(x), tan(x) Các hàm lượng giác
asin(x), acos(x), atan(x) Các hàm lượng giác ngược
exp(x) Hàm mũ e
x
log(x), log10(x), log(2) Logarit cơ số e, 10, 2
abs(x) Hàm lấy trị tuyệt đối
Round(x), floor(x), fix(x), ceil(x) Các hàm làm tròn
1.4.2. Các toán tử và các hàm thao tác với ma trận
Có thể dùng các hàm sau để tạo các ma trận đặc biệt
• zeros(N): Tạo ma trận các phần tử đều bằng 0 có kích thước N
• ones(N): Tạo ma trận các phần tử đều bằng 1 có kích thước N
• rand(N): Tạo ma trận ngẫu nhiên có kích thước N, các phần tử phân bố
đều.
• randn(N): Tạo ma trận ngẫu nhiên có kích thước N, các phần tử tuân theo
phân bố chuẩn
• magic(N): Tạo ma trận magic (tổng giá trị trong 1 hàng bằng tổng giá trị
trong 1 cột bằng tổng giá trị đường chéo) có kích thước N
• eye(N): Tạo ma trận đơn vị
Các thao tác khác
• Cộng: X=A+B
c xanh xám + dấu + đường gạch gạch
m đỏ tím * hoa thị
y vàng s vuông
k đen d kim cương
w trắng v, ^,<,> tam giác
p,h ngôi sao
Ví dụ:
>> plot(x,y,' *b')
Kết quả:
Ngoài ra có thể chỉnh sửa cách trình bày đồ thị bằng cách lệnh sau:
• grid on/off: thêm/bỏ đường lưới vào đồ thị
• box on/off: thêm/bỏ hộp chứa đồ thị
• asix on/off: thêm/bỏ trục tọa độ
• xlabel('Trục x'): thêm nhãn cho trục x
• ylabel('Truc y'): thêm nhãn cho trục y
• title('Do thi ham sin'): thêm tiêu đề ở đỉnh cho đồ thị
Để vẽ nhiều đồ thị trên một hình ta có thể sử dụng lệnh plot(x,y,m,n) khi đó đồ thị
với tọa độ x,y và đồ thị với tọa độ m,n sẽ được vẽ trên một hình. Ngoài ra có thể sử
dụng lệnh hold on:
Ví dụ:
>> x=linspace(0,2*pi,30);
>> y=sin(x);
>> m=linspace(0,2*pi,30);
>> n=cos(x);
>> plot(x,y)
>> hold on
>> plot(m,n)
Một số đồ loại khác trong Matlab
• pie: vẽ đồ thị tròn
• pareto: đồ thị pareto
X,Y là một cặp ma trận tương ứng với một lưới chữ nhật trong mặt phẳng x-y. Z là
một hàm số theo x,y cuối cùng, sử dụng hàm mesh(x,y,z) để vẽ đồ thị.
Ví dụ:
>> [X,Y] = meshgrid(-8:.5:8);
>> R = sqrt(X.^2 + Y.^2) + eps;
>> Z = sin(R)./R;
>> mesh(X,Y,Z)
Kết quả:
1.6. Lập trình trong Matlab
Trong Matlab, ta thực hiện các yêu cầu tại dấu nhắc trong cửa sổ lệnh nhanh và hiệu
quả, tuy nhiên với những lệnh được sử dụng nhiều lần, hoặc trong những chương
trình lớn, sử dụng nhiều câu lệnh, ta có thẻ lưu trong file và yêu cầu Matlab mở file
để thực hiện các lệnh.
Ví dụ trong bài toán vẽ độ thị trên, ta tạo một file dothi3D.m với nội dung:
function dothi3D
[X,Y] = meshgrid(-8:.5:8);
R = sqrt(X.^2 + Y.^2) + eps;
Z = sin(R)./R;
mesh(X,Y,Z)
Khi đó, để thực hiện nhóm câu lệnh trong file trên, tại dấu nhắc của cửa sổ lệnh, chỉ
việc gõ dothi3D
Khi lập trình trong Matlab chúng ta sử dụng các cấu trúc điều khiển và vòng lặp
giống như trong C:
• Biểu thức điều kiện: If, else , elseif. switch
• Vòng lặp: for, while.
1.7. Matlab GUI
Matlab GUI là là giao diện hình ảnh của chương trình, chúng bao gồm các nút bấm,
các thanh trượt, các cửa sổ, menu v.v được sử dụng để cung cấp cho người dùng
một môi trường làm việc đơn giản và thân thiện.
1.7.1. Môi trường làm việc
này có 2 tham số quan trọng:
• hObject : handle của điều khiển của control
• handles : là một cấu trúc chứa tất cả các điều khiển và dữ liệu người dùng.
Dùng cái này để truy suất các điều khiển khác.
Ví dụ
disp('Hello')
Chú ý, Matlab là ngôn ngữ lập trình thông dịch vì vậy sau khi sửa mã, không cần
biên dịch lại.
Để lấy dữ liệu và thiết lập thuộc tính cho điều khiển ta sử dùng 2 hàm là set và
get, cú pháp như sau:
get(handles.tag_dieu_khien, ‘ten thuoc tinh’);
set(handles.tag_dieu_khien, ‘ten_thuoc_tinh’, gia_tri);
Ví dụ viết chương trình để cộng 2 số:
x=get(handles.edit1,'string');
y=get(handles.edit2,'string');
x=str2num(char(x));
y=str2num(char(y));
z=x+y;
set(handles.text1,'string',num2str(z));
1.7.4. Debug trong Matlab
Khi đã viết xong chương trình hoàn chỉnh, để chạy chương trình có thể bấm nút Play
trên thanh công cụ hoặc F5 trong cửa sổ lập trình.
Trong trường hợp muốn debug chương trình, ta đặt breakpoint bằng phím F12, rồi
chạy chương trình, khi đó tại cửa sổ lệnh của Matlab con trước con trỏ để gõ lệnh sẽ
trở thành K>>
Muốn chuyển sang lệnh tiếp theo sử dụng phím tắt F10.
Trong quá trình viết chương trình, có thể in biến đang sử dụng ra bằng lệnh msgbox
Ví dụ:
msgbox(x,'Thong bao');
Lệnh trên được sử dụng để hiển thị giá trị của biến x, thuận tiện cho quá trình debug
n=1:k;
x=rand(1,k);
stem(n,x);
1.8. Bài tập chương 1
Bài 1. Nhập vào ma trận: A=[16 3 2 13; 5 10 11 8; 9 6 7 12; 4 15 14 1]
a. Tìm kích thước ma trận A
b. Lấy dòng đầu tiên của ma trận A.
c. Tạo ma trận B bằng 2 cột của ma trận A.
d. Tạo ma trận B bằng 3 dòng đầu của ma trận A.
e. Tính tổng các phần tử trên các cột của A
f. Tính tổng các giá trị ở cột 1,
g. Tính tổng các phần tử trên các hàng của A
Hướng dẫn giải:
a. Sử dụng hàm size
b. A(1,:)
c. B = A(:,[2,3])
d. B = A(1:3,:)
e. sum(A)
f. sum(A(:,1))
g. sum(A')
Bài 2. Giải hệ phương Ax=b, với: A=
013
352
101
−
−
và b =
2
1
1
viết như sau:
x[n]={-3 , 2, 4, -4, 0, 1…} với n là số nguyên
Tín hiệu tương tự ở đầu vào được chuyển sang dạng số nhờ một hệ biến đổi tương tự
- số. Quá trình rời rạc hóa còn gọi là quá trình lấy mẫu tín hiệu.
2.2. Các tín hiệu cơ sở
2.2.1. Dãy xung đơn vị
Dãy xung đơn vị hay còn gọi là hàm Delta, có giá trị bằng đơn vị khi đối số = 0 và
có giá trị bằng 0 trong các trường hợp còn lại:
{ }
,0,0,1,0,0,
0,0
0,1
)(
↑
=
≠
=
=
n
n
n
δ
Dãy xung đơn vị rất quan trọng, nó được sử dụng để xác định đáp ứng xung, với
một hệ thống tuyến tính nếu xác định được đáp ứng xung đơn vị thì có thể xác định
đượng đáp ứng của hệ thống. Bởi vì, một tín hiệu thời gian – rời rạc x[n] bất kỳ có
thể được triển khai thành một dãy xung đơn vị thích hợp theo công thức sau:
∑
đơn vị trên khoảng [n1,n2] ta viết một hàm trong matlab như sau:
function [x,n]=impseq(n0,n1,n2)
n=[n1:n2];
x=[(n-n0)==0];
Ví dụ: Tạo dãy xung đơn vị trong khoảng [-5:5]
n=[-5:5]
x=impseq(0,-5,5)
stem(n,x)
Kết quả:
2.2.2. Dãy nhảy bậc đơn vị
Dãy nhảy bậc đơn vị có giá trị bằng đơn vị khi đối số lớn hơn hoặc bằng 0, và bằng
0 khi đối số nhỏ hơn 0. Nó được ký hiệu là u[n] và được biểu diễn toán học như sau:
[ ]
<
≥
=
0n when 0
0n when 1
nu
Một dãy tín hiệu rời rạc theo thời gian bất kỳ x[n] để có thể khai triển thành một
tổng các dãy xung nhảy bậc đơn vị theo công thức: