You are on page 1of 24

TÀI LIỆU THÍ NGHIỆM XỬ LÝ SỐ TÍN HIỆU (EE2016) 1

BÀI 1: GIỚI THIỆU MATLAB CƠ BẢN

1. MỤC ĐÍCH THÍ NGHIỆM

- Giới thiệu tổng quan về Matlab và một số lệnh chức năng cơ bản.
- Giới thiệu công cụ SPTool trong hỗ trợ thiết kế bộ lọc số.
- Thực thi chương trình trên Matlab với các lệnh cơ bản về xử lý tín hiệu rời rạc.

2. THIẾT BỊ THÍ NGHIỆM

STT Tên thiết bị/Phần mềm Số lượng

01 Máy vi tính cá nhân có cài đặt phần mềm Matlab® 01

3. GIỚI THIỆU MATLAB® VÀ MỘT SỐ LỆNH CƠ BẢN

3.1. GIỚI THIỆU PHẦN MỀM MATLAB®


Matlab (Matrix Laboratory) là môi trường tính toán đa ứng dụng, được tính toán để thực hiện
nhanh các phép toán ma trận. Matlab hỗ trợ nhiều hàm phục vụ cho nhiều lĩnh vực khác nhau.
Matlab cho phép thực hiện dễ dàng các tính toán số và đồ họa. Khi khởi động Matlab, giao diên
làm việc sẽ xuất hiện như hình 1, với các cửa số sau:

 Cửa sổ lệnh (command window): thực thi các lệnh.

 Không gian biến (workspace): hiện thị các biến được định nghĩa.

 Các lệnh đã thực hiện (command history): hiện thị các lệnh đã sử dụng.

BỘ MÔN VIỄN THÔNG – ĐẠI HỌC BÁCH KHOA TP. HCM - Lưu hành nội bộ -
TÀI LIỆU THÍ NGHIỆM XỬ LÝ SỐ TÍN HIỆU (EE2016) 2

Hình 1. Các cửa sổ làm việc của Matlab

Để tra cứu thông tin của một hàm, chúng ta sử dụng cú pháp lệnh “help + tên hàm” trên cửa sổ
lệnh. Một ví dụ về tra thông tin của làm ‘sqrt’ được thực hiện như hình 2.

Hình 2. Lệnh giúp đỡ (help)


Matlab cung cấp 2 phương thức để thực thi các lệnh gồm i) Nhập lệnh từ dấu nhắc của cửa sổ
lênh và ii) thực thi lệnh thông qua M-files sử dụng Matlab Editor.

BỘ MÔN VIỄN THÔNG – ĐẠI HỌC BÁCH KHOA TP. HCM - Lưu hành nội bộ -
TÀI LIỆU THÍ NGHIỆM XỬ LÝ SỐ TÍN HIỆU (EE2016) 3

Một ví dụ về việc thực thi các lệnh từ dấu nhắc của cửa sổ lệnh được thực hiện cho phép cộng
5 + 3 và lưu kết quả vào biến ‘a’ như sau:

khi đó Matlab trả về kết quả là a = 8. Trong trường hợp biến lưu không được gán thì kết quả sẽ
được lưu trong biến ‘ans.’
Ngoài ra, Matlab cho phép thực hiện các lệnh thông qua M-files sử dụng ‘Matlab Editor.’ Hầu
hết các lệnh được tạo trong Matlab sẽ được lưu trữ dưới dạng tệp có phần mở rộng .m. Các tệp m
này chứa một chuỗi các lệnh Matlab được thực thi theo thứ tự khi chúng được gọi. Để tạo một tệp
m, trước tiên, hãy duyệt qua cửa sổ thư mục hiện tại trên thanh công cụ và đặt thư mục mà các tập
lệnh Matlab sẽ được lưu trữ. Tiếp theo, mở một tệp văn bản mới bằng cách nhấp vào biểu tượng
tài liệu trống trên thanh công cụ. Một tập lệnh trống mới sẽ được hiển thị trong cửa sổ ‘Editor.’
Tập lệnh có thể là một chuỗi các lệnh, sẽ được thực hiện từ trên xuống dưới. Các tệp M có thể
được gọi và thực thi từ cửa sổ lệnh bằng cách nhập tên của chúng. Ví dụ, bằng cách gõ Script trên
cửa sổ lệnh, một tệp m có tên Script.m sẽ được gọi và thực thi. (Bạn cũng có thể chạy tập lệnh
bằng menu gỡ lỗi trong trình chỉnh sửa hoặc phím tắt “Lưu và chạy”, F5.)

(Gợi ý: Không nên đặt tên tập lệnh bắt đầu bằng các số chẳng hạn như 123testing.m. Matlab sẽ
coi một lệnh bắt đầu bằng một số như một phép tính và vì 123testing là một phép tính không hợp
lệ trong MATLAB, một lỗi sẽ được trả về.)

Các chú thích có thể được chèn vào dòng lệnh bằng cách thêm ‘%’ vào đầu câu lệnh của bạn.
Ví dụ:

tan(x) = sin(x)/cos(x) %Tangent of an argument in radians


Bất kỳ câu lệnh nào xuất hiện sau dấu “%” trên một dòng đều bị MATLAB bỏ qua và coi như
một nhận xét.

Ví dụ tạo hàm M-files thực hiện phép cộng 5 + 3 được thực hiện qua các bước sau:

BỘ MÔN VIỄN THÔNG – ĐẠI HỌC BÁCH KHOA TP. HCM - Lưu hành nội bộ -
TÀI LIỆU THÍ NGHIỆM XỬ LÝ SỐ TÍN HIỆU (EE2016) 4

