使用MATLAB設計FIR濾波器
1. 采用fir1函數設計,fir1函數可以設計低通、帶通、高通、帶阻等多種類型的具有嚴格線性相位特性的FIR濾波器。語法形式:
b = fir1(n, wn)
b = fir1(n, wn, ‘ftype’)
b = fir1(n, wn, ‘ftype’, window)
b = fir1(n, wn, ‘ftype’, window, ‘noscale’)
參數的意義及作用:
- b:返回的FIR濾波器單位脈沖響應,脈沖響應為偶對稱,長度為n+1;
- n:濾波器的介數;
- wn:濾波器的截止頻率,取值範圍為0<wn<1,1對應信號采樣頻率一半。如果wn是單個數值,且ftype參數為low,則表示設計截止頻率為wn的低通濾波器,如果ftype參數為high,則表示設計截止頻率為wn的高通濾波器;如果wn是有兩個數組成的向量[wn1 wn2],ftype為stop,則表示設計帶阻濾波器,ftype為bandpass,則表示設計帶通濾波器;如果wn是由多個數組成的向量,則根據ftype的值設計多個通帶或阻帶範圍的濾波器,ftype為DC-1,表示設計的第一個頻帶為通帶,ftype為DC-0,表示設計的第一個頻帶為阻帶;
- window:指定使用的窗函數,默認為海明窗;
- noscale:指定是否歸一化濾波器的幅度。
示例:
N=41; %濾波器長度 fs=2000; %采樣頻率 %各種濾波器的特征頻率 fc_lpf=200; fc_hpf=200; fp_bandpass=[200 400]; fc_stop=[200 400]; %以采樣頻率的一半,對頻率進行歸一化處理 wn_lpf=fc_lpf*2/fs; wn_hpf=fc_hpf*2/fs; wn_bandpass=fp_bandpass*2/fs; wn_stop=fc_stop*2/fs; %采用fir1函數設計FIR濾波器 b_lpf=fir1(N-1,wn_lpf); b_hpf=fir1(N-1,wn_hpf,‘high‘); b_bandpass=fir1(N-1,wn_bandpass,‘bandpass‘); b_stop=fir1(N-1,wn_stop,‘stop‘); %求濾波器的幅頻響應 m_lpf=20*log(abs(fft(b_lpf)))/log(10); m_hpf=20*log(abs(fft(b_hpf)))/log(10); m_bandpass=20*log(abs(fft(b_bandpass)))/log(10); m_stop=20*log(abs(fft(b_stop)))/log(10); %設置幅頻響應的橫坐標單位為Hz x_f=0:(fs/length(m_lpf)):fs/2; %繪制單位脈沖響應 subplot(421);stem(b_lpf);xlabel(‘n‘);ylabel(‘h(n)‘); subplot(423);stem(b_hpf);xlabel(‘n‘);ylabel(‘h(n)‘); subplot(425);stem(b_bandpass);xlabel(‘n‘);ylabel(‘h(n)‘); subplot(427);stem(b_stop);xlabel(‘n‘);ylabel(‘h(n)‘); %繪制幅頻響應曲線 subplot(422);plot(x_f,m_lpf(1:length(x_f)));xlabel(‘頻率(Hz)‘,‘fontsize‘,8);ylabel(‘幅度(dB)‘,‘fontsize‘,8); subplot(424);plot(x_f,m_hpf(1:length(x_f)));xlabel(‘頻率(Hz)‘,‘fontsize‘,8);ylabel(‘幅度(dB)‘,‘fontsize‘,8); subplot(426);plot(x_f,m_bandpass(1:length(x_f)));xlabel(‘頻率(Hz)‘,‘fontsize‘,8);ylabel(‘幅度(dB)‘,‘fontsize‘,8); subplot(428);plot(x_f,m_stop(1:length(x_f)));xlabel(‘頻率(Hz)‘,‘fontsize‘,8);ylabel(‘幅度(dB)‘,‘fontsize‘,8); |
2. 采用fir2函數設計,函數算法是:首先根據要求的幅頻響應向量形式進行插值,然後進行傅裏葉變換得到理想濾波器的單位脈沖響應,最後利用窗函數對理想濾波器的單位脈沖響應激進型截斷處理,由此得到FIR濾波器系數。fir2函數的語法形式:
b = fir2(n, f, m)
b = fir2(n, f, m, window)
b = fir2(n, f, m, npt)
b = fir2(n, f, m, npt, window)
b = fir2(n, f, m, npt, lap)
b = fir2(n, f, m, npt, lap, window)
各項參數的意義及作用:
- n及b:濾波器的介數,返回值b為濾波器系數,長度為n+1。註意:當設計的濾波器在歸一化頻率為1處的幅度值不為0時,n不能為奇數;
- f及m:f取值在0~1之間,對應為濾波器的歸一化頻率;m是長度與f相同的向量,用於設置對應頻段範圍內的理想幅值;
- window:用於指定窗函數的種類,默認是海明窗;
- npt:正整數,用於指定對幅度響應進行插值時的插值點個數,默認是512;
- lap:正整數,用於指定對幅度響應進行插值時,對於不連續點轉變成連續時的點數,默認25
示例:
N=120; %濾波器階數 fc=[0 0.125 0.125 0.25 0.25 0.5 0.5 1]; %截止頻率 mag=[1 1 0.5 0.5 0.25 0.25 0.125 0.125 ]; %理想濾波器幅度 b=fir2(N,fc,mag); %設計海明窗濾波器 freqz(b); %繪制頻率響應曲線 |
3. 采用kaiserord函數設計,凱塞窗具有可調參數選項,可根據相關算法,先選擇過渡帶、容限參數,並根據這些參數計算出凱塞窗的值,以及濾波器階數,語法形式:
[n, wn, beta, filtype] = kaiserord(f, a, dev, fs)
各項參數的意義和作用:
- f及fs:如果f是一個向量,則其中的元素是待設計的過渡帶的起始點和結束點;如果沒有fs參數,f中元素的取值範圍是0~1,即相對於采樣頻率一半的歸一化頻率;如果有fs參數,則fs為信號采樣頻率,f中元素即為實際的截止頻率;
- a:是一個向量,用於指定過渡帶頻率段的理想幅度值;
- dev:是一個向量,用於指定通帶或阻帶內的容許誤差;
- n:設計的最小階數;
- wn:向量,計算得到的濾波器截止頻率點;
- beta:計算得到的值;
- ftype:根據設計要求得到的濾波器類型參數
4. 采用firpm函數設計,采用最大誤差最小準則進行濾波器設計,語法形式:
b = firpm(n, f, a)
b = firpm(n, f, a,w)
b = firpm(n, f, a,’ftype’)
b = firpm(n, f, a, w, ‘ftype’)
[b, delta] = firpm(…)
各項參數的意義及作用:
- n及b:濾波器階數;
- f及a:兩個長度相同向量,f取值0~1之間,對應濾波器的歸一化頻率,a用於設置對應頻段範圍內的理想幅值;
- w:長度為f的一半,實現對應頻段幅度值的權值;
- ftype:指定濾波器結構類型,如果沒有設置該參數,表示設計偶對稱脈沖響應濾波器;如果設置為hilbert,則表示設計奇對稱結構的濾波器,具有相移特性;
- delta:返回濾波器最大容限值
示例:
利用凱塞窗函數設計低通FIR濾波器,過渡帶為1000~1500Hz,采樣頻率為8000Hz,通帶容限最大為0.01,阻帶容限最大為0.05.利用海明窗及firpm函數設計相同的低通濾波器,截止頻率為1500Hz,濾波器階數為凱塞窗函數求取的值。
fs=8000; %采樣頻率 fc=[1000 1500]; %過渡帶 mag=[1 0]; %窗函數的理想濾波器幅度 dev=[0.01 0.05]; %紋波 [n,wn,beta,ftype]=kaiserord(fc,mag,dev,fs); %獲取凱塞窗參數 fpm=[0 fc(1)*2/fs fc(2)*2/fs 1]; %firpm函數的頻段向量 magpm=[1 1 0 0]; %firpm函數的幅值向量
%設計凱塞窗及海明窗濾波器 h_kaiser=fir1(n,wn,ftype,kaiser(n+1,beta)); h_hamm=fir1(n,fc(2)*2/fs); %設計最優濾波器 h_pm=firpm(n,fpm,magpm); %求濾波器的幅頻響應 m_kaiser=20*log(abs(fft(h_kaiser,1024)))/log(10); m_hamm=20*log(abs(fft(h_hamm,1024)))/log(10); m_pm=20*log(abs(fft(h_pm,1024)))/log(10);
%設置幅頻響應的橫坐標單位為Hz x_f=[0:(fs/length(m_kaiser)):fs/2]; %只顯示正頻率部分的幅頻響應 m1=m_kaiser(1:length(x_f)); m2=m_hamm(1:length(x_f)); m3=m_pm(1:length(x_f)); %繪制幅頻響應曲線 plot(x_f,m1,‘-‘,x_f,m2,‘-.‘,x_f,m3,‘--‘); xlabel(‘頻率(Hz)‘);ylabel(‘幅度(dB)‘); legend(‘凱塞窗‘,‘海明窗‘,‘最優濾波器‘); grid; |
使用MATLAB設計FIR濾波器