Tải bản đầy đủ (.pdf) (27 trang)

Thí nghiệm xử lý tín hiệu số

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (1003.73 KB, 27 trang )

TRƯỜNG ĐẠI HỌC QUY NHƠN
KHOA KỸ THUẬT VÀ CÔNG NGHỆ
-----  -----

BÀI GIẢNG

THÍ NGHIỆM XỬ LÝ TÍN HIỆU SỐ

Biên soạn: TS. Phạm Hồng Thịnh
Bộ môn: Điện tử - Viễn thông

Tài liệu lưu hành nội bộ


BÀI 1. MƠ PHỎNG HỆ THỐNG VÀ TÍN HIỆU RỜI
RẠC BẰNG MATLAB
1. Giới thiệu matlab
Matlab (Matrix Laboratory) là môi trường tính tốn đa ứng dụng, được tính tố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 tốn số và đồ họa.
Khi khởi động Matlab, giao diên làm việc (command window) sẽ xuất hiện như hình:,
- 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.
Để hiểu rõ cách sử dụng một hàm, có thể sử dụng lệnh >>help và hàm tương ứng.
Matlab có thể thực thi các lệnh ở cửa sổ lệnh từ dấu nhắc của cửa sổ lệnh.
Ví dụ1: Các lệnh vẽ đồ thị tín hiệu sin
>> t = 0:0.01:2; % cho t thay giá trị từ 0 đến 2, mỗi giá trị cach nhau 0.01
>> x = sin(2*pi*t); % tính giá trị hàm (2 pi t) cho từng giá trị t
>> plot(t,x,’b’); % Vẽ đồ thị đường màu xanh
>> xlabel(’t in sec’); ylabel(’x(t)’); % Đặt tên trục x và trục y


>> title(’Plot of sin(2\pi t)’); % Tiêu đề đồ thị

Ví dụ 2: Tạo hàm m cộng hai tín hiệu sin có tần số và biên độ khác nhau
function y=sumsin(A1, f1, A2, f2, Time, fs)
% Cong 2 tin hieu sin co bien do va tan so khac nhau
% Input
% A1, f1: bien do va tan so tin hieu sin 1
% A2, f2: bien do va tan so tin hieu sin 2
% Time (giay) khoang thoi gian can tinh
% fs (Hz): tan so lay mau
% Output: y(t)=A1*sin(2*pi*f1*t)+A2*sin(2*pi*f2*t)
% Vi du: y=sumsin(1, 2, 2, 4, 1, 50)
N=round(Time*fs) % So mau
n=0:N;
x1=A1*sin(2*pi*(f1/fs)*n);
x2=A2*sin(2*pi*(f2/fs)*n);
y=x1+x2;
figure;
subplot(3,1,1);
stem(n/fs, x1);
xlabel('time');
ylabel('x1(t)');
subplot(3,1,2);
stem(n/fs, x2);
xlabel('time');
ylabel('x2(t)');
subplot(3,1, 3);
stem(n/fs, y);
xlabel('time');
ylabel('y(t)=x1(t)+x2(t)');

end

Lưu chương trình con với tên phải cùng tên với tên hàm, ví dụ trên ta lưu lại
sumsin.m. Hàm sumsin() khi đó có thể được gọi từ chương trình khác hoặc có thể
thực thi từ cửa số lệnh, ví dụ: >> y=sumsin(1, 2, 2, 4, 1, 50)
2. Thiết kế bộ lọc số bằng công cụ SPTool

-1-


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.
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.
3. Tiến hành thí nghiệm
Thí nghiệm 1. Viết chương trình con tạo một dãy thực ngẫu nhiên xuất phát từ n1
đến n2 và có giá trị của biên độ theo phân bố GAUSS với trung bình bằng 0,
phương sai bằng 1. u cầu chương trình con có các tham số đầu vào và đầu ra
được nhập theo lệnh với cú pháp :[x,n] = randnseq(n1,n2);
function [x,n] = randnseq(n1,n2)
%Generates x(n) = a^n; n1 <= n <= n2
%---------------------------------------------%[x,n] = r_expseq(a,n1,n2)
n = [n1:n2];
x = randn(size(n));

Thí nghiệm 2. Cho dãy x(n) = {1,2,3,4,5,6,7,6,5,4,3,2,1} . Viết chương trình con
thể hiện trên đồ thị các dãy :
a. x1(n) = 2x(n – 5) – 3x(n+4)
b. x2(n) = x(3 – n) – x(n)x(n – 2)
n = [-2:10]; x = [1:7,6:-1:1];
%
[x11,n11] = sigshift(x,n,5); [x12,n12] = sigshift(x,n,-4);
[x1,n1] = sigadd(2*x11,n11,-3*x12,n12);
subplot(2,1,1); stem(n1,x1);
title('Day so theo dau bai 2a');
xlabel('n'); ylabel('x1(n)');

-2-



%
[x21,n21] = sigfold(x,n); [x21,n21] = sigshift(x21,n21,3);
[x22,n22] = sigshift(x,n,2); [x22,n22] = sigmult(x,n,x22,n22);
[x2,n2] = sigadd(x21,n21,x22,n22);
subplot(2,1,2); stem(n2,x2);
title('Day so theo dau bai 2b');
xlabel('n'); ylabel('x2(n)');

Thí nghiệm 3. Cho hệ thống được mô tả bởi phương trình sai phân tuyến tính hệ
số hằng như sau : y(n) – y(n – 1) + 0.9y(n – 2) = x(n)
Sử dụng hàm filter của Matlap, viết chương trình thực hiện các công việc sau:
b = [1]; a = [1, -1, 0.9];
%
x= impseq(0,-20,120); n = [-20:120];
h= filter(b,a,x);
subplot(2,1,1); stem(n,h);
title('Impulse Response'); xlabel('n'); ylabel('h(n)');
%
x = stepseq(0,-20,120);
s = filter(b,a,x);
subplot(2,1,2); stem(n,s);
title('Step Response'); xlabel('n'); ylabel('s(n)');

