Changeset 147 in flair-src for trunk/lib/FlairFilter


Ignore:
Timestamp:
Feb 28, 2017, 12:45:08 PM (5 years ago)
Author:
Sanahuja Guillaume
Message:

modif euler/lowpass

Location:
trunk/lib/FlairFilter/src
Files:
7 edited

Legend:

Unmodified
Added
Removed
  • trunk/lib/FlairFilter/src/ButterworthLowPass_impl.cpp

    r15 r147  
    4747  f = new PoleFilter(order);
    4848
    49   if (T->Value() != 0)
     49  if (T->Value() != 0) {
    5050    f->setup(1. / T->Value(), cutoff->Value());
     51  }
     52 
    5153  f->reset();
    5254
    5355  first_update = true;
     56  this->order=order;
    5457}
    5558
     
    5962  float result;
    6063  cvmatrix *input = (cvmatrix *)data;
    61 
    62   if (T->ValueChanged() || cutoff->ValueChanged()) {
     64  float delta_t;
     65 
     66  if (T->ValueChanged()) {
    6367    if (T->Value() != 0) {
    6468      f->setup(1. / T->Value(), cutoff->Value());
    65     } else {
    66       first_update = true;
     69      settingsChanged(input->Value(0, 0));
    6770    }
    6871  }
    6972
     73  if (T->Value() == 0) {
     74    delta_t = (float)(data->DataTime() - previous_time) / 1000000000.;
     75    f->setup(1. / delta_t, cutoff->Value());
     76  } else {
     77    delta_t=T->Value();
     78  }
     79 
    7080  // on prend une fois pour toute les mutex et on fait des accès directs
    7181  output->GetMutex();
    7282  input->GetMutex();
    7383
    74   if (T->Value() == 0) {
    75     float delta_t = (float)(data->DataTime() - previous_time) / 1000000000.;
     84  if (cutoff->ValueChanged()) {
    7685    f->setup(1. / delta_t, cutoff->Value());
     86    settingsChanged(input->ValueNoMutex(0, 0));
    7787  }
    7888
     
    90100  previous_time = data->DataTime();
    91101}
     102
     103//ne gere pas les oscillations (s'arrete des qu'une valeure est bonne a 5%)
     104void ButterworthLowPass_impl::settingsChanged(float inputValue) {
     105  float result=f->filter(inputValue);
     106 
     107  while(result<inputValue*0.95 || result>inputValue*1.05) {
     108      result=f->filter(inputValue);
     109  }
     110}
  • trunk/lib/FlairFilter/src/EulerDerivative.h

    r15 r147  
    4545  * IODevice::ProcessUpdate is called. \n
    4646  * The optional init_value parameters allow to specify
    47   * the size of the input datas and its inital values.
     47  * the size of the input datas and output inital values.
    4848  * If unspecified, a 1*1 size is used, and values are
    4949  * initialized with 0.
     
    5252  * \param position position to display settings
    5353  * \param name name
    54   * \param init_value initial value
     54  * \param init_value initial value, it is safe to destroy it after calling this constructor
    5555  */
    5656  EulerDerivative(const core::IODevice *parent,
  • trunk/lib/FlairFilter/src/EulerDerivative_impl.cpp

    r15 r147  
    3333                                           const cvmatrix *init_value) {
    3434  first_update = true;
     35 
     36  if (init_value != NULL) {
     37    // init output matrix of same size as init
     38    cvmatrix_descriptor *desc =new cvmatrix_descriptor(init_value->Rows(), init_value->Cols());
    3539
    36   if (init_value != NULL) {
    37     prev_value = (cvmatrix *)init_value;
     40    for (int i = 0; i < init_value->Rows(); i++) {
     41      for (int j = 0; j < init_value->Cols(); j++) {
     42        desc->SetElementName(i, j, init_value->Name(i, j));
     43      }
     44    }
     45    output = new cvmatrix(self, desc,init_value->GetDataType().GetElementDataType(), name);
     46    for (int i = 0; i < init_value->Rows(); i++) {
     47      for (int j = 0; j < init_value->Cols(); j++) {
     48        output->SetValue(i, j, init_value->Value(i,j));
     49      }
     50    }
    3851  } else {
    3952    // if NULL, assume dimension 1, and init=0
    4053    cvmatrix_descriptor *desc = new cvmatrix_descriptor(1, 1);
    4154    desc->SetElementName(0, 0, "output");
    42     prev_value = new cvmatrix(self, desc, floatType, name);
    43     prev_value->SetValue(0, 0, 0);
     55    output = new cvmatrix(self, desc, floatType, name);
     56    output->SetValue(0, 0, 0);
    4457  }
     58 
     59 
     60  cvmatrix_descriptor *desc = new cvmatrix_descriptor(output->Rows(), output->Cols());
     61  prev_value = new cvmatrix(self, desc, output->GetDataType().GetElementDataType(), name);
     62
    4563
    4664  // init UI
     
    4866  T = new DoubleSpinBox(reglages_groupbox->NewRow(), "period, 0 for auto:",
    4967                        " s", 0, 1, 0.01);
    50 
    51   // init output matrix of same size as init
    52   cvmatrix_descriptor *desc =
    53       new cvmatrix_descriptor(prev_value->Rows(), prev_value->Cols());
    54 
    55   for (int i = 0; i < prev_value->Rows(); i++) {
    56     for (int j = 0; j < prev_value->Cols(); j++) {
    57       desc->SetElementName(i, j, prev_value->Name(i, j));
    58     }
    59   }
    60 
    61   output = new cvmatrix(self, desc,
    62                         prev_value->GetDataType().GetElementDataType(), name);
    6368}
    6469
     
    7681    for (int i = 0; i < input->Rows(); i++) {
    7782      for (int j = 0; j < input->Cols(); j++) {
    78         output->SetValueNoMutex(i, j, prev_value->ValueNoMutex(i, j));
    7983        prev_value->SetValueNoMutex(i, j, input->ValueNoMutex(i, j));
    8084      }
  • trunk/lib/FlairFilter/src/LowPassFilter.h

    r15 r147  
    5252  * \param position position to display settings
    5353  * \param name name
    54   * \param init_value initial value
     54  * \param init_value initial value, it is safe to destroy it after calling this constructor
    5555  */
    5656  LowPassFilter(const core::IODevice *parent,
  • trunk/lib/FlairFilter/src/LowPassFilter_impl.cpp

    r15 r147  
    3535                                       string name,
    3636                                       const cvmatrix *init_value) {
    37   first_update = true;
    3837
    3938  if (init_value != NULL) {
    40     prev_value = (cvmatrix *)init_value;
     39    // init output matrix of same size as init
     40    cvmatrix_descriptor *desc =new cvmatrix_descriptor(init_value->Rows(), init_value->Cols());
     41
     42    for (int i = 0; i < init_value->Rows(); i++) {
     43      for (int j = 0; j < init_value->Cols(); j++) {
     44        desc->SetElementName(i, j, init_value->Name(i, j));
     45      }
     46    }
     47    output = new cvmatrix(self, desc,init_value->GetDataType().GetElementDataType(), name);
     48    for (int i = 0; i < init_value->Rows(); i++) {
     49      for (int j = 0; j < init_value->Cols(); j++) {
     50        output->SetValue(i, j, init_value->Value(i,j));
     51      }
     52    }
    4153  } else {
    4254    // if NULL, assume dimension 1, and init=0
    4355    cvmatrix_descriptor *desc = new cvmatrix_descriptor(1, 1);
    4456    desc->SetElementName(0, 0, "output");
    45     prev_value = new cvmatrix(self, desc, floatType, name);
    46     prev_value->SetValue(0, 0, 0);
     57    output = new cvmatrix(self, desc, floatType, name);
     58    output->SetValue(0, 0, 0);
    4759  }
    4860
     
    5365  freq = new DoubleSpinBox(reglages_groupbox->NewRow(), "cutoff frequency",
    5466                           " Hz", 0, 10000, 0.1, 2, 1);
    55 
    56   // init output matrix of same size as init
    57   cvmatrix_descriptor *desc =
    58       new cvmatrix_descriptor(prev_value->Rows(), prev_value->Cols());
    59 
    60   for (int i = 0; i < prev_value->Rows(); i++) {
    61     for (int j = 0; j < prev_value->Cols(); j++) {
    62       desc->SetElementName(i, j, prev_value->Name(i, j));
    63     }
    64   }
    65 
    66   output = new cvmatrix(self, desc,
    67                         prev_value->GetDataType().GetElementDataType(), name);
    68 
    69   output->SetValue(0, 0, 0);
     67                           
     68  previous_time=GetTime();
    7069}
    7170
     
    7473void LowPassFilter_impl::UpdateFrom(const io_data *data) {
    7574  float delta_t;
    76   float result;
    7775  cvmatrix *input = (cvmatrix *)data;
    7876
     
    8179  input->GetMutex();
    8280
    83   if (first_update == true) {
    84     for (int i = 0; i < input->Rows(); i++) {
    85       for (int j = 0; j < input->Cols(); j++) {
    86         output->SetValueNoMutex(i, j, prev_value->ValueNoMutex(i, j));
    87         prev_value->SetValueNoMutex(i, j, input->ValueNoMutex(i, j));
    88       }
    89     }
    90     first_update = false;
     81  if (T->Value() == 0) {
     82    delta_t = (float)(data->DataTime() - previous_time) / 1000000000.;
    9183  } else {
    92     if (T->Value() == 0) {
    93       delta_t = (float)(data->DataTime() - previous_time) / 1000000000.;
    94     } else {
    95       delta_t = T->Value();
    96     }
    97     for (int i = 0; i < input->Rows(); i++) {
    98       for (int j = 0; j < input->Cols(); j++) {
    99 
    100         if (freq->Value() != 0) {
    101           output->SetValueNoMutex(i, j, (1 - 2 * PI * freq->Value() * delta_t) *
    102                                                 prev_value->ValueNoMutex(i, j) +
    103                                             2 * PI * freq->Value() * delta_t *
    104                                                 input->ValueNoMutex(i, j));
    105         } else {
    106           output->SetValueNoMutex(i, j, input->ValueNoMutex(i, j));
    107         }
    108         prev_value->SetValueNoMutex(i, j, output->ValueNoMutex(i, j));
     84    delta_t = T->Value();
     85  }
     86  for (int i = 0; i < input->Rows(); i++) {
     87    for (int j = 0; j < input->Cols(); j++) {
     88      float cutoff=freq->Value();
     89      if (cutoff == 0 || freq->ValueChanged()) {
     90        output->SetValueNoMutex(i, j, input->ValueNoMutex(i, j));
     91      } else {
     92        output->SetValueNoMutex(i, j, (1 - 2 * PI * cutoff * delta_t) *
     93                                              output->ValueNoMutex(i, j) +
     94                                          2 * PI * cutoff * delta_t *
     95                                              input->ValueNoMutex(i, j));
    10996      }
    11097    }
    11198  }
     99 
    112100  input->ReleaseMutex();
    113101  output->ReleaseMutex();
  • trunk/lib/FlairFilter/src/unexported/ButterworthLowPass_impl.h

    r15 r147  
    128128
    129129private:
     130  void settingsChanged(float inputValue);
    130131  flair::gui::DoubleSpinBox *cutoff, *T;
    131132  PoleFilter *f;
    132133  bool first_update;
    133134  flair::core::Time previous_time;
     135  int order;
    134136};
    135137
  • trunk/lib/FlairFilter/src/unexported/LowPassFilter_impl.h

    r15 r147  
    4343private:
    4444  flair::core::Time previous_time;
    45   bool first_update;
    46   flair::core::cvmatrix *prev_value;
    4745  flair::gui::DoubleSpinBox *freq, *T;
    4846};
Note: See TracChangeset for help on using the changeset viewer.