#include "gtl_math_ampl.h" namespace gtl { namespace math { ampl::ampl(gtl::analog_data *data) : analog_value(data) , _sum(0) , _dc(0) { _name = "amplitude"; } void ampl::before_copying_data(std::vector::iterator begin, std::vector::iterator end) { _sum -= std::accumulate(begin, end, 0.0); } void ampl::after_copying_data(std::vector::iterator begin, std::vector::iterator end) { _sum += std::accumulate(begin, end, 0.0); _dc = _sum/_data.size(); auto [min, max] = std::minmax_element(begin, end); auto ampl_iter = abs(*max - _dc) > abs(*min - _dc) ? max : min; std::set::iterator iter_remove_begin = std::lower_bound(_ampl_indexes.begin(), _ampl_indexes.end(), std::distance(_data.begin(), begin)); std::set::iterator iter_remove_end = std::lower_bound(_ampl_indexes.begin(), _ampl_indexes.end(), std::distance(_data.begin(), end)); _ampl_indexes.erase(iter_remove_begin, iter_remove_end); _ampl_indexes.insert(std::distance(_data.begin(), ampl_iter)); } void ampl::data_changed() { analog_value::data_changed(); if(_ampl_indexes.empty()) { _value = 0; return; } qreal ampl = abs(_data[*_ampl_indexes.begin()] - _dc); for(int it: _ampl_indexes) { qreal ampl_current = abs(_data[it] - _dc); if(ampl_current > ampl) ampl = ampl_current; } _value = ampl; emit value_changed(); } } }