【滤波器学习笔记】一阶RC低通滤波
一階RC低通濾波
從模擬到數字
本文整理自網絡、《匠人手記》等書籍文章
- 模擬電路低通濾波時域、頻域
- 軟件低通濾波
典型電路
圖1 典型RC電路
直流、交流、脈沖信號都可以用它
時域
電容電流:
基爾霍夫電壓定律得:
Ui=RCdUodt+Uo
Ui的單位是伏特,RC的單位為秒,τ=RC;
解得:
Uo(t)=Ui(1?e∧(?t/RC))
假設電容初始電壓值為0
R=1000Ω
C=4.7uF
Ui=1V
t=0.0001~0.1s
τ=RC
Vc(τ)=0.632
圖2 一階RC系統的階躍響應曲線
頻域
u1=Ui;u2=Uo;
以電容電壓作為輸出,電路的網絡函數為:
令ωc= 1RC=1τ
ωc即為截止頻率;
幅值和相角函數:
θ(ω)=?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
幅頻特性圖的對數表示:
圖5
-當ω<ωc時,幅值是平行于坐標的直線,基本無衰減;
-當ω>>ωc時,是斜率與-20dB/十倍頻成比例的一條直線;
-當ω=ωc時,增益衰減至0.707,即-3dB,相位滯后45度,對應低通濾波器,該頻率通常被稱為截止頻率。
缺點:
采用這種模擬濾波器抑制低頻干擾時,要求濾波器有較大的時間常數和高精度的RC網絡,增大時間常數要求增大R值,其漏電流也隨之增大,從而降低了濾波效果;
軟件上的一階低通濾波
優點:
-采用數字濾波算法來實現動態的RC濾波,則能很好的克服模擬濾波器的缺點;
-在模擬常數要求較大的場合這種算法顯得更為實用;
-其對于周期干擾有良好的抑制作用,
-比較節省RAM空間
缺點
-不足之處是帶來了相位滯后,導致靈敏度低;
-同時它不能濾除頻率高于采樣頻率的二分之一(稱為奈奎斯特頻率)的干擾(例如采樣頻率為100Hz,則它不能濾除50Hz以上的干擾信號)對于高于奈奎斯特頻率的干擾信號,應該采用模擬濾波器。
-對沒有乘、除法運算指令的單片機來說,程序運算工作量較大
基本濾波算法:
算法由來:
頻率分析中一階RC低通濾波在S域的傳遞函數:
通過z變換(方法很多,如一階前向差分、雙線性變換等這里用一階后向差分法)
s=1?z∧(?1)T,T表示采樣周期
帶入S域傳遞函數中:
推導轉化為差分方程后可得:
Y(n)=TT+RCX(n)+RCT+RCY(n?1)
通過Z變換把S域的傳遞函數轉化成時域的差分方程,分析可得到
一階RC數字濾波的基本算法
X為輸入,Y為濾波后得輸出值,則:
a為與RC值有關的一個參數,稱為濾波系數,其值決定新采樣值在本次濾波結果中所占的權重,其值通常遠小于1,當采樣間隔t足夠小的時候,
-濾波系數越小,濾波結果越平穩,但是靈敏度越低;
-濾波系數越大,靈敏度越高,但是濾波結果越不穩定
-本次輸出值主要取決于上次濾波輸出值,當前采樣值對本次輸出貢獻比較小,起到修正作用;
-截止頻率:
fl=a2πt
例如:t=0.5s (f=2Hz), a=1/32
則fl=(1/32)/(2*3.14*0.5)=0.01Hz;
基本程序:
按照一階濾波的基本原理與公式寫程序,如下:
/*程序中整數運算比小數運算快,為加快程序的處理速度,為計算方便,a取一整數,1-a用256-a來代替,a則取0~255,代表新采樣值在濾波結果中的權重(也可將1-a的基數改為100-a,計算結果做相應處理,這里不做說明)*/#define a 128 char value; //上次濾波值 char filter() {char new_value;new_value=get_ad();//本次采樣值return(256-a)*value/256+a*new_value/256; }程序初步優化
減少乘、除的運算次數以提高運算速度。
具體優化辦法:
先將新采樣值與上次濾波結果進行比較,然后根據比較采用不同的公式計算,這樣程序的運算效率提高了一倍;
化解基本公式可得:
當Xn>Y(n?1)時,Yn=Y(n?1)+(Xn?Y(n?1))×a÷256;
流程圖:
程序:
/*入口:NEW_DATA 新采樣值OLD_DATA 上次濾波結果k 濾波系數(0~255)(代表在濾波結果中的權重)出口: 本次濾波結果*/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); }濾波分析:
當濾波系數為30的時候:
當濾波系數為128的時候:
當濾波系數為200的時候:
可見濾波系數越小,濾波結果越平穩,但是靈敏度越低;濾波系數越大,靈敏度越高,但濾波結果也越不穩定;
不足
-靈敏度和平穩度間的矛盾
-小數舍棄帶來的誤差
比如:本次采樣值=25,上次濾波結果=24,濾波系數=10;
根據算法得本次結果=24.0390625
在單片機中,很少采用浮點數,小數部分要么舍棄,要么進行四色五入。這樣結果就變成24;假如采樣值一直為25那么,結果永遠是24;濾波結果和實際數據一直存在無法消除的誤差。
嚴重時會導致,在數據采樣數據穩定在某一數值上時,濾波結果曲線偏離實際值(即濾波結果在穩定時與實際結果存在較大誤差);
改善辦法
改變濾波系數,增大會導致平穩度降低,濾波系數太大濾波也就喪失意義;
將小數位參與計算,會給CPU帶來沉重運算壓力;
優化方法 —– 動態調整濾波系數
1、實現功能:
-當數據快速變化時,濾波結果能及時跟進,并且數據的變化越快,靈敏度應該越高(靈敏度優先原則)
-當數據趨于穩定,并在一個范圍內振蕩時,濾波結果能趨于平穩(平穩度優先原則)
-當數據穩定后,濾波結果能逼近并最終等于采樣數據(消除因計算中小數帶來的誤差)
2、調整前判斷:
-數據變化方向是否為同一個方向(如當連續兩次的采樣值都比其上次濾波結果大時,視為變化方向一致,否則視為不一致)
-數據變化是否較快(主要是判斷采樣值和上一次濾波結果之間的差值)
3、調整原則:
-當兩次數據變化不一致時,說明有抖動,將濾波系數清零,忽略本次新采樣值
-當數據持續向一個方向變化時,逐漸提高濾波系數,提供本次采樣值得權;
-當數據變化較快(差值>消抖計數加速反應閾值)時,要加速提高濾波系數
調整濾波系數的程序流程:
幾個常量參數及其取值范圍:
(不同的取值會影響濾波的靈敏度和穩定度)
1、消抖計數加速反應閾值,取值根據數據情況確定
2、消抖計數最大值,一般取值10;
3、濾波系數增量,一般取值范圍為10~30
4、濾波系數最大值,一般取值255;
在調用一階濾波程序前,先調用調整濾波系數程序,對系數進行即時調整
濾波效果
1、當采樣數據偶然受到干擾,濾波結果中的干擾完全被濾除
2、當數據在一個范圍內振蕩時,濾波結果曲線非常平滑,幾乎是一根直線
3、當采樣數據發生真實的變化時,濾波結果也能比較及時地跟進
4、當采樣數據趨于穩定時,濾波結果逐漸逼近并最終等于采樣數據
-最終改進算法,兼顧了靈敏度和平穩度的要求;同時又不太消耗系統的RAM;
-只要合理調整幾個常量,以使得算法更合適實際應用;
應用
下面是一個使用了動態調整濾波的例子:
程序:
//用MPU6050測得數據;對x軸濾波處理#define Threshold_1 8 //閾值1用于一階帶參濾波器,變化角度大于此值時,計數增加 #define Threshold_2 30 //閾值2用于一階帶參濾波器,計數值大于此值時,增大參數,增強濾波跟隨float K_x=0; //濾波系數 u8 new_flag_x=0;//本次數據變化方向 u8 num_x=0;//濾波計數器/*****帶系數修改的一階濾波函數入口: NEW_DATA 新采樣的角度值OLD_DATA 上次濾波獲得的角度結果k 濾波系數(代表在濾波結果中的權重)flag 上次數據變化方向 出口: result 本次濾波角度結果*/ 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)//當變化角度大于Threshold_1度的時候,進行計數器num快速增加,以達到快速增大K值,提高跟隨性num_x+=5; if(num_x>Threshold_2) //計數閾值設置,當角度遞增或遞減速度達到一定速率時,增大K值{K_x=k+0.2; //0.2為K_x的增長值,看實際需要修改num_x=0;}}else {num_x=0;K_x=0.01; //角度變化穩定時K_x值,看實際修改}OLD_DATA=(1-K_x)*OLD_DATA+K_x*NEW_DATA;return OLD_DATA; }上幾張圖片:
-
-
修改程序中的閾值1和閾值2,可獲得不同的濾波效果
————————————
再次聲明:本文整理自網絡、《匠人手記》等書籍文章,僅作為個人學習筆記
總結
以上是生活随笔為你收集整理的【滤波器学习笔记】一阶RC低通滤波的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 光纤交换机常见硬件、软件故障问题介绍
- 下一篇: 海康萤石摄像机远程监控机制分析