Professional Documents
Culture Documents
B1 GIỚI THIỆU MATLAB CƠ BẢN - Sinh vien
B1 GIỚI THIỆU MATLAB CƠ BẢN - Sinh vien
- 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.
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.
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.
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ướ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:
Thực hành: Thực hiện tạo một file .m với tên và lệnh bất kỳ.
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.
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 =
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ụ:
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.
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 đượ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.
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.
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
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
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
được cho bởi biểu thức sau
Trong đó 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
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
chúng ta có thể tính giá trị phổ biên độ và phổ pha 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 theo 2 cách
tính toán theo biểu thức và sử dụng lệnh Matlab fft.
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
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');
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
theo 2 cách. Lưu lại với tên Bai1_NHOMx_IDFT.m.
Giả sử ngõ ra của một bộ lọc là khi có tín hiệu ngõ vào và đáp ứng xung là .
Tín hiệu ngõ ra được xác định theo biểu thức tích chập và cho bởi . Xem xét
dạng trực tiếp của phép tích chập ta có
Trong đó Giả sử có là chiều dài của tín hiệu và là bậc của bộ lọc. Khi đó, ngõ ra
sẽ có chiều dài là .
Như vậy, ngõ ra có thể tìm được thông qua lưu đồ tính tích chập trực tiếp của và
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
Để vẽ đáp ứng tần số của bộ lọc có hàm truyền chúng ta có thể thực hiện như sau. Xác
Ví dụ, phác họa đáp ứng miền tần số của bộ lọc có hàm truyền sau .
Ta có đáp ứng tần số với . Khi đó đồ thị đáp ứng tần số có thể
đượ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);
H_matlab_manitude = abs(H_matlab);
H_matlab_phase = angle(H_matlab);
Trong đó a, b là vec tơ hệ số của mẫu và tử của hàm truyền.
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
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
% Signal Genergating
Fs = 8e3; % Sampling frequency 8 kHz
Ts = 1/Fs; % Sampling period
F_xt = 300; % Frequency of signal 300 Hz
%% 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');
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 với Hz, tần số lẫy mẫu 8000 Hz.
2 Tạo mẫu tín hiệu được lấy mẫu với 20 trong 1 chu kỳ T.
3 Tạo tín hiệu sinc với Hz, (s) và được lấy mẫu
ở tần số 500 Hz.
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
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:
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.
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:
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
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ị.
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.
Dạng cực – zero của một hàm truyền H(z) như sau:
( z−z 1 )( z−z 2 ) .. . ( z−z n )
H ( z )=k
( z− p 1 ) ( z− p2 ) .. . ( z− pm )
Hàm truyền trên có thể được viết lại như sau:
L L −1 −2
b 0k +b1 k z +b 2k z
H ( z )=g ∏ H k ( z )=g ∏ −1 −2
k =1 k =1 1+a1k z +a2 k z
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:
[ ]
b 01 b11 b 21 1 a11 a21
sos= b 02 b12 b 22 1 a12 a22
⋮ ⋮ ⋮ ⋮ ⋮ ⋮
b0 L b1 L b 2 L 1 a1 L a 2 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:
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ò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 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.
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.