103 lines
2.9 KiB
C++
103 lines
2.9 KiB
C++
#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<qreal>::iterator begin, std::vector<qreal>::iterator end)
|
|
{
|
|
_sum -= std::accumulate(begin, end, 0.0);
|
|
}
|
|
|
|
void freq::after_copying_data(std::vector<qreal>::iterator begin, std::vector<qreal>::iterator end)
|
|
{
|
|
_sum += std::accumulate(begin, end, 0.0);
|
|
|
|
// qDebug() << _data_ptr;
|
|
log_fronts("before", _fronts.begin(), _fronts.end());
|
|
|
|
std::set<int>::iterator iter_remove_begin = _fronts.lower_bound(std::distance(_data.begin(), begin));
|
|
std::set<int>::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<int>::iterator begin, std::set<int>::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<int>::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();
|
|
}
|
|
}
|
|
}
|