From 1c7bab1762a77a6f9998f77cfd44505b07d032ad Mon Sep 17 00:00:00 2001 From: f4exb Date: Wed, 4 Nov 2015 04:29:26 +0100 Subject: [PATCH] GLScope: trigger on phase derivative (instantaneous frequebcy) --- include/dsp/scopevis.h | 5 +++- sdrbase/dsp/scopevis.cpp | 51 +++++++++++++++++++++++++++++++++------ sdrbase/gui/glscope.cpp | 5 ++-- sdrbase/gui/glscopegui.ui | 5 ++++ 4 files changed, 55 insertions(+), 11 deletions(-) diff --git a/include/dsp/scopevis.h b/include/dsp/scopevis.h index 6a8c28fc4..2ea9348e7 100644 --- a/include/dsp/scopevis.h +++ b/include/dsp/scopevis.h @@ -17,7 +17,8 @@ public: TriggerChannelQ, TriggerMagLin, TriggerMagDb, - TriggerPhase + TriggerPhase, + TriggerDPhase }; static const uint m_traceChunkSize; @@ -149,6 +150,8 @@ private: uint m_triggerDelayCount; //!< trace sizes delay counter int m_sampleRate; SampleVector::const_iterator m_triggerPoint; + Real m_prevArg; + bool m_firstArg; bool triggerCondition(SampleVector::const_iterator& it); bool nextTrigger(); //!< move to next trigger. Returns true if next trigger is active. diff --git a/sdrbase/dsp/scopevis.cpp b/sdrbase/dsp/scopevis.cpp index 65542f92f..c4324c14d 100644 --- a/sdrbase/dsp/scopevis.cpp +++ b/sdrbase/dsp/scopevis.cpp @@ -21,7 +21,9 @@ ScopeVis::ScopeVis(GLScope* glScope) : m_triggerDelayCount(0), m_triggerOneShot(false), m_armed(false), - m_sampleRate(0) + m_sampleRate(0), + m_prevArg(0.0), + m_firstArg(true) { setObjectName("ScopeVis"); m_trace.reserve(100*m_traceChunkSize); @@ -276,6 +278,11 @@ bool ScopeVis::handleMessage(const Message& message) m_triggerBothEdges[index] = conf.getTriggerBothEdges(); m_triggerPre = conf.getTriggerPre(); + if (m_triggerChannel[index] == TriggerDPhase) + { + m_firstArg = true; + } + if (m_triggerPre >= m_traceback.size()) { m_triggerPre = m_traceback.size() - 1; // top sample in FIFO is always the triggering one (pre-trigger delay = 0) @@ -322,28 +329,56 @@ bool ScopeVis::triggerCondition(SampleVector::const_iterator& it) Complex c(it->real()/32768.0f, it->imag()/32768.0f); m_traceback.push_back(c); // store into trace memory FIFO - if (m_tracebackCount < m_traceback.size()) { // increment count up to trace memory size + if (m_tracebackCount < m_traceback.size()) + { // increment count up to trace memory size m_tracebackCount++; } - if (m_triggerChannel[m_triggerIndex] == TriggerChannelI) { + if (m_triggerChannel[m_triggerIndex] == TriggerChannelI) + { return c.real() > m_triggerLevel[m_triggerIndex]; } - else if (m_triggerChannel[m_triggerIndex] == TriggerChannelQ) { + else if (m_triggerChannel[m_triggerIndex] == TriggerChannelQ) + { return c.imag() > m_triggerLevel[m_triggerIndex]; } - else if (m_triggerChannel[m_triggerIndex] == TriggerMagLin) { + else if (m_triggerChannel[m_triggerIndex] == TriggerMagLin) + { return abs(c) > m_triggerLevel[m_triggerIndex]; } - else if (m_triggerChannel[m_triggerIndex] == TriggerMagDb) { + else if (m_triggerChannel[m_triggerIndex] == TriggerMagDb) + { Real mult = (10.0f / log2f(10.0f)); Real v = c.real() * c.real() + c.imag() * c.imag(); return mult * log2f(v) > m_triggerLevel[m_triggerIndex]; } - else if (m_triggerChannel[m_triggerIndex] == TriggerPhase) { + else if (m_triggerChannel[m_triggerIndex] == TriggerPhase) + { return arg(c) / M_PI > m_triggerLevel[m_triggerIndex]; } - else { + else if (m_triggerChannel[m_triggerIndex] == TriggerDPhase) + { + Real curArg = arg(c) - m_prevArg; + m_prevArg = arg(c); + + if (curArg < -M_PI) { + curArg += 2.0 * M_PI; + } else if (curArg > M_PI) { + curArg -= 2.0 * M_PI; + } + + if (m_firstArg) + { + m_firstArg = false; + return false; + } + else + { + return curArg / M_PI > m_triggerLevel[m_triggerIndex]; + } + } + else + { return false; } } diff --git a/sdrbase/gui/glscope.cpp b/sdrbase/gui/glscope.cpp index 40101e64c..27c0dd48a 100644 --- a/sdrbase/gui/glscope.cpp +++ b/sdrbase/gui/glscope.cpp @@ -546,7 +546,7 @@ void GLScope::paintGL() glPopMatrix(); // paint trigger level #2 - if ((m_triggerChannel == ScopeVis::TriggerPhase) || (m_triggerChannel == ScopeVis::TriggerChannelQ)) + if ((m_triggerChannel == ScopeVis::TriggerPhase) || (m_triggerChannel == ScopeVis::TriggerDPhase) || (m_triggerChannel == ScopeVis::TriggerChannelQ)) { glPushMatrix(); glTranslatef(m_glScopeRect2.x(), m_glScopeRect2.y() + m_glScopeRect2.height() / 2.0, 0); @@ -562,7 +562,8 @@ void GLScope::paintGL() float negLimit = -1.0 / m_amp2; if ((m_triggerChannel == ScopeVis::TriggerChannelQ) - || (m_triggerChannel == ScopeVis::TriggerPhase)) + || (m_triggerChannel == ScopeVis::TriggerPhase) + || (m_triggerChannel == ScopeVis::TriggerDPhase)) { if ((m_triggerLevelDis2 > negLimit) && (m_triggerLevelDis2 < posLimit)) { diff --git a/sdrbase/gui/glscopegui.ui b/sdrbase/gui/glscopegui.ui index 1e550dd05..f0078b242 100644 --- a/sdrbase/gui/glscopegui.ui +++ b/sdrbase/gui/glscopegui.ui @@ -828,6 +828,11 @@ Phi + + + dPhi + +