You are on page 1of 27

BÀI 3: THIẾT KẾ VÀ THỰC HIỆN CÁC BỘ

LỌC IIR TRÊN MATLAB


GVHD: THẦY HUỲNH VĂN PHẬN

HỌ VÀ TÊN SV BÁO CÁO : MAI THÀNH DANH MSSV: 1910907

1.1. Các bộ lọc IIR


1.1.1. Bộ lọc IIR chắn dải
Thiết kế, thực hiện và kiểm tra một bộ lọc IIR chắn dải bậc 10, tần số trung tâm
1750Hz, sử dụng phương pháp Elliptic với các thông số 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
 Thiết kế bộ lọc dùng SPTool trên MATLAB:
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à filt2). Tên này có
thể thay đổi sau này.
b. Nhập các thông số thiết kế vào:
 Response Type = Bandstop
 Design Method = IIR Elliptic
 Specify Order: 10

 Frequency Specifications: Fs = 8000, Fc1 = 1700, Fc2 = 1800.


 Apass = 1, Astop = 60.
c. Nhấn Design Filter. Khi đó đáp ứng tần số của bộ lọc thiết kế sẽ được
hiển thị. Lưu lại kết quả và kiểm tra xem đây có phải bộ lọc chắn dải như
mong muốn không?
3. Trở về cửa sổ SPTool, trong cột Filters sẽ xuất hiện thêm một dòng filt2
[design]. Đây chính là bộ lọc vừa thiết kế. Thay đổi tên bộ lọc trên thành
bs1750 bằng cách chọn Edit  Name…filt2 [design]. Trong cửa sổ mới
xuất hiện, nhập tên mới.
4. Từ cửa sổ SPTool, chọn File  Export… Trong Export list xuất hiện, chọn
Filter: bs1750 [design] rồi nhấn nút Export to workspace
5. Đó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.
6. Mở cửa sổ Workspace của MATLAB, ta sẽ thấy trong workspace sẽ xuất
hiện biến mới là bs1750. Đâ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 bs1750 trong
workspace, ta sẽ thấy được các field của cấu trúc này.
7. 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ố. Để chuyển các hệ số này sang dạng
mỗi tầng bậc hai (second-order section), trong MATLAB có thể dùng các
lệnh sau:
>> [z,p,k] = tf2zp(bs1750.tf.num, bs1750.tf.den) ;
>> sos = zp2sos(z,p,k);
Ma trận sos trong MATLAB như sau:
b00 b01 b02 1 a 01 a 02 
b b11 b12 1 a11 a12 
sos   10
 
 
b L 0 b L1 bL2 1 a L1 a L2 

trong đó b0i, b1i, b2i là các hệ số tử số hàm truyền của phần bậc 2 thứ i và 1,
a1i, a2i là các hệ số mẫu số của hàm truyền của phần bậc 2 thứ i.
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. Ghi nhận
các giá trị b và a vào bảng sau

0.8527 -0.3329 0.8527 -0.3484 0.7846

1.0000 -0.3614 1.0000 -0.2809 0.9638


1.0000 -0.4194 1.0000 -0.4840 0.9645
1.0000 -0.3460 1.0000 -0.3119 0.9943
1.0000 -0.4345 1.0000 -0.4656 0.9944

 Thực hiện bộ lọc IIR trên Matlab


Chương trình Matlab thực hiện bộ lọc như sau:
function y = IIR(a,b,x,Ly)
L = length(b);
M = length(a);
Lx = length(x);
v = zeros(1,L);
w = zeros(1,M);
xn = [x zeros(1,Ly-Lx)];
for i = 1:Ly
c1 = 0;
c2 = 0;
v(1,1) = xn(1,i);
for k = 2 : M
c1 = c1 - a(1,k)*w(1,k);
end
for k = 1 : L
c2 = c2 + b(1,k)*v(1,k);
end
w(1,1) = c1 + c2;
y(1,i) = w(1,1);
for k = L:-1:2
v(1,k) = v(1,k-1);
end
for k = M:-1:2
w(1,k) = w(1,k-1);
end
end
end
 Kiểm tra bộ lọc
