30 classType =
"SavitzkyGolayFilter";
31 preProcessingType = classType;
32 debugLog.setProceedingText(
"[DEBUG SavitzkyGolayFilter]");
33 errorLog.setProceedingText(
"[ERROR SavitzkyGolayFilter]");
34 warningLog.setProceedingText(
"[WARNING SavitzkyGolayFilter]");
35 init(numLeftHandPoints,numRightHandPoints,derivativeOrder,smoothingPolynomialOrder,numDimensions);
40 this->numPoints = rhs.numPoints;
41 this->numLeftHandPoints = rhs.numLeftHandPoints;
42 this->numRightHandPoints = rhs.numRightHandPoints;
43 this->derivativeOrder = rhs.derivativeOrder;
44 this->smoothingPolynomialOrder = rhs.smoothingPolynomialOrder;
45 this->data = rhs.data;
47 this->coeff = rhs.coeff;
49 classType =
"SavitzkyGolayFilter";
50 preProcessingType = classType;
51 debugLog.setProceedingText(
"[DEBUG SavitzkyGolayFilter]");
52 errorLog.setProceedingText(
"[ERROR SavitzkyGolayFilter]");
53 warningLog.setProceedingText(
"[WARNING SavitzkyGolayFilter]");
64 this->numPoints = rhs.numPoints;
65 this->numLeftHandPoints = rhs.numLeftHandPoints;
66 this->numRightHandPoints = rhs.numRightHandPoints;
67 this->derivativeOrder = rhs.derivativeOrder;
68 this->smoothingPolynomialOrder = rhs.smoothingPolynomialOrder;
69 this->data = rhs.data;
71 this->coeff = rhs.coeff;
79 if( preProcessing == NULL )
return false;
86 this->numPoints = ptr->numPoints;
87 this->numLeftHandPoints = ptr->numLeftHandPoints;
88 this->numRightHandPoints = ptr->numRightHandPoints;
89 this->derivativeOrder = ptr->derivativeOrder;
90 this->smoothingPolynomialOrder = ptr->smoothingPolynomialOrder;
91 this->data = ptr->data;
93 this->coeff = ptr->coeff;
99 errorLog <<
"clone(PreProcessing *preProcessing) - PreProcessing Types Do Not Match!" << std::endl;
107 errorLog <<
"process(const VectorFloat &inputVector) - Not initialized!" << std::endl;
111 if( inputVector.size() != numInputDimensions ){
112 errorLog <<
"process(const VectorFloat &inputVector) - The size of the inputVector (" << inputVector.size() <<
") does not match that of the filter (" << numInputDimensions <<
")!" << std::endl;
116 processedData =
filter( inputVector );
118 if( processedData.size() == numOutputDimensions )
return true;
127 yy.
resize(numInputDimensions,0);
128 processedData.clear();
129 processedData.
resize(numInputDimensions,0);
138 errorLog <<
"saveModelToFile(string filename) - The HighPassFilter has not been initialized" << std::endl;
143 file.open(filename.c_str(), std::ios::out);
157 if( !file.is_open() ){
158 errorLog <<
"saveModelToFile(std::fstream &file) - The file is not open!" << std::endl;
162 file <<
"GRT_SAVITZKY_GOLAY_FILTER_FILE_V1.0" << std::endl;
164 file <<
"NumInputDimensions: " << numInputDimensions << std::endl;
165 file <<
"NumOutputDimensions: " << numOutputDimensions << std::endl;
166 file <<
"NumPoints: " << numPoints << std::endl;
167 file <<
"NumLeftHandPoints: " << numLeftHandPoints << std::endl;
168 file <<
"NumRightHandPoints: " << numRightHandPoints << std::endl;
169 file <<
"DerivativeOrder: " << derivativeOrder << std::endl;
170 file <<
"SmoothingPolynomialOrder: " << smoothingPolynomialOrder << std::endl;
178 file.open(filename.c_str(), std::ios::in);
193 if( !file.is_open() ){
194 errorLog <<
"loadModelFromFile(std::fstream &file) - The file is not open!" << std::endl;
203 if( word !=
"GRT_SAVITZKY_GOLAY_FILTER_FILE_V1.0" ){
204 errorLog <<
"loadModelFromFile(std::fstream &file) - Invalid file format!" << std::endl;
210 if( word !=
"NumInputDimensions:" ){
211 errorLog <<
"loadModelFromFile(std::fstream &file) - Failed to read NumInputDimensions header!" << std::endl;
214 file >> numInputDimensions;
218 if( word !=
"NumOutputDimensions:" ){
219 errorLog <<
"loadModelFromFile(std::fstream &file) - Failed to read NumOutputDimensions header!" << std::endl;
222 file >> numOutputDimensions;
226 if( word !=
"NumPoints:" ){
227 errorLog <<
"loadModelFromFile(std::fstream &file) - Failed to read NumPoints header!" << std::endl;
234 if( word !=
"NumLeftHandPoints:" ){
235 errorLog <<
"loadModelFromFile(std::fstream &file) - Failed to read NumLeftHandPoints header!" << std::endl;
238 file >> numLeftHandPoints;
242 if( word !=
"NumRightHandPoints:" ){
243 errorLog <<
"loadModelFromFile(std::fstream &file) - Failed to read numRightHandPoints header!" << std::endl;
246 file >> numRightHandPoints;
250 if( word !=
"DerivativeOrder:" ){
251 errorLog <<
"loadModelFromFile(std::fstream &file) - Failed to read DerivativeOrder header!" << std::endl;
254 file >> derivativeOrder;
258 if( word !=
"SmoothingPolynomialOrder:" ){
259 errorLog <<
"loadModelFromFile(std::fstream &file) - Failed to read SmoothingPolynomialOrder header!" << std::endl;
262 file >> smoothingPolynomialOrder;
265 return init(numLeftHandPoints,numRightHandPoints,derivativeOrder,smoothingPolynomialOrder,numInputDimensions);
268 bool SavitzkyGolayFilter::init(UINT numLeftHandPoints,UINT numRightHandPoints,UINT derivativeOrder,UINT smoothingPolynomialOrder,UINT numDimensions){
272 if( numDimensions == 0 ){
273 errorLog <<
"init(Float filterFactor,Float gain,UINT numDimensions) - NumDimensions must be greater than 0!" << std::endl;
277 this->numPoints = numLeftHandPoints+numRightHandPoints+1;
278 this->numLeftHandPoints = numLeftHandPoints;
279 this->numRightHandPoints = numRightHandPoints;
280 this->derivativeOrder = derivativeOrder;
281 this->smoothingPolynomialOrder = smoothingPolynomialOrder;
283 this->numInputDimensions = numDimensions;
284 this->numOutputDimensions = numDimensions;
286 yy.
resize(numDimensions,0);
287 processedData.clear();
288 processedData.
resize(numDimensions,0);
292 errorLog <<
"init(UINT NL,UINT NR,UINT LD,UINT M,UINT numDimensions) - Failed to compute filter coefficents!" << std::endl;
305 errorLog <<
"filter(Float x) - The filter has not been initialized!" << std::endl;
311 if( y.size() > 0 )
return y[0];
318 errorLog <<
"filter(const VectorFloat &x) - Not Initialized!" << std::endl;
322 if( x.size() != numInputDimensions ){
323 errorLog <<
"filter(const VectorFloat &x) - The Number Of Input Dimensions (" << numInputDimensions <<
") does not match the size of the input vector (" << x.size() <<
")!" << std::endl;
331 for(UINT j=0; j<x.size(); j++){
332 processedData[j] = 0;
333 for(UINT i=0; i<numPoints; i++)
334 processedData[j] += data[i][j] * coeff[i];
337 return processedData;
340 bool SavitzkyGolayFilter::calCoeff(){
342 int np = (int)numPoints;
343 int nl = (int)numLeftHandPoints;
344 int nr = (int)numRightHandPoints;
345 int ld = (int)derivativeOrder;
346 int m = (int)smoothingPolynomialOrder;
347 int i,j,k,imj,ipj,kk,mm,pos;
354 for (ipj=0; ipj<=(m << 1); ipj++) {
355 sum=(ipj ? 0.0 : 1.0);
357 for (k=1; k<=nr; k++) sum += pow(Float(k),Float(ipj));
358 for (k=1; k<=nl; k++) sum += pow(Float(-k),Float(ipj));
360 mm = min_(ipj,2*m-ipj);
362 for (imj = -mm; imj<=mm; imj+=2) a[(ipj+imj)/2][(ipj-imj)/2] = sum;
366 for (j=0;j<m+1;j++) b[j]=0.0;
368 if( !alud.solve_vector(b,b) ){
372 for (kk=0; kk<np; kk++) c[kk]=0.0;
373 for (k = -nl; k<=nr; k++) {
377 for(mm=1; mm<=m; mm++)
378 sum += b[mm]*(fac *= k);
bool push_back(const T &value)
virtual bool loadModelFromFile(std::string filename)
Float filter(const Float x)
virtual ~SavitzkyGolayFilter()
This implements a Savitzky-Golay filter. This code is based on the Savitzky Golay filter code from Nu...
virtual bool resize(const unsigned int size)
virtual bool saveModelToFile(std::string filename) const
SavitzkyGolayFilter(UINT numLeftHandPoints=10, UINT numRightHandPoints=10, UINT derivativeOrder=0, UINT smoothingPolynomialOrder=2, UINT numDimensions=1)
std::string getPreProcessingType() const
virtual bool deepCopyFrom(const PreProcessing *preProcessing)
SavitzkyGolayFilter & operator=(const SavitzkyGolayFilter &rhs)
bool copyBaseVariables(const PreProcessing *preProcessingModule)
bool setAllValues(const T &value)
virtual bool process(const VectorFloat &inputVector)
bool resize(const unsigned int newBufferSize)