Bước 1: từ của sổ HOME chọn tab new, sau đó chọn ‘Script’

Bước 2: Viết lệnh vào cửa sổ script mới tạo sau đó lưu lại với tên bất kỳ. Khi đó chúng ta được
1 file .m lưu trong không gian ‘Current Folder’ như hình sau:

Bước 3: Để chạy file .m vừa tạo chúng ta có thể thực hiện theo một trong các cách: Chọn RUN
trong tab EDITOR, nhập tên file .m lên cửa sổ lệnh hoặc nhấn F5 trên bàn phím. Sau khi chạy sẽ
cho hiển thị kết quả a = 8 trên cửa sổ lệnh và một biến a được lưu trong không gian làm việc
‘Workspace.’ Kết quả như hình sau:

BỘ MÔN VIỄN THÔNG – ĐẠI HỌC BÁCH KHOA TP. HCM - Lưu hành nội bộ -
TÀI LIỆU THÍ NGHIỆM XỬ LÝ SỐ TÍN HIỆU (EE2016) 5

Thực hành: Thực hiện tạo một file .m với tên và lệnh bất kỳ.

3.2. MỘT SỐ LỆNH MATLAB® CƠ BẢN SỬ DỤNG TRONG MÔN HỌC

3.2.1. Một số lệnh cơ bản

a) Toán tử logic và quan hệ

Các toán tử logic và quan hệ cho phép so sánh các đại lượng vô hướng, ma trận hoặc từng phần
tử. Các toán tử sau đây có sẵn và được sử dụng rộng rãi trong lập trình Matlab.

< Nhỏ hơn <= Nhỏ hơn hoặc bằng


> Lớn hơn >= Lớn hơn hoặc bằng
== Bằng ~= Không bằng
| OR & AND
~ NOT

Các toán tử logic OR (|), AND (&), and NOT (~) được sử dụng để kết nối hoặc định lượng các
quan hệ. Khi các toán tử logic này được áp dụng cho các toán tử vô hướng, kết quả của các toán
tử này là các toán tử vô hướng là 0’s (Sai) hoặc 1’s (Đúng). Ví dụ, kết quả logic của phép tính 7
lớn hơn 8 được thực hiện như sau

>> 7 > 8
ans =

BỘ MÔN VIỄN THÔNG – ĐẠI HỌC BÁCH KHOA TP. HCM - Lưu hành nội bộ -
TÀI LIỆU THÍ NGHIỆM XỬ LÝ SỐ TÍN HIỆU (EE2016) 6

0
Nếu các toán tử quan hệ và logic này được áp dụng cho các ma trận có cùng kích thước, thì kết
quả đưa ra khi áp dụng các toán tử này là ma trận của 0 và 1 cho giá trị của mối quan hệ giữa các
mục nhập tương ứng. Ví dụ:

>> A = [1 2; 3 4]; B = [1 2 ; 3 5]; A == B


ans =
1 1
1 0

b) Vẽ đồ thị

Một trong những tính năng hữu ích của MATLAB là trực quan hóa dữ liệu (tức là vẽ biểu đồ).
Hai hàm biểu đồ phổ biến nhất sẽ được sử dụng trong xử lý tín hiệu số (DSP) là biểu đồ lệnh và
biểu đồ gốc. Nếu x và y là hai vectơ có cùng độ dài, thì biểu đồ (x, y) hoặc gốc (x, y) lập biểu đồ
x so với y bằng cách kết nối biểu đồ với các điểm dữ liệu. Sự khác biệt duy nhất giữa biểu đồ và
gốc là, biểu đồ sẽ vẽ một đồ thị liên tục trong khi gốc sẽ vẽ một đồ thị rời rạc. Các lệnh bên dưới
tạo ra biểu đồ của một đồ thị cosine bằng cách sử dụng biểu đồ và gốc của hàm.

x = 0:pi/20:2*pi; % Define vector x from 0 to 2pi with step size pi/100


y = sin(x); % Define vector y
subplot(1,2,1); % Create a graph with two sub-graphs in 1 row 2 column
and with subplot position 1
plot(x,y,'b-'); % Plot x versus y
axis([0 2*pi -1 1]);
xlabel('x (pi)');
ylabel('y=sin(x)'); %Label of x-axis and y-axis
title('Graph of Continuous Sine from 0 to 2pi'); %Title of graph

subplot(1,2,2);stem(x,y,'r-') %Plot p versus q with subplot position 2


axis([0 2*pi -1 1]);
xlabel('x (pi)');
ylabel('y=sin(x)'); %Label of p-axis and q-axis
title('Graph of Discrete Sine from 0 to 2pi'); %Title of graph

Từ các lệnh trên, véc tơ x được xác định với thành phần là các giá trị cách đều nhau từ 0 đến
2π với bước chạy là 0.05π và véc tơ y được định nghĩa là một hàm sin theo biến x. Có một tính
năng hữu ích khác có thể được sử dụng cùng với biểu đồ hoặc gốc là hàm có tên subplot. Hàm này
tạo một mảng các ô trong cùng một cửa sổ bằng cách chia ô hiện tại thành các ô hình chữ nhật

BỘ MÔN VIỄN THÔNG – ĐẠI HỌC BÁCH KHOA TP. HCM - Lưu hành nội bộ -
TÀI LIỆU THÍ NGHIỆM XỬ LÝ SỐ TÍN HIỆU (EE2016) 7

được đánh số theo hàng. Subplot được sử dụng kết hợp với ô hoặc gốc để tạo một mảng các ô
trong cùng một cửa sổ. Hàm subplot (m, n, p) chia cửa sổ hình thành ma trận m × n gồm các trục
nhỏ và vẽ đồ thị trên các trục thứ p và trả về xử lý trục. Các trục được tính từ hàng trên cùng của
cửa sổ Figure cho đến hàng dưới cùng của cửa sổ Figure.

