用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,得到如下窗口:
通過選擇設置,可以得到濾波器的係數,以本題爲例:
其係數如下:
可對其到處頭文件,進行數據處理。
總結
本人對於數字信號處理這門課的學習比較衝忙,對於很多知識點都是比較模糊,希望在後續所需時能夠進一步的加深理解。
在FIR濾波器設計的過程中,遇到一個比較困惑的點是,根據其他的案例,濾波器係數是包含分子係數以及分母系數,但本例產生的濾波器僅含分母系數,比較困惑,請大佬們指教!