1. Kiểm tra bộ lọc với tín hiệu sine đa tần có các thành phần tần số 1000 Hz và
1750 Hz:
- Code: (tạo ra 480 mẫu ngõ ra)
clc;
clf;
Fs = 8e3;
Ts = 1/Fs;
t = 0 : Ts : 0.06 -Ts;
xn = sin(2000*pi*t) + sin(3500*pi*t);
a = bs1750.tf.den;
b = bs1750.tf.num;
yn = IIR(a,b,xn,480);
N = length(xn);
N1 = length(yn);
n = 0 : N/2 - 1;
n1 = 0 : N1/2 - 1;
Xn = fft(xn);
Yn = fft(yn);
X_mag = abs(Xn);
Y_mag = abs(Yn);
subplot(121)
plot(n*(Fs/N),X_mag(1:N/2)/N)
title('Pho bien do ngo vao');
xlabel('Frequency (Hz)');
ylabel('Amplitude');
subplot(122)
plot(n1*(Fs/N1),Y_mag(1:N1/2)/N1)
title('Pho bien do ngo ra');
xlabel('Frequency (Hz)');
ylabel('Amplitude');

function y = IIR(a,b,x,Ly)
L = length(b);
M = length(a);
Lx = length(x);
v = zeros(1,L);
w = zeros(1,M);
xn = [x zeros(1,Ly-Lx)];
for i = 1:Ly
c1 = 0;
c2 = 0;
v(1,1) = xn(1,i);
for k = 2 : M
c1 = c1 - a(1,k)*w(1,k);
end
for k = 1 : L
c2 = c2 + b(1,k)*v(1,k);
end
w(1,1) = c1 + c2;
y(1,i) = w(1,1);
for k = L:-1:2
v(1,k) = v(1,k-1);
end
for k = M:-1:2
w(1,k) = w(1,k-1);
end
end
end
- Kết quả:
- Ngõ vào có 2 vạch phổ ở tần số 1000 Hz và 1750 Hz đúng với lý thuyết.
- Bộ lọc IRR chắn dải có tần số trung tâm 1750 Hz, nên ngõ ra chỉ còn 1
vạch phổ ở tần số 1000 Hz, vạch phổ 1750 Hz bị loại bỏ.

2. Kiểm tra bộ lọc với ngõ vào tín hiệu tổng của các tín hiệu sin tần số 100 – 3900
Hz:
Chương trình Matlab thực hiện yêu cầu:
% Matlab code
clc;
clf;
Fs = 8e3;
Ts = 1/Fs;
t = 0 : Ts : 0.05 - Ts; %Signal duration in 50 ms
xn = 0;
for k = 100 : 100 : 3900
xn = xn + sin(2*pi*k*t);
end
N = length(xn)
a = bs1750.tf.den;
b = bs1750.tf.num;
yn = IIR(a,b,xn,400);
N1 = length(yn);
Xn = fft(xn);
X_mag = abs(Xn);
Yn = fft(yn);
Y_mag = abs(Yn);
figure(1)
n = 0 : N/2 - 1;
n1 = 0 : N1/2 - 1;
subplot(121)
plot(n*(Fs/N),X_mag(1:N/2)/N)
title('Pho bien do ngo vao');
xlabel('Frequency (Hz)');
ylabel('Amplitude');
subplot(122)
plot(n1*(Fs/N1),Y_mag(1:N1/2)/N1)
title('Pho bien do ngo ra');
xlabel('Frequency (Hz)');
ylabel('Amplitude');

function y = IIR(a,b,x,Ly)
L = length(b);
M = length(a);
Lx = length(x);
v = zeros(1,L);
w = zeros(1,M);
xn = [x zeros(1,Ly-Lx)];
for i = 1:Ly
c1 = 0;
c2 = 0;
v(1,1) = xn(1,i);
for k = 2 : M
c1 = c1 - a(1,k)*w(1,k);
end
for k = 1 : L
c2 = c2 + b(1,k)*v(1,k);
end
w(1,1) = c1 + c2;
y(1,i) = w(1,1);
for k = L:-1:2
v(1,k) = v(1,k-1);
end
for k = M:-1:2
w(1,k) = w(1,k-1);
end
end
end

