Infinite impulse response filter

Fork of IIR by Project_WIPV_antiSlip

Revision:
0:a7405ea45d27
Child:
1:3d8226c5abfe
diff -r 000000000000 -r a7405ea45d27 IIR.h
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/IIR.h	Fri Jul 29 14:26:54 2016 +0000
@@ -0,0 +1,83 @@
+#include <vector>
+using std::vector;
+
+class Circular_buffer{
+private:
+    vector<float> A;
+    // vector<float>::iterator it;
+    int ind; // The index of the newest element
+    
+public:
+    Circular_buffer(){
+        ind = 0;
+    }
+    Circular_buffer(int n){
+        A.resize(n);
+        for (size_t i=0; i< A.size(); i++)
+            A[i] = 0;
+            
+        ind = 0;
+    }
+    
+    void Init(int n){ // Input: buffer size
+        A.resize(n);
+        for (size_t i=0; i< A.size(); i++)
+            A[i] = 0;
+        ind = 0;
+    }
+    
+    float Get(int i){ // Get the value of the (t-i)th element, where t stands for the current sample
+        int ind_e = ind-i;
+        while (ind_e < 0){
+            ind_e += A.size();
+        }
+        return A[ind_e];
+    }
+    void Insert(float x_new){ // Pop the oldest element and push a new element 
+        ind++;
+        while (ind >= A.size()){
+            ind -= A.size();
+        } 
+        A[ind] = x_new;
+    }
+};
+
+class IIR{
+private:
+    
+    int m; // the order of numerator
+    int n; // the order of denominator
+    Circular_buffer x,y;
+    vector<float> b; // parameters of numerator, highest order --> lowest order (newest -> oldest)
+    vector<float> a; // parameters of denominator, highest order --> lowest order (newest -> oldest)
+    float gain;
+    
+public:
+    IIR(int m, int n): m(m),n(n) {
+        x.Init(m+1);
+        y.Init(n);      
+    }
+    void Assign_parameters(float b_in[], float a_in[], float gain_in){
+        b.assign(b_in,b_in+m+1);
+        a.assign(a_in,a_in+n);
+        gain = gain_in;
+        for (size_t i = 0; i < b.size(); i++){
+            b[i] *= gain;
+        }
+    }
+    float Iterate_once(float x_in){
+        x.Insert(x_in);
+        float y_new = 0;
+        // Numerator
+        for (int i = 0; i <= m; i++ ){
+            y_new += b[i]*x.Get(i);
+        }
+        
+        // Denominator
+        for (int i = 0; i < n; i++){
+            y_new -= a[i]*y.Get(i);
+        }
+        y.Insert(y_new);
+        return y_new;
+    }
+};