Non-variable (TESTEDandWORKING)

Dependencies:   mbed-rtos mbed

Fork of ELEC347_Coursework by CMST

Revision:
2:f6e49378dd8a
Parent:
1:b088b771a591
Child:
6:a2737b51424c
diff -r b088b771a591 -r f6e49378dd8a Filter.cpp
--- a/Filter.cpp	Tue Nov 28 09:41:07 2017 +0000
+++ b/Filter.cpp	Tue Nov 28 09:51:30 2017 +0000
@@ -1,64 +1,54 @@
 #include "Filter.hpp"
+#include <math.h>
 
-FILTER::FILTER(int Fs, int Fo, int Boost, int Q) //Constuctor
+#define PI 3.14159
+
+FILTER::FILTER(int Fs, int Fo, double Boost, int Q) //Constuctor
 {
-    _Fs = Fs;
+    this-> _Fs = Fs;
     this-> _Fo = Fo;
     this-> _Boost = Boost;
     this-> _Q = Q;
 
-    // B - Upnominator coefficients
-    _b0 = 0.0201;
-    _b1 = 0.0;
-    _b2 = -0.0402;
-    _b3 = 0.0;
-    _b4 = 0.0201;
-
-    // A - Denominator coefficients
-    _a0 = 1.0000;
-    _a1 = -2.5494;
-    _a2 = 3.2024;
-    _a3 = -2.0359;
-    _a4 = 0.6414;
 
     _centreTap = 1;
     _G = 0;
     _k = 0;
     _Wo = 0;
+    _Wo_d = 0;
+    _Wo_d2 = 0;
+    _Com_Den = 0;
+    _NC0 = 0;
+    _NC1 = 0;
+    _NC2 = 0;
+    _DC1 = 0;
+    _DC2 = 0;
 
-    _xn = 0;     //this value is the input value
+    _xn = 0;     //This value is the input value
     _xnm1 = 0;
     _xnm2 = 0;
-    _xnm3 = 0;
-    _xnm4 = 0;
 
     _yn = 0;
     _ynm1 = 0;
     _ynm2 = 0;
-    _ynm3 = 0;
-    _ynm4 = 0;
 }
 
 FILTER::~FILTER() {}
 
-void FILTER::setvalue(int RAW_input)
+void FILTER::setvalue(float RAW_input)
 {
             
     _xn = RAW_input;
-    _centreTap = _xn*_b0 + _xnm1*_b1 + _xnm2*_b2 + _xnm3*_b3 + _xnm4*_b4;  //IIR Filter
-    _yn = _centreTap*_a0 - _a1*_ynm1 - _a2*_ynm2  - _a3*_ynm3 - _a4*_ynm4; //Result in yn
+    _centreTap = _xn*_b0 + _xnm1*_b1 + _xnm2*_b2; //IIR Filter
+    _yn = _centreTap*_a0 - _a1*_ynm1 - _a2*_ynm2; //Result in yn
 
-    FilterOutput=_yn+0.5f;       //Output resultant to DAC. Again MBED uses 0.0 to 1.0 float!!!!!! and Offset to give 0 to 3V3 range
+    _FilterOutput=_yn+0.5f;       //Output resultant to DAC. Again MBED uses 0.0 to 1.0 float!!!!!! and Offset to give 0 to 3V3 range
 
     //THESE NEED TO BE LOADED IN THIS ORDER OTHERWISE ALL xnm VALUES WILL BECOME THE SAME AS xn
-    _xnm4 = _xnm3;
-    _xnm3 = _xnm2;
     _xnm2 = _xnm1;
     _xnm1 = _xn;
 
     //THESE NEED TO BE LOADED IN THIS ORDER OTHERWISE ALL ynm VALUES WILL BECOME THE SAME AS yn
-    _ynm4 = _ynm3;
-    _ynm3 = _ynm2;
     _ynm2 = _ynm1;
     _ynm1 = _yn;
 
@@ -66,7 +56,30 @@
 
 float FILTER::getvalue(void)
 {
-    return FilterOutput;  
+    return _FilterOutput;  
 }
 
-https://os.mbed.com/users/thomasmorris/code/ELEC347_CourseWork/
\ No newline at end of file
+void FILTER::Define_Filter()//Define the filter coefficients
+{
+    _G = pow(10,_Boost/20.0);
+    _k = 3 * ((_G - 1) / (_G+1));
+    _Wo = 2 * PI * _Fo;
+    _Wo_d = tan(_Wo / (2*_Fs));
+    _Wo_d2 = (_Wo_d * _Wo_d);                   //Omega-Dash-Naught-Squared
+    _Com_Den = 1 + ((3-_k)*_Wo_d/_Q) + _Wo_d2;
+    _NC0 = 1 + ((3+_k)*_Wo_d/_Q) + _Wo_d2;
+    _NC1 = -2 + (2 * _Wo_d2);
+    _NC2 = 1 - ((3+_k)*_Wo_d/_Q) + _Wo_d2;
+    _DC1 = _NC1;
+    _DC2 = 1 - ((3-_k)*_Wo_d/_Q) + _Wo_d2;
+    
+    //Calculate Coefficients
+    
+    _b0 = _NC0 / _Com_Den;
+    _b1 = _NC1 / _Com_Den;
+    _b2 = _NC2 / _Com_Den;
+    _a0 = 1.0000;
+    _a1 = _DC1 / _Com_Den;
+    _a2 = _DC2 / _Com_Den;
+}
+