Phổ của tín hiệu ngõ vào và ngõ ra:

Nhận xét/Giải thích:

- Ngõ vào gồm các vạch phổ có tần số từ 100 – 3900 Hz giống với lý thuyết.
- Bộ lọc IIR thông dải có tần số cắt là 1700 Hz và 1800 Hz, nên các vạch phổ nằm trong
vùng tần số đó bị lọc bỏ.

Lưu các chương trình Matlab trong mục này với tên Bai_2
_IIR_bs_1700_1800_NHOMx.m

1.1.2. Bộ lọc IIR thông thấp


Tương tự như phần II.2.1, hãy thiết kế, thực hiện và kiểm tra một bộ lọc IIR thông
thấp thuộc loại Chebyshev 2 với các thông số như sau:
 Bậc bộ lọc: 10
 Cạnh dải dải chắn: 1.6 KHz.
 Độ gợn dải chắn: 60 dB
 Tần số lấy mẫu: 8 kHz.

1. Đáp ứng tần số của bộ lọc thiết kế dùng MATLAB:

2. Gía trị các hệ số đáp ứng xung mỗi tầng bậc 2 của bộ lọc thực hiện trên kit
DSP:

0.0085 0.0154 0.0085 -0.1589 0.0209

1.0000 0.8768 1.0000 -0.2993 0.1394

1.0000 0.0542 1.0000 -0.5186 0.3357

1.0000 -0.4025 1.0000 -0.7499 0.5712

1.0000 -0.5955 1.0000 -0.9582 0.8412

3. Kiểm tra bộ lọc với ngõ vào tín hiệu sin đa tần có các thành phần tần số
1000 Hz và 1700 Hz:

- Code:
clc;
clf;
Fs = 8e3;
Ts = 1/Fs;
t = 0 : Ts : 0.06 -Ts;
xn = sin(2000*pi*t) + sin(3500*pi*t);
a = lp1600.tf.den;
b = lp1600.tf.num;
yn = IIR(a,b,xn,480);
N = length(xn);
N1 = length(yn);
n = 0 : N/2 - 1;
n1 = 0 : N1/2 - 1;
Xn = fft(xn);
Yn = fft(yn);
X_mag = abs(Xn);
Y_mag = abs(Yn);
subplot(121)
plot(n*(Fs/N),X_mag(1:N/2)/N)
title('Pho bien do ngo vao');
xlabel('Frequency (Hz)');
ylabel('Amplitude');
subplot(122)
plot(n1*(Fs/N1),Y_mag(1:N1/2)/N1)
title('Pho bien do ngo ra');
xlabel('Frequency (Hz)');
ylabel('Amplitude');

function y = IIR(a,b,x,Ly)
L = length(b);
M = length(a);
Lx = length(x);
v = zeros(1,L);
w = zeros(1,M);
xn = [x zeros(1,Ly-Lx)];
for i = 1:Ly
c1 = 0;
c2 = 0;
v(1,1) = xn(1,i);
for k = 2 : M
c1 = c1 - a(1,k)*w(1,k);
end
for k = 1 : L
c2 = c2 + b(1,k)*v(1,k);
end
w(1,1) = c1 + c2;
y(1,i) = w(1,1);
for k = L:-1:2
v(1,k) = v(1,k-1);
end
for k = M:-1:2
w(1,k) = w(1,k-1);
end
end
end
- Kết quả:

- Ngõ vào có 2 vạch phổ ở tần số 1000 Hz và 1750 Hz đúng với lý thuyết.
- Bộ lọc IRR thông thấp có tần số cắt 1600 Hz, nên ngõ ra chỉ còn 1 vạch
phổ ở tần số 1000 Hz, vạch phổ 1750 Hz bị loại bỏ.

