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

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

lic

File size: 3.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: 2011/05/01
6// filename: LowPassFilter_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
14//
15//
16/*********************************************************************/
17
18#include "LowPassFilter_impl.h"
19#include "LowPassFilter.h"
20#include <cvmatrix.h>
21#include <Layout.h>
22#include <GroupBox.h>
23#include <SpinBox.h>
24#include <DoubleSpinBox.h>
25
26#define PI ((float)3.14159265358979323846)
27
28using std::string;
29using namespace flair::core;
30using namespace flair::gui;
31using namespace flair::filter;
32
33LowPassFilter_impl::LowPassFilter_impl(const LowPassFilter* self,const LayoutPosition* position,string name,const cvmatrix* init_value)
34{
35 first_update=true;
36
37 if(init_value!=NULL)
38 {
39 prev_value=(cvmatrix*)init_value;
40 }
41 else
42 {
43 //if NULL, assume dimension 1, and init=0
44 cvmatrix_descriptor* desc=new cvmatrix_descriptor(1,1);
45 desc->SetElementName(0,0,"output");
46 prev_value=new cvmatrix(self,desc,floatType,name);
47 prev_value->SetValue(0,0,0);
48 }
49
50 //init UI
51 GroupBox* reglages_groupbox=new GroupBox(position,name);
52 T=new DoubleSpinBox(reglages_groupbox->NewRow(),"period, 0 for auto"," s",0,10,0.01);
53 freq=new DoubleSpinBox(reglages_groupbox->NewRow(),"cutoff frequency"," Hz",0,10000,0.1,2,1);
54
55
56 //init output matrix of same size as init
57 cvmatrix_descriptor* desc=new cvmatrix_descriptor(prev_value->Rows(),prev_value->Cols());
58
59 for(int i=0;i<prev_value->Rows();i++)
60 {
61 for(int j=0;j<prev_value->Cols();j++)
62 {
63 desc->SetElementName(i,j,prev_value->Name(i,j));
64 }
65 }
66
67 output=new cvmatrix(self,desc,prev_value->GetDataType().GetElementDataType(),name);
68
69 output->SetValue(0,0,0);
70}
71
72LowPassFilter_impl::~LowPassFilter_impl()
73{
74}
75
76void LowPassFilter_impl::UpdateFrom(const io_data *data)
77{
78 float delta_t;
79 float result;
80 cvmatrix *input=(cvmatrix*)data;
81
82 //on prend une fois pour toute les mutex et on fait des accès directs
83 output->GetMutex();
84 input->GetMutex();
85
86 if(first_update==true)
87 {
88 for(int i=0;i<input->Rows();i++)
89 {
90 for(int j=0;j<input->Cols();j++)
91 {
92 output->SetValueNoMutex(i,j,prev_value->ValueNoMutex(i,j));
93 prev_value->SetValueNoMutex(i,j,input->ValueNoMutex(i,j));
94 }
95 }
96 first_update=false;
97 }
98 else
99 {
100 if(T->Value()==0)
101 {
102 delta_t=(float)(data->DataTime()-previous_time)/1000000000.;
103 }
104 else
105 {
106 delta_t=T->Value();
107 }
108 for(int i=0;i<input->Rows();i++)
109 {
110 for(int j=0;j<input->Cols();j++)
111 {
112
113 if(freq->Value()!=0)
114 {
115 output->SetValueNoMutex(i,j,(1-2*PI*freq->Value()*delta_t)*prev_value->ValueNoMutex(i,j)+2*PI*freq->Value()*delta_t*input->ValueNoMutex(i,j));
116 }
117 else
118 {
119 output->SetValueNoMutex(i,j,input->ValueNoMutex(i,j));
120 }
121 prev_value->SetValueNoMutex(i,j,output->ValueNoMutex(i,j));
122 }
123 }
124 }
125 input->ReleaseMutex();
126 output->ReleaseMutex();
127
128 output->SetDataTime(data->DataTime());
129 previous_time=data->DataTime();
130}
131
Note: See TracBrowser for help on using the repository browser.