Kết quả thu được như sau:

Hình trên cho thấy các đồ thị được tạo bởi các lệnh đã đề cập trước đó. Đồ thị ở bên trái được
tạo bởi đồ thị hàm số ‘plot(x,y)’ và đồ thị ở bên phải được tạo bởi gốc hàm ‘stem(x,y)’. Vị trí của
mỗi đồ thị được xác định bởi đồ thị hàm con subplot(m, n, p).

Ngoài ra, Matlab còn cung cấp các hàm cho phép vẽ đồ thị với các đặc tính khác như tỷ lệ
logarithm hoành độ và tung độ, vẽ đồ thị 3D …

Thực hành 1: Viết file-M thực hiện chương trình trên và lưu với tên
Bai1_NHOMx_PlotGraph.m
Yêu cầu 1: Ghi nhớ các lệnh matlab trong chương trình trên.

BỘ MÔN VIỄN THÔNG – ĐẠI HỌC BÁCH KHOA TP. HCM - Lưu hành nội bộ -
TÀI LIỆU THÍ NGHIỆM XỬ LÝ SỐ TÍN HIỆU (EE2016) 8

c) Vòng lặp và cấu trúc có điều kiện

Các lệnh phổ biến nhất trong MATLAB được sử dụng để viết vòng lặp, vòng lặp điều kiện và
câu lệnh điều kiện là for, while và if-else. Các câu lệnh điều khiển này hoạt động giống như bất kỳ
ngôn ngữ lập trình nào khác.

For: Một câu lệnh lặp; một ví dụ sử dụng lệnh for được hiển thị bên dưới:

>> n = 5;
A = [];
for i = 1:n,
A = [A, i^2];
end
>> A

A =

1 4 9 16 25
Câu lệnh này sẽ tạo ra một vector A có các thành phần là bình phương của chỉ số thành phần.

While: Hình thức chung của vòng lặp while trong Matlab được hiển thị bên dưới:

while conditions(relationships);
statements(actions)
end

Câu lệnh while sẽ được thực thi lặp đi lặp lại trong khi quan hệ vẫn đúng. Ví dụ dưới đây minh
họa luồng của câu lệnh while.

n = 0;
x = 5;
while n < x
n = n + 1;
fprintf('%d ', n);
end
Câu lệnh trên thực hiện việ in giá trị n khi n < x.

If: Hình thức chung của câu lệnh điều kiện if trong Matlab được hiển thị bên dưới:

if conditions(relationships)
statements (actions)
end

BỘ MÔN VIỄN THÔNG – ĐẠI HỌC BÁCH KHOA TP. HCM - Lưu hành nội bộ -
TÀI LIỆU THÍ NGHIỆM XỬ LÝ SỐ TÍN HIỆU (EE2016) 9

Các câu lệnh (hoặc hành động) sẽ chỉ được thực thi khi quan hệ là đúng. Nhiều nhánh của if
cũng có thể, như được minh họa bằng ví dụ bên dưới:

if n < 0
counter = 0;
elseif n = 0
counter = counter + 1;
else n > 0
counter = counter + 2;
end

3.3. MỘT SỐ PHÉP BIẾN ĐỔI TÍN HIỆU SỐ SỬ DỤNG MATLAB

3.3.1. Biến đổi DFT và IDFT

Phép biến đổi Fourier rời rạc - DFT của một tín hiệu rời rạc cho trước x  n    x 0 , x1 ,, x N 1 

được cho bởi biểu thức sau

N 1 N 1 2 nk
j
X  k    x nW nk
N   x ne N , k  0, , N  1.
n0 n0

Trong đó j là đơn vị phức. Phép biến đổi Fourier rời rạc ngược - IDFT của tín hiệu trước

X  k    X 0 , X 1 ,, X N 1  được cho bởi biểu thức sau

N 1 2 nk
1
x n   X ke
j
N , n  0, , N  1.
N k 0

Ngoài ra, Matlab cung cấp các lệnh ‘fft’ và ‘ifft’ được dùng tương ứng cho biến đổi Fourier rời
rạc thuận (DFT) và nghịch (IDFT). Cú pháp sử dụng 2 lệnh trên như sau Xk = fft(xn) và xn =
ifft(Xk).

Ý nghĩa của phép biến đổi Fourier là tìm giá trị trong miền tần số của tín hiệu. Do đó kết quả
của phép biến đổi DFT có thể cho chúng ta biết các thành phần tần số có trong tín hiệu. Hay nói
cách khác chúng ta có thể biết phổ của tín hiệu thông qua các giá trị biến đổi DFT. Từ chuỗi X  k 

chúng ta có thể tính giá trị phổ biên độ X  k  và phổ pha X  k  tương ứng bằng các lệnh ‘abs’

và ‘angle’ trong Matlab.

Ví dụ: Thực hiện chương trình Matlab tính DFT của tín hiệu x  n   1, 2,3, 4,5, 6 theo 2 cách

tính toán theo biểu thức và sử dụng lệnh Matlab fft.

BỘ MÔN VIỄN THÔNG – ĐẠI HỌC BÁCH KHOA TP. HCM - Lưu hành nội bộ -
TÀI LIỆU THÍ NGHIỆM XỬ LÝ SỐ TÍN HIỆU (EE2016) 10

clc;
close all;

xn = [1, 2, 3, 4, 5, 6];
L = length(xn); %find the length of the sequence
Xk = zeros(1,L); %initialize an array of same size as that
of input sequence

