source: flair-src/trunk/lib/FlairFilter/src/ButterworthLowPass_impl.cpp @ 10

Last change on this file since 10 was 10, checked in by Sanahuja Guillaume, 6 years ago

lic

File size: 2.5 KB
Line 
1// %flair:license{
2// This file is part of the Flair framework distributed under the
3// CECILL-C License, Version 1.0.
4// %flair:license}
5//  created:    2013/12/10
6//  filename:   ButterworthLowPass_impl.cpp
7//
8//  author:     Guillaume Sanahuja
9//              Copyright Heudiasyc UMR UTC/CNRS 7253
10//
11//  version:    $Id: $
12//
13//  purpose:    objet permettant le calcul d'un filtre passe bas de Butterworth
14//
15//
16/*********************************************************************/
17
18#include "ButterworthLowPass_impl.h"
19#include "ButterworthLowPass.h"
20#include <cvmatrix.h>
21#include <Layout.h>
22#include <GroupBox.h>
23#include <SpinBox.h>
24#include <DoubleSpinBox.h>
25
26using std::string;
27using namespace flair::core;
28using namespace flair::gui;
29using namespace flair::filter;
30
31ButterworthLowPass_impl::ButterworthLowPass_impl(ButterworthLowPass* self,const LayoutPosition* position,string name,int order)
32{
33    //init UI
34    GroupBox* reglages_groupbox=new GroupBox(position,name);
35        T=new DoubleSpinBox(reglages_groupbox->NewRow(),"period, 0 for auto"," s",0,10,0.01);
36        cutoff=new DoubleSpinBox(reglages_groupbox->NewRow(),"cutoff frequency"," Hz",0,10000,0.1,2,1);
37
38    cvmatrix_descriptor* desc=new cvmatrix_descriptor(1,1);
39    desc->SetElementName(0,0,"output");
40    output=new cvmatrix(self,desc,floatType,name);
41
42    output->SetValue(0,0,0);
43
44        f= new PoleFilter(order);
45
46    if(T->Value()!=0) f->setup(1./T->Value(), cutoff->Value());
47        f->reset();
48
49        first_update=true;
50}
51
52ButterworthLowPass_impl::~ButterworthLowPass_impl()
53{
54    delete f;
55}
56
57void ButterworthLowPass_impl::UpdateFrom(const io_data *data)
58{
59    float result;
60    cvmatrix *input=(cvmatrix*)data;
61
62    if(T->ValueChanged() || cutoff->ValueChanged())
63    {
64        if(T->Value()!=0)
65        {
66            f->setup (1./T->Value(), cutoff->Value());
67        }
68        else
69        {
70            first_update=true;
71        }
72    }
73
74    //on prend une fois pour toute les mutex et on fait des accès directs
75    output->GetMutex();
76    input->GetMutex();
77
78    if(T->Value()==0)
79    {
80        float delta_t=(float)(data->DataTime()-previous_time)/1000000000.;
81        f->setup (1./delta_t, cutoff->Value());
82    }
83
84    if(first_update==true)
85    {
86        first_update=false;
87    }
88    else
89    {
90        result = f->filter(input->ValueNoMutex(0,0));
91        output->SetValueNoMutex(0,0,result);
92    }
93
94    input->ReleaseMutex();
95    output->ReleaseMutex();
96
97    output->SetDataTime(data->DataTime());
98    previous_time=data->DataTime();
99}
100
Note: See TracBrowser for help on using the repository browser.