From 3b969ac05868d40a9bee7281716b065ab2a94d2a Mon Sep 17 00:00:00 2001 From: f4exb Date: Thu, 30 Nov 2023 14:10:36 +0100 Subject: [PATCH] Scope: Added derivative of magnitude squared to the list of projections --- sdrbase/dsp/projector.cpp | 16 ++++++++++++++++ sdrbase/dsp/projector.h | 2 ++ sdrgui/gui/glscope.cpp | 1 + sdrgui/gui/glscopegui.cpp | 1 + 4 files changed, 20 insertions(+) diff --git a/sdrbase/dsp/projector.cpp b/sdrbase/dsp/projector.cpp index 820ae2ddb..e0845b80f 100644 --- a/sdrbase/dsp/projector.cpp +++ b/sdrbase/dsp/projector.cpp @@ -60,6 +60,15 @@ Real Projector::run(const Sample& s) v = re*re + im*im; } break; + case ProjectionDMagSq: + { + Real re = s.m_real / SDR_RX_SCALEF; + Real im = s.m_imag / SDR_RX_SCALEF; + Real curMagSq = re*re + im*im; + v = curMagSq - m_prevVal; + m_prevVal = curMagSq; + } + break; case ProjectionMagDB: { Real re = s.m_real / SDR_RX_SCALEF; @@ -235,6 +244,13 @@ Real Projector::run(const std::complex& s) case ProjectionMagSq: v = std::norm(s); break; + case ProjectionDMagSq: + { + Real curMagSq = std::norm(s); + v = curMagSq - m_prevVal; + m_prevVal = curMagSq; + } + break; case ProjectionMagDB: { Real magsq = std::norm(s); diff --git a/sdrbase/dsp/projector.h b/sdrbase/dsp/projector.h index d31bedb3d..cc5a58c7c 100644 --- a/sdrbase/dsp/projector.h +++ b/sdrbase/dsp/projector.h @@ -33,6 +33,7 @@ public: ProjectionImag, //!< Extract imaginary part ProjectionMagLin, //!< Calculate linear magnitude or modulus ProjectionMagSq, //!< Calculate linear squared magnitude or power + ProjectionDMagSq, //!< Calculate time derivative of linear squared magnitude or power ProjectionMagDB, //!< Calculate logarithmic (dB) of squared magnitude ProjectionPhase, //!< Calculate phase ProjectionDOAP, //!< Calculate ambiguous DOA from phase as phase difference (assuming positive) @@ -60,6 +61,7 @@ private: static Real normalizeAngle(Real angle); ProjectionType m_projectionType; Real m_prevArg; + Real m_prevVal; Real *m_cache; bool m_cacheMaster; }; diff --git a/sdrgui/gui/glscope.cpp b/sdrgui/gui/glscope.cpp index 04cdce1b6..d036f9cf5 100644 --- a/sdrgui/gui/glscope.cpp +++ b/sdrgui/gui/glscope.cpp @@ -1893,6 +1893,7 @@ void GLScope::setYScale(ScaleEngine &scale, uint32_t highlightedTraceIndex) break; case Projector::ProjectionMagLin: case Projector::ProjectionMagSq: + case Projector::ProjectionDMagSq: if (amp_range < 1e-9) { scale.setRange(Unit::None, amp_ofs * 1e12, amp_range * 1e12 + amp_ofs * 1e12); } else if (amp_range < 1e-6) { diff --git a/sdrgui/gui/glscopegui.cpp b/sdrgui/gui/glscopegui.cpp index 0e050472d..8d6aa7589 100644 --- a/sdrgui/gui/glscopegui.cpp +++ b/sdrgui/gui/glscopegui.cpp @@ -1315,6 +1315,7 @@ void GLScopeGUI::fillProjectionCombo(QComboBox* comboBox) comboBox->addItem("Imag", Projector::ProjectionImag); comboBox->addItem("Mag", Projector::ProjectionMagLin); comboBox->addItem("MagSq", Projector::ProjectionMagSq); + comboBox->addItem("dMagSq", Projector::ProjectionDMagSq); comboBox->addItem("MagdB", Projector::ProjectionMagDB); comboBox->addItem("Phi", Projector::ProjectionPhase); comboBox->addItem("DOAP", Projector::ProjectionDOAP);