![](/media/cache/img/default_profile.jpg.50x50_q85.jpg)
Cutoff frequency variable LPF by IIR 6th-order Butterworth filter for ST Nucleo F401RE.
Dependencies: UIT_IIR_Filter UIT_ACM1602NI UITDSP_ADDA mbed UIT_AQM1602
Revision 7:34eced3597bb, committed 2015-09-11
- Comitter:
- MikamiUitOpen
- Date:
- Fri Sep 11 09:52:06 2015 +0000
- Parent:
- 6:116f72cda0f4
- Commit message:
- 8
Changed in this revision
--- a/Biquad.hpp Sat Jul 25 06:41:36 2015 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,44 +0,0 @@ -//-------------------------------------------------------------- -// Biquad filter for IIR filter of cascade structure -// 2014/10/21, Copyright (c) 2014 MIKAMI, Naoki -//-------------------------------------------------------------- - -#ifndef IIR_BIQUAD_HPP -#define IIR_BIQUAD_HPP - -#include "mbed.h" - -// 2nd order IIR filter -class Biquad -{ -public: - struct Coefs { float a1, a2, b1, b2; }; - - Biquad() {} // Default constructore - - Biquad(const Coefs ck) - : a1_(ck.a1), a2_(ck.a2), b1_(ck.b1), b2_(ck.b2) - { Clear(); } - - float Execute(float xn) - { - float un = xn + a1_*un1_ + a2_*un2_; - float yn = un + b1_*un1_ + b2_*un2_; - - un2_ = un1_; - un1_ = un; - - return yn; - } - - void Clear() { un1_ = un2_ = 0; } - -private: - float a1_, a2_, b1_, b2_; - float un1_, un2_; - - Biquad(const Biquad&); -}; - -#endif // IIR_BIQUAD_HPP -
--- a/IIR_Cascade.hpp Sat Jul 25 06:41:36 2015 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,55 +0,0 @@ -//-------------------------------------------------------------- -// IIR filter ---- Cascade structure -// 2014/10/23, Copyright (c) 2014 MIKAMI, Naoki -//-------------------------------------------------------------- - -#ifndef IIR_CASCADE_HPP -#define IIR_CASCADE_HPP - -#include "mbed.h" -#include "Biquad.hpp" - -namespace Mikami -{ - // IIR filter -- Cascade structure - template<int order> class IirCascade - { - private: - Biquad hk_[order]; // Elements of cascade structure - float g0_; // gain factor - - IirCascade(const IirCascade&); - IirCascade& operator=(const IirCascade&); - - public: - IirCascade() {} - IirCascade(float g0, const Biquad::Coefs ck[]) - { SetCoefs(g0, ck); } - - void SetCoefs(float g0, const Biquad::Coefs ck[]) - { - g0_ = g0; - for (int k=0; k<order; k++) - hk_[k] = Biquad(ck[k]); - } - - float Execute(float xn) - { - float yn = g0_*xn; - for (int k=0; k<order; k++) - yn = hk_[k].Execute(yn); - - return yn; - } - - void Clear() - { - for (int k=0; k<order; k++) - hk_[k].Clear(); - } - }; -} -#endif // IIR_CASCADE_HPP - - -
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/UIT_IIR_Filter.lib Fri Sep 11 09:52:06 2015 +0000 @@ -0,0 +1,1 @@ +http://mbed.org/users/MikamiUitOpen/code/UIT_IIR_Filter/#2533ed0150e7
--- a/main.cpp Sat Jul 25 06:41:36 2015 +0000 +++ b/main.cpp Fri Sep 11 09:52:06 2015 +0000 @@ -3,7 +3,7 @@ // A0: Signal to be filtered // A2: Value which controls cutoff frequency // -// 2015/07/25, Copyright (c) 2015 MIKAMI, Naoki +// 2015/09/11, Copyright (c) 2015 MIKAMI, Naoki //-------------------------------------------------------------- #include "ADC_Interrupt.hpp" // for ADC using interrupt @@ -25,11 +25,11 @@ #endif const int FS_ = 24000; // Sampling frequency: 24 kHz -ADC_Intr myAdc_(A0, FS_, A1, A2); +ADC_Intr myAdc_(A0, FS_, A2); DAC_MCP4921 myDac_; const int ORDER_ = 8; -IirCascade<ORDER_/2> iirLpf_; // IIR filter object +IirCascade<ORDER_> iirLpf_; // IIR filter object DigitalIn sw1_(D2, PullDown); // 0: disable filter // 1: enable filter @@ -41,7 +41,7 @@ { float xn = myAdc_.Read(); // Read from A0 - myAdc_.Select3rdChannel(); // Select A2 + myAdc_.Select2ndChannel(); // Select A2 myAdc_.SoftStart(); // ADC start for A2 input // Execute IIR filter