用MATLAB設計FIR濾波器

濾波器

濾波器定義

“濾波器(filter),是一種用來消除干擾雜訊的器件,將輸入或輸出經過過濾而得到純淨的直流電。對特定頻率的頻點或該頻點以外的頻率進行有效濾除的電路,就是濾波器,其功能就是得到一個特定頻率或消除一個特定頻率。”

濾波器種類

濾波器按照頻率來分類,可分爲高通、低通、帶通、帶阻以及全通濾波器,根據所需選擇合適濾波器。

濾波器種類

濾波器設計

濾波器的設計方法可分爲兩大類,一類是IIR,另一類是FIR。對於FIR的設計,一般可以採用等波紋以及窗的方法。

濾波器設計要求

採樣頻率50khz,帶通濾波器,通帶15KHz,阻帶20KHz,阻帶衰減50dB,用凱撒窗設計帶通濾波器。

Matlab程序設計濾波器

首先在Matlab中設置所需參數:

fs = 50000;
T = 1/fs;
L = 4000;
t = (0:L-1)*T;

然後從r32文件中讀取信號數據:

filename=['文件路徑'];
fid=fopen(filename,'r');
Na=4000;
dat=fread(fid,[32,Na],'float');
data=dat(1,:); %data即爲所導入信號

繪製信號時域圖:

plot(t,data)

得到:
濾波前信號時域圖
再對其進行FFT:

NFFT = 2^nextpow2(L);
Y = fft(data,NFFT)/L;
f=fs/2*linspace(0,1,NFFT/2+1);
figure
plot(f,2*abs(Y(1:NFFT/2+1)))
title('Single-sided Amplitude Spectrum of y(t)')
xlabel('Frequency(Hz)')
ylabel('|Y(f)|')

得到:
濾波前信號的單面振幅頻譜圖
設計濾波器:

fs = 50000;
f = [13000 15000 20000 22000];
dev = [0.01 0.02 0.01];
a = [0 1 0];
[n,wn,beta,ftype] = kaiserord(f,a,dev,fs);
b = fir1(n,wn,'bandpass');
freqz(b)

得到濾波器的幅值相位圖:
濾波器的幅值相位圖
所設計濾波器的分子係數存於b中,使所給信號通過所設計的濾波器,所用程序如下:

d=filter(b,1,data);
plot(t,d)

得到濾波後的信號時域圖:
濾波後的信號時域圖
對其進行FFT:

Y _af= fft(d,NFFT)/L;
f_af=fs/2*linspace(0,1,NFFT/2+1);
figure
plot(f_af,2*abs(Y_af(1:NFFT/2+1)))
xlabel('Frequency(Hz)')

得到:
濾波後信號的單面振幅頻譜圖

利用Matlab工具箱設計濾波器

另外,還有一種更加快捷的設計方法,即使用Matlab自帶的工具箱filterDesigner來設計濾波器:
在Matlab的命令行窗口中輸入filterDesigner,得到如下窗口:
filterDesigner界面
通過選擇設置,可以得到濾波器的係數,以本題爲例:
利用filterDesigner設計濾波器
其係數如下:
濾波器係數
可對其到處頭文件,進行數據處理。






總結

本人對於數字信號處理這門課的學習比較衝忙,對於很多知識點都是比較模糊,希望在後續所需時能夠進一步的加深理解。
在FIR濾波器設計的過程中,遇到一個比較困惑的點是,根據其他的案例,濾波器係數是包含分子係數以及分母系數,但本例產生的濾波器僅含分母系數,比較困惑,請大佬們指教!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章