大家好,我是專(zhuān)注分享職業(yè)規(guī)劃/技術(shù)科普/智能生活有關(guān)原創(chuàng)文章的allen康哥。
今天介紹下嵌入式系統(tǒng)中常見(jiàn)的信號(hào)處理與濾波算法。
一、限幅濾波法:按鍵消抖場(chǎng)景原理
通過(guò)設(shè)定最大允許偏差值(A),若新采樣值與歷史值的差值超過(guò)閾值則視為噪聲,保留舊值。該算法適合消除突發(fā)性脈沖干擾。
應(yīng)用場(chǎng)景機(jī)械按鍵消抖:消除觸點(diǎn)接觸瞬間的抖動(dòng)信號(hào)。
電機(jī)轉(zhuǎn)速突變檢測(cè):防止因負(fù)載突變導(dǎo)致的異常值干擾控制邏輯。
代碼實(shí)現(xiàn)
#define?MAX_DELTA?5??//?最大允許偏差值
char?limit_filter(char?current_val)?{
????static?char?last_val;
????if?(abs(current_val?-?last_val)?>?MAX_DELTA)?
????????return?last_val;??//?超出閾值則保留舊值
????else?
????????last_val?=?current_val;
????return?current_val;
}
二、中位值濾波:溫度傳感器去噪原理
對(duì)連續(xù)奇數(shù)次采樣值排序后取中間值,有效抑制偶發(fā)干擾。
應(yīng)用場(chǎng)景熱敏電阻測(cè)溫:消除環(huán)境電磁干擾導(dǎo)致的偶發(fā)跳變。
液位監(jiān)測(cè):過(guò)濾因流體波動(dòng)引起的瞬時(shí)異常數(shù)據(jù)。
代碼實(shí)現(xiàn)
#define?N?7??//?奇數(shù)采樣次數(shù)
char?median_filter()?{
????char?samples[N],?temp;
????for?(int?i=0;?i<N;?i++)?
????????samples[i]?=?get_adc();??//?獲取ADC采樣值
????
????//?冒泡排序取中值
????for?(int?i=0;?i<N-1;?i++)?{
????????for?(int?j=0;?j<N-i-1;?j++)?{
????????????if?(samples[j]?>?samples[j+1])?{
????????????????temp?=?samples[j];
????????????????samples[j]?=?samples[j+1];
????????????????samples[j+1]?=?temp;
????????????}
????????}
????}
????return?samples[N/2];??//?返回中間值
}
三、滑動(dòng)平均濾波:流量實(shí)時(shí)監(jiān)測(cè)原理
維護(hù)固定長(zhǎng)度的數(shù)據(jù)隊(duì)列,計(jì)算窗口內(nèi)數(shù)據(jù)的算術(shù)平均,動(dòng)態(tài)響應(yīng)變化。
應(yīng)用場(chǎng)景流量計(jì)數(shù)據(jù)平滑:消除流體湍流引起的瞬時(shí)波動(dòng)。
電池電流監(jiān)測(cè):平衡實(shí)時(shí)性與噪聲抑制需求。
代碼優(yōu)化
#define?WINDOW_SIZE?8??//?窗口長(zhǎng)度
int?moving_average()?{
????static?int?buffer[WINDOW_SIZE],?index?=?0;
????buffer[index]?=?get_adc();??//?新數(shù)據(jù)入隊(duì)
????index?=?(index?+?1)?%?WINDOW_SIZE;??//?環(huán)形隊(duì)列管理
????
????int?sum?=?0;
????for?(int?i=0;?i<WINDOW_SIZE;?i++)?
????????sum?+=?buffer[i];
????return?sum?/?WINDOW_SIZE;??//?計(jì)算均值
}
四、卡爾曼濾波:姿態(tài)傳感器數(shù)據(jù)融合原理
通過(guò)預(yù)測(cè)與校正機(jī)制,融合多傳感器數(shù)據(jù)并動(dòng)態(tài)估計(jì)系統(tǒng)狀態(tài)。
應(yīng)用場(chǎng)景無(wú)人機(jī)姿態(tài)解算:融合陀螺儀與加速度計(jì)數(shù)據(jù)。
智能車(chē)定位:結(jié)合編碼器與視覺(jué)數(shù)據(jù)優(yōu)化位置估計(jì)。
代碼實(shí)現(xiàn)
typedef?struct?{
????float?q;????//?過(guò)程噪聲方差
????float?r;????//?測(cè)量噪聲方差
????float?x;????//?狀態(tài)估計(jì)值
????float?p;????//?估計(jì)誤差協(xié)方差
????float?k;????//?卡爾曼增益
}?KalmanFilter;
float?kalman_update(KalmanFilter?*kf,?float?measurement)?{
????//?預(yù)測(cè)階段
????kf->p?+=?kf->q;??
????//?更新階段
????kf->k?=?kf->p?/?(kf->p?+?kf->r);
????kf->x?+=?kf->k?*?(measurement?-?kf->x);
????kf->p?*=?(1?-?kf->k);
????return?kf->x;
}
五、一階滯后濾波:電機(jī)電流平滑控制原理
通過(guò)加權(quán)系數(shù)α平衡新采樣值與歷史輸出值,實(shí)現(xiàn)低計(jì)算量濾波。
應(yīng)用場(chǎng)景PWM電流控制:抑制高頻開(kāi)關(guān)噪聲。
溫度PID控制:減少執(zhí)行器頻繁動(dòng)作。
代碼實(shí)現(xiàn)
#define?ALPHA?0.3??//?平滑系數(shù)(0<α<1)
float?first_order_filter(float?new_sample)?{
????static?float?prev_output?=?0;
????prev_output?=?ALPHA?*?new_sample?+?(1?-?ALPHA)?*?prev_output;
????return?prev_output;
}
選型建議資源受限場(chǎng)景(如8位MCU)優(yōu)先選擇限幅、中位值等輕量算法。動(dòng)態(tài)系統(tǒng)控制(如無(wú)人機(jī))推薦卡爾曼濾波,需平衡計(jì)算復(fù)雜度與精度。高頻信號(hào)處理(如電機(jī)電流)采用一階滯后或滑動(dòng)平均濾波,避免相位延遲。
你好,我是Allen,CSDN博客專(zhuān)家,博客訪問(wèn)超千萬(wàn)。現(xiàn)任世界500強(qiáng)外企高級(jí)開(kāi)發(fā)工程師,有多年國(guó)企和外企工作經(jīng)驗(yàn),擅長(zhǎng)電子及嵌入式方向?qū)W習(xí)規(guī)劃,簡(jiǎn)歷優(yōu)化及offer咨詢(xún),高考/考研咨詢(xún)等,歡迎留言與我交流!