%DFT of the sequence


for k = 0:L-1
for n = 0:L-1
Xk(k+1) = Xk(k+1) + xn(n+1)*exp(-1j*2*pi*k*n/L);
end
end
% Using FFT Matlab
Xk_2 = fft(xn,L);

%Plotting input sequence


t=0:L-1;
subplot(1,3,1);
stem(t,xn);
ylabel ('Amplitude');
xlabel ('Time Index');
title('Input Sequence');

t=0:L-1;
% Find the magnitudes of individual DFT points
Xk_magnitude = abs(Xk);
Xk_2_magnitude = abs(Xk_2);
% plot the magnitude response
subplot(1,3,2);
stem(t,Xk_magnitude,'bo-'); hold on;
stem(t,Xk_2_magnitude,'r*--'); hold on;
ylabel ('Amplitude');
xlabel ('K');
title('Magnitude Response');

% Find the phases of individual DFT points


Xk_phase = angle(Xk);
Xk_2_phase = angle(Xk_2);
% plot the magnitude sequence
subplot(1,3,3);
stem(t,Xk_phase,'bo-'); hold on;
stem(t,Xk_2_phase,'r*--'); hold on;
ylabel ('Phase');
xlabel ('K');
title ('Phase Response');

BỘ MÔN VIỄN THÔNG – ĐẠI HỌC BÁCH KHOA TP. HCM - Lưu hành nội bộ -
TÀI LIỆU THÍ NGHIỆM XỬ LÝ SỐ TÍN HIỆU (EE2016) 11

legend('Computing', 'fft Matlab');

Kết quả thu được như hình sau:

Thực hành 2: Viết một file-M thực hiện chương trình trên và lưu với tên Bai1_NHOMx_DFT.m
Yêu cầu 2: Ghi nhớ các lệnh matlab trong chương trình trên.
Thực hành 3: Viết chương trình thực hiện biến đổi IDFT của chuỗi
X  k   10, 2  2i, 2, 2  2i  theo 2 cách. Lưu lại với tên Bai1_NHOMx_IDFT.m.

3.3.2. Tích chập

Giả sử ngõ ra của một bộ lọc là y  n  khi có tín hiệu ngõ vào x  n  và đáp ứng xung là h  n  .

Tín hiệu ngõ ra được xác định theo biểu thức tích chập và cho bởi y  n   x  n   h  n  . Xem xét

dạng trực tiếp của phép tích chập ta có

min  n , M 
y n   h  m  x  m  n ,
m  max  0,n  L x 1

Trong đó Giả sử có L x là chiều dài của tín hiệu x  n  và M là bậc của bộ lọc. Khi đó, ngõ ra

y  n  sẽ có chiều dài là L y  L x  N  1 .

BỘ MÔN VIỄN THÔNG – ĐẠI HỌC BÁCH KHOA TP. HCM - Lưu hành nội bộ -
TÀI LIỆU THÍ NGHIỆM XỬ LÝ SỐ TÍN HIỆU (EE2016) 12

Như vậy, ngõ ra y  n  có thể tìm được thông qua lưu đồ tính tích chập trực tiếp của x  n  và

h  n  như sau

Lx = length(xn);
N = length(hn);
M = N - 1;
Ly = Lx + M;

yn = zeros(1, Ly);
for n = 0 : Ly-1
for m = max(0,n-Lx + 1):min(n,M)
yn(n+1) = yn(n+1) + hn(m+1) * xn(n-m+1);
end
end

Ngoài ra, Matlab hỗ trợ phép tích chập khi sử dụng lênh conv(x,h).
Trạng thái quá độ và ổn định của ngõ ra được mô tả như trong hình sau

Trong đó, trạng thái quá độ ngõ vào lên trong khoảng mẫu 0 đến M-1, trạng thái ổn định trong
khoảng mẫu thứ M đến L-1, và vùng quá độ ngõ vào tắt trong khoảng mẫu L đến L + M – 1.
Như vậy một lưu ý quan trọng là sử dụng vùng ổn định của ngõ ra để đảm bảo tính chính xác trong
phân tích ở các bài thí nghiệm sau.

Thực hành 4: Viết một file-M tìm ngõ ra y(n) của hệ thống nhân quả với ngõ vào x(n) = [1, 3,
5, 3, 6, 3] và đáp ứng xung h(n) = [1, 4, 7, 2, 8] theo 2 cách, và lưu với tên
Bai1_NHOMx_conv.m

BỘ MÔN VIỄN THÔNG – ĐẠI HỌC BÁCH KHOA TP. HCM - Lưu hành nội bộ -
TÀI LIỆU THÍ NGHIỆM XỬ LÝ SỐ TÍN HIỆU (EE2016) 13

3.3.3. Đáp ứng tần số của bộ lọc

Để vẽ đáp ứng tần số của bộ lọc có hàm truyền H  z  chúng ta có thể thực hiện như sau. Xác định
đáp ứng tần số H   và khảo sát trong khoảng 0     .

5 1  0.4 z 1 
Ví dụ, phác họa đáp ứng miền tần số của bộ lọc có hàm truyền sau H  z   .
1  0.8 z 1
5  2e  j
Ta có đáp ứng tần số H    với   2 f / f s . Khi đó đồ thị đáp ứng tần số có thể
1  0.8e  j
được thực hiện thông qua chương trình Matlab sau
omega = 0:pi/10:pi;
H = (5 + 2*exp(-1j*omega))./(1-0.8*exp(-1j*omega));
H_manitude = abs(H);
H_phase = angle(H);
Ngoài ra, Matlab cho phép tính đáp ứng tần số từ các hệ số của hàm truyền thông qua lệnh freqz
như sau
a = [1, -0.8];
b = [5, 2];
[H_matlab, w] = freqz(b,a); stem
plot(w,H_matlab_manitude)
H_matlab_manitude = abs(H_matlab); semilogy(x, y)
H_matlab_phase = angle(H_matlab); semilogy(w,H_matlab_manitude)
Trong đó a, b là vec tơ hệ số của mẫu và tử của hàm truyền. freqz(h)
Trong cả 2 cách thực hiện nêu trên, đáp ứng tần số

