Files
ISTTOK/epics/css/sys-mng-opi/CSS/MARTe/GAMs/isttokbiblio/IWaveform.cpp
2019-10-21 16:02:55 +01:00

173 lines
4.5 KiB
C++

//******************************************************************************
//
// IWaveform.cpp - waveform container able to perform basic waveform operations
// Ivo Carvalho 27/4/2011
//
//******************************************************************************
#include "IWaveform.h"
//OBJECTLOADREGISTER(IWaveform,"$Id: IWaveform.cpp,v 1.0 27/4/2011 14:22:36 ivoc Exp $")
IWaveform::IWaveform(float * received_index_vector,float * received_data_vector, int NumberOfPoints){
if( NumberOfPoints >1) {
number_of_points = NumberOfPoints;
index_vector = new float[NumberOfPoints];
data_vector = new float[NumberOfPoints];
int i;
for (i = 0; i < NumberOfPoints ; i++ ){
index_vector[i] = *(received_index_vector+i);
data_vector[i] = *(received_data_vector+i);
}
this->SortWaveform();
this->RemoveRepeatedValues();
}
}
// ********* Destructor ********************************************
IWaveform::~IWaveform(){
if(this->index_vector != NULL) delete this->index_vector;
if(this->data_vector != NULL) delete this->data_vector;
}
float IWaveform::GetWaveformValue(float index_to_search){
if (this->number_of_points == 0) return 0.;
if (this->number_of_points == 1 && index_to_search == this->index_vector[0]) return this->data_vector[0];
//if out of bounds
if (this->index_vector[0] > index_to_search || this->index_vector[this->number_of_points-1] < index_to_search) return this->OutsideValueDefaultOutput;
// search algorithm based on a regular SAR ADC model - bisection routine - numerical receips in C chapter 3.4
this->jl = 0;
this->ju = this->number_of_points-1;
while (ju-jl > 1){
this->jm = (this->ju+this->jl) >> 1; //(shift 1 bit to the left same as divide by 2 and then cast to int)
if (index_to_search >= this->index_vector[jm]) this->jl = this->jm;
else this->ju = this->jm;
}// return linear interpolation between the upper and the lower point
return (this->data_vector[jl] + (this->data_vector[jl+1] - this->data_vector[jl])*(index_to_search - this->index_vector[jl])/(this->index_vector[jl+1] - this->index_vector[jl]));
}
bool IWaveform::SaveWaveform(float * received_index_vector,float * received_data_vector, int NumberOfPoints){
if (NumberOfPoints != number_of_points) {
index_vector = new float[NumberOfPoints];
data_vector = new float[NumberOfPoints];
number_of_points = NumberOfPoints;
}
if (NumberOfPoints < 2) return False;
int i;
for (i = 0; i < NumberOfPoints ; i++ ){
index_vector[i] = *(received_index_vector+i);
data_vector[i] = *(received_data_vector+i);
}
if(this->SortWaveform()) return (this->RemoveRepeatedValues());
}
float IWaveform::GetFirstIndex(){
if (this->number_of_points > 0){
return index_vector[0];
}
else return (float)NULL;
}
float IWaveform::GetLastIndex(){
if (this->number_of_points > 0){
return index_vector[number_of_points-1];
}
else return (float)NULL;
}
/* not done yet
bool WaveformGAM::AddPoint(float point_index, float point_data){
return True;
}
bool WaveformGAM::RemovePoint(int index_to_remove){
return True;
}
bool WaveformGAM::GetIndexVector(float &recived_index_vector){
}
bool WaveformGAM::GetDataVector(float &received_data_vector){
}
*/
bool IWaveform::DefineOutsideValueDefaultValue(float outside_value_default_output){
this->OutsideValueDefaultOutput = outside_value_default_output;
}
bool IWaveform::RemoveRepeatedValues(){
if (this->number_of_points < 1) return False;
if (this->number_of_points == 1) return True;
int i = 0;
int alfa;
for (alfa = 0; alfa < this->number_of_points-1; alfa++){
if ( this->index_vector[alfa] == this->index_vector[alfa+1]){
for (i = alfa; i < this->number_of_points-2; i++){
this->index_vector[i+1] = this->index_vector[i+2];
this->data_vector[i+1] = this->data_vector[i+2];
}
alfa--;
this->number_of_points--;
}
}
return True;
}
bool IWaveform::SortWaveform(){
if (this->number_of_points < 1) return False;
if (this->number_of_points == 1) return True;
int i;
int alfa;
float temp;
float min = this->index_vector[0];
int pos;
for(alfa = 0; alfa < this->number_of_points-1; alfa++){
pos = alfa;
min = this->index_vector[alfa];
for (i = alfa;i < this->number_of_points; i++){
if ( this->index_vector[i] <= min){
pos = i;
min = this->index_vector[i];
}
}
temp = this->index_vector[alfa];
this->index_vector[alfa] = this->index_vector[pos];
this->index_vector[pos] = temp;
temp = this->data_vector[alfa];
this->data_vector[alfa] = this->data_vector[pos];
this->data_vector[pos] = temp;
}
return True;
}