CosinusProvider.cpp
87 lines
| 2.7 KiB
| text/x-c
|
CppLexer
|
r128 | #include "CosinusProvider.h" | ||
|
r782 | #include "MockDefs.h" | ||
|
r128 | |||
#include <Data/DataProviderParameters.h> | ||||
r1423 | #include <Data/ScalarTimeSerie.h> | |||
#include <Data/SpectrogramTimeSerie.h> | ||||
#include <Data/VectorTimeSerie.h> | ||||
|
r128 | |||
r135 | #include <cmath> | |||
|
r922 | #include <set> | ||
r135 | ||||
r428 | #include <QFuture> | |||
r364 | #include <QThread> | |||
r428 | #include <QtConcurrent/QtConcurrent> | |||
r298 | ||||
r231 | ||||
r1423 | namespace | |||
{ | ||||
|
r784 | |||
|
r895 | /// Number of bands generated for a spectrogram | ||
const auto SPECTROGRAM_NUMBER_BANDS = 30; | ||||
|
r922 | /// Bands for which to generate NaN values for a spectrogram | ||
r1423 | const auto SPECTROGRAM_NAN_BANDS = std::set<int> { 1, 3, 10, 20 }; | |||
|
r922 | |||
/// Bands for which to generate zeros for a spectrogram | ||||
r1423 | const auto SPECTROGRAM_ZERO_BANDS = std::set<int> { 2, 15, 19, 29 }; | |||
|
r785 | |||
|
r786 | |||
|
r784 | } // namespace | ||
|
r712 | std::shared_ptr<IDataProvider> CosinusProvider::clone() const | ||
{ | ||||
// No copy is made in clone | ||||
return std::make_shared<CosinusProvider>(); | ||||
} | ||||
r1423 | TimeSeries::ITimeSerie* CosinusProvider::_generate( | |||
const DateTimeRange& range, const QVariantHash& metaData) | ||||
r1350 | { | |||
// Retrieves cosinus type | ||||
auto typeVariant = metaData.value(COSINUS_TYPE_KEY, COSINUS_TYPE_DEFAULT_VALUE); | ||||
auto freqVariant = metaData.value(COSINUS_FREQUENCY_KEY, COSINUS_FREQUENCY_DEFAULT_VALUE); | ||||
r1423 | const auto fs = 200.; | |||
r1350 | double freq = freqVariant.toDouble(); | |||
double start = std::ceil(range.m_TStart * freq); | ||||
double end = std::floor(range.m_TEnd * freq); | ||||
r1423 | if (end < start) | |||
{ | ||||
r1350 | std::swap(start, end); | |||
} | ||||
std::size_t dataCount = static_cast<std::size_t>(end - start + 1); | ||||
r1423 | if (typeVariant.toString() == QStringLiteral("scalar")) | |||
r1350 | { | |||
r1423 | auto ts = new ScalarTimeSerie(dataCount); | |||
std::generate( | ||||
std::begin(*ts), std::end(*ts), [range, freq, fs, dt = 1. / freq, i = 0.]() mutable { | ||||
auto t = range.m_TStart + i * dt; | ||||
i++; | ||||
return std::pair<double, double> { t, std::cos(2 * 3.14 * freq / fs * t) }; | ||||
}); | ||||
return ts; | ||||
r1350 | } | |||
r1423 | if (typeVariant.toString() == QStringLiteral("vector")) | |||
{ | ||||
auto ts = new VectorTimeSerie(dataCount); | ||||
std::generate( | ||||
std::begin(*ts), std::end(*ts), [range, freq, fs, dt = 1. / freq, i = 0.]() mutable { | ||||
auto t = range.m_TStart + i * dt; | ||||
i++; | ||||
return std::pair<double, VectorTimeSerie::raw_value_type> { t, | ||||
{ std::cos(2 * 3.14 * freq / fs * t), std::sin(2 * 3.14 * freq / fs * t), | ||||
std::cos(2 * 3.14 * freq / fs * t) * std::sin(2 * 3.14 * freq / fs * t) } }; | ||||
}); | ||||
return ts; | ||||
} | ||||
if (typeVariant.toString() == QStringLiteral("spectrogram")) | ||||
{ | ||||
return nullptr; | ||||
} | ||||
return nullptr; | ||||
|
r128 | } | ||
|
r310 | |||
r1423 | TimeSeries::ITimeSerie* CosinusProvider::getData(const DataProviderParameters& parameters) | |||
r1350 | { | |||
r1352 | return _generate(parameters.m_Range, parameters.m_Data); | |||
r1350 | } | |||