From 023915c1449ff1839429eed1bf104fa2903d7633 Mon Sep 17 00:00:00 2001 From: f4exb Date: Wed, 27 Jul 2022 18:53:40 +0200 Subject: [PATCH] M17: DataCarrierDetect and SlidingDFT code cleanup --- modemm17/DataCarrierDetect.h | 16 +++++---- modemm17/SlidingDFT.h | 70 +++++++++++++++++------------------- 2 files changed, 42 insertions(+), 44 deletions(-) diff --git a/modemm17/DataCarrierDetect.h b/modemm17/DataCarrierDetect.h index 411d99b47..bca698bbd 100644 --- a/modemm17/DataCarrierDetect.h +++ b/modemm17/DataCarrierDetect.h @@ -28,10 +28,7 @@ namespace modemm17 { template struct DataCarrierDetect { - using ComplexType = std::complex; - using NDFT = NSlidingDFT; - - NDFT dft_; + NSlidingDFT dft_; float ltrigger_; float htrigger_; float level_1 = 0.0; @@ -40,9 +37,14 @@ struct DataCarrierDetect bool triggered_ = false; DataCarrierDetect( - size_t freq1, size_t freq2, - float ltrigger = 2.0, float htrigger = 5.0) - : dft_({freq1, freq2}), ltrigger_(ltrigger), htrigger_(htrigger) + size_t freq1, + size_t freq2, + float ltrigger = 2.0, + float htrigger = 5.0 + ) : + dft_({freq1, freq2}), + ltrigger_(ltrigger), + htrigger_(htrigger) { } diff --git a/modemm17/SlidingDFT.h b/modemm17/SlidingDFT.h index 534683efc..9c6118e4c 100644 --- a/modemm17/SlidingDFT.h +++ b/modemm17/SlidingDFT.h @@ -20,23 +20,14 @@ namespace modemm17 template class SlidingDFT { +public: using ComplexType = std::complex; - static constexpr size_t N = SampleRate / Accuracy; - static constexpr float pi2 = M_PI * 2.0; - static constexpr float kth = float(Frequency) / float(SampleRate); - - // We'd like this to be static constexpr, but std::exp is not a constexpr. - ComplexType coeff_; - std::array samples_; - ComplexType result_{0,0}; - size_t index_ = 0; - size_t prev_index_ = N - 1; - -public: SlidingDFT() { samples_.fill(0); + float pi2 = M_PI * 2.0f; + float kth = float(Frequency) / float(SampleRate); coeff_ = std::exp(-ComplexType{0, 1} * pi2 * kth); } @@ -44,7 +35,7 @@ public: { auto index = index_; index_ += 1; - if (index_ == N) index_ = 0; + if (index_ == (SampleRate / Accuracy)) index_ = 0; float delta = sample - samples_[index]; ComplexType result = (result_ + delta) * coeff_; @@ -53,6 +44,13 @@ public: prev_index_ = index; return result; } + +private: + ComplexType coeff_; + std::array samples_; + ComplexType result_{0,0}; + size_t index_ = 0; + size_t prev_index_ = (SampleRate / Accuracy) - 1; }; /** @@ -70,31 +68,8 @@ public: template class NSlidingDFT { - using ComplexType = std::complex; - - static constexpr float pi2 = M_PI * 2.0; - - // We'd like this to be static constexpr, but std::exp is not a constexpr. - const std::array coeff_; - std::array samples_; - std::array result_{0,0}; - size_t index_ = 0; - size_t prev_index_ = N - 1; - - static constexpr std::array - make_coefficients(const std::array& frequencies) - { - ComplexType j = ComplexType{0, 1}; - std::array result; - for (size_t i = 0; i != K; ++i) - { - float k = float(frequencies[i]) / float(SampleRate); - result[i] = std::exp(-j * pi2 * k); - } - return result; - } - public: + using ComplexType = std::complex; using result_type = std::array; /** @@ -130,6 +105,27 @@ public: samples_[index] = sample; return result_; } + +private: + const std::array coeff_; + std::array samples_; + std::array result_{0,0}; + size_t index_ = 0; + size_t prev_index_ = N - 1; + + static constexpr std::array + make_coefficients(const std::array& frequencies) + { + ComplexType j = ComplexType{0, 1}; + std::array result; + float pi2 = M_PI * 2.0f; + for (size_t i = 0; i != K; ++i) + { + float k = float(frequencies[i]) / float(SampleRate); + result[i] = std::exp(-j * pi2 * k); + } + return result; + } }; } // modemm17