21 #define GRT_DLL_EXPORTS
30 classType =
"Derivative";
31 preProcessingType = classType;
32 debugLog.setProceedingText(
"[DEBUG Derivative]");
33 errorLog.setProceedingText(
"[ERROR Derivative]");
34 warningLog.setProceedingText(
"[WARNING Derivative]");
35 if( derivativeOrder == FIRST_DERIVATIVE || derivativeOrder == SECOND_DERIVATIVE ){
36 init(derivativeOrder,delta,numDimensions,filterData,filterSize);
50 classType =
"Derivative";
51 preProcessingType = classType;
52 debugLog.setProceedingText(
"[DEBUG Derivative]");
53 errorLog.setProceedingText(
"[ERROR Derivative]");
54 warningLog.setProceedingText(
"[WARNING Derivative]");
79 if( preProcessing == NULL )
return false;
98 errorLog <<
"clone(const PreProcessing *preProcessing) - PreProcessing Types Do Not Match!" << std::endl;
106 errorLog <<
"process(const VectorFloat &inputVector) - Not initialized!" << std::endl;
110 if( inputVector.
getSize() != numInputDimensions ){
111 errorLog <<
"process(const VectorFloat &inputVector) - The size of the inputVector (" << inputVector.size() <<
") does not match that of the filter (" << numInputDimensions <<
")!" << std::endl;
117 if( processedData.size() == numOutputDimensions )
return true;
128 if( !file.is_open() ){
129 errorLog <<
"save(fstream &file) - The file is not open!" << std::endl;
133 file <<
"GRT_DERIVATIVE_FILE_V1.0" << std::endl;
135 file <<
"NumInputDimensions: " << numInputDimensions << std::endl;
136 file <<
"NumOutputDimensions: " << numOutputDimensions << std::endl;
138 file <<
"FilterSize: " <<
filterSize << std::endl;
139 file <<
"Delta: " <<
delta << std::endl;
140 file <<
"FilterData: " <<
filterData << std::endl;
147 if( !file.is_open() ){
148 errorLog <<
"load(fstream &file) - The file is not open!" << std::endl;
157 if( word !=
"GRT_DERIVATIVE_FILE_V1.0" ){
158 errorLog <<
"load(fstream &file) - Invalid file format!" << std::endl;
164 if( word !=
"NumInputDimensions:" ){
165 errorLog <<
"load(fstream &file) - Failed to read NumInputDimensions header!" << std::endl;
168 file >> numInputDimensions;
172 if( word !=
"NumOutputDimensions:" ){
173 errorLog <<
"load(fstream &file) - Failed to read NumOutputDimensions header!" << std::endl;
176 file >> numOutputDimensions;
180 if( word !=
"DerivativeOrder:" ){
181 errorLog <<
"load(fstream &file) - Failed to read DerivativeOrder header!" << std::endl;
188 if( word !=
"FilterSize:" ){
189 errorLog <<
"load(fstream &file) - Failed to read FilterSize header!" << std::endl;
196 if( word !=
"Delta:" ){
197 errorLog <<
"load(fstream &file) - Failed to read Delta header!" << std::endl;
204 if( word !=
"FilterData:" ){
205 errorLog <<
"load(fstream &file) - Failed to read FilterData header!" << std::endl;
211 return init(derivativeOrder,delta,numInputDimensions,filterData,filterSize);
214 bool Derivative::init(UINT derivativeOrder,Float delta,UINT numDimensions,
bool filterData,UINT filterSize){
218 if( derivativeOrder != FIRST_DERIVATIVE && derivativeOrder != SECOND_DERIVATIVE ){
219 errorLog <<
"init(UINT derivativeOrder,Float delta,UINT numDimensions,bool filterData,UINT filterSize) - Unknown derivativeOrder!" << std::endl;
223 if( numDimensions == 0 ){
224 errorLog <<
"init(UINT derivativeOrder,Float delta,UINT numDimensions,bool filterData,UINT filterSize) - NumDimensions must be greater than 0!" << std::endl;
229 errorLog <<
"init(UINT derivativeOrder,Float delta,UINT numDimensions,bool filterData,UINT filterSize) - Delta must be greater than 0!" << std::endl;
233 if( filterSize == 0 ){
234 errorLog <<
"init(UINT derivativeOrder,Float delta,UINT numDimensions,bool filterData,UINT filterSize) - FilterSize must be greater than zero!" << std::endl;
240 this->numInputDimensions = numDimensions;
241 this->numOutputDimensions = numDimensions;
249 processedData.clear();
250 processedData.
resize(numDimensions,0);
257 if( numInputDimensions != 1 ){
258 errorLog <<
"computeDerivative(const Float x) - The Number Of Input Dimensions is not 1! NumInputDimensions: " << numInputDimensions << std::endl;
264 if( y.size() == 0 )
return 0 ;
272 errorLog <<
"computeDerivative(const VectorFloat &x) - Not Initialized!" << std::endl;
276 if( x.size() != numInputDimensions ){
277 errorLog <<
"computeDerivative(const VectorFloat &x) - The Number Of Input Dimensions (" << numInputDimensions <<
") does not match the size of the input vector (" << x.size() <<
")!" << std::endl;
286 for(UINT n=0; n<numInputDimensions; n++){
287 processedData[n] = (y[n]-
yy[n])/
delta;
293 for(UINT n=0; n<numInputDimensions; n++){
294 tmp = processedData[n];
295 processedData[n] = (processedData[n]-
yyy[n])/
delta;
300 return processedData;
304 if( derivativeOrder == FIRST_DERIVATIVE || derivativeOrder == SECOND_DERIVATIVE ){
309 errorLog <<
"setDerivativeOrder(UINT derivativeOrder) - Unkown derivativeOrder" << std::endl;
314 if( filterSize > 0 ){
319 errorLog <<
"setFilterSize(UINT filterSize) - FilterSize must be greater than zero!" << std::endl;
331 switch( derivativeOrder ){
333 return processedData[0];
335 case( FIRST_DERIVATIVE ):
338 case( SECOND_DERIVATIVE ):
342 warningLog <<
"getDerivative(UINT derivativeOrder) - Unkown derivativeOrder: " << derivativeOrder << std::endl;
351 switch( derivativeOrder ){
353 return processedData;
355 case( FIRST_DERIVATIVE ):
358 case( SECOND_DERIVATIVE ):
362 warningLog <<
"getDerivative(UINT derivativeOrder) - Unkown derivativeOrder: " << derivativeOrder << std::endl;
virtual bool save(std::fstream &file) const
bool init(UINT filterSize, UINT numDimensions)
UINT filterSize
The size of the filter used to filter the input data before the derivative is computed.
virtual bool resize(const unsigned int size)
bool setDerivativeOrder(UINT derivativeOrder)
VectorFloat yy
A buffer holding the previous input value(s)
VectorFloat yyy
A buffer holding the previous first derivative values.
Float computeDerivative(const Float x)
virtual bool load(std::fstream &file)
VectorFloat getDerivatives(UINT derivativeOrder=FIRST_DERIVATIVE)
Derivative & operator=(const Derivative &rhs)
Float filter(const Float x)
Float getDerivative(UINT derivativeOrder=FIRST_DERIVATIVE)
std::string getPreProcessingType() const
virtual bool process(const VectorFloat &inputVector)
bool filterData
Flags if the input data should be filtered before the derivative is computed.
Float delta
The estimated time between sensor samples.
bool copyBaseVariables(const PreProcessing *preProcessingModule)
bool enableFiltering(bool filterData)
UINT derivativeOrder
The order of the derivative that will be computed (either FIRST_DERIVATIVE or SECOND_DERIVATIVE) ...
Derivative(UINT derivativeOrder=FIRST_DERIVATIVE, Float delta=1, UINT numDimensions=1, bool filterData=true, UINT filterSize=3)
bool setFilterSize(UINT filterSize)
virtual bool deepCopyFrom(const PreProcessing *preProcessing)
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.