最近需要用到fir濾波器,在網上也看了不少資料,發現乙個稍微能用的(主要**也是直接copy的,但是在使用過程中發現,三角窗的實現好像不對,而且只實現了低通的,根據該文章內容,我自己重寫了乙個,包括三角窗函式的實現,新增了高通、帶通、帶阻的實現。環境visual studio2015,c#。
1、如下圖(最下面的曲線),使用網友的三角函式實現不對;
2、據此更改了相關**;
public class bartlett
public double getwin()
if (n > ((n - 1) / 2))
}return wd;}}
3、下圖為blackman和三角函式的h(n);
4、下圖為hanning和hamming窗的h(n);
5、由於看到的資料只提供了低通的實現方式,根據《數字訊號處理理論、演算法與實現(第三版)》實現了對應的高通、帶通、帶阻的實現;
6、高通
public double gethigh()
else
}return hd;
}
7、帶通
public double getdaitong(double wl, double wh)
else
}return hd;
}
8、帶阻,這裡設計時,對於求n=alpha時的hd[n]值不是很確定,上圖中用紅筆注釋的地方(為下面**實現的內容)。
public double getdaizu(double wl, double wh)
else
}return hd;
}
9、測試:(測試**均使用的hanning窗,測試低通、高通、帶通與帶阻功能)
9.1、原始訊號引數為:fs=1000,取樣點數:2048,原始資料報含兩個頻率點資料5hz和20hz。matlab**:
f1=5;f2=20;f3=15;
t=0:0.001:2.049;
y=2*cos(2*pi*f1*t)+2*sin(2*pi*f2*t);
plot(t,y);
fid=fopen('test1.txt','wt');
fprintf(fid,'%d,',y);
fclose(fid);
9.2、原始訊號及頻譜,
9.3、低通濾波,wp=0.02 * math.pi,ws=0.03 * math.pi(分別對應wp=10hz,ws=15hz)
注:由於給入的頻率為歸一化後的,需要計算((fs/2)*wp=fp,截止頻率為fc【wc為歸一化頻率】);相位延遲:(1/fs)*(n-1)/2;濾波器階數:n-1(n為窗長度)【這裡不確定,網上查到有這個說法,有大神知道的話可以**一下】。
9.4、高通濾波,引數與低通一致,
9.5、帶通濾波,帶通頻率設定為【0.03 * math.pi, 0.05 * math.pi】(即為15hz~25hz,通帶)
9.6、帶阻濾波,帶通頻率設定為【0.03 * math.pi, 0.05 * math.pi】(即為15hz~25hz,阻帶)
10、總結:
1)基本能實現濾波功能,但是有很多引數以及演算法需要再研究優化,僅提供一種思路;(未涉及到fir的4種形式)
2)從效果來看,高通與帶阻濾波後會出現很多高頻的干擾(頻段),而低通與帶通沒有,圖中能看出,還需要進一步研究;
3)本文採用的是時域卷積的處理方式,其實也可以用差分方程來做,自己賴還沒弄,處理完後都有資料點增多以及相移(線性)的問題,需要想辦法優化;
4)整個測試**
更新:5)在使用時發現,高通濾波時若訊號含有直流分量,則濾波結束後可能會引入低頻雜訊,將直流分量濾除後再進行濾波效果就會好很多;
低通,高通,帶通,帶阻濾波器的定義
1 低通 low pass filter 是容許低於截止頻率的訊號通過,但高於截止頻率的訊號不能通過的電子濾波裝置。2 高通 是一種讓某一頻率以上的訊號分量通過,而對該頻率以下的訊號分量大大抑制的電容 電感與電阻等器件的組合裝置。其特性在時域及頻域中可分別用衝激響應及頻率響應描述。3 帶通 是指能通...
FIR濾波器,低通 高通 帶通 帶阻VC實現
通常來說,一種理想濾波器的頻率響應是很容易理解的,如圖所示。圖1 濾波器頻響 以低通為例,濾波器頻率響應函式為 所謂濾波器處理的過程,簡單來說,可以用公式 來表示,由卷積的性質可以知道,該公式的另一種形式為 其中x n 為要處理的資料序列,h n 為逼近濾波器的時域響應 其中,hd n 為對應不同型...
空間低通高通濾波 濾波器和中值濾波
即使資料含有nan值,也可以直接處理 法一 空間中值高通低通濾波 空間濾波lon6 x lat6 高通 lon filt 6 lat filt 6 濾波的經緯度 mm lon lon filt 4 mm lat lat filt 4 mid sla ngrid1 nan size mid ngrid...