102 lines
2.2 KiB
C++
102 lines
2.2 KiB
C++
#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;
|
|
}
|
|
|
|
|
|
}
|
|
}
|