Chương trình chính: Hàm bpf_kai(ws1,wp1,wp2,ws2,Rp,As) thực hiện thiết kế bộ lọc thông dải dùng cửa sổ Kaiser.
BEGIN Nhập các chỉ tiêu w1s, w1p, w2p, w2s, A s, R p Chỉ tiêu có hợp lệ không? No Tính bậc M và hệ số β
của cửa sổ Kaiser theo công thức (1.40)
Tìm hàm cửa sổ w(n) (Gọi hàm của Matlab w=kaiser(M,beta) ) Tính hd(n) h(n)=hd(n).w(n) Vẽ hd(n), w(n), h(n) và đáp ứng biên độ (dB) của bộ lọc thiết kế. END Yes
function [h] = bpf_kai(ws1,wp1,wp2,ws2,Rp,As);
%thiet ke bo loc Fix thong dai dung cua so kaiser
%--- % h = bpf_kai(ws1,wp1,wp2,ws2,Rp,As)
% ws1: Canh thap cua dai chan % wp1: Canh thap cua dai thong % wp2: Canh cao cua dai thong % ws2: Canh cao cua dai chan % Rp : Do gon song trong dai thong % As : Suy hao trong dai chan
%--- % Note: 0 < ws1 < wp1 < wp2 < ws2 < 1
% Rp < 1 dB % As > 21 dB
%--- % Kiem tra cac so lieu khi nhap vao
if (nargin == 0),
temp=input('Canh thap cua dai chan: ws1 = ');
if (temp <= 0)|(temp>=1), error('Canh thap cua dai chan ws1: 0< ws1 <1'); end
ws1=temp;
temp=input('Canh thap cua dai thong: wp1 = ');
if (temp <= ws1)|(temp>=1), error('Canh thap cua dai thong wp1: ws1 < wp1 < 1'); end
wp1=temp;
temp=input('Canh cao cua dai thong: wp2 = ');
if (temp <= wp1)|(temp>=1), error('Canh cao cua dai thong wp2: wp1 < wp2 < 1'); end
wp2=temp;
temp=input('Canh cao cua dai chan: ws2 = ');
if (temp <= wp2)|(temp>=1), error('Canh cao cua dai chan ws2: wp2 < ws2 < 1'); end
ws2=temp;
temp=input('Do gon song trong dai thong (0 < Rp < 1): Rp = '); if (temp <= 0)|(temp>=1), error('Error: 0 < Rp < 1');
end
Rp=temp;
temp=input('Suy hao trong dai chan (As > 21): As = '); if (temp < 0), error('Error: As lon hon 21 dB !!'); end As=temp; elseif (nargin ~= 6), error('bpf_kai(ws1,wp1,wp2,ws2,Rp,As)'); end ws1=ws1*pi; wp1=wp1*pi;
wp2=wp2*pi; ws2=ws2*pi; % Tinh M va beta tr_width = min((wp1-ws1),(ws2-wp2)); M = ceil((As-7.95)/(14.36*tr_width/(2*pi))+1)+1; M = 2*floor(M/2)+1 n=[0:1:M-1]; if As >= 50 beta = 0.1102*(As-8.7);
elseif (As < 50) & (As > 21)
beta = 0.5842*(As-21)^(0.4) + 0.07886*(As-21);
else
error('As lon hon 21')
end
beta
w_kai = (kaiser(M,beta))'; % Tinh cua so kaiser
wc1 = (ws1+wp1)/2; % Tan so cat cua LPF 1
wc2 = (wp2+ws2)/2; % Tan so cat cua LPF 2
hd = ideal_lp(wc2,M) - ideal_lp(wc1,M); % Tinh dap ung xung ly tuong
h = hd .* w_kai; % Dap ung xung cua bo loc can tinh
[db,mag,pha,grd,w] = freqz_m(h,[1]); %
delta_w = 2*pi/1000; %
disp(['Do gon song trong dai thong:']) %
Rp = -min(db(wp1/delta_w+1:1:wp2/delta_w)) % Do gon song trong dai thong
disp(['Do suy hao trong dai chan:']) %
As = -round(max(db(ws2/delta_w+1:1:501))) % Do suy hao trong dai chan %================================================== %Ve dap ung xung cua loc thong thap ly tuong hd(n)
subplot(1,1,1);
subplot(2,2,1); stem(n,hd,'.'); title('dap ung xung hd(n)') axis([0 M-1 -0.4 0.4]); xlabel('n'); ylabel('hd(n)')
%================================================== % V? ham cua so Kaiser w_kai(n)
subplot(2,2,2); stem(n,w_kai,'.');title(' cua so Kaiser w(n)') axis([0 M-1 -0.1 1.1]); xlabel('n'); ylabel('w(n)')
%================================================== % Ve dap ung xung cua bo loc can thiet ke h(n)
subplot(2,2,3); stem(n,h,'.');title('dap ung xung h(n)') axis([0 M-1 -0.4 0.4]); xlabel('n'); ylabel('h(n)')
%================================================== % Ve dap ung bien do-tan so cua bo loc can thiet ke
subplot(2,2,4); plot(w/pi,db); title('Dap ung bien do');grid; axis([0 1 -150 10]);
% plot dash lines
set(gca,'XTickMode','manual','XTick',[0,ws1/pi,wp1/pi,wp2/pi,ws2/pi,1]) set(gca,'YTickMode','manual','YTick',[-As,0])
Các hàm chính được sử dụng trong chương trình:
• ideal_lp(wc,M): Tính đáp ứng xung của bộ lọc thông thấp lý tưởng bậc M
• kaiser(M,beta): Tính cửa sổ Kaiser chiều dài M, với tham số beta.
• freqz_m(h,[1]): Tính đáp ứng tần số của bộ lọc FIR có đáp ứng xung h. 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 hd = ideal_lp(wc,M);
% Ideal LowPass filter computation % ---
% [hd] = ideal_lp(wc,M)
% hd = ideal impulse response between 0 to M-1 % wc = cutoff frequency in radians
% M = length of the ideal filter
alpha = (M-1)/2; n = [0:1:(M-1)]; m = n - alpha + eps; hd = sin(wc*m) ./ (pi*m);
c.Kết quả chạy chương trình thiết kế dùng cửa sổ Kaiser
Các chỉ tiêu thiết kế được cho:
• ws1 = 0.25π, wp1 = 0.35π • wp2 = 0.55π, ws2 = 0.65π
• Suy hao ở dải chắn : As = 70 dB
• Độ gợn sóng ở dải thông : Rp = 0.7 dB
Cách gọi hàm : h=bpf_kai(0.25, 0.35, 0.55, 0.65, 0.7, 70); Kết quả chạy chương trình thiết kế:
• M = 89
• Beta = 6.57
• Độ gợn sóng trong dải thông thực tế: Rp = 0.0064 dB
• Suy hao trong dải chắn thực tế: As = 69
Hình dạng của đáp ứng xung lý tưởng, đáp ứng xung thực tế bộ lọc, hàm cửa sổ Kaiser, và đáp ứng biên độ tần số (theo dB) của bộ lọc được cho ở hình 2.3.
0 20 40 60 80-0.4 -0.4 -0.2 0 0.2 0.4
dap ung xung hd(n)
n h d (n ) 0 20 40 60 80 0 0.2 0.4 0.6 0.8 1 cua so Kaiser w(n) n w (n ) 0 20 40 60 80 -0.4 -0.2 0 0.2 0.4
dap ung xung h(n)
n h (n ) 0 0.250.35 0.550.65 1 -69 0