FIR (Finite Impulse Response) yani sonlu dürtü tepkisi bir dijital filtre türüdür. Giriş değerleri sadece terimleri içermesinden dolayı yinelemeyen-tekrarlamayan filtre olarak da bilinir.
Alçak geçiren filtrenin frekans domenindeki karşılığı aşağıdaki gibi bir dikdörtgen penceredir.
köşe frekansı olmak üzere yukarıdaki dikdörtgen pencerenin transfer fonksiyonu aşağıdaki gibidir:
verinin DFT'sini alıp, bu dikdörtgen pencere ile çarptıktan sonra IDFT'sini alırsak alçak geçiren filtreyi gerçekleştirmiş oluruz. Zaman domeninden frekans domenine ve frekans domeninden zaman domenine geçiş, 'nin büyüklüğüne göre yüksek miktarda işlem yükü getirir. Frekans domeninde çarpma işlemi zaman domeninde konvolüsyona denk gelir.
Transfer fonksiyonunun zaman domenindeki karşılığını IDFT ile bulabiliriz:
köşe (kesim) frekansı, sampling (örnekleme) frekansı olmak üzere şeklinde normalize edilir. nyquist teoremine göre arasında değerler alabilir.
fonksiyonu sonsuza uzanan bir fonksiyon olduğunda gerçekleştirilebilir bir filtre yapılamaz. Bunun yerine fonksiyonunu fonksiyonu ile çarparak kırpalım(pencereleyelim):
Burada filtrenin derecesini belirtir. değeri arttıkça frekans tepkisi ideale yaklaşır.
fonksiyonunun fonksiyonu ile konvolüsyon işlemine sokarsak FIR filtreyi gerçekleştirmiş oluruz.
Matlab Uygulaması:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 |
% Belirlenen fs, fc ve dereceye göre alçak % geçiren 1.tip linear phase FIR filtre katsayılarını % hesaplayan ve bu katsayılara göre filtrenin frekans % tepkisini çizen program %Köşe (Kesim) Frekansı fc = 20000; %Örnekleme Frekansı fs = 100000; %Filtre Derecesi %Filtre Uzunluğu = N + 1; N = 80; %[0, pi) Arasında Normalize Edilmiş Köşe Frekansı wc = 2 * pi * fc / fs; %Katsayı Vektörü t = -N/2:N/2; %Transfer Fonksiyonu h = wc * sinc(wc * t / pi) / pi; %FFT Uzunluğu ve Vektörü fftlen = 8192; fftvec = linspace(-pi, pi, fftlen); %Transfer Fonksiyonunun Frekans domenindeki karşılığı H = abs(fft(h, fftlen)); %Katsayılar subplot(3,1,1); stem(0:N, h, 'filled'); set(gca, 'Ylim', [-0.2 0.5], ... 'FontName', 'Symbol', 'FontSize', 12); grid on; title('Katsayılar', 'FontSize', 10, 'FontName', 'Times'); xlabel('n', 'FontSize', 15, 'FontName', 'Times'); ylabel('h[n]', 'FontSize', 15, 'FontName', 'Times'); %Frekans Tepkisi ([-2pi, 2pi] aralığında) subplot(3,1,2); plot(fftvec - pi, H, fftvec + pi, H, 'color', 'blue'); set(gca, 'xTick', [-2*pi -pi 0 pi 2*pi], ... 'xTickLabel', {'-2p' '-p' '0' 'p' '2p'}, ... 'FontName', 'Symbol', 'FontSize', 12, ... 'Ylim', [-0.5 1.5], 'Xlim', [-2 * pi 2 * pi]); grid on; title('Frekans Tepkisi', 'FontSize', 10, 'FontName', 'Times'); xlabel('\omega', 'FontSize', 15, 'FontName', 'Times'); ylabel('|H(\omega)|', 'FontSize', 15, 'FontName', 'Times'); %Frekans Tepkisi (dB cinsinden) ([-2pi, 2pi] aralığında) subplot(3,1,3); plot(fftvec - pi, 20*log10(H), fftvec + pi, 20*log10(H), 'color', 'blue'); set(gca, 'xTick', [-2*pi -pi 0 pi 2*pi], ... 'xTickLabel', {'-2p' '-p' '0' 'p' '2p'}, ... 'FontName', 'Symbol', 'FontSize', 12, ... 'Ylim', [-80 10], 'Xlim', [-2 * pi 2 * pi]); grid on; title('Frekans Tepkisi', 'FontSize', 10, 'FontName', 'Times'); xlabel('\omega', 'FontSize', 15, 'FontName', 'Times'); ylabel('|H(\omega)|_{dB}', 'FontSize', 15, 'FontName', 'Times'); |