基于stm32的FIR滤波
這兩天有個地方用到了距離傳感器,選用的傳感器是夏普的近紅外距離傳感器。后來調試的時候發(fā)現傳感器出來的信號除了有個隨著距離規(guī)律變化的直流信號以外還有一個周期為1ms的尖峰脈沖信號形狀如下圖示
這樣的波形會影響采集數據的結果,硬件上已經固定了,所以就選擇從軟件方面來尋找解決方案。
之前涉及的軟件濾波無非就是采用求平均值的方法或者用排序的方法取中間值。但是發(fā)現這種傳統的方法都不能解決問題,無奈之下只好請出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.。接下來就看看效果吧
前面一段是沒有濾波的圖像,后面一段是濾波以后的圖像,把濾波以后的數據做一個平均處理就已經很穩(wěn)定了。
總的來說還是很有成就感的。
總結
以上是生活随笔為你收集整理的基于stm32的FIR滤波的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Word控件Spire.Doc 【邮件合
- 下一篇: Python常用网络爬虫速查表下载