test_sdk/math/gtl_math_delta_phase.h

104 lines
3.1 KiB
C
Raw Normal View History

#ifndef GTL_MATH_DELTA_PHASE_H
#define GTL_MATH_DELTA_PHASE_H
#include <QObject>
#include <QDateTime>
#include "gtl_math_analog_value.h"
#include "math_global.h"
#include "core/gtl_analog_data.h"
#include "gtl_math_freq.h"
namespace gtl {
namespace math {
class last_front : public analog_value
{
Q_OBJECT
public:
last_front(gtl::analog_data *data)
: analog_value(data)
, _front(-1)
, _freq(100)
{
}
int front(){return _front;}
void set_freq(qreal value)
{
if(value != _freq && value > 0)
{
_freq = value;
analog_value::set_time(1.1/_freq);
_front = -1;
}
}
qreal freq(){return _freq;}
virtual void set_time(qreal value) override{ analog_value::set_time(value); }
private:
virtual void before_copying_data(std::vector<qreal>::iterator begin, std::vector<qreal>::iterator end) override{}
virtual void after_copying_data(std::vector<qreal>::iterator begin, std::vector<qreal>::iterator end) override{}
protected slots:
virtual void data_changed() override
{
_ad->lock_device();
if(_ad->size() >= _data.size())
{
std::copy(_ad->end() - _data.size(), _ad->end(), _data.begin());
}
else
{
int dif = _data.size() - _ad->size();
std::copy(_data.end() - dif, _data.end(), _data.begin());
std::copy(_ad->begin(), _ad->end(), _data.begin() + dif);
}
_ad->unlock_device();
qreal dc = 0;//std::accumulate(_data.begin(), _data.end(), 0.0)/_data.size();
for(int i = _data.size() - 1; i > 0; --i)
{
if(_data[i] >= dc && _data[i-1] < dc)
{
_front = _data.size() - i;
break;
}
}
}
private:
int _front;
qreal _freq;
};
class MATH_EXPORT delta_phase : public last_front
{
Q_OBJECT
public:
delta_phase(gtl::analog_data *ref, gtl::analog_data *data);
~delta_phase();
virtual void set_time(qreal value) override;
private:
last_front* _ref = NULL;
last_front* _data = NULL;
gtl::math::freq *_freq = NULL;
private:
virtual void before_copying_data(std::vector<qreal>::iterator begin, std::vector<qreal>::iterator end) override;
virtual void after_copying_data(std::vector<qreal>::iterator begin, std::vector<qreal>::iterator end) override;
protected slots:
virtual void data_changed() override;
};
} // namespace math
} // namespace gtl
#endif // GTL_MATH_DELTA_PHASE_H