Thực hành 5: Viết một file-M vẽ đáp ứng tần số của hệ thống có hàm truyền trên theo 2 cách:
i) tính toán đáp ứng tần số và ii) sử dụng hàm Matlab, và lưu với tên Bai1_NHOMx_freqz.m

3.3.4. Tạo mẫu giá trị một số tín hiệu cơ bản

a) Tín hiệu Sine

Yêu cầu: tạo mẫu tín hiệu sin với tần số F = 300 Hz, tần số lấy mẫu Fs = 8 kHz trong khoảng thời
gian từ 0 đến 0.01 (s). Sau đó vẽ các đồ thị tín hiệu theo thời gian và mẫu. Xác định và vẽ biểu đồ
phổ biên độ và phổ pha của tín hiệu.
Trước tiên chúng ta có các thời điểm lấy mẫu của tín hiệu là: 0, Ts, 2Ts … 0.01 – Ts, với Ts là chu
kỳ lấy mẫu. Khi đó mẫu tín hiệu có thể thực hiện theo chương trình sau:

clc
clear

BỘ MÔN VIỄN THÔNG – ĐẠI HỌC BÁCH KHOA TP. HCM - Lưu hành nội bộ -
TÀI LIỆU THÍ NGHIỆM XỬ LÝ SỐ TÍN HIỆU (EE2016) 14

% Signal Genergating
Fs = 8e3; % Sampling frequency 8 kHz
Ts = 1/Fs; % Sampling period
F_xt = 300; % Frequency of signal 300 Hz

T_sim = 0.01; % Signal duration in seconds 50 ms


t = 0 : Ts : T_sim - Ts;

xn = sin(2 * pi * F_xt * t);

N = length(xn); % DFT length = signal length


Xk = fft(xn, N); % DFT of signal
Xk_Man = abs(Xk);
Xk_Pha = angle(Xk);

%% Signal plot
figure(1)
subplot(1,2,1)
hold on
plot(t, xn);
xlabel('Time (sec)');
ylabel('Amplitude');
title('Nhom: xx | MSSV: yyyyy');

subplot(1,2,2)
hold on
plot(0:N-1, xn);
xlabel('Sampling index - n');
ylabel('Amplitude');
title('Nhom: xx | MSSV: yyyyy');

%% Spectrum plot
figure(2)
subplot(1,2,1)
stem((0:N/2-1)*Fs/N, Xk_Man(1:N/2) / N);
xlabel('Frequency (Hz)');
ylabel('Amplitude');
title('Nhom: xx | MSSV: yyyyy');

subplot(1,2,2)
plot((0:N/2-1)*Fs/N, Xk_Pha(1:N/2) );
xlabel('Frequency (Hz)');
ylabel('Phase');
title('Nhom: xx | MSSV: yyyyy');

BỘ MÔN VIỄN THÔNG – ĐẠI HỌC BÁCH KHOA TP. HCM - Lưu hành nội bộ -
TÀI LIỆU THÍ NGHIỆM XỬ LÝ SỐ TÍN HIỆU (EE2016) 15

Thực hành 6: Viết các chương trình Matlab thực hiện các yêu cầu sau:

1 Tạo 5 chu kỳ mẫu tín hiệu s1  cos  2 f 1t  với f 1  400 Hz, tần số lẫy mẫu 8000 Hz.

1 T 4  t  3T 4
2 Tạo mẫu tín hiệu s 3   được lấy mẫu với 20 trong 1 chu kỳ T.
0 elsewhere
3 Tạo tín hiệu sinc s 4  sinc  2 f 4  t  0.5  với f 4  40 Hz, 0  t  1 (s) và được lấy

mẫu ở tần số 500 Hz.

b) Tín hiệu khác

Ngoài ra Matlab còn cung cấp các hàm tín hiệu khác như bảng sau:
Hàm Lệnh Matlab
Dirac dirac
Bước đơn vị Heaviside
Xung vuông rectpuls
Xung tam giác tripuls

3.4. THIẾT KẾ BỘ LỌC SỐ VỚI MATLAB®

3.4.1. Thiết kế bộ lọc số với công cụ SPTool

SPTool là một công cụ có giao diện tương tác dùng cho xử lý số tín hiệu. Công cụ này có thể
được sử dụng để phân tích tín hiệu, thiết kế các bộ lọc, phân tích các bộ lọc, lọc tín hiệu và phân
tích phổ của tín hiệu. Để khởi động SPTool, từ dấu nhắc lệnh của MATLAB, nhập lệnh
>> sptool

Khi đó, giao diện của SPTool sẽ xuất hiện như sau:

BỘ MÔN VIỄN THÔNG – ĐẠI HỌC BÁCH KHOA TP. HCM - Lưu hành nội bộ -
TÀI LIỆU THÍ NGHIỆM XỬ LÝ SỐ TÍN HIỆU (EE2016) 16

Hình 3. Giao diện của SPTool.


