1. 程式人生 > >使用MATLAB設計FIR濾波器

使用MATLAB設計FIR濾波器

AMM lap 獲取 處理 ali 圖片 組成 相關 高通

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濾波器