4. Kiểm tra bộ lọc với ngõ vào tín hiệu tổng của các tín hiệu sin tần số 100 –
3900 Hz:
Chương trình Matlab thực hiện yêu cầu:
% Matlab code
clc;
clf;
Fs = 8e3;
Ts = 1/Fs;
t = 0 : Ts : 0.05 - Ts; %Signal duration in 50 ms
xn = 0;
for k = 100 : 100 : 3900
xn = xn + sin(2*pi*k*t);
end
N = length(xn)
a = lp1600.tf.den;
b = lp1600.tf.num;
yn = IIR(a,b,xn,400);
N1 = length(yn);
Xn = fft(xn);
X_mag = abs(Xn);
Yn = fft(yn);
Y_mag = abs(Yn);
figure(1)
n = 0 : N/2 - 1;
n1 = 0 : N1/2 - 1;
subplot(121)
plot(n*(Fs/N),X_mag(1:N/2)/N)
title('Pho bien do ngo vao');
xlabel('Frequency (Hz)');
ylabel('Amplitude');
subplot(122)
plot(n1*(Fs/N1),Y_mag(1:N1/2)/N1)
title('Pho bien do ngo ra');
xlabel('Frequency (Hz)');
ylabel('Amplitude');

function y = IIR(a,b,x,Ly)
L = length(b);
M = length(a);
Lx = length(x);
v = zeros(1,L);
w = zeros(1,M);
xn = [x zeros(1,Ly-Lx)];
for i = 1:Ly
c1 = 0;
c2 = 0;
v(1,1) = xn(1,i);
for k = 2 : M
c1 = c1 - a(1,k)*w(1,k);
end
for k = 1 : L
c2 = c2 + b(1,k)*v(1,k);
end
w(1,1) = c1 + c2;
y(1,i) = w(1,1);
for k = L:-1:2
v(1,k) = v(1,k-1);
end
for k = M:-1:2
w(1,k) = w(1,k-1);
end
end
end

Phổ của tín hiệu ngõ vào và ngõ ra:

Nhận xét/Giải thích:

- Ngõ vào gồm các vạch phổ có tần số từ 100 – 3900 Hz giống với lý thuyết.
- Bộ lọc IIR thông thấp có tần số cắt là 1600 Hz, nên các vạch phổ nằm trong vùng tần số
lớn hơn 1600 Hz bị lọc bỏ.
Lưu các chương trình Matlab trong mục này với tên Bai_2
_IIR_lp_1600_NHOMx.m

1.1.3. Thực hiện bộ lọc IIR thông dải


Tương tự như phần II.2.1, hãy thiết kế, thực hiện và kiểm tra một bộ lọc IIR thông
dải thuộc loại Chebyshev 2 với các thông số như sau:
 Bậc bộ lọc: 36
 Tần số cắt dải chắn: 1600 và 2400 Hz
 Độ gợn dải chắn 100 dB.
 Tần số lấy mẫu: 8 kHz.

1. Đáp ứng tần số của bộ lọc thiết kế dùng MATLAB:

2. Gía trị các hệ số đáp ứng xung mỗi tầng bậc 2 của bộ lọc thực hiện trên kit
DSP:

0.0000 -0.0001 0.000 -0.0999 0.3945

1.000 1.9317 1.000 0.0999 0.3945


1.000 -1.5644 1.000 -0.2683 0.4614
1.000 1.5644 1.000 0.2683 0.4614
1.000 -1.2190 1.000 -0.3769 0.5574
1.000 1.2190 1.000 0.3769 0.5574
1.000 0.9858 1.000 0.4367 0.6534
1.000 -0.9858 1.000 -0.4367 0.6534
1.000 0.8351 1.000 0.4663 0.7381
1.000 -0.8351 1.000 -0.4663 0.7381
1.000 -0.7374 1.000 -0.4800 0.8098
1.000 0.7374 1.000 0.4800 0.8098
1.000 0.6750 1.000 0.4872 0.8709
1.000 -0.6750 1.000 -0.4872 0.8709
1.000 -0.6377 1.000 -0.4932 0.9247

1.000 0.6377 1.000 0.4932 0.9247


1.000 0.6202 1.000 0.5016 0.9247
1.000 -0.6202 1.000 -0.5016 0.9247

3. Kiểm tra bộ lọc với ngõ vào tín hiệu sin đa tần có các thành phần tần số
1000 Hz và 2000 Hz:

- Code:
clc;
clf;
Fs = 8e3;
Ts = 1/Fs;
t = 0 : Ts : 0.06 -Ts;
xn = sin(2000*pi*t) + sin(4000*pi*t);
a = bp2000.tf.den;
b = bp2000.tf.num;
yn = IIR(a,b,xn,400);
N = length(xn);
N1 = length(yn);
n = 0 : N/2 - 1;
n1 = 0 : N1/2 - 1;
Xn = fft(xn);
Yn = fft(yn);
X_mag = abs(Xn);
Y_mag = abs(Yn);
subplot(121)
plot(n*(Fs/N),X_mag(1:N/2)/N)
title('Pho bien do ngo vao');
xlabel('Frequency (Hz)');
ylabel('Amplitude');
subplot(122)
plot(n1*(Fs/N1),Y_mag(1:N1/2)/N1)
title('Pho bien do ngo ra');
xlabel('Frequency (Hz)');
ylabel('Amplitude');

function y = IIR(a,b,x,Ly)
L = length(b);
M = length(a);
Lx = length(x);
v = zeros(1,L);
w = zeros(1,M);
xn = [x zeros(1,Ly-Lx)];
for i = 1:Ly
c1 = 0;
c2 = 0;
v(1,1) = xn(1,i);
for k = 2 : M
c1 = c1 - a(1,k)*w(1,k);
end
for k = 1 : L
c2 = c2 + b(1,k)*v(1,k);
end
w(1,1) = c1 + c2;
y(1,i) = w(1,1);
for k = L:-1:2
v(1,k) = v(1,k-1);
end
for k = M:-1:2
w(1,k) = w(1,k-1);
end
end
end
- Kết quả:

- Ngõ vào có 2 vạch phổ ở tần số 1000 Hz và 2000 Hz đúng với lý thuyết.
- Bộ lọc IRR thông dải có tần số cắt 1600 Hz và 2400 Hz, nên ngõ ra chỉ
còn 1 vạch phổ ở tần số 2000 Hz, vạch phổ 1000 Hz bị loại bỏ.

4. Kiểm tra bộ lọc với ngõ vào tín hiệu tổng của các tín hiệu sin tần số 100 –
3900 Hz:
Chương trình Matlab thực hiện yêu cầu:
% Matlab code
clc;
clf;
Fs = 8e3;
Ts = 1/Fs;
t = 0 : Ts : 0.05 - Ts; %Signal duration in 50 ms
xn = 0;
for k = 100 : 100 : 3900
xn = xn + sin(2*pi*k*t);
end
N = length(xn)
a = bp2000.tf.den;
b = bp2000.tf.num;
yn = IIR(a,b,xn,400);
N1 = length(yn);
Xn = fft(xn);
X_mag = abs(Xn);
Yn = fft(yn);
Y_mag = abs(Yn);
figure(1)
n = 0 : N/2 - 1;
n1 = 0 : N1/2 - 1;
subplot(121)
plot(n*(Fs/N),X_mag(1:N/2)/N)
title('Pho bien do ngo vao');
xlabel('Frequency (Hz)');
ylabel('Amplitude');
subplot(122)
plot(n1*(Fs/N1),Y_mag(1:N1/2)/N1)
title('Pho bien do ngo ra');
xlabel('Frequency (Hz)');
ylabel('Amplitude');

function y = IIR(a,b,x,Ly)
L = length(b);
M = length(a);
Lx = length(x);
v = zeros(1,L);
w = zeros(1,M);
xn = [x zeros(1,Ly-Lx)];
for i = 1:Ly
c1 = 0;
c2 = 0;
v(1,1) = xn(1,i);
for k = 2 : M
c1 = c1 - a(1,k)*w(1,k);
end
for k = 1 : L
c2 = c2 + b(1,k)*v(1,k);
end
w(1,1) = c1 + c2;
y(1,i) = w(1,1);
for k = L:-1:2
v(1,k) = v(1,k-1);
end
for k = M:-1:2
w(1,k) = w(1,k-1);
end
end
end

Phổ của tín hiệu ngõ vào và ngõ ra:

