技術分享 | 嵌入式常用濾波算法的matlab實現

隨着基於模型設計的廣泛應用,模型在環仿真也逐漸多了起來,我們今天介紹幾種嵌入式常用濾波算法的matlab實現。

一、採用數字濾波算法克服隨機干擾的誤差具有以下優點:

  1. 數字濾波無需其他的硬件成本,只用一個計算過程,可靠性高,不存在阻抗匹配問題。尤其是數字濾波可以對頻率很低的信號進行濾波,這是模擬濾波器做不到的。

  2. 數字濾波使用軟件算法實現,多輸入通道可共用一個濾波程序,降低系統開支。

  3. 只要適當改變濾波器的濾波程序或運算,就能方便地改變其濾波特性,這對於濾除低頻干擾和隨機信號會有較大的效果。

  4. 在單片機系統中常用的濾波算法有限幅濾波法、中值濾波法、算術平均濾波法、加權平均濾波法、滑動平均濾波等。

%% 代碼測試框架 clear signal=wgn(1,1000,10); signal=10+signal; signalFited=zeros(1,1000); for i=1:1000 signalFited(i)=MyFilter(@LowPasFilter,signal(i)); % 改一下句柄名字就可以了。 end plot(signal); hold on; plot(signalFited); function output = MyFilter(fun,input) %MyFilter 濾波測試函數 % MyFilter.m output=fun(input); end

二、限幅濾波 該運算的過程中將兩次相鄰的採樣相減,求出其增量,然後將增量的絕對值,與兩次採樣允許的最大差值maxErr進行比較。maxErr的大小由被測對象的具體情況而定,如果小於或等於允許的最大差值,則本次採樣有效;否則取上次採樣值作爲本次數據的樣本。

限幅濾波法主要用於處理變化較爲緩慢的數據,如溫度、物體的位置等。使用時,關鍵要選取合適的門限制maxErr。通常這可由經驗數據獲得,必要時可通過實驗得到。

function out = LimRanFilter(input) %LimRan 限幅度濾波函數 % LimRanFilter.m maxErr=5;%允許最大誤差 persistent last; if isempty(last) last=input; end%上一次的值 if((input-last)>maxErr||(last-input)>maxErr) out=last; else out=input; end end

file

三、中值濾波

該運算的過程是對某一參數連續採樣N次(N一般爲奇數),然後把N次採樣的值按從小到大排列,再取中間值作爲本次採樣值,整個過程實際上是一個序列排序的過程。

中值濾波比較適用於去掉由偶然因素引起的波動和採樣器不穩定而引起的脈動干擾。若被測量值變化比較慢,採用中值濾波法效果會比較好,但如果數據變化比較快,則不宜採用此方法。

function output= MeanFilter(input) %MeanFilter 中值濾波 % MeanFilter.m persistent buff; if isempty(buff) buff=[2 0 0 0 0 0]; end%選擇序列 if(buff(1)<7) buff(buff(1))=input; buff(buff(1))=buff(buff(1))+1; else for i=2:5 if(buff(i)>buff(i+1)) temp=buff(i); buff(i)=buff(i+1); buff(i+1)=temp; end end buff(2:6)=0; buff(1)=2; end%初始化濾波緩衝區 output=buff(4); end

file

四、滑動平均濾波

平均濾波算法有一個特點,即每獲取一個有效採樣值必須連續進行若干次採樣,當採速度慢時,系統的實時得不到保證。這裏介紹的滑動平均濾波算法只採樣一次,將一次採樣值和過去的若干次採樣值一起求平均,得到的有效採樣值即可投入使用。如果取N個採樣值求平均,存儲區中必須開闢N個數據的暫存區。每新採集一個數據便存入暫存區中,同時去掉一個最老數據,保存這N個數據始終是最新更新的數據。採用環型隊列結構可以方便地實現這種數據存放方式。

function output= MovAveFilter(input) %MovAveFilter 滑動平均濾波 % ´MovAveFilter.m persistent buff; if isempty(buff) buff=[ 0 0 0 0 0 ]; end%滑動窗口 persistent numOfBuff; if isempty(numOfBuff) numOfBuff=0; end%´當前窗口元素 persistent k; if isempty(k) k=1; end%計數器 buff(k)=input; k=mod((k+1),5)+1; numOfBuff=numOfBuff+1; if(numOfBuff>5) numOfBuff=5; end output=sum(buff)/numOfBuff; end

file

五、低通濾波

將普通硬件RC低通濾波器的微分方程用差分方程來表求,變可以採用軟件算法來模擬硬件濾波的功能,經推導,低通濾波算法如下:

Yn=a* Xn+(1-a) *Yn-1 式中 Xn——本次採樣值 Yn-1——上次的濾波輸出值; a——濾波係數,其值通常遠小於1; Yn——本次濾波的輸出值。

function output= LowPasFilter(input) %LowPasFilter低通濾波 % ´LowPasFilter.m persistent yn0; if isempty(yn0) yn0=0; end%上次輸出值 a=0.5;%濾波係數 output=inputa+yn0(1-a); yn0=output; end

file

這幾種是使用較多的濾波算法,比較方便進行仿真與編寫,還有擴展卡爾曼等的實現可以根據實際情況來運用,在一般領域這幾種濾波算法已經能夠達到很好的效果了。

  • End -

技術發展的日新月異,阿木實驗室將緊跟技術的腳步,不斷把機器人行業最新的技術和硬件推薦給大家。看到經過我們培訓的學員在技術上突飛猛進,是我們培訓最大的價值。如果你在機器人行業,就請關注我們的公衆號,我們將持續發佈機器人行業最有價值的信息和技術。

阿木實驗室致力於前沿IT科技的教育和智能裝備,讓機器人研發更高效!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章