---
title: "arduino digital filter class"
tags: hackpad
---
# arduino digital filter class
> [點此觀看原始內容](https://openlabtaipei.hackpad.tw/wqpBVSyF3MS)
arduino digital filter class
介紹:
因為光敏電阻讀到的數值雜訊、擾動太大,所以需要一個數位低通過濾來處理。
由林高遠編寫。
此例中使用離散的有限脈衝響應,優點是實作簡單,缺點是要達到理想的脈衝響應需要的級數較大。
通常在嵌入式(尤其是 mcu)系統中,考慮效能會使用無限脈衝響應,級數較小但是設計較困難。
用在 arduino 中,若 filter coefficient(響應參數)不會改變,應該放進 PROGMEM。
此部分就交給其他勇者......
討論串
- [https://www.facebook.com/photo.php?fbid=10153036400776375&set=a.10152092316591375.1073742128.628761374&type=1&theater](https://www.facebook.com/photo.php?fbid=10153036400776375&set=a.10152092316591375.1073742128.628761374&type=1&theater)
參考資料
- [http://alberthuang314.blogspot.tw/2012/08/blog-post_24.html](http://alberthuang314.blogspot.tw/2012/08/blog-post_24.html)
- [https://en.wikipedia.org/wiki/Finite\_impulse\_response](https://en.wikipedia.org/wiki/Finite_impulse_response)
- [http://playground.arduino.cc/Code/Filters](http://playground.arduino.cc/Code/Filters)
- [http://playground.arduino.cc/Main/DigitalSmooth](http://playground.arduino.cc/Main/DigitalSmooth)
- [http://jeroendoggen.github.io/Arduino-signal-filtering-library/](http://jeroendoggen.github.io/Arduino-signal-filtering-library/)
- [http://www.geek-workshop.com/thread-7694-1-1.html](http://www.geek-workshop.com/thread-7694-1-1.html)
程式碼:
```
class FIR
{
private:
int const _sequence;
double const const _response; // FIR coefficients
size\_t const \_length;
size\_t \_position;
public:
FIR(double const const response, size_t const length):
\_response(response), \_sequence(new int[length]), \_length(length), \_position(0)
{
}
void push(double const value)
{
\_sequence[\_position] = value;
++_position;
if(\_length == \_position)
_position = 0;
}
double const getSmoothValue()
{
double sum=0;
for(size\_t i = 0; i < \_length; ++i)
sum += \_sequence[\_position + i % \_length] \_response[i];
return sum;
}
double pushGetSmoothValue(RESPONSE_T const value)
{
push(value);
return this->getSmoothValue();
}
};
// 我不知道這什麼通,自己想辦法生出正確的 coefficient。
// 給 {0.2, 0.2, 0.2, 0.2, 0.2} 就是 5 sample 的 moving average。
FIR lightSensorFIR({0.1, 0.15, 0.1, 0.05, 0.6}, 5);
int const sensorPin = A0;
int const motorPin = 3;
void setup()
{
pinMode(motorPin, OUTPUT);
Serial.begin(9600);
Serial.println(lightSensorFIR->getLength());
}
void loop()
{
int const sensorValue = analogRead(sensorPin);
int const val = map(sensorValue, 0, 1023, 0, 255);
Serial.print("Before=");
Serial.print(val,DEC);
val = lightSensorFIR.pushGetSmoothValue(val);
Serial.print(" Filtered=");
Serial.println(val,DEC);
if(val<130) val=0;
analogWrite(motorPin, val);
}