163 lines
4.2 KiB
C++
163 lines
4.2 KiB
C++
|
#include "gtl_math_delta_phase_spec.h"
|
||
|
|
||
|
namespace gtl
|
||
|
{
|
||
|
namespace math
|
||
|
{
|
||
|
|
||
|
delta_phase_spec::delta_phase_spec(gtl::analog_data *ref, gtl::analog_data *data)
|
||
|
: _ref_spec(nullptr),
|
||
|
_data_spec(nullptr),
|
||
|
_phase(0),
|
||
|
_freq(0),
|
||
|
_max_freq(0)
|
||
|
{
|
||
|
_device = static_cast<gtl::device*>(data->root());
|
||
|
|
||
|
if(_device)
|
||
|
_device->lock_ai();
|
||
|
|
||
|
_ref_spec = new gtl::math::spec(gtl::math::spec::types::phase, ref);
|
||
|
_data_spec = new gtl::math::spec(gtl::math::spec::types::phase, data);
|
||
|
|
||
|
if(_device)
|
||
|
connect(_device, >l::device::recieved_data, this, &delta_phase_spec::calculate);
|
||
|
|
||
|
if(_device)
|
||
|
_device->unlock_ai();
|
||
|
|
||
|
connect(_ref_spec, >l::math::spec::resolution_changed, this, &delta_phase_spec::resolution_changed);
|
||
|
connect(_ref_spec, >l::math::spec::overlap_changed, this, &delta_phase_spec::overlap_changed);
|
||
|
}
|
||
|
|
||
|
delta_phase_spec::~delta_phase_spec()
|
||
|
{
|
||
|
delete _ref_spec;
|
||
|
delete _data_spec;
|
||
|
}
|
||
|
|
||
|
qreal delta_phase_spec::frequency() const
|
||
|
{
|
||
|
return _freq;
|
||
|
}
|
||
|
|
||
|
void delta_phase_spec::set_frequency(qreal value)
|
||
|
{
|
||
|
if(value != _freq && value > 0 && value < _ref_spec->frequency())
|
||
|
{
|
||
|
_freq = value;
|
||
|
|
||
|
if(!_max_freq)
|
||
|
{
|
||
|
if(_device)
|
||
|
_device->lock_ai();
|
||
|
|
||
|
_ref_spec->set_frequency(_freq*2);
|
||
|
_data_spec->set_frequency(_freq*2);
|
||
|
|
||
|
if(_device)
|
||
|
_device->unlock_ai();
|
||
|
}
|
||
|
|
||
|
emit frequency_changed();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
qreal delta_phase_spec::max_frequency() const
|
||
|
{
|
||
|
return _max_freq;
|
||
|
}
|
||
|
|
||
|
void delta_phase_spec::set_max_frequency(qreal value)
|
||
|
{
|
||
|
if(value != _max_freq && value >= 0)
|
||
|
{
|
||
|
_max_freq = value;
|
||
|
|
||
|
qreal max_freq = _max_freq ? _max_freq : _freq*2;
|
||
|
|
||
|
if(_device)
|
||
|
_device->lock_ai();
|
||
|
|
||
|
_ref_spec->set_frequency(max_freq);
|
||
|
_data_spec->set_frequency(max_freq);
|
||
|
|
||
|
if(_device)
|
||
|
_device->unlock_ai();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
qreal delta_phase_spec::resolution() const
|
||
|
{
|
||
|
return _ref_spec->resolution();
|
||
|
}
|
||
|
|
||
|
void delta_phase_spec::set_resolution(qreal value)
|
||
|
{
|
||
|
if(_device)
|
||
|
_device->lock_ai();
|
||
|
|
||
|
_ref_spec->set_resolution(value);
|
||
|
_data_spec->set_resolution(value);
|
||
|
|
||
|
if(_device)
|
||
|
_device->unlock_ai();
|
||
|
}
|
||
|
|
||
|
qreal delta_phase_spec::overlap() const
|
||
|
{
|
||
|
return _ref_spec->overlap();
|
||
|
}
|
||
|
|
||
|
void delta_phase_spec::set_overlap(int value)
|
||
|
{
|
||
|
if(_device)
|
||
|
_device->lock_ai();
|
||
|
|
||
|
_ref_spec->set_overlap(value);
|
||
|
_data_spec->set_overlap(value);
|
||
|
|
||
|
if(_device)
|
||
|
_device->unlock_ai();
|
||
|
}
|
||
|
|
||
|
qreal delta_phase_spec::value()
|
||
|
{
|
||
|
return _phase;
|
||
|
}
|
||
|
|
||
|
void delta_phase_spec::calculate()
|
||
|
{
|
||
|
if(_ref_spec->samples() != _data_spec->samples())
|
||
|
return;
|
||
|
|
||
|
if(_device)
|
||
|
_device->lock_ai();
|
||
|
|
||
|
if(_freq)
|
||
|
{
|
||
|
qreal phase = 0;
|
||
|
int idx = std::round(_freq/_ref_spec->resolution());
|
||
|
|
||
|
if(idx < _ref_spec->size() && idx < _data_spec->size())
|
||
|
phase = _data_spec->at(idx) - _ref_spec->at(idx);
|
||
|
else
|
||
|
return;
|
||
|
|
||
|
phase = 180*phase/M_PI;
|
||
|
if(phase < 0)
|
||
|
phase += 360.;
|
||
|
// if(phase >= 180.)
|
||
|
// phase = 360. - phase;
|
||
|
|
||
|
_phase = phase;
|
||
|
emit value_changed();
|
||
|
}
|
||
|
|
||
|
if(_device)
|
||
|
_device->unlock_ai();
|
||
|
}
|
||
|
|
||
|
} // namespace math
|
||
|
} // namespace gtl
|