Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Fork of IIR by
Revision 3:7191d27f4855, committed 2017-02-10
- Comitter:
- benson516
- Date:
- Fri Feb 10 18:25:55 2017 +0000
- Parent:
- 2:0bae37b297f4
- Commit message:
- Rewrite the library to a more formal form
Changed in this revision
| IIR.cpp | Show annotated file Show diff for this revision Revisions of this file |
| IIR.h | Show annotated file Show diff for this revision Revisions of this file |
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/IIR.cpp Fri Feb 10 18:25:55 2017 +0000
@@ -0,0 +1,98 @@
+#include "IIR.h"
+/*-----------------------------*/
+// Order of the numerator: m
+// Orser of the denominator: n
+//--------------------------------//
+//
+// y gain*( sum(i from 0 to m) b[i]*x[k-i] )
+// --- = --------------------------------------------
+// u 1 + sum( i from 1 to n) a[i]*y[k-i]
+//
+// 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]
+//
+// Compatible with the coefficient generated by Matlab fdatool
+//
+// by C.F. Huang from LDSC
+/*-----------------------------*/
+
+Circular_buffer::Circular_buffer(){
+ n = 0;
+ ind = 0;
+}
+Circular_buffer::Circular_buffer(int n_in){
+ n = n_in;
+ A.resize(n);
+ for (size_t i=0; i< A.size(); i++)
+ A[i] = 0;
+
+ ind = 0;
+}
+//
+void Circular_buffer::Init(int n_in){ // Input: buffer size
+ n = n_in;
+ A.resize(n);
+ for (size_t i=0; i< A.size(); i++)
+ A[i] = 0;
+ ind = 0;
+}
+//
+float Circular_buffer::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 Circular_buffer::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;
+}
+void Circular_buffer::reset(float val){ // Reset all elements to val
+ for (size_t i = 0; i< A.size(); i++)
+ A[i] = val;
+ ind = 0;
+}
+
+// IIR
+//---------------------------------------//
+IIR::IIR(int m, int n): m(m),n(n) {
+ x.Init(m+1);
+ y.Init(n);
+}
+//
+void IIR::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);
+ b.resize(m+1);
+ a.resize(n);
+ for (size_t i = 0; i < n; i++){
+ a[i] = a_in[i+1];
+ }
+ gain = gain_in;
+ for (size_t i = 0; i < b.size(); i++){
+ b[i] = gain*b_in[i];
+ }
+}
+//
+float IIR::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;
+}
+void IIR::Reset(float val){ // Rest all elements to val
+ x.reset(val);
+ y.reset(val);
+}
--- a/IIR.h Tue Jan 10 19:45:40 2017 +0000
+++ b/IIR.h Fri Feb 10 18:25:55 2017 +0000
@@ -27,46 +27,14 @@
int ind; // The index of the newest element
public:
- Circular_buffer(){
- n = 0;
- ind = 0;
- }
- Circular_buffer(int n_in){
- n = n_in;
- A.resize(n);
- for (size_t i=0; i< A.size(); i++)
- A[i] = 0;
-
- ind = 0;
- }
-
- void Init(int n_in){ // Input: buffer size
- n = n_in;
- 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;
- }
- void reset(float val){ // Reset all elements to val
- for (size_t i = 0; i< A.size(); i++)
- A[i] = val;
- ind = 0;
- }
+ Circular_buffer();
+ Circular_buffer(int n_in);
+ //
+ void Init(int n_in);
+ //
+ float Get(int i); // Get the value of the (t-i)th element, where t stands for the current sample
+ void Insert(float x_new); // Pop the oldest element and push a new element
+ void reset(float val); // Reset all elements to val
};
class IIR{
@@ -80,42 +48,13 @@
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);
- b.resize(m+1);
- a.resize(n);
- for (size_t i = 0; i < n; i++){
- a[i] = a_in[i+1];
- }
- gain = gain_in;
- for (size_t i = 0; i < b.size(); i++){
- b[i] = gain*b_in[i];
- }
- }
- 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;
- }
- void Reset(float val){ // Rest all elements to val
- x.reset(val);
- y.reset(val);
- }
+ //
+ IIR(int m, int n);
+ //
+ void Assign_parameters(float b_in[], float a_in[], float gain_in);
+ //
+ float Iterate_once(float x_in);
+ void Reset(float val);
};
#endif
