#include "gtl_math_freq.h" namespace gtl { namespace math { freq::freq(gtl::analog_data *data) : analog_value(data) , _sum(0) , _dc(qInf()) { _name = "frequency"; } void freq::before_copying_data(std::vector::iterator begin, std::vector::iterator end) { _sum -= std::accumulate(begin, end, 0.0); } void freq::after_copying_data(std::vector::iterator begin, std::vector::iterator end) { _sum += std::accumulate(begin, end, 0.0); // qDebug() << _data_ptr; log_fronts("before", _fronts.begin(), _fronts.end()); std::set::iterator iter_remove_begin = _fronts.lower_bound(std::distance(_data.begin(), begin)); std::set::iterator iter_remove_end = _fronts.lower_bound(std::distance(_data.begin(), end)); log_fronts("eracing fronts", iter_remove_begin, iter_remove_end); _fronts.erase(iter_remove_begin, iter_remove_end); qreal dc = _dc == qInf() ? _sum/_data.size() : _dc; for(auto it = begin; it != end; it++) { qreal value_prev = _data[(std::distance(_data.begin(), it) - 1 + _data.size()) % _data.size()]; qreal value = *it; if(value_prev < dc && value >= dc) _fronts.insert(std::distance(_data.begin(), it)); } log_fronts("after", _fronts.begin(), _fronts.end()); } void freq::set_time(qreal value) { analog_value::set_time(value); _fronts.clear(); _sum = 0; } qreal freq::dc() const { return _dc; } void freq::set_dc(qreal value) { _dc = value; emit dc_changed(); } void freq::log_fronts(QString msg, std::set::iterator begin, std::set::iterator end) { return; QString str = msg + ": "; for(auto it = begin; it != end; it++) str += QString::number(*it) + ", "; qDebug() << str; } void freq::data_changed() { analog_value::data_changed(); if(_fronts.size() < 2) { _value = 0; return; } std::set::iterator iter_ptr = _fronts.upper_bound(_data_ptr); if(iter_ptr == _fronts.end()) iter_ptr = _fronts.begin(); qreal period = 0; if(iter_ptr == _fronts.begin()) period = *(--_fronts.end()) - *iter_ptr; else period = -(*iter_ptr) + *(--iter_ptr) + _data.size(); period /= _fronts.size() - 1; _value = _ad->get_rate() / period; emit value_changed(); } } }