日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

基于stm32的FIR滤波

發布時間:2023/12/29 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 基于stm32的FIR滤波 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

這兩天有個地方用到了距離傳感器,選用的傳感器是夏普的近紅外距離傳感器。后來調試的時候發現傳感器出來的信號除了有個隨著距離規律變化的直流信號以外還有一個周期為1ms的尖峰脈沖信號形狀如下圖示

這樣的波形會影響采集數據的結果,硬件上已經固定了,所以就選擇從軟件方面來尋找解決方案。

之前涉及的軟件濾波無非就是采用求平均值的方法或者用排序的方法取中間值。但是發現這種傳統的方法都不能解決問題,無奈之下只好請出FIR了。在網上找到一段關于FIR濾波器的C代碼,

const double Gains[65] = {
? 0.0009479362407674,0.0009929350550642, 0.003930214337694,0.0004266602318381,
? ?0.002659113001781, 0.005817509119983,-0.000228463397681, 0.006702278150725,
? ?0.008005149622821,-0.0008554957856821, ?0.01422482817203, 0.008473933262289,
? -1.620146125747e-17, ?0.02516227532517, 0.004919104877225, 0.005096205867541,
? ? 0.03751085310479,-0.004203950025341, ?0.01799639204041, ? 0.0469989686148,
? ?-0.01876523334251, ?0.04251211195407, ?0.04699049465662, -0.03660751758108,
? ? 0.08342623579446, ?0.02691060679784, -0.05397754228244, ? 0.1541577471136,
? ?-0.04192656769609, -0.06664039473937, ? 0.3591036736045, ?-0.5005151692802,
? ? ?0.6415102143687, ?-0.5005151692802, ? 0.3591036736045, -0.06664039473937,
? ?-0.04192656769609, ? 0.1541577471136, -0.05397754228244, ?0.02691060679784,
? ? 0.08342623579446, -0.03660751758108, ?0.04699049465662, ?0.04251211195407,
? ?-0.01876523334251, ? 0.0469989686148, ?0.01799639204041,-0.004203950025341,
? ? 0.03751085310479, 0.005096205867541, 0.004919104877225, ?0.02516227532517,
? -1.620146125747e-17, 0.008473933262289, ?0.01422482817203,-0.0008554957856821,
? ?0.008005149622821, 0.006702278150725,-0.000228463397681, 0.005817509119983,
? ?0.002659113001781,0.0004266602318381, 0.003930214337694,0.0009929350550642,
? 0.0009479362407674
};
#define ORDER ? ? ? ?64 ? ? ? ? ? ? ? ? ? ? ? //階數


?double Buffer[ORDER]; ? ? ? ?//采樣歷史數據




double Fir(double Input)
{
? ? ? ? double Output=0.0; ? ? ? ?//數據輸出
? ? ? ? unsigned int Index; ? ? ? ? ? ? ? ?//下標索引
? ? ? ??
? ? ? ? //采樣數據移位
? ? ? ? for(Index=ORDER;Index>0;Index--)?
Buffer[Index]=Buffer[Index-1];

? ? ? ? Buffer[0]=Input;
? ? ? ??
? ? ? ? //計算輸出
? ? ? ? for(Index=0;Index<ORDER+1;Index++)
? ? ? ? {
? ? ? ? ? ? ? ? Output+=Gains[Index]*Buffer[Index];
? ? ? ? }
? ? ? ??
? ? ? ? return Output;
}

給出的代碼是一個64階的帶阻濾波器。代碼很好理解,需要用matlab生成系數。matlab設置的步驟如下

打開matlab(我用的2013b)在APPS種找到“Filter Designer & Analysis”


其中紅色方框標記出來的是需要設計的,Filter Order設計濾波器的階數,Fs是指的采樣頻率,Fc是截止頻率。設計好以后直接點擊“Design Filter”按鍵然后點擊Targets ->

Generate C header.。接下來就看看效果吧


前面一段是沒有濾波的圖像,后面一段是濾波以后的圖像,把濾波以后的數據做一個平均處理就已經很穩定了。

總的來說還是很有成就感的。

總結

以上是生活随笔為你收集整理的基于stm32的FIR滤波的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。