Chương trình Matlab

Một phần của tài liệu Thiết kế bộ lọc FIR thông dải bằng phương pháp cửa sổ (Trang 26 - 31)

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

Một phần của tài liệu Thiết kế bộ lọc FIR thông dải bằng phương pháp cửa sổ (Trang 26 - 31)

Tải bản đầy đủ (DOC)

(55 trang)
w