Nhận xét/Giải thích:

- Ngõ vào gồm các vạch phổ có tần số từ 100 – 3900 Hz giống với lý thuyết.
- Bộ lọc IIR thông dải có tần số cắt là 1600 Hz và 2400 Hz, nên các vạch phổ nằm trong
vùng tần số đó được giữ lại ở ngõ ra, các vạch phổ ở các vùng tần số khác bị lọc bỏ.

Lưu các chương trình Matlab trong mục này với tên Bai_2
_IIR_bp_1600_2400_NHOMx.m
1.1.4. Thiết kế bộ lọc IIR multiband
Trong thí nghiệm này, chúng ta thiết kế, thực hiện và kiểm tra một bộ lọc IIR
multiband có đáp ứng mong muốn như bộ lọc ở phần II.1.4.
Các bước thiết kế giống như ở phần II.1.4 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];
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(5000*f,m);
figure;
plot(w/pi,abs(h));

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 được sử dụng khi cần thực hiện bộ lọc này.
1. Đáp ứng tần số của bộ lọc thiết kế dùng MATLAB:
2. Gía trị các hệ số đáp ứng xung mỗi tầng bậc 2 của bộ lọc thực hiện trên kit
DSP:

0.0039 0.0006 -0.0033 0.2857 -0.6801

1.0000 -0.0988 1.0007 -1.2724 0.7443


1.0000 1.4526 0.9959 1.3253 0.8359
1.0000 1.9811 0.9980 1.7908 0.8359
1.0000 -0.7303 0.3060 -1.6567 0.8374
1.0000 -1.9744 1.0038 -1.5851 0.8382
1.0000 -1.4846 1.0073 -0.8344 0.8545
1.0000 -0.9215 0.5575 -0.9567 0.8694
1.0000 1.2369 0.9961 1.1737 0.8721
1.0000 1.6357 0.9968 1.5194 0.8865
1.0000 1.8849 0.9954 1.7898 0.8872
1.0000 -0.6740 0.7094 -0.7553 0.8902
1.0000 0.9607 0.9981 0.9142 0.9008
1.0000 1.7830 0.9981 1.6998 0.9112
1.0000 -1.5216 0.6429 -1.7678 0.9124
1.0000 0.6089 0.9978 0.5676 0.9137
1.0000 -1.4705 0.9566 -1.6170 0.9289
1.0000 -1.2931 0.9961 1.0797 0.9294
1.0000 1.9501 0.9991 1.8969 0.9320
1.0000 -1.9253 1.0028 -1.8328 0.9393
1.0000 -1.7853 0.9237 -1.8136 0.9433
1.0000 -0.5673 1.0019 -0.7141 0.9470
1.0000 -1.0577 0.9417 -1.0584 0.9511
1.0000 -1.5884 0.9973 -1.5940 0.9526
1.0000 -1.2297 0.9975 -1.1467 0.9536
1.0000 -0.6124 0.8571 -0.6768 0.9570
1.0000 -0.8444 0.9589 -0.8444 0.9589
1.0000 -1.6581 0.9576 -1.6594 0.9598
1.0000 -1.8648 0.9388 -1.8692 0.9630
1.0000 -0.6711 0.9427 -0.6406 0.9650
1.0000 -0.5898 0.9688 -0.6093 0.9816
3. Kiểm tra bộ lọc với ngõ vào tín hiệu sin đa tần có các thành phần tần số 500
Hz, 750 Hz và 1750 Hz:

- Code:
clc;
clf;
Fs = 1e4;
Ts = 1/Fs;
t = 0 : Ts : 0.06 -Ts;
xn = sin(1000*pi*t) + sin(1500*pi*t) + sin(3500*pi*t);
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;
a = den;
b = num;
[num, den] = yulewalk(n-1,f,m);
yn = IIR(a,b,xn,400);
N = length(xn);
N1 = length(yn);
n = 0 : N/2 - 1;
n1 = 0 : N1/2 - 1;
Xn = fft(xn);
Yn = fft(yn);
X_mag = abs(Xn);
Y_mag = abs(Yn);
subplot(121)
plot(n*(Fs/N),X_mag(1:N/2)/N)
title('Pho bien do ngo vao');
xlabel('Frequency (Hz)');
ylabel('Amplitude');
subplot(122)
plot(n1*(Fs/N1),Y_mag(1:N1/2)/N1)
title('Pho bien do ngo ra');
xlabel('Frequency (Hz)');
ylabel('Amplitude');