Thí nghiệm 4. Thiết kế một bộ lọc FIR chắn dải bằng SPTool
Bộ lọc, được thiết kế bằng phương pháp cửa sổ Kaiser, với các thông số sau:
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
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ị.
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ế. Sau này, nếu muốn sửa đổi thiết
kế, chọn lại 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
4. Báo cáo thí nghiệm
-3-


BÀI 2. THIẾT KẾ BỘ LỌC FIR THÔNG THẤP BẰNG PHƯƠNG
PHÁP XẤP XỈ TỐI ƯU
1. Bài toán thiết kế
Thiết kế bộ chuyển đổi Hilbert theo cấu trúc FIR bằng phương pháp xấp xỉ tối
ưu cân bằng gợn sóng trên dải tần cho trước (0.1   0.9)
2. Các bước tiến hành thiết kế
* Bước 1: Nhập các chỉ tiêu kỹ thuật của bộ lọc f, m, N. Dựa vào dải tần đã cho
xác định bậc N và đáp ứng biên độ mong muốn m tại mỗi cạnh dải thích hợp .

Chọn N = 30
Đối với bộ biến đổi Hilbert giá trị m được chọn là [1 1].
* Bước 2: Chọn kiểu bộ lọc FIR thích hợp để thiết kế.
Đối với bộ biến đổi Hilbert lý tưởng đáp ứng tần số có dạng:
  je  j ,....0    
H d ( e j )  
 j
,....     0
 je
Đáp ứng xung tương ứng:
 2 sin2  ( n   ) / 2

,...n  
hd ( n )  
(*)
n 
 0,...............................n  
 Sử dụng bộ lọc FIR pha tuyến tính loại 3 để thiết kế bộ biến đổi là thích
hợp nhất. Bởi vì hệ thống FIR loại 3 có đáp ứng xung đơn vị phản đối xứng, M lẻ.
Đáp ứng tần số có giá trị bằng 0 tại  = 0 và  = . Ngồi ra, đáp ứng biên độ của
nó có giá trị bằng 1 trong một vùng tần số xác định giống với đáp ứng biên độ của
bộ Hilbert lý tưởng.
*Bước 3: Tìm đáp ứng xung của bộ biến đổi Hilbert lý tưởng
Đáp ứng xung lý tưởng được tính theo cơng thức (*)
*Bước 4: Dùng thuật tốn Parks-McClellan để xác định đáp ứng xung h(n) của bộ
biến đổi cần thiết kế. Thuật tốn này được tích hợp trong hàm Remez
*Bước 5: Tìm đáp ứng biên độ - tần số của bộ biến đổi Hilbert thực tế. h(n), hd(n)
Hr(), Hr()
3. Chương trình thiết kế bộ lọc số
Chương trình được viết và chạy trên nền Matlab 7.0. Trong chương trình sử

dụng một số hàm hỗ trợ có sẵn của Matlab cho xử lý tín hiệu số và một số hàm
thêm vào được tham khảo từ tài liệu
Các hàm liên quan:
[h]=remez(N,f,n,ftype): tìm đáp ứng xung của bộ lọc thực tế theo thuật tốn
Parks-McClellan
h : là các hệ số bộ lọc có chiều dài M=N+1
-4-


N : ký hiệu bậc của bộ lọc
f : một mảng ký hiệu các cạnh dải tính theo đơn vị của π, 0 f  1. Đối với
bộ biến đổi Hilbert tần số thấp nhất không được = 0 và tần số cao nhất
không được
bằng 1
m : đáp ứng biên độ mong muốn ở mỗi f . Chiều dài của mảng f và m là giống
nhau và phải có số phần tử là chẵn
- ftype: loại bộ lọc cần thiết kế.
- function [db,mag,pha,grd,w] = freqz_m(h, [1]): tính đáp ứng tần số của bộ
lọc có đáp ứng xung h
- function [Hr,w,c,L]=Hr_Type3(h): hàm này sẽ tính đáp ứng biên độ Hr(w)
theo đáp ứng xung h(n) của bộ lọc FIR loại 3
function [db,mag,pha,grd,w] = freqz_m(b,a);
% Modified version of freqz subroutine
%.............................................................................................
% [db,mag,pha,grd,w]=freqz_m(b,a);
% db=Relative magnitude in dB computed over 0 to pi radians
% mag=absolute magnitude computed over 0 to pi radians
% grd= Group delay over 0 to pi radians
% w=501 frequency samples between 0 to pi radians
% b=numerator polynomial of H(z) (for FIR: a=h)

% a=demonitor polynomial of H(z) (for FIR: a=[1])
%........................................................................................
[H,w] = freqz(b,a,1000,'whole');
H = (H(1:1:501))';w=(w(1:1:501))';
mag = abs(H);
Db = 20*log10((mag+eps)/max(mag));
Pha = angle(H);
grd = grpdelay(b,a,w);
function [Hr,w,c,L]=Hr_Type3(h);
%Computers Amplitude response Hr(w) of a Type-3 LP FIR filter
%---------------------------------------------------------------------------% [Hr,w,c,L]=Hr_Type3(h)
% Hr=Amplitude response
% w=frequencies between [0 pi] over which Hr is computed
% c= Type-3 LP filter coefficients
% L=Order of Hr
% h=Type-3 LP impulse response
M=length(h);
L=(M-1)/2;

-5-


c=[2*h(L+1:-1:1)];
n=[0:1:L];
w=[0:1:500]'*pi/500;
Hr = sin(w*n)*c';
% Chương trình chính
clear all;
format long;
fprintf('\n');

