test_sdk/math/gtl_math_diff.cpp

102 lines
2.2 KiB
C++
Raw Normal View History

#include "gtl_math_diff.h"
namespace gtl
{
namespace math
{
diff::diff(gtl::analog_data* parent, bool is_hidden)
: gtl::analog_data(parent, is_hidden)
, _taps(1)
// , _delay(1)
{
if(parent == NULL)
return;
QString name_base = tr("differentiator");
QString name = name_base;
int idx = 0;
while(parent->is_child_name_exist(name))
{
idx++;
name = name_base + "_" + QString::number(idx);
}
set_name(name);
init();
}
diff::~diff()
{
delete _delays;
}
int diff::taps() const
{
return _taps;
}
void diff::set_taps(int value)
{
if( value > 0 && value != _taps)
{
_taps = value;
init();
}
}
// int diff::delay() const
// {
// return _delay;
// }
// void diff::set_delay(int value)
// {
// if( value > 0 && value != _delay)
// {
// _delay = value;
// init();
// }
// }
void gtl::math::diff::set_data(iterator begin, iterator end)
{
clear();
std::copy(begin, end, std::back_inserter(*this)); //to do...
process(this->begin(), this->end());
gtl::analog_data::set_data(this->begin(), this->end());
}
void diff::init()
{
if(_delays)
delete _delays;
_delays = new std::vector<qreal>(_taps);
}
void diff::process(iterator begin, iterator end)
{
int size = std::distance(begin, end);
qreal dt = 1./get_rate();
for( int i = 0; i < size; i++)
{
qreal value = *(begin + i);
for(int t = 0; t < _taps; t++)
{
value -= _delays->at(t);
_delays->at(t) += value;
}
*(begin + i) = value/dt;
}
return;
}
}
}