--- 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); }