Infinite impulse response filter
IIR.h@3:7191d27f4855, 2017-02-10 (annotated)
- 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?
User | Revision | Line number | New 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 |