2020 12 17一階RC低通濾波演算法原理與實現

2021-10-12 07:35:34 字數 3285 閱讀 1750

羅伯特祥 2020-08-09 12:46:14

分類專欄: ▶ 運動控制

▶ linux/嵌入式

▶ 訊號處理 文章標籤: 低通濾波器

rc濾波器 版權

一階濾波,又叫一階慣性濾波,或一階低通濾波,軟體實現rc低通濾波器的功能。

y ( n ) = α x ( n ) + ( 1 − α ) y ( n − 1 ) y(n)=αx(n) + (1-α)y(n-1)y(n)=αx(n)+(1−α)y(n−1)

式中:α αα為濾波係數,x ( n ) x(n)x(n)為本次取樣值,y ( n − 1 ) y(n-1)y(n−1)為上次濾波輸出值,y ( n ) y(n)y(n)為本次濾波輸出值

傳遞函式推導可參考該博文:傳送門

一階濾波無法完美地兼顧靈敏度和平穩度。有時,我們只能尋找乙個平衡,在可接受的靈敏度範圍內取得盡可能好的平穩度。而在一些場合,我們希望擁有這樣一種接近理想狀態的濾波演算法。即:當資料快速變化時,濾波結果能及時跟進(靈敏度優先);當資料趨於穩定,在乙個固定的點上下振盪時,濾波結果能趨於平穩(平穩度優先)。

案例1:油門資料濾波

// 油門濾波

thr_lpf+=(1/(1+1/(2.0f*3.14f*t)))*(height_thr-thr_lpf)

案例2:

#define a   0.01                // 濾波係數a(0-1) 

static float oldoutdata = 0;

char filter(void)

/*程式中整數運算比小數運算快,為加快程式的處理速度,

為計算方便,a取一整數,1-a用256-a來代替,

a則取0~255,代表新取樣值在濾波結果中的權重

(也可將1-a的基數改為100-a,計算結果做相應處理,這裡不做說明)

*/#define a 128

char value; //上次濾波值

char filter()

案例3:matlab測試

% 一階低通濾波器測試

close all;

t = 0.003;

a = 1/(1+(1/(2*pi*t)));

tt = 0:t:25;

y = sin(0.5*tt);

y_noise = awgn(y,35);

y_proce = y_noise;

for i = 2:length(y)

y_proce(i) = (1-a) * y_proce(i-1) + a * y_noise(i);

endplot(tt,y,'r');

figure(2)

plot(tt,y_noise,'g');hold on;

plot(tt,y_proce,'b');

hold off;

思路:先將新取樣值與上次濾波結果進行比較,然後根據比較採用不同的公式計算,這樣程式的運算效率提高了一倍

/*入口:new_data 新取樣值

old_data 上次濾波結果

k 濾波係數(0~255)(代表在濾波結果中的權重)

出口: 本次濾波結果

*/ char filter_1(char new_data,char old_data,char k)

else result=old_data;

return((char)result);

}

分析:實現功能:

幾個常量引數及其取值範圍(不同的取值會影響濾波的靈敏度和穩定度):

消抖計數加速反應閾值,取值根據資料情況確定

消抖計數最大值,一般取值10;

濾波係數增量,一般取值範圍為10~30

濾波係數最大值,一般取值255;

在呼叫一階濾波程式前,先呼叫調整濾波係數程式,對係數進行即時調整。濾波效果:

當取樣資料偶然受到干擾,濾波結果中的干擾完全被濾除

當資料在乙個範圍內振盪時,濾波結果曲線非常平滑,幾乎是一根直線

當取樣資料發生真實的變化時,濾波結果也能比較及時地跟進

當取樣資料趨於穩定時,濾波結果逐漸逼近並最終等於取樣資料

//用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)

}else

old_data=(1-k_x)*old_data+k_x*new_data;

return old_data;

}

一階低通濾波器方程 一階低通濾波原理詳解

在汽車標定中,使用最多的濾波演算法即低通濾波,很多朋友可能知道怎麼標定,但是不清楚具體的原理,因此本文將介紹一階低通濾波的原理 演算法建模 和優缺點 一階濾波演算法的原理 一階濾波,又叫一階慣性濾波,或一階低通濾波。一階低通濾波的演算法公式為 y n x n 1 y n 1 式中 濾波係數 x n ...

RC一階低通濾波器

由於工作原因一直在接觸濾波器,但是對其詳細概念和原理一知半解,所以一直想好好學習一下。最近終於抽出時間搜遍各種資料,但總覺得知識點太散,不太方便系統的理解,所以自己整理了一下,希望有所幫助。第一次編輯發部落格,實在不易,word編輯好了,想直接拷貝上來還不行,公式無法複製,只好乙個個截圖,實在尷尬!...

演算法學習筆記之一階低通濾波演算法

一階濾波,又叫一階慣性濾波,或一階低通濾波。是使用軟體程式設計實現普通硬體rc低通濾波器的功能。一階低通濾波的演算法公式為 y n x n 1 y n 1 式中 濾波係數 x n 本次取樣值 y n 1 上次濾波輸出值 y n 本次濾波輸出值。一階低通濾波法採用本次取樣值與上次濾波輸出值進行加權,得...