一阶RC低通滤波
一階RC低通濾波
從模擬到數(shù)字?
本文整理自網(wǎng)絡(luò)、《匠人手記》等書籍文章
- 模擬電路低通濾波時(shí)域、頻域
- 軟件低通濾波
典型電路
?
圖1 典型RC電路?
直流、交流、脈沖信號都可以用它
時(shí)域
電容電流:?
基爾霍夫電壓定律得:?
Ui=RCdUodt+Uo
Ui的單位是伏特,RC的單位為秒,τ=RC;?
解得:?
Uo(t)=Ui(1?e∧(?t/RC))
假設(shè)電容初始電壓值為0?
R=1000Ω?
C=4.7uF?
Ui=1V?
t=0.0001~0.1s?
τ=RC?
Vc(τ)=0.632?
?
圖2 一階RC系統(tǒng)的階躍響應(yīng)曲線
頻域
u1=Ui;u2=Uo;?
以電容電壓作為輸出,電路的網(wǎng)絡(luò)函數(shù)為:?
令ωc= 1RC=1τ
ωc即為截止頻率;
幅值和相角函數(shù):?
θ(ω)=?arctanωωc
各變量取值:?
R=1000Ω?
C=4.7uF?
ω=1RC
fc=12πRC
A(f)=1j2πfRC+1
|A(fc)|=0.707?
θ(f)=180arg(A(f))π
θ(fc)=-45
f=0.001、1、…….100000
幅頻和相頻特性圖:?
?
圖3?
?
圖4?
幅頻特性圖的對數(shù)表示:?
?
圖5
-當(dāng)ω<ωc時(shí),幅值是平行于坐標(biāo)的直線,基本無衰減;
-當(dāng)ω>>ωc時(shí),是斜率與-20dB/十倍頻成比例的一條直線;
-當(dāng)ω=ωc時(shí),增益衰減至0.707,即-3dB,相位滯后45度,對應(yīng)低通濾波器,該頻率通常被稱為截止頻率。
缺點(diǎn):?
采用這種模擬濾波器抑制低頻干擾時(shí),要求濾波器有較大的時(shí)間常數(shù)和高精度的RC網(wǎng)絡(luò),增大時(shí)間常數(shù)要求增大R值,其漏電流也隨之增大,從而降低了濾波效果;
軟件上的一階低通濾波
優(yōu)點(diǎn):
-采用數(shù)字濾波算法來實(shí)現(xiàn)動態(tài)的RC濾波,則能很好的克服模擬濾波器的缺點(diǎn);?
-在模擬常數(shù)要求較大的場合這種算法顯得更為實(shí)用;?
-其對于周期干擾有良好的抑制作用,?
-比較節(jié)省RAM空間
缺點(diǎn)
-不足之處是帶來了相位滯后,導(dǎo)致靈敏度低;?
-同時(shí)它不能濾除頻率高于采樣頻率的二分之一(稱為奈奎斯特頻率)的干擾(例如采樣頻率為100Hz,則它不能濾除50Hz以上的干擾信號)對于高于奈奎斯特頻率的干擾信號,應(yīng)該采用模擬濾波器。?
-對沒有乘、除法運(yùn)算指令的單片機(jī)來說,程序運(yùn)算工作量較大
基本濾波算法:
算法由來:?
頻率分析中一階RC低通濾波在S域的傳遞函數(shù):?
通過z變換(方法很多,如一階前向差分、雙線性變換等這里用一階后向差分法)?
s=1?z∧(?1)T,T表示采樣周期
帶入S域傳遞函數(shù)中:?
推導(dǎo)轉(zhuǎn)化為差分方程后可得:?
Y(n)=TT+RCX(n)+RCT+RCY(n?1)
通過Z變換把S域的傳遞函數(shù)轉(zhuǎn)化成時(shí)域的差分方程,分析可得到
一階RC數(shù)字濾波的基本算法
X為輸入,Y為濾波后得輸出值,則:?
a為與RC值有關(guān)的一個(gè)參數(shù),稱為濾波系數(shù),其值決定新采樣值在本次濾波結(jié)果中所占的權(quán)重,其值通常遠(yuǎn)小于1,當(dāng)采樣間隔t足夠小的時(shí)候,?
-濾波系數(shù)越小,濾波結(jié)果越平穩(wěn),但是靈敏度越低;
-濾波系數(shù)越大,靈敏度越高,但是濾波結(jié)果越不穩(wěn)定
-本次輸出值主要取決于上次濾波輸出值,當(dāng)前采樣值對本次輸出貢獻(xiàn)比較小,起到修正作用;
-截止頻率:
fl=a2πt
例如:t=0.5s (f=2Hz), a=1/32?
則fl=(1/32)/(2*3.14*0.5)=0.01Hz;
基本程序:
按照一階濾波的基本原理與公式寫程序,如下:
/*程序中整數(shù)運(yùn)算比小數(shù)運(yùn)算快,為加快程序的處理速度,為計(jì)算方便,a取一整數(shù),1-a用256-a來代替,a則取0~255,代表新采樣值在濾波結(jié)果中的權(quán)重(也可將1-a的基數(shù)改為100-a,計(jì)算結(jié)果做相應(yīng)處理,這里不做說明)*/#define a 128 char value; //上次濾波值 char filter() {char new_value;new_value=get_ad();//本次采樣值return(256-a)*value/256+a*new_value/256; }- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
程序初步優(yōu)化
減少乘、除的運(yùn)算次數(shù)以提高運(yùn)算速度。?
具體優(yōu)化辦法:?
先將新采樣值與上次濾波結(jié)果進(jìn)行比較,然后根據(jù)比較采用不同的公式計(jì)算,這樣程序的運(yùn)算效率提高了一倍;?
化解基本公式可得:?
當(dāng)Xn>Y(n?1)時(shí),Yn=Y(n?1)+(Xn?Y(n?1))×a÷256;
流程圖:?
程序:
/*入口:NEW_DATA 新采樣值OLD_DATA 上次濾波結(jié)果k 濾波系數(shù)(0~255)(代表在濾波結(jié)果中的權(quán)重)出口: 本次濾波結(jié)果*/char filter_1(char NEW_DATA,char OLD_DATA,char k) {int result;if(NEW_DATA<OLD_DATA){result=OLD_DATA-NEW_DATA;result=result*k;result=result+128;//+128是為了四色五入result=result/256;result=OLD_DATA-result;}else if(NEW_DATA>OLD_DATA){result=NEW_DATA-OLD_DATA;result=result*k;result=result+128;//+128是為了四色五入result=result/256;result=OLD_DATA-result;}else result=OLD_DATA;return((char)result); }- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
濾波分析:?
當(dāng)濾波系數(shù)為30的時(shí)候:?
?
當(dāng)濾波系數(shù)為128的時(shí)候:?
?
當(dāng)濾波系數(shù)為200的時(shí)候:?
?
可見濾波系數(shù)越小,濾波結(jié)果越平穩(wěn),但是靈敏度越低;濾波系數(shù)越大,靈敏度越高,但濾波結(jié)果也越不穩(wěn)定;
不足
-靈敏度和平穩(wěn)度間的矛盾
-小數(shù)舍棄帶來的誤差?
比如:本次采樣值=25,上次濾波結(jié)果=24,濾波系數(shù)=10;?
根據(jù)算法得本次結(jié)果=24.0390625?
在單片機(jī)中,很少采用浮點(diǎn)數(shù),小數(shù)部分要么舍棄,要么進(jìn)行四色五入。這樣結(jié)果就變成24;假如采樣值一直為25那么,結(jié)果永遠(yuǎn)是24;濾波結(jié)果和實(shí)際數(shù)據(jù)一直存在無法消除的誤差。?
嚴(yán)重時(shí)會導(dǎo)致,在數(shù)據(jù)采樣數(shù)據(jù)穩(wěn)定在某一數(shù)值上時(shí),濾波結(jié)果曲線偏離實(shí)際值(即濾波結(jié)果在穩(wěn)定時(shí)與實(shí)際結(jié)果存在較大誤差);
改善辦法
改變?yōu)V波系數(shù),增大會導(dǎo)致平穩(wěn)度降低,濾波系數(shù)太大濾波也就喪失意義;?
將小數(shù)位參與計(jì)算,會給CPU帶來沉重運(yùn)算壓力;
優(yōu)化方法 —– 動態(tài)調(diào)整濾波系數(shù)
1、實(shí)現(xiàn)功能:?
-當(dāng)數(shù)據(jù)快速變化時(shí),濾波結(jié)果能及時(shí)跟進(jìn),并且數(shù)據(jù)的變化越快,靈敏度應(yīng)該越高(靈敏度優(yōu)先原則)?
-當(dāng)數(shù)據(jù)趨于穩(wěn)定,并在一個(gè)范圍內(nèi)振蕩時(shí),濾波結(jié)果能趨于平穩(wěn)(平穩(wěn)度優(yōu)先原則)?
-當(dāng)數(shù)據(jù)穩(wěn)定后,濾波結(jié)果能逼近并最終等于采樣數(shù)據(jù)(消除因計(jì)算中小數(shù)帶來的誤差)?
2、調(diào)整前判斷:?
-數(shù)據(jù)變化方向是否為同一個(gè)方向(如當(dāng)連續(xù)兩次的采樣值都比其上次濾波結(jié)果大時(shí),視為變化方向一致,否則視為不一致)?
-數(shù)據(jù)變化是否較快(主要是判斷采樣值和上一次濾波結(jié)果之間的差值)?
3、調(diào)整原則:?
-當(dāng)兩次數(shù)據(jù)變化不一致時(shí),說明有抖動,將濾波系數(shù)清零,忽略本次新采樣值?
-當(dāng)數(shù)據(jù)持續(xù)向一個(gè)方向變化時(shí),逐漸提高濾波系數(shù),提供本次采樣值得權(quán);?
-當(dāng)數(shù)據(jù)變化較快(差值>消抖計(jì)數(shù)加速反應(yīng)閾值)時(shí),要加速提高濾波系數(shù)
調(diào)整濾波系數(shù)的程序流程:
幾個(gè)常量參數(shù)及其取值范圍:?
(不同的取值會影響濾波的靈敏度和穩(wěn)定度)?
1、消抖計(jì)數(shù)加速反應(yīng)閾值,取值根據(jù)數(shù)據(jù)情況確定?
2、消抖計(jì)數(shù)最大值,一般取值10;?
3、濾波系數(shù)增量,一般取值范圍為10~30?
4、濾波系數(shù)最大值,一般取值255;?
在調(diào)用一階濾波程序前,先調(diào)用調(diào)整濾波系數(shù)程序,對系數(shù)進(jìn)行即時(shí)調(diào)整
濾波效果
1、當(dāng)采樣數(shù)據(jù)偶然受到干擾,濾波結(jié)果中的干擾完全被濾除?
2、當(dāng)數(shù)據(jù)在一個(gè)范圍內(nèi)振蕩時(shí),濾波結(jié)果曲線非常平滑,幾乎是一根直線?
3、當(dāng)采樣數(shù)據(jù)發(fā)生真實(shí)的變化時(shí),濾波結(jié)果也能比較及時(shí)地跟進(jìn)?
4、當(dāng)采樣數(shù)據(jù)趨于穩(wěn)定時(shí),濾波結(jié)果逐漸逼近并最終等于采樣數(shù)據(jù)
-最終改進(jìn)算法,兼顧了靈敏度和平穩(wěn)度的要求;同時(shí)又不太消耗系統(tǒng)的RAM;?
-只要合理調(diào)整幾個(gè)常量,以使得算法更合適實(shí)際應(yīng)用;
應(yīng)用
下面是一個(gè)使用了動態(tài)調(diào)整濾波的例子:
程序:
//用MPU6050測得數(shù)據(jù);對x軸濾波處理#define Threshold_1 8 //閾值1用于一階帶參濾波器,變化角度大于此值時(shí),計(jì)數(shù)增加 #define Threshold_2 30 //閾值2用于一階帶參濾波器,計(jì)數(shù)值大于此值時(shí),增大參數(shù),增強(qiáng)濾波跟隨float K_x=0; //濾波系數(shù) u8 new_flag_x=0;//本次數(shù)據(jù)變化方向 u8 num_x=0;//濾波計(jì)數(shù)器/*****帶系數(shù)修改的一階濾波函數(shù)入口: NEW_DATA 新采樣的角度值OLD_DATA 上次濾波獲得的角度結(jié)果k 濾波系數(shù)(代表在濾波結(jié)果中的權(quán)重)flag 上次數(shù)據(jù)變化方向 出口: result 本次濾波角度結(jié)果*/ float filter_1_x(float NEW_DATA,float OLD_DATA,float k,u8 flag) {//角度變化方向,new_flag=1表示角度增加,=0表示角度正在減小if((NEW_DATA-OLD_DATA)>0)new_flag_x=1;else if((NEW_DATA-OLD_DATA)<0)new_flag_x=0;if(new_flag_x==flag) //此次變化與前一次變化方向是否一致,相等表示角度變化方向一致{num_x++;if(fabs((NEW_DATA-OLD_DATA))>Threshold_1)//當(dāng)變化角度大于Threshold_1度的時(shí)候,進(jìn)行計(jì)數(shù)器num快速增加,以達(dá)到快速增大K值,提高跟隨性num_x+=5; if(num_x>Threshold_2) //計(jì)數(shù)閾值設(shè)置,當(dāng)角度遞增或遞減速度達(dá)到一定速率時(shí),增大K值{K_x=k+0.2; //0.2為K_x的增長值,看實(shí)際需要修改num_x=0;}}else {num_x=0;K_x=0.01; //角度變化穩(wěn)定時(shí)K_x值,看實(shí)際修改}OLD_DATA=(1-K_x)*OLD_DATA+K_x*NEW_DATA;return OLD_DATA; }- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
上幾張圖片:?
-
-
修改程序中的閾值1和閾值2,可獲得不同的濾波效果
————————————
再次聲明:本文整理自網(wǎng)絡(luò)、《匠人手記》等書籍文章,僅作為個(gè)人學(xué)習(xí)筆記
總結(jié)
- 上一篇: 车子上路应变技巧
- 下一篇: 连接正常(或者能上QQ)但是上不了网