fprintf('\t\t\t CHUONG TRINH THIET KE BO BIEN DOI HILBERT THEO CAU
TRUC FIR');
fprintf('\n\t\t\t\t BANG PHUONG PHAP XAP XI TOI UU CAN BANG GON SONG ');
fprintf('\n\t\t\t\t
LOP KY THUAT DIEN TU KHOA VIEN THONG KHOA 41');
fprintf('\n\t\t\t\t\t
HOC VIEN : NGUYEN VAN A');
fprintf('\n\t\t\t\t
QUY NHON 05/2021');
fprintf('\n');
fprintf('\n');
f = [0.1,0.9];
m = [1 1];
M = 31; N = M-1;
alpha=(M-1)/2;
n=0:N;
hd=(2/pi)*((sin((pi/2)*(n-alpha)).^2)./(n-alpha));
hd(alpha+1)=0;
h = remez(N,f,m,'hilbert');
[db,mag,pha,grd,w] = freqz_m(h,[1]);
[Hr,w,c,L] = Hr_type3(h);
figure(1); subplot(1,1,1)
subplot(2,2,1); stem(n,hd); title('Ideal Impulse Response');
xlabel('n'); ylabel('hd(n)'); axis([0 N -0.8 0.8])
set(gca,'XTickMode','manual','XTick',[0,N])
set(gca,'YTickMode','manual','YTick',[-0.8:0.2:0.8])
subplot(2,2,3); stem(n,h); title('Actual Impulse Response');
xlabel('n'); ylabel('h(n)'); axis([0 N -0.8 0.8])
set(gca,'XTickMode','manual','XTick',[0,N])
set(gca,'YTickMode','manual','YTick',[-0.8:0.2:0.8])

subplot(2,2,2); plot(w/pi,mag); title('Magnitude Response');
xlabel('frequency in pi units'); ylabel('|Hr|')
set(gca,'XTickMode','manual','XTick',[0,f,1])
set(gca,'YTickMode','manual','YTick',[0,1]);grid
subplot(2,2,4);plot(w/pi,pha);title('Phase Response');
xlabel('frequency in pi units'); ylabel('Hr(w)');

-6-


set(gca,'XTickMode','manual','XTick',[0,f,1])
set(gca,'YTickMode','manual','YTick',[-1,1]);grid

4. Kết quả chạy chương trình và nhận xét đánh giá.

BÀI 3. THIẾT KẾ BỘ LỌC FIR THÔNG CAO BẰNG PHƯƠNG
PHÁP LẤY MẪU TẦN SỐ
1. Bài toán thiết kế
Hãy thiết kế bộ lọc FIR thơng cao pha tuyến tính theo phương pháp lấy mẫu tần
số, với các chỉ tiêu bộ lọc cần thiết kế được cho như sau:
 Cạnh dải chắn:

ws

 Cạnh dải thơng: wp
 Độ gợn sóng trong dải thông: Rp
 Suy hao trong dải chắn:

As


Các đại lượng này có thể được mơ tả trên hình 1 như sau:
Mag(dB)
0
RP

As
ws

wp

F (Hz)

Hình 1. Các chỉ tiêu của bộ lọc thơng cao HPF (high pass filter)

Điều kiện:

ws< wp<1

Hoặc bài toán cho các chỉ tiêu 1 và 2 ta cũng có thể tính được As và Rp dựa
vào quan hệ giữa chúng theo công thức (1.1) và (1.2).
2. Các bước tiến hành thiết kế
Bước 1. Chọn số mẫu để lấy mẫu tần số của bộ lọc lý tưởng
-7-


Trong phương pháp lấy mẫu tần số, việc chọn số mẫu để lấy mẫu bộ lọc lý
tưởng là rất quan trọng. Ở đây, chọn số mẫu M để có 02 mẫu rơi vào dải chuyển
tiếp.
M = [round(1/(ws1-wp1))]*6+1;
Bước 2. Thực hiện lấy M mẫu tần số bộ lọc lý tưởng

Lúc này ta có M điểm lấy mẫu, trong đó đáp ứng tần số biên độ của các điểm
trong dải thông là 1, trong dải chắn là 0. Việc xác định đáp ứng tần số biên độ của
02 mẫu trong dải chuyển tiếp được thực hiện lặp để xác đinh được bộ lọc có Rp và
As là tốt nhất.
Bước 3. Tìm đáp ứng xung của bộ lọc thông cao cần thiết kế
Đáp ứng xung của bộ lọc thơng cao có thể tìm được bằng phép biển đổi DFT
ngược các mẫu hd(n) :
h( n) 

1
M

M 1

 H ( k )e

j 2  nk / M

0  n  M 1

k 0

3. Chương trình thiết kế bộ lọc số
Trong phần này sẽ thực hiện chương trình thiết kế bộ lọc thơng cao bằng
phương pháp lấy mẫu tần số. Chương trình sẽ nhận các chỉ tiêu yêu cầu của bộ lọc
cần thiết kế, sau đó thực hiện các bước thiết kế để tìm được đáp ứng xung h(n).
Để khảo sát bộ lọc vừa thiết kế, chương trình cũng sẽ thực hiện tính tốn và vẽ
đáp ứng biên độ - tần số của bộ lọc theo dB, cũng như vẽ các đáp ứng xung lý
tưởng hd(n), hàm cửa sổ w(n) và đáp ứng xung bộ lọc thực tế h(n).
Chương trình được viết và chạy trên nền Matlab, với việc sử dụng một số hàm

hỗ trợ có sẵn của Matlab cho xử lý tín hiệu số, và một số hàm viết thêm được tham
khảo từ tài liệu [1] (các hàm dưới dạng các file .m).
function [ws wp As Rp]=loc_FIR_thongcao()
fprintf('\n');
fprintf('Nhap vao cac thong so cua bo loc thong cao :');
fprintf('\n');
ws1=input('Nhap 0ws ,0ws ,021, As = ');
while(As1<=21)

-8-


As1=input('Nhap sai, nhap lai As>21, As = ');
end
Rp1=input('Nhap 0 < Rp < 1, Rp = ');
while((Rp1<=0)|(Rp1>=1))
Rp1=input('Nhap sai, nhap lai 0 < Rp < 1, Rp = ');
end
ws=ws1;
wp=wp1;
As=As1;
Rp=Rp1;

M=round(1/(wp-ws))*6+1;
alpha = (M-1)/2; l = 0:M-1; wl = (2*pi/M)*l;
%Tim cac gia tri toi uu
MaxAs=As;
MinRp=Rp;
N1=ceil(ws*alpha)+1;
N2=ceil((2-wp)*alpha)+1;
for T1 = 0.05:0.01:0.5
for T2 = 1:-0.01:0.5
Hrs = [zeros(1,N1),T1,T2,ones(1,N2-N1-2),T2,T1,zeros(1,M-N2-2)];
Hdr = [0,0,1,1]; wdl = [0,ws,wp,1];
k1 = 0:floor((M-1)/2); k2 = floor((M-1)/2)+1:M-1;
angH = [-alpha*(2*pi)/M*k1, alpha*(2*pi)/M*(M-k2)];
H = Hrs.*exp(j*angH);
h = real(ifft(H,M));
[db,mag,pha,grd,w] = freqz_m(h,1);
[Hr,ww,a,L] = Hr_Type1(h);
delta_w=1/500;
Asd = -max( db(1:ws/delta_w+1));
Rpd = -min(db(wp/delta_w+1):501)
if((Asd>=MaxAs)&(Rpd<=MinRp))
MaxAs=Asd;
MinRp=Rpd;
T1op=T1;
T2op=T2;
end
end
end
Hrs = [zeros(1,N1),T1op,T2op,ones(1,N2-N1-2),T2op,T1op,zeros(1,M-N2-2)];
Hdr = [0,0,1,1]; wdl = [0,ws,wp,1];

k1 = 0:floor((M-1)/2); k2 = floor((M-1)/2)+1:M-1;
angH = [-alpha*(2*pi)/M*k1, alpha*(2*pi)/M*(M-k2)];
H = Hrs.*exp(j*angH);
h = real(ifft(H,M));
[db,mag,pha,grd,w] = freqz_m(h,1);
[Hr,ww,a,L] = Hr_Type1(h);
subplot(1,1,1);
subplot(2,2,1);plot(wl(1:alpha+1)/pi,Hrs(1:alpha+1),'o',wdl,Hdr);
axis([0,1,-0.1,1.1]); title('Frequency Samples at M=%2.4f',M);
xlabel('Frequency in pi units'); ylabel('Hr(k)')
set(gca,'XTickMode','manual','XTick',[0;ws;wp;1])
set(gca,'XTickLabelMode','manual','XTickLabels',[0;ws;wp; 1])
set(gca,'YTickMode','manual','YTick',[0,T1op,T2op,1]); grid
subplot(2,2,2); stem(l,h); axis([-1,M,-0.4,0.4])
title('Impulse Response'); xlabel('n');ylabel('h(n)');text(M+1,-0.4,'n')
subplot(2,2,3); plot(ww/pi,Hr,wl(1:alpha+1)/pi,Hrs(1:alpha+1),'o');
axis([0,1,-0.1,1.1]); title('Amplitude Response')
xlabel('Frequency in pi units'); ylabel('Hr(w)')
set(gca,'XTickMode','manual','XTick',[0;ws;wp;1])
set(gca,'XTickLabelMode','manual','XTickLabels',[ 0;ws;wp;1])

-9-


set(gca,'YTickMode','manual','YTick',[T1op,T2op]); grid
subplot(2,2,4);plot(w/pi,db); axis([0,1,-100,10]); grid
title('Magnitude Response');xlabel('Frequency in pi units'); ylabel('Decibels');
set(gca,'XTickMode','manual','XTick',[0;ws;wp;1])
set(gca,'XTickLabelMode','manual','XTickLabels',[ 0;ws;wp; 1])
set(gca,'YTickMode','Manual','YTick',[-As;0]);

set(gca,'YTickLabelMode','manual','YTickLabels',[As; 0])

4. Kết quả chạy chương trình và nhận xét đánh giá.
Kết quả chương trình được thực hiện với ws=0.4pi, wp=0.65pi, Rp=0.4, As=45

BÀI 4. THIẾT KẾ BỘ LỌC THÔNG DẢI IIR SỬ DỤNG BỘ LỌC
CHEBYSHEV-1 BẰNG PHƯƠNG PHÁP BIẾN ĐỔI SONG TUYẾN
1. Bài toán thiết kế :
Thiết kế bộ lọc thông dải theo cấu trúc IIR sử dụng bộ lọc Chebyshev-1 bằng
phương pháp biến đổi song tuyến tính.
2. Các bước tiến hành thí nghiệm :
Các bước được thực hiện như sau:
Bước 1: Nhập các chỉ tiêu kỹ thuật của bộ lọc số :
- Tần số ở mép dải thông wp
- Tần số ở mép dải chắn ws
- Độ mấp mô dải thông Rp
- Độ suy giảm dải chắn As và tham số T.
Bước 2: Chiếu các tần số cắt wp và ws từ miền tần số số lên miền tần số tương
tự theo công thức sau:
p 
2
2
 s 
p 

T


tan 
 2 


s 

T

tan  
 2 

Bước 3: Xác định đặc tuyến bộ lọc có hàm truyền Ha(s) thỏa mãn các chỉ tiêu
tương tự trên các điểm Ωp, Ωs.
Bước 4: Chiếu hàm Ha(s) theo phép biến đổi song tuyến
 2 1  z 1 

H LP ( Z )  H a 
1 
T
1

z



Bước 5: Chuyển đổi tần số để đạt được bộ lọc số thông dải:
H(z) = H LP (Z )
2

Z

1


1

 G( z )  

1

z  1 z   2
1

2

1  1 z   2 z
 2k
k 1
2 
với 1 
k 1
k 1

Bước 6: Biến đổi dải tần đạt được bộ lọc số thông dải.
Bước 7: Vẽ đáp ứng biên độ - pha tần số và trễ nhóm của các bộ lọc.
3. Chương trình thiết kế bộ lọc số
function MANHHUNG_OpeningFcn(hObject, eventdata, handles, varargin)
set(handles.mess,'Visible','off');

-10-


set(handles.pushbutton4,'Visible','off')
set(handles.pushbutton6,'Visible','off')

set(handles.pushbutton7,'Visible','off')
set(handles.pushbutton8,'Visible','off')
set(handles.pushbutton10,'Visible','off')
set(handles.pushbutton11,'Visible','off')
set(handles.axes1,'Visible','off');
set(gcf,'CurrentAxes',handles.axes1)
cla
set(handles.axes2,'Visible','off');
set(gcf,'CurrentAxes',handles.axes2)
cla
set(handles.axes3,'Visible','off');
set(gcf,'CurrentAxes',handles.axes3)
cla
set(handles.axes4,'Visible','off');
set(gcf,'CurrentAxes',handles.axes4)
cla
set(handles.axes5,'Visible','off');
set(gcf,'CurrentAxes',handles.axes5)
cla
set(handles.axes6,'Visible','off');
set(gcf,'CurrentAxes',handles.axes6)
cla
% -------------------------------------------------------------------% THIẾT KẾ NÚT NHẤN CHẤP NHẬN NHẬP CÁC THAM SỐ ĐẦU VÀO
% -------------------------------------------------------------------function
[ws1,wp1,wp2,ws2,Rp,As,wplp,wslp,T,OmegaP,OmegaS,ep,Ripple,Attn]=pushbut
ton1_Callback(hObject, eventdata, handles)
ws1

= get(handles.ws1, 'String');
ws1

= pi*str2num(ws1);
wp1
= get(handles.wp1, 'String');
wp1
= pi*str2num(wp1);
wp2
= get(handles.wp2, 'String');
wp2
= pi*str2num(wp2);
ws2
= get(handles.ws2, 'String');
ws2
= pi*str2num(ws2);
t
= get(handles.t, 'String');
T
= str2num(t);
as
= get(handles.as, 'String');
As
= str2num(as);
rp
= get(handles.rp, 'String');
Rp
= str2num(rp);
ep = sqrt(10^(Rp/10)-1);
% passband ripple parameter
Ripple = sqrt(1/(1+ep*ep));
% passband Ripple
Attn = 1/(10^(As/20));

% stopband Attenuation
%ws1=pi*ws1;ws2=pi*ws2;wp1=pi*wp1;wp2=pi*wp2;
if ((ws1 < wp1)&&(wp1 < wp2)&&(wp2 <
ws2)&&(As>10)&&(As<70)&&(Rp>0)&&(Rp<2))
set(handles.mess,'Visible','off');
set(handles.pushbutton4,'Visible','on');
set(handles.pushbutton6,'Visible','on');
set(handles.pushbutton7,'Visible','on');
set(handles.pushbutton8,'Visible','on');
set(handles.pushbutton10,'Visible','on');
set(handles.pushbutton11,'Visible','on');
% nhan data
chi dinh wplp
wplp = 0.2*pi;
% Digital Passband Freq in Hz

-11-


% tinh wslp
%wslp = 0.4*pi;
% Digital Stopband Freq in Hz
beta = (cos((wp2 + wp1)/2))/(cos((wp2 - wp1)/2));
k = cot((wp2 - wp1)/2)*tan(wplp/2)
alpha1 = -(2*beta*k)/(k+1)
alpha2 = (k-1)/(k+1)
wslp = angle(-(exp(-j*ws1)*exp(-j*ws1)-alpha1*exp(j*ws1)+alpha2)/(alpha2*exp(-j*ws1)*exp(-j*ws1)-alpha1*exp(-j*ws1)+1))
% Frequency of Analog Lowpass Filter
% Analog prototype specifications: Inverse mapping for frequency
%T = 1;

% Set T=1
OmegaP = (2/T)*tan(wplp/2);
% Prewarp Prototype Passband
freq
OmegaS = (2/T)*tan(wslp/2);
% Prewarp Prototype Stopband
freq
else
set(handles.mess,'Visible','on');
set(handles.pushbutton4,'Visible','off');
set(handles.pushbutton6,'Visible','off');
set(handles.pushbutton7,'Visible','off');
set(handles.pushbutton8,'Visible','off');
set(handles.pushbutton10,'Visible','off');
set(handles.pushbutton11,'Visible','off');
end
% -------------------------------------------------------------------% THIẾT KẾ BỘ LỌC THÔNG THẤP TƯƠNG TỰ
% -------------------------------------------------------------------function pushbutton4_Callback(hObject, eventdata, handles) % analog
filter - lowpass
% eventdata reserved - to be defined in MANHHUNG future version of
MATLAB
set(handles.axes5,'Visible','off');
set(gcf,'CurrentAxes',handles.axes5);
cla;
set(handles.axes6,'Visible','off');
set(gcf,'CurrentAxes',handles.axes6);
cla;
% handles
structure with handles and user data (see GUIDATA)
[ws1,wp1,wp2,ws2,Rp,As,wplp,wslp,T,OmegaP,OmegaS,ep,Ripple,Attn]=pushbut

ton1_Callback(hObject, eventdata, handles);
% Analog Chebyshev-I Prototype Filter Calculation
[cs,ds] = afd_chb1(OmegaP,OmegaS,Rp,As);
% Calculation of Impulse response
[ha,x,t] = impulse(cs,ds);
% Calculation of frequency Response
[db1,mag1,pha1,w1] = freqs_m(cs,ds,pi);
% Plots of Analog Prototype Lowpass Filter:
set(gcf,'CurrentAxes',handles.axes1); cla; % Magnitude response
:
plot(w1/pi,mag1);
title('Magnitude Response of Chebyshev-I Analog Lowpass
Filter','FontSize',10)
xlabel('Analog frequency in pi units','FontSize',10);
ylabel('|H|','FontSize',10); axis([0,1,-0.1,1.1])
%xlabel('Analog frequency in pi units'); ylabel('|H|');
axis([0,1,0,1.1])

-12-


set(gca,'XTickMode','manual','XTick',[0,OmegaP/pi,OmegaS/pi,0.5,1],'Font
Size',10);
set(gca,'YTickmode','manual','YTick',[0,Attn,Ripple,1],'FontSize',10);
grid
set(gcf,'CurrentAxes',handles.axes2); cla;
plot(w1/pi,pha1/pi);
title('Phase Response','FontSize',10)
xlabel('Analog frequency in pi units','FontSize',10);
ylabel('Radians','FontSize',10); axis([0,1,-1,1.1])

set(gca,'XTickMode','manual','XTick',[0,OmegaP/pi,OmegaS/pi,0.5],'FontSi
ze',10);
set(gca,'YTickmode','manual','YTick',[-1,0.5,0,0.5,1],'FontSize',10); grid
set(gcf,'CurrentAxes',handles.axes3); cla;
plot(w1/pi,db1);
title('Magnitude in dB','FontSize',10)
xlabel('Analog frequency in pi units','FontSize',10);
ylabel('Decibels','FontSize',10); axis([0,1,-(As+60),5])
%xlabel('Analog frequency in pi units'); ylabel('Decibels');
axis([0,1,-(As+50),5])
set(gca,'XTickMode','manual','XTick',[0,OmegaP/pi,OmegaS/pi,0.5,1],'Font
Size',10);
set(gca,'YTickmode','manual','YTick',[-75,-50,25,0],'FontSize',10); grid
set(gcf,'CurrentAxes',handles.axes4); cla;
plot(t,ha,[0,max(t)],[0,0]);
Title('Impulse Response','FontSize',10)
xlabel('time in seconds','FontSize',10);
ylabel('ha(t)','FontSize',10); axis([0,max(t),min(ha),max(ha)])
set(gca,'XTickMode','manual','XTick',[0;
max(t)],'FontSize',10);
set(gca,'YTickmode','manual','YTick',[min(ha);
max(ha)],'FontSize',10); grid
% -------------------------------------------------------------------% THIẾT KẾ BỘ LỌC THÔNG THẤP SỐ
% -------------------------------------------------------------------function pushbutton6_Callback(hObject, eventdata, handles)% digital
filter - lowpass
% hObject
handle to pushbutton6 (see GCBO)
% eventdata reserved - to be defined in MANHHUNG future version of
MATLAB
set(handles.axes5,'Visible','off');

set(gcf,'CurrentAxes',handles.axes5)
cla
set(handles.axes6,'Visible','off');
set(gcf,'CurrentAxes',handles.axes6)
cla
% handles
structure with handles and user data (see GUIDATA)
[ws1,wp1,wp2,ws2,Rp,As,wplp,wslp,T,OmegaP,OmegaS,ep,Ripple,Attn]=pushbut
ton1_Callback(hObject, eventdata, handles)
%[N,wn] =
cheb1ord(wplp/pi,wslp/pi,Rp,As);%++++++++++++++++++++++++++++++++++

-13-


% Impulse invariance transformation to obtain MANHHUNG digital
Chebyshev-I lowpass filter
[cs,ds] =
afd_chb1(OmegaP,OmegaS,Rp,As);%++++++++++++++++++++++++++++++++++
[blp,alp] = bilinear(cs,ds,T);
% Plots of Digital Lowpass Filter:
[db2,mag2,pha2,grd2,w2] = freqz_m(blp,alp);
% Plotting Magnitude response :
set(gcf,'CurrentAxes',handles.axes1); cla; % Magnitude response
:
plot(w2/pi,mag2);
title('Magnitude Response of Chebyshev-I Digital Lowpass
Filter','FontSize',10)
xlabel('frequency in pi units','FontSize',10);
ylabel('|H|','FontSize',10); axis([0,1,0,1.1])

set(gca,'XTickMode','manual','XTick',[0,wplp/pi,wslp/pi,1],'FontSize',10
);
set(gca,'YTickmode','manual','YTick',[0,Attn,Ripple,1],'FontSize',10);
grid
% Phase response :
set(gcf,'CurrentAxes',handles.axes2); cla;
plot(w2/pi,pha2/pi); title('Phase Response','FontSize',10)
xlabel('frequency in pi units','FontSize',10); ylabel('pi
units','FontSize',10); axis([0,1,-1,1.1]);
set(gca,'XTickMode','manual','XTick',[0,wplp/pi,wslp/pi,1],'FontSize',10
);
set(gca,'YTickmode','manual','YTick',[1,0,1],'FontSize',10); grid
% Magnitude response in dB :
set(gcf,'CurrentAxes',handles.axes3); cla;
plot(w2/pi,db2);
title('Magnitude in dB','FontSize',10)
xlabel('frequency in pi units','FontSize',10);
ylabel('Decibels','FontSize',10); axis([0,1,-(As+10),5]);
set(gca,'XTickMode','manual','XTick',[0,wplp/pi,wslp/pi,1],'FontSize',10
);
set(gca,'YTickmode','manual','YTick',[-As,-Rp,0]); grid
%set(gca,'YTickLabelMode','manual','YTickLabel',['',num2str(As);' -',num2str(Rp);' 1';' 0'])
% Group Delay
set(gcf,'CurrentAxes',handles.axes4); cla;
plot(w2/pi,grd2);
title('Group Delay','FontSize',10)
xlabel('frequency in pi units','FontSize',10);
ylabel('Samples','FontSize',10); axis([0,1,0,15])
set(gca,'XTickMode','manual','XTick',[0,wplp/pi,wslp/pi,1],'FontSize',10
);

set(gca,'YTickmode','manual','YTick',[0,max(grd2)],'FontSize',10); grid
% --- Executes on button press in pushbutton7.
% -------------------------------------------------------------------% ĐIỂM CỰC, ĐIỂM KHÔNG VÀ ĐÁP ỨNG XUNG CỦA BỘ LỌC THÔNG THẤP SỐ
% -------------------------------------------------------------------function pushbutton7_Callback(hObject, eventdata, handles)
% hObject
handle to pushbutton7 (see GCBO)

-14-


% eventdata reserved - to be defined in MANHHUNG future version of
MATLAB
% handles
structure with handles and user data (see GUIDATA)
set(handles.axes1,'Visible','off');
set(gcf,'CurrentAxes',handles.axes1)
cla
set(handles.axes2,'Visible','off');
set(gcf,'CurrentAxes',handles.axes2)
cla
set(handles.axes3,'Visible','off');
set(gcf,'CurrentAxes',handles.axes3)
cla
set(handles.axes4,'Visible','off');
set(gcf,'CurrentAxes',handles.axes4)
cla
% Plots of Pole, Zero and Impulse Response for Digital Lowpass Filter
% Pole and Zero
[ws1,wp1,wp2,ws2,Rp,As,wplp,wslp,T,OmegaP,OmegaS,ep,Ripple,Attn]=pushbut
ton1_Callback(hObject, eventdata, handles)

%[N,wn] =
cheb1ord(wplp/pi,wslp/pi,Rp,As);%++++++++++++++++++++++++++++
% Impulse invariance transformation to obtain MANHHUNG digital
Chebyshev-I lowpass filter
[cs,ds] = afd_chb1(OmegaP,OmegaS,Rp,As);
[blp,alp] = bilinear(cs,ds,T);
% Plots of Digital Lowpass Filter:
[db2,mag2,pha2,grd2,w2] = freqz_m(blp,alp);
z = roots(blp);
p = roots(alp);
[h1,t] = impz(blp,alp,100);
set(gcf,'CurrentAxes',handles.axes5); cla;
zplane(z,p); grid;
title('Pole and Zero for Digital Lowpass Filter','FontSize',10)
% Impulse Response
set(gcf,'CurrentAxes',handles.axes6); cla;
stem(t,h1); grid;
title('Impulse Response for Digital Lowpass
Filter','FontSize',10)
% --- Executes on button press in pushbutton8.
% -------------------------------------------------------------------% THIẾT KẾ BỘ LỌC THÔNG DẢI SỐ
% -------------------------------------------------------------------function pushbutton8_Callback(hObject, eventdata, handles)
% hObject
handle to pushbutton8 (see GCBO)
% eventdata reserved - to be defined in MANHHUNG future version of
MATLAB
set(handles.axes5,'Visible','off');
set(gcf,'CurrentAxes',handles.axes5);
cla;
set(handles.axes6,'Visible','off');

set(gcf,'CurrentAxes',handles.axes6);
cla;
[ws1,wp1,wp2,ws2,Rp,As,wplp,wslp,T,OmegaP,OmegaS,ep,Ripple,Attn]=pushbut
ton1_Callback(hObject, eventdata, handles)
[cs,ds] = afd_chb1(OmegaP,OmegaS,Rp,As);% thiet ke loc thong
thap analog
[blp,alp] = bilinear(cs,ds,T);
beta = cos((wp2 + wp1)/2)/cos((wp2 - wp1)/2);

-15-


k = cot((wp2 - wp1)/2)*tan(wplp/2)
alpha1 = -(2*beta*k)/(k+1)
alpha2 = (k-1)/(k+1)
Nz = -[alpha2,-alpha1,1]
Dz = [1,-alpha1,alpha2]
[bbp,abp] = zmapping(blp,alp,Nz,Dz)
% Cascade realization of the digital bandpass filter :
[C,B,MANHHUNG] = dir2cas(bbp,abp)
% Plots of Digital Bandpass Filter:
[db3,mag3,pha3,grd3,w3] = freqz_m(bbp,abp);
% Magnitude response
set(gcf,'CurrentAxes',handles.axes1); cla;
plot(w3/pi,mag3); grid;
title('Magnitude Response of Chebyshev-I Digital Bandpass
Filter','FontSize',10)
% Continue: Plots of Digital Bandstop Filter: Magnitude,
Phase responses and Group Delay
xlabel('frequency in pi units','FontSize',10); axis([0, 1,

0, 1])
set(gca,'XTickMode','manual','XTick',[0;ws1/pi;wp1/pi;wp2/pi;ws2/pi;1],'
FontSize',10)
set(gca,'YTickMode','manual','YTick',[0,Ripple,1],'FontSize',10);
% Phase response :
set(gcf,'CurrentAxes',handles.axes2); cla;
plot(w3/pi,pha3/pi);grid;
title('Phase Response','FontSize',10); axis([0,1,-1,1]);
xlabel('frequency in pi units','FontSize',10);ylabel('Phase
in pi units','FontSize',10)
set(gca,'XTickMode','manual','XTick',[0;ws1/pi;wp1/pi;wp2/pi;ws2/pi;1],'
FontSize',10)
% Magnitude response in dB :
set(gcf,'CurrentAxes',handles.axes3); cla;
plot(w3/pi,db3);grid;
title('Magnitude in dB','FontSize',10)
xlabel('frequency in pi units','FontSize',10);
axis([0, 1, -(As+60), 0]);
set(gca,'XTickMode','manual','XTick',[0;ws1/pi;wp1/pi;wp2/pi;ws2/pi;1],'
FontSize',10)
set(gca,'YTickMode','manual','YTick',[-75;-50;25;0],'FontSize',10)
% Group delay :
set(gcf,'CurrentAxes',handles.axes4); cla;
plot(w3/pi,grd3);grid;
title('Group Delay','FontSize',10);
axis([0,1,min(grd3),max(grd3)])
xlabel('frequency in pi units','FontSize',10);
ylabel('Samples','FontSize',10);
set(gca,'XTickMode','manual','XTick',[0;ws1/pi;wp1/pi;wp2/pi;ws2/pi;1],'
FontSize',10)

% handles

structure with handles and user data (see GUIDATA)

% --- Executes on button press in pushbutton10.
% -------------------------------------------------------------------% ĐIỂM CỰC, ĐIỂM KHÔNG VÀ ĐÁP ỨNG XUNG CỦA BỘ LỌC THÔNG DẢI SỐ

-16-


% -------------------------------------------------------------------function pushbutton10_Callback(hObject, eventdata, handles)
%--------------------------------------------------------------------set(handles.axes1,'Visible','off');
set(gcf,'CurrentAxes',handles.axes1);
cla;
set(handles.axes2,'Visible','off');
set(gcf,'CurrentAxes',handles.axes2);
cla;
set(handles.axes3,'Visible','off');
set(gcf,'CurrentAxes',handles.axes3);
cla;
set(handles.axes4,'Visible','off');
set(gcf,'CurrentAxes',handles.axes4);
cla;
[ws1,wp1,wp2,ws2,Rp,As,wplp,wslp,T,OmegaP,OmegaS,ep,Ripple,Attn]=pushbut
ton1_Callback(hObject, eventdata, handles)
[cs,ds] = afd_chb1(OmegaP,OmegaS,Rp,As);% thiet ke loc thong
thap analog
[blp,alp] = bilinear(cs,ds,T);
beta = (cos((wp2 + wp1)/2))/(cos((wp2 - wp1)/2));
k = cot((wp2 - wp1)/2)*tan(wplp/2)

alpha1 = -(2*beta*k)/(k+1)
alpha2 = (k-1)/(k+1)
Nz = -[alpha2,-alpha1,1]
Dz = [1,-alpha1,alpha2]
[bbp,abp] = zmapping(blp,alp,Nz,Dz)
z = roots(bbp);
p = roots(abp);
[h,t] = impz(bbp,abp,100);
set(gcf,'CurrentAxes',handles.axes5); cla;
zplane(z,p); grid;
title('Pole and Zero for Digital Bandstop Filter')
% Impulse Response
set(gcf,'CurrentAxes',handles.axes6); cla;
stem(t,h); grid;
title('Impulse Response for Digital BandPass Filter');

4. Kết quả chạy chương trình và nhận xét đánh giá.

BÀI 5. THIẾT KẾ BỘ LỌC CHẮN DẢI IIR SỬ DỤNG PHƯƠNG
PHÁP BIẾN ĐỔI BẤT BIẾN XUNG
1. Bài toán thiết kế
Thiết kế bộ lọc số IIR chắn dải sử dụng biến đổi bất biến xung thỏa mãn các chỉ tiêu
về tần số thấp L, tần số cao U, độ gợn sóng dải thông Rp và độ suy hao dải chắn As hay
các chỉ tiêu về bậc N của bộ lọc.

2. Các bước tiến hành thí nghiệm
Bước 1: Nhập các thơng số bộ lọc số chắn dải cần thiết kế
- Tần số dải thông ωp
- Tần số dải chắn ωs
-17-



- Độ gợn sóng dải thơng Rp
- Độ suy giảm dải chắn As
- Chu kỳ T.
Bước 2: Chiếu tần số cắt ωp và ωs từ miền tần số số lên miền tần số tương tự
theo công thức sau:
Ωp=ωp/T, Ωs=ωs/T
Bước 3: Thiết kế bộ lọc thông thấp tương tự Ha(s) sử dụng bộ lọc Chebyshev-II
với thông số Ωp, Ωs, Rp, As.
Bước 4: Biến đổi bộ lọc thông thấp tương tự Ha(s) thành bộ lọc thông thấp số
HLP(Z) theo phép biến đổi bất biến xung:
H LP ( Z ) 

1 
2 

Ha  s  j
k

T k  
T 

Bước 5: Chuyển đổi tần số để đạt được bộ lọc số chắn dải:
H(z) = H LP ( Z ) |

Z 1 

z


2

1z

11z

1

1

 2

 2 z

2

Với 1 = -2/(K+1)
2 = (K-1)/(K+1)
=

cos U  L  / 2 
cos U  L  / 2 

U  L

c
2
2
Bước 6: Vẽ đáp ứng biên độ - pha tần số và trễ nhóm của các bộ lọc
K =cotan


tan

3. Chương trình thiết kế bộ lọc số
% THIET KE BO LOC CHAN DAI CAU TRUC IIR SU DUNG BO LOC CHEBSEV -II VA BIEN
DOI BAT BIEN XUNG
%
function varargout = IR(varargin)
gui_Singleton = 1;
gui_State = struct('gui_Name',
mfilename, ...
'gui_Singleton', gui_Singleton, ...
'gui_OpeningFcn', @IR_OpeningFcn, ...
'gui_OutputFcn', @IR_OutputFcn, ...
'gui_LayoutFcn', [] , ...
'gui_Callback', []);
if nargin && ischar(varargin{1})
gui_State.gui_Callback = str2func(varargin{1});
end
if nargout
[varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});
else
gui_mainfcn(gui_State, varargin{:});
end
function IR_OpeningFcn(hObject, eventdata, handles, varargin)

-18-


handles.output = hObject;

guidata(hObject, handles);
function varargout = IR_OutputFcn(hObject, eventdata, handles)
varargout{1} = handles.output;
%=======================================================================
% THIET KE BO LOC THONG THAP TUONG TU
%=======================================================================
function pushbutton1_Callback(hObject, eventdata, handles)
clc
wp1p = 0.2*pi; % Dai thong so don vi Hz
ws1p = 0.5*pi; % Dai chan so don vi Hz
% Frequency of Analog Lowpass Filter
%
T=str2num(get(handles.T,'String'));
OmegaP = wp1p/T;
% Mau tan so dai thong
OmegaS = ws1p/T;
% mau tan so dai chan
% Digital Filter Specifications
wp1=str2num(get(handles.wp1,'String')); wpbs1=wp1*pi;
wp2=str2num(get(handles.wp2,'String')); wpbs2=wp2*pi;
ws1=str2num(get(handles.ws1,'String')); wsbs1=ws1*pi;
ws2=str2num(get(handles.ws2,'String')); wsbs2=ws2*pi;
Rp=str2num(get(handles.rp,'String'));
As=str2num(get(handles.as,'String'));
if ((As<=0) || (Rp<=0) )
errordlg('Xin vui long nhap lai','Bad input','modal' )
else
ep = sqrt(10^(Rp/10)-1);
% tham so gon song dai thong
Ripple = sqrt(1/(1+ep*ep)); % do gon song dai thong

Attn = 1/(10^(As/20));
% suy hao cua dai chan
end
% Qua trinh tinh toan Bo loc mau Chebyshev-II tuong tu
[cs,ds] = afd_chb2(OmegaP,OmegaS,Rp,As);
% Tinh toan dap ung xung
[ha,x,t] = impulse(cs,ds);
% Tinh toan dap ung tan so
[db1,mag1,pha1,w1] = freqs_m(cs,ds,pi);
% Do thi cua bo loc mau thong thap tuong tu
figure(1);
% Dap ung bien do
subplot(2,2,1); plot(w1/pi,mag1);
title('DAP UNG BIEN DO ')
xlabel('Tan so tuong tu (pi) '); ylabel('|H|'); axis([0,1,-0.1,1.1])
set(gca,'XTickMode','manual','XTick',[0,OmegaP/pi,OmegaS/pi,1]);
set(gca,'YTickmode','manual','YTick',[0,Attn,Ripple,1]); ;grid
% Dap ung pha :
subplot(2,2,2); plot(w1/pi,pha1/pi);
title('DAP UNG PHA')

-19-



×