matlab的FIR濾波器設計
阿新 • • 發佈:2018-12-08
1.matlab設計fir濾波器的方法
matlab可以使用fir1函式設計低通、高通、低通、帶通等具有嚴格線性相位特性的濾波器。
fir1函式的幾種語法如下:
b=fir1(n,wn);
b=fir1(n,wn,'ftype');
b=fir1(n,wn,'ftype',window)
b=fir1(...,'noscale')
各個引數的含義:
- b:返回fir濾波器的單位脈衝相應,偶對稱,長度為n+1;
- n:濾波器的階數,設計出的濾波器長度為n+1;
- wn:濾波器的截止頻率,取值範圍0<wn<1,1對應取樣頻率的1/2。當需要設計低通/高通濾波器,wn是單個值的,即截至頻率,ftype引數是low/high;;當設計帶通/帶阻濾波器時,wn由兩個陣列成的向量[wn1 wn2],ftype引數是bandpass/stop;
- window:指定使用的窗函式,預設是漢明窗(Hamming),最常用的還有漢寧窗(Hanning)、布萊克曼窗(Blackman)、凱賽窗(Kaiser);
- noscale:指定歸一化濾波器的幅度‘
2.fir1函式設計濾波器
設計濾波器,採用漢明窗,長度41(階數40),取樣頻率2000hz:
- 1.低通,截至頻率200hz;
- 2.高通,截至頻率200hz;
- 3.帶通,通帶200-400hz;
- 4.帶阻,阻帶200-400h’z
clear all; close all; clc;
% 濾波器長度
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(4,2,1);stem(b_lpf);xlabel('n');ylabel('h(n)');legend('lpf');
subplot(4,2,3);stem(b_hpf);xlabel('n');ylabel('h(n)');legend('hpf');
subplot(4,2,5);stem(b_bandpass);xlabel('n');ylabel('h(n)');legend('bandpass');
subplot(4,2,7);stem(b_stop);xlabel('n');ylabel('h(n)');legend('stop');
% 幅頻響應
subplot(4,2,2);plot(x_f,m_lpf(1:length(x_f)));xlabel('頻率(hz)');ylabel('幅度(db)','fontsize',8);legend('lpf')
subplot(4,2,4);plot(x_f,m_hpf(1:length(x_f)));xlabel('頻率(hz)');ylabel('幅度(db)','fontsize',8);legend('hpf')
subplot(4,2,6);plot(x_f,m_bandpass(1:length(x_f)));xlabel('頻率(hz)');ylabel('幅度(db)','fontsize',8);legend('bandpass')
subplot(4,2,8);plot(x_f,m_stop(1:length(x_f)));xlabel('頻率(hz)');ylabel('幅度(db)','fontsize',8);legend('stop');
模擬脈衝相應和幅頻響應圖: