26 RegisterPreProcessingModule< Derivative > Derivative::registerModule(
"Derivative");
29 classType =
"Derivative";
30 preProcessingType = classType;
31 debugLog.setProceedingText(
"[DEBUG Derivative]");
32 errorLog.setProceedingText(
"[ERROR Derivative]");
33 warningLog.setProceedingText(
"[WARNING Derivative]");
34 if( derivativeOrder == FIRST_DERIVATIVE || derivativeOrder == SECOND_DERIVATIVE ){
35 init(derivativeOrder,delta,numDimensions,filterData,filterSize);
49 classType =
"Derivative";
50 preProcessingType = classType;
51 debugLog.setProceedingText(
"[DEBUG Derivative]");
52 errorLog.setProceedingText(
"[ERROR Derivative]");
53 warningLog.setProceedingText(
"[WARNING Derivative]");
78 if( preProcessing == NULL )
return false;
97 errorLog <<
"clone(const PreProcessing *preProcessing) - PreProcessing Types Do Not Match!" << endl;
105 errorLog <<
"process(const VectorDouble &inputVector) - Not initialized!" << endl;
109 if( inputVector.size() != numInputDimensions ){
110 errorLog <<
"process(const VectorDouble &inputVector) - The size of the inputVector (" << inputVector.size() <<
") does not match that of the filter (" << numInputDimensions <<
")!" << endl;
116 if( processedData.size() == numOutputDimensions )
return true;
128 errorLog <<
"saveModelToFile(string filename) - The DeadZone has not been initialized" << endl;
133 file.open(filename.c_str(), std::ios::out);
147 if( !file.is_open() ){
148 errorLog <<
"saveModelToFile(fstream &file) - The file is not open!" << endl;
152 file <<
"GRT_DERIVATIVE_FILE_V1.0" << endl;
154 file <<
"NumInputDimensions: " << numInputDimensions << endl;
155 file <<
"NumOutputDimensions: " << numOutputDimensions << endl;
158 file <<
"Delta: " <<
delta << endl;
167 file.open(filename.c_str(), std::ios::in);
182 if( !file.is_open() ){
183 errorLog <<
"loadModelFromFile(fstream &file) - The file is not open!" << endl;
192 if( word !=
"GRT_DERIVATIVE_FILE_V1.0" ){
193 errorLog <<
"loadModelFromFile(fstream &file) - Invalid file format!" << endl;
199 if( word !=
"NumInputDimensions:" ){
200 errorLog <<
"loadModelFromFile(fstream &file) - Failed to read NumInputDimensions header!" << endl;
203 file >> numInputDimensions;
207 if( word !=
"NumOutputDimensions:" ){
208 errorLog <<
"loadModelFromFile(fstream &file) - Failed to read NumOutputDimensions header!" << endl;
211 file >> numOutputDimensions;
215 if( word !=
"DerivativeOrder:" ){
216 errorLog <<
"loadModelFromFile(fstream &file) - Failed to read DerivativeOrder header!" << endl;
223 if( word !=
"FilterSize:" ){
224 errorLog <<
"loadModelFromFile(fstream &file) - Failed to read FilterSize header!" << endl;
231 if( word !=
"Delta:" ){
232 errorLog <<
"loadModelFromFile(fstream &file) - Failed to read Delta header!" << endl;
239 if( word !=
"FilterData:" ){
240 errorLog <<
"loadModelFromFile(fstream &file) - Failed to read FilterData header!" << endl;
246 return init(derivativeOrder,delta,numInputDimensions,filterData,filterSize);
249 bool Derivative::init(UINT derivativeOrder,
double delta,UINT numDimensions,
bool filterData,UINT filterSize){
253 if( derivativeOrder != FIRST_DERIVATIVE && derivativeOrder != SECOND_DERIVATIVE ){
254 errorLog <<
"init(UINT derivativeOrder,double delta,UINT numDimensions,bool filterData,UINT filterSize) - Unknown derivativeOrder!" << endl;
258 if( numDimensions == 0 ){
259 errorLog <<
"init(UINT derivativeOrder,double delta,UINT numDimensions,bool filterData,UINT filterSize) - NumDimensions must be greater than 0!" << endl;
264 errorLog <<
"init(UINT derivativeOrder,double delta,UINT numDimensions,bool filterData,UINT filterSize) - Delta must be greater than 0!" << endl;
268 if( filterSize == 0 ){
269 errorLog <<
"init(UINT derivativeOrder,double delta,UINT numDimensions,bool filterData,UINT filterSize) - FilterSize must be greater than zero!" << endl;
275 this->numInputDimensions = numDimensions;
276 this->numOutputDimensions = numDimensions;
281 yy.resize(numDimensions,0);
283 yyy.resize(numDimensions,0);
284 processedData.clear();
285 processedData.resize(numDimensions,0);
292 if( numInputDimensions != 1 ){
293 errorLog <<
"computeDerivative(const double x) - The Number Of Input Dimensions is not 1! NumInputDimensions: " << numInputDimensions << endl;
299 if( y.size() == 0 )
return 0 ;
307 errorLog <<
"computeDerivative(const VectorDouble &x) - Not Initialized!" << endl;
308 return vector<double>();
311 if( x.size() != numInputDimensions ){
312 errorLog <<
"computeDerivative(const VectorDouble &x) - The Number Of Input Dimensions (" << numInputDimensions <<
") does not match the size of the input vector (" << x.size() <<
")!" << endl;
313 return vector<double>();
321 for(UINT n=0; n<numInputDimensions; n++){
322 processedData[n] = (y[n]-
yy[n])/
delta;
328 for(UINT n=0; n<numInputDimensions; n++){
329 tmp = processedData[n];
330 processedData[n] = (processedData[n]-
yyy[n])/
delta;
335 return processedData;
339 if( derivativeOrder == FIRST_DERIVATIVE || derivativeOrder == SECOND_DERIVATIVE ){
344 errorLog <<
"setDerivativeOrder(UINT derivativeOrder) - Unkown derivativeOrder" << endl;
349 if( filterSize > 0 ){
354 errorLog <<
"setFilterSize(UINT filterSize) - FilterSize must be greater than zero!" << endl;
366 switch( derivativeOrder ){
368 return processedData[0];
370 case( FIRST_DERIVATIVE ):
373 case( SECOND_DERIVATIVE ):
377 warningLog <<
"getDerivative(UINT derivativeOrder) - Unkown derivativeOrder: " << derivativeOrder << endl;
386 switch( derivativeOrder ){
388 return processedData;
390 case( FIRST_DERIVATIVE ):
393 case( SECOND_DERIVATIVE ):
397 warningLog <<
"getDerivative(UINT derivativeOrder) - Unkown derivativeOrder: " << derivativeOrder << endl;
401 return VectorDouble();
VectorDouble yyy
A buffer holding the previous first derivative values.
virtual bool deepCopyFrom(const PreProcessing *preProcessing)
VectorDouble yy
A buffer holding the previous input value(s)
double delta
The estimated time between sensor samples.
double filter(const double x)
bool filterData
Flags if the input data should be filtered before the derivative is computed.
virtual bool saveModelToFile(string filename) const
string getPreProcessingType() const
bool enableFiltering(bool filterData)
bool copyBaseVariables(const PreProcessing *preProcessingModule)
Derivative(UINT derivativeOrder=FIRST_DERIVATIVE, double delta=1, UINT numDimensions=1, bool filterData=true, UINT filterSize=3)
UINT derivativeOrder
The order of the derivative that will be computed (either FIRST_DERIVATIVE or SECOND_DERIVATIVE) ...
bool setFilterSize(UINT filterSize)
bool setDerivativeOrder(UINT derivativeOrder)
double getDerivative(UINT derivativeOrder=0)
VectorDouble getDerivatives(UINT derivativeOrder=0)
virtual bool loadModelFromFile(string filename)
bool init(UINT filterSize, UINT numDimensions)
Derivative & operator=(const Derivative &rhs)
virtual bool process(const VectorDouble &inputVector)
double computeDerivative(const double x)
UINT filterSize
The size of the filter used to filter the input data before the derivative is computed.
The Derivative class computes either the first or second order derivative of the input signal...
MovingAverageFilter filter
The filter used to low pass filter the input data.