Khi mới mở SPTool, nó chứa một tập hợp các tín hiệu, bộ lọc và phổ mặc định. Trên giao diện
của SPTool, có 3 cột: Signals, Filters và Spectra. Dưới mỗi cột có các nút sử dụng cho cột đó.
Cột Signals hiển thị các tín hiệu, cột Filters hiển thị các bộ lọc và cột Spectra hiển thị các phổ
trong workspace (vùng làm việc) của SPTool.

Các tín hiệu, bộ lọc hoặc phổ trong workspace của MATLAB có thể được đưa vào SPTool bằng
lệnh Import trong menu File của SPTool. Các tín hiệu, bộ lọc hoặc phổ được tạo ra hoặc được
import vào SPTool tồn tại dưới dạng các cấu trúc của MATLAB. Để lưu lại các tín hiệu, bộ lọc và
phổ đã tạo ra hoặc chỉnh sửa trong SPTool, sử dụng lệnh Export trong menu File, chúng cũng sẽ
được lưu lại dưới dạng các cấu trúc MATLAB.

Để bắt đầu thiết kế một bộ lọc mới, các bạn hãy nhấn vào nút New ngay dưới cột Filter. Khi
đó, giao diện Filter Designer dùng để thiết kế bộ lọc như sau sẽ xuất hiện.

Filter Designer cung cấp một môi trường đồ họa tương tác để thiết kế các bộ lọc số IIR hoặc
FIR dựa trên các tiêu chuẩn do người dùng xác định.

 Các loại bộ lọc có thể thiết kế: Thông thấp, thông cao, thông dải, chắn dải.
 Các phương pháp thiết kế bộ lọc FIR: Equiripple, Least squares, Window
 Các phương pháp thiết kế bộ lọc IIR: Butterworth, Chebyshev loại I, Chebyshev loại II,
Elliptic.

BỘ MÔN VIỄN THÔNG – ĐẠI HỌC BÁCH KHOA TP. HCM - Lưu hành nội bộ -
TÀI LIỆU THÍ NGHIỆM XỬ LÝ SỐ TÍN HIỆU (EE2016) 17

Hình 4. Giao diện Filter Designer

Ví dụ 1: Thiết kế một bộ lọc FIR chắn dải sử dụng công cụ SPTool với các thông số sau:

 Bộ lọc được thiết kế bằng phương pháp cửa sổ Kaiser


 Chiều dài của đáp ứng xung: N = 89 (MATLAB hiển thị bậc bộ lọc bằng 88)
 Tần số trung tâm: 2700 Hz
 Tần số cắt: 2500 Hz và 2900 Hz
 Giá trị của  = 4
 Tần số lấy mẫu 8000 Hz

Các bước thiết kế như sau:

1. Khởi động SPTool. Dưới cột Filters, nhấn nút New để mở cửa sổ Filter Designer.
2. Trong giao diện của Filter Designer:
a. Trong text box Filter: Tên bộ lọc được tự đặt (ở đây là filt1). Tên này có thể thay
đổi sau này.
b. Nhập các thông số thiết kế vào:
i. Sampling Frequency = 8000
ii. Algorithm: Kaiser Window FIR

BỘ MÔN VIỄN THÔNG – ĐẠI HỌC BÁCH KHOA TP. HCM - Lưu hành nội bộ -
TÀI LIỆU THÍ NGHIỆM XỬ LÝ SỐ TÍN HIỆU (EE2016) 18

iii. Bỏ chọn ở check box Minimum Order. (nếu chọn thì sẽ thiết kế bộ lọc có
bậc tối thiểu).
iv. Filter Order = 88, Type = Bandstop, Fc1 = 2500, Fc2 = 2900, Beta = 4
c. Nhấn Apply. Khi đó đáp ứng tần số của bộ lọc thiết kế sẽ được hiển thị.

Hình 5. Đáp ứng tần số của bộ lọc đã thiết kế


3. Trở về cửa sổ SPTool, trong cột Filters sẽ xuất hiện thêm một dòng filt1 [design]. Đây
chính là bộ lọc vừa thiết kế. Nếu muốn sửa đổi thiết kế, chúng ta có thể nhấn chọn tên
bộ lọc và nhấn nút Edit ở phía dưới. Để dễ nhớ, ta sẽ thay đổi tên bộ lọc trên thành
bs2700 bằng cách chọn Edit  Name…filt1 [design]. Trong cửa sổ mới xuất hiện,
nhập tên mới.
Khi thiết kế một bộ lọc FIR như trên, kết quả mà ta cần nhận được sau khi thiết kế là các giá
trị của vector đáp ứng xung h của bộ lọc thiết kế. Để lấy các giá trị của vector đáp ứng xung,
ta thực hiện như sau:
1. Từ cửa sổ SPTool, chọn File  Export… Trong Export list xuất hiện, chọn
Filter: bs2700 [design] rồi nhấn nút Export to workspace
2. Đóng cửa sổ SPTool lại. Một thông báo xuất hiện hỏi có muốn lưu lại phiên làm việc
hiện tại hay không. Nếu muốn lưu lại, chọn Save.

BỘ MÔN VIỄN THÔNG – ĐẠI HỌC BÁCH KHOA TP. HCM - Lưu hành nội bộ -
TÀI LIỆU THÍ NGHIỆM XỬ LÝ SỐ TÍN HIỆU (EE2016) 19

3. Mở cửa sổ Workspace của MATLAB, ta sẽ thấy trong workspace sẽ xuất hiện biến
mới là bs2700. Đây chính là bộ lọc mà ta đã thiết kế trong SPTool và xuất ra workspace
của MATLAB. Biến này được lưu dưới dạng một cấu trúc mô tả bộ lọc đã thiết kế.
Nhấn đúp chuột vào tên biến bs2700 trong workspace, ta sẽ thấy được các field của
cấu trúc này như sau:

