Infinite impulse response filter

Dependents:   WIPV

Committer:
benson516
Date:
Fri Feb 10 18:25:55 2017 +0000
Revision:
3:7191d27f4855
Parent:
2:0bae37b297f4
Rewrite the library to a more formal form

Who changed what in which revision?

UserRevisionLine numberNew contents of line
benson516 2:0bae37b297f4 1 #ifndef IIR_H
benson516 2:0bae37b297f4 2 #define IIR_H
benson516 2:0bae37b297f4 3
benson516 0:a7405ea45d27 4 #include <vector>
benson516 0:a7405ea45d27 5 using std::vector;
benson516 1:3d8226c5abfe 6 /*-----------------------------*/
benson516 2:0bae37b297f4 7 // Order of the numerator: m
benson516 2:0bae37b297f4 8 // Orser of the denominator: n
benson516 2:0bae37b297f4 9 //--------------------------------//
benson516 1:3d8226c5abfe 10 //
benson516 1:3d8226c5abfe 11 // y gain*( sum(i from 0 to m) b[i]*x[k-i] )
benson516 1:3d8226c5abfe 12 // --- = --------------------------------------------
benson516 1:3d8226c5abfe 13 // u 1 + sum( i from 1 to n) a[i]*y[k-i]
benson516 1:3d8226c5abfe 14 //
benson516 1:3d8226c5abfe 15 // y[k] = gain*( sum(i from 0 to m) b[i]*x[k-i] ) - sum( i from 1 to n) a[i]*y[k-i]
benson516 2:0bae37b297f4 16 //
benson516 2:0bae37b297f4 17 // Compatible with the coefficient generated by Matlab fdatool
benson516 1:3d8226c5abfe 18 //
benson516 1:3d8226c5abfe 19 // by C.F. Huang from LDSC
benson516 1:3d8226c5abfe 20 /*-----------------------------*/
benson516 0:a7405ea45d27 21
benson516 0:a7405ea45d27 22 class Circular_buffer{
benson516 0:a7405ea45d27 23 private:
benson516 2:0bae37b297f4 24 size_t n;
benson516 0:a7405ea45d27 25 vector<float> A;
benson516 0:a7405ea45d27 26 // vector<float>::iterator it;
benson516 0:a7405ea45d27 27 int ind; // The index of the newest element
benson516 2:0bae37b297f4 28
benson516 0:a7405ea45d27 29 public:
benson516 3:7191d27f4855 30 Circular_buffer();
benson516 3:7191d27f4855 31 Circular_buffer(int n_in);
benson516 3:7191d27f4855 32 //
benson516 3:7191d27f4855 33 void Init(int n_in);
benson516 3:7191d27f4855 34 //
benson516 3:7191d27f4855 35 float Get(int i); // Get the value of the (t-i)th element, where t stands for the current sample
benson516 3:7191d27f4855 36 void Insert(float x_new); // Pop the oldest element and push a new element
benson516 3:7191d27f4855 37 void reset(float val); // Reset all elements to val
benson516 0:a7405ea45d27 38 };
benson516 0:a7405ea45d27 39
benson516 0:a7405ea45d27 40 class IIR{
benson516 0:a7405ea45d27 41 private:
benson516 2:0bae37b297f4 42
benson516 0:a7405ea45d27 43 int m; // the order of numerator
benson516 0:a7405ea45d27 44 int n; // the order of denominator
benson516 0:a7405ea45d27 45 Circular_buffer x,y;
benson516 0:a7405ea45d27 46 vector<float> b; // parameters of numerator, highest order --> lowest order (newest -> oldest)
benson516 0:a7405ea45d27 47 vector<float> a; // parameters of denominator, highest order --> lowest order (newest -> oldest)
benson516 0:a7405ea45d27 48 float gain;
benson516 2:0bae37b297f4 49
benson516 0:a7405ea45d27 50 public:
benson516 3:7191d27f4855 51 //
benson516 3:7191d27f4855 52 IIR(int m, int n);
benson516 3:7191d27f4855 53 //
benson516 3:7191d27f4855 54 void Assign_parameters(float b_in[], float a_in[], float gain_in);
benson516 3:7191d27f4855 55 //
benson516 3:7191d27f4855 56 float Iterate_once(float x_in);
benson516 3:7191d27f4855 57 void Reset(float val);
benson516 0:a7405ea45d27 58 };
benson516 2:0bae37b297f4 59
benson516 2:0bae37b297f4 60 #endif