function y = IIR(a,b,x,Ly)
L = length(b);
M = length(a);
Lx = length(x);
v = zeros(1,L);
w = zeros(1,M);
xn = [x zeros(1,Ly-Lx)];
for i = 1:Ly
c1 = 0;
c2 = 0;
v(1,1) = xn(1,i);
for k = 2 : M
c1 = c1 - a(1,k)*w(1,k);
end
for k = 1 : L
c2 = c2 + b(1,k)*v(1,k);
end
w(1,1) = c1 + c2;
y(1,i) = w(1,1);
for k = L:-1:2
v(1,k) = v(1,k-1);
end
for k = M:-1:2
w(1,k) = w(1,k-1);
end
end
end
- Kết quả:
- Ngõ vào có 3 vạch phổ tại các tần số 500 Hz, 750 Hz, 1750 Hz giống với
lý thuyết.
- Bộ lọc IIR multiband có dải thông [500 1000] Hz và [1500 2000] Hz, nên
ngõ có cả 3 vạch phổ nhưng vạch phổ tại tần số 500 Hz gần tần số cắt nên
biên độ giảm đáng kể.

3. Kiểm tra bộ lọc với ngõ vào tín hiệu tổng của các tín hiệu sin tần số 100 – 3900
Hz:
Chương trình Matlab thực hiện yêu cầu:
% Matlab code
clc;
clf;
Fs = 1e4;
Ts = 1/Fs;
t = 0 : Ts : 0.05 - Ts; %Signal duration in 50 ms
xn = 0;
for k = 100 : 100 : 3900
xn = xn + sin(2*pi*k*t);
end
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;
[num, den] = yulewalk(n-1,f,m);
N = length(xn)
a = den;
b = num;
yn = IIR(a,b,xn,400);
N1 = length(yn);
Xn = fft(xn);
X_mag = abs(Xn);
Yn = fft(yn);
Y_mag = abs(Yn);
figure(1)
n = 0 : N/2 - 1;
n1 = 0 : N1/2 - 1;
subplot(121)
plot(n*(Fs/N),X_mag(1:N/2)/N)
title('Pho bien do ngo vao');
xlabel('Frequency (Hz)');
ylabel('Amplitude');
subplot(122)
plot(n1*(Fs/N1),Y_mag(1:N1/2)/N1)
title('Pho bien do ngo ra');
xlabel('Frequency (Hz)');
ylabel('Amplitude');

function y = IIR(a,b,x,Ly)
L = length(b);
M = length(a);
Lx = length(x);
v = zeros(1,L);
w = zeros(1,M);
xn = [x zeros(1,Ly-Lx)];
for i = 1:Ly
c1 = 0;
c2 = 0;
v(1,1) = xn(1,i);
for k = 2 : M
c1 = c1 - a(1,k)*w(1,k);
end
for k = 1 : L
c2 = c2 + b(1,k)*v(1,k);
end
w(1,1) = c1 + c2;
y(1,i) = w(1,1);
for k = L:-1:2
v(1,k) = v(1,k-1);
end
for k = M:-1:2
w(1,k) = w(1,k-1);
end
end
end

Phổ của tín hiệu ngõ vào và ngõ ra:


Nhận xét/Giải thích:

- Ngõ vào gồm các vạch phổ có tần số từ 100 – 3900 Hz giống với lý thuyết.
- Bộ lọc IIR multiband có dải thông [500 1000] Hz và [1500 2000] Hz, nên các vạch phổ
trong tần số thuộc dải thông được giữ lại. Các vạch phổ của các tần số còn lại có gần như
bị loại bỏ hoàn toàn.

Lưu các chương trình Matlab trong mục này với tên Bai_2 _IIR_mb_NHOMx.m

You might also like