Hình 6. Các field của bs2700


4. Trong các field này, field tf thể hiện hàm truyền của bộ lọc. Field này cũng là một cấu
trúc gồm 2 field: tf.num và tf.den thể hiện tương ứng các hệ số của đa thức tử số và
đa thức mẫu số. Đối với bộ lọc FIR, hàm truyền chỉ có tử số và các hệ số của tử số
chính là đáp ứng xung của bộ lọc. Do đó, với bộ lọc trên, các giá trị của vector đáp
ứng xung được lưu trong bs2700.tf.num. Trong cửa sổ Array Editor trên, lần lượt nhấn
đúp vào field tf rồi nhấn đúp vào num, ta sẽ thấy các hệ số đáp ứng xung của bộ lọc.
Để gán các hệ số này vào một vector h, trong MATLAB có thể dùng lệnh sau:
>> h = bs2700.tf.num

BỘ MÔN VIỄN THÔNG – ĐẠI HỌC BÁCH KHOA TP. HCM - Lưu hành nội bộ -
TÀI LIỆU THÍ NGHIỆM XỬ LÝ SỐ TÍN HIỆU (EE2016) 20

Hình 7. Vector đáp ứng xung của bộ lọc đã thiết kế


Các giá trị thu được của vector đáp ứng xung sẽ được sử dụng để thực hiện bộ lọc số lên trên
kit DSP.

Thực hành 7: Thực hiện việc thiết kế bộ lọc FIR chắn dải với các thông số như trong ví dụ 1.
Lấy các hệ số của bộ và viết chương trình vẽ đáp ứng tần số của bộ lọc trên. Lưu lại với tên
BAI_1_NHOMx_bs2700_freqz.
Sử dụng hàm semilogy thay cho plot đưa ra nhận xét về sự khác biệt.

Ví dụ 2: Thiết kế bộ lọc IIR chắn dải sử dụng công cụ SPTool với các yêu cầu sau:
Sử dụng phương pháp Elliptic để thiết kế một bộ lọc IIR chắn dải bậc 10, tần số trung tâm
1750Hz. Chú ý rằng MATLAB hiển thị bậc bộ lọc là 5, biểu diễn số phần bậc 2 của bộ lọc. (Điều
này đúng với các bộ lọc IIR thông dải và chắn dải)
Các thông số của bộ lọc này như sau.

 Tần số cắt: 1700 Hz và 1800 Hz


 Độ gợn dải thông và dải chắn tương ứng là 1 dB và 60 dB
 Tần số lấy mẫu: 8000 Hz
Cách thực hiện:
Thực hiện tương tự như ví dụ trên, lưu bộ lọc thiết kế với tên bs1750 và xuất ra workspace.
Trong workspace sẽ có một cấu trúc tên là bs1750. Các hệ số tử số và mẫu số của hàm truyền được
lưu tương ứng trong các biến bs1750.tf.num và bs1750.tf.den.

BỘ MÔN VIỄN THÔNG – ĐẠI HỌC BÁCH KHOA TP. HCM - Lưu hành nội bộ -
TÀI LIỆU THÍ NGHIỆM XỬ LÝ SỐ TÍN HIỆU (EE2016) 21

Hình 8. Đáp ứng tần số của bộ lọc IIR đã thiết kế

Dạng cực – zero của một hàm truyền H(z) như sau:

H ( z)  k
z  z1 z  z 2 ...z  z n 
z  p1 z  p2 ...z  pm 
Hàm truyền trên có thể được viết lại như sau:
L L
b0 k  b1k z 1  b2 k z 2
H ( z )  g  H k z   g  1
k 1 k 1 1  a1k z  a2 k z 2
Với L là số nguyên gần nhất lớn hơn cực đại của n/2 và m/2.
Trong MATLAB, các phần bậc 2 của H(z) được lưu trong 1 ma trận như sau:
 b01 b11 b21 1 a11 a21 
b b12 b22 1 a12 a22 
sos   02

       
 
b0 L b1L b2 L 1 a1L a2 L 
Từ các hệ số tử và mẫu ở trên, ta sẽ chuyển thành dạng các phần bậc hai bằng các lệnh sau:

>> [z,p,k] = tf2zp(bs1750.tf.num, bs1750.tf.den)


>> sos = zp2sos(z,p,k)
Các phần tử của ma trận sos này sẽ được sử dụng để thực hiện bộ lọc IIR này lên kit DSP.

BỘ MÔN VIỄN THÔNG – ĐẠI HỌC BÁCH KHOA TP. HCM - Lưu hành nội bộ -
TÀI LIỆU THÍ NGHIỆM XỬ LÝ SỐ TÍN HIỆU (EE2016) 22

Thực hành 8: Thực hiện việc thiết kế bộ lọc FIR chắn dải với các thông số như trong ví dụ 2.
Lấy các hệ số của bộ và viết chương trình vẽ đáp ứng tần số của bộ lọc trên. Lưu lại với tên
BAI_1_NHOMx_bs2700_freqz.
Sử dụng hàm semilogy thay cho plot.

3.4.2. Thiết kế bộ lọc bằng lệnh của MATLAB

Bên cạnh việc sử dụng công cụ SPTool để thiết kế bộ lọc như trên, MATLAB cũng có một số
lệnh có thể sử dụng để thiết kế bộ lọc. Các lệnh này có thể được sử dụng khi thiết kế một số loại
bộ lọc mà SPTool không có sẵn, ví dụ như các bộ lọc multiband.
Ví dụ 1: Thiết kế bộ lọc FIR multiband bằng các lệnh MATLAB
Trong ví dụ này, chúng ta sẽ thiết kế một bộ lọc FIR multiband gồm 63 hệ số. Tần số lấy mẫu
là 10 kHz. Chúng ta sử dụng hàm remez của MATLAB. Hàm remez sử dụng giải thuật Parks –
McClellan dựa trên giải thuật Remez và lý thuyết xấp xỉ Chebyshev.
Bộ lọc cần thiết kế có đáp ứng tần số như sau:

