test_sdk/math/gtl_math_freq.cpp

103 lines
2.9 KiB
C++
Raw Permalink Normal View History

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