#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(_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; } } }