1.2

0.8

0.6

0.4

0.2

0
0 500 1000 1500 2000 2500 3000 3500 4000 4500 5000

Hình 9. Đáp ứng tần số của bộ lọc multiband FIR cần thiết kế

Bộ lọc mong muốn có 2 dải thông, được biểu diễn bởi 5 dải như sau:

Dải Tần số (Hz) Tần số chuẩn hóa f/FN Biên độ


1 0 – 500 0 – 0.1 0

BỘ MÔN VIỄN THÔNG – ĐẠI HỌC BÁCH KHOA TP. HCM - Lưu hành nội bộ -
TÀI LIỆU THÍ NGHIỆM XỬ LÝ SỐ TÍN HIỆU (EE2016) 23

2 600 – 900 0.12 – 0.18 1


3 1000 – 1500 0.2 – 0.3 0
4 1600 – 1900 0.32 – 0.38 1
5 2000 - 5000 0.4 - 1 0
Trong đó FN là tần số Nyquist, bằng ½ tần số lấy mẫu. Chúng ta viết một file .m để thiết kế bộ
lọc này, lưu lại với tên multibandfir63.m. Nội dung của file này như sau:

%multibandfir63.m: Multiband FIR filter with 63 coefficients


f = [0 0.1 0.12 0.18 0.2 0.3 0.32 0.38 0.4 1];
m = [0 0 1 1 0 0 1 1 0 0];
n = 63;
cof = remez(n-1,f,m);
% frequency response with 256 points
[h w] = freqz(cof,1,256);
% plot magnitude of the filter
plot(f * 5000,m, 'b'); hold on;
plot(w/pi*5000,abs(h), 'r-.');

Trong đoạn chương trình trên, có một số lưu ý:

 Dòng lệnh cof = remez(n-1,f,m) trả về vector hệ số của bộ lọc FIR bậc n – 1, với f và
m xác định các dải tần số theo bảng ở trên.

 Lệnh freqz để tính đáp ứng tần số của bộ lọc

 Lệnh plot thứ nhất vẽ đáp ứng tần số mong muốn dựa trên f và m.

 Lệnh figure tạo ra một cửa sổ mới và lệnh plot thứ hai vẽ đáp ứng tần số của bộ lọc đã
thiết kế được lên cửa sổ mới này.

 Ở đây, kết quả của quá trình thiết kế mà ta cần nhận được chính là các hệ số chứa trong
biến cof. Chúng được sử dụng khi thực hiện bộ lọc lên trên kit DSP.

Ví dụ 2: Thiết kế bộ lọc IIR multiband bằng các lệnh của MATLAB


Trong thí nghiệm này, chúng ta thiết kế một bộ lọc IIR multiband có đáp ứng mong muốn như
bộ lọc ở ví dụ 1. Tần số lấy mẫu cũng là 10 kHz. Các bước thiết kế giống như trên với nội dung
file multibandiir63.m dùng để thiết kế như sau:
%multibandiir63.m: Multiband IIR filter with 63 coefficients
f = [0 0.1 0.12 0.18 0.2 0.3 0.32 0.38 0.4 1];
m = [0 0 1 1 0 0 1 1 0 0];

BỘ MÔN VIỄN THÔNG – ĐẠI HỌC BÁCH KHOA TP. HCM - Lưu hành nội bộ -
TÀI LIỆU THÍ NGHIỆM XỬ LÝ SỐ TÍN HIỆU (EE2016) 24

n = 63;
[num, den] = yulewalk(n-1,f,m);
% frequency response with 256 points
[h w] = freqz(num,den,256);
% plot magnitude of the filter
plot(f * 5000,m, 'b'); hold on;
plot(w/pi*5000,abs(h), 'r-.');
Trong đoạn chương trình trên, lưu ý:
 Lệnh remez được thay bằng lệnh yulewalk dùng để thiết kế bộ lọc IIR. Lệnh này trả về
các hệ số của tử số và mẫu số của hàm truyền bộ lọc, được chứa tương ứng trong biến
num và den.

 Lệnh freqz được sửa đổi để vẽ đáp ứng tần số của bộ lọc IIR đã thiết kế.

Các giá trị của num và den sẽ được sử dụng để thực hiện bộ lọc.

Thực hành: Thực hiện các chương trình thiết kế bộ lọc thông dải đa dải và vẽ đáp ứng tần số
với các yêu cầu như trong ví dụ 1 và 2.
Thực hành: Thiết kế bộ lọc FIR chắn đa dải 1000-1500 và 2500-3000, có bậc 62, tần số lấy
mẫu là 10 kHz. Sau đó vẽ đáp ứng tần số của bộ lọc.
Thực hành: Thiết kế bộ lọc IIR chắn đa dải 1000-1500 và 2500-3000, có bậc 62, có tần số lấy
mẫu là 10 kHz. Sau đó vẽ đáp ứng tần số của bộ lọc.

4. TIẾN TRÌNH THÍ NGHIỆM

Sinh viên thực hiện các yêu cầu và thực hành trong bài và viết báo cáo thực hiện.

BỘ MÔN VIỄN THÔNG – ĐẠI HỌC BÁCH KHOA TP. HCM - Lưu hành nội bộ -

You might also like