diff --git a/plugins/channelrx/demodnfm/nfmdemod.cpp b/plugins/channelrx/demodnfm/nfmdemod.cpp index 2f0326078..1d583f041 100644 --- a/plugins/channelrx/demodnfm/nfmdemod.cpp +++ b/plugins/channelrx/demodnfm/nfmdemod.cpp @@ -150,9 +150,13 @@ void NFMDemod::feed(const SampleVector::const_iterator& begin, const SampleVecto qint16 sample; - m_AGC.feed(ci); + //m_AGC.feed(ci); + + //double magsqRaw = m_AGC.getMagSq(); + long double magsqRaw; // = ci.real()*ci.real() + c.imag()*c.imag(); + + Real demod = m_phaseDiscri.phaseDiscriminator3(ci, magsqRaw); - double magsqRaw = m_AGC.getMagSq(); Real magsq = magsqRaw / (1<<30); m_movingAverage.feed(magsq); m_magsqSum += magsq; @@ -164,8 +168,6 @@ void NFMDemod::feed(const SampleVector::const_iterator& begin, const SampleVecto m_magsqCount++; - Real demod = m_phaseDiscri.phaseDiscriminator2(ci); - //m_m2Sample = m_m1Sample; //m_m1Sample = ci; m_sampleCount++; diff --git a/plugins/channelrx/demodnfm/nfmplugin.cpp b/plugins/channelrx/demodnfm/nfmplugin.cpp index 8252fbe52..19076811f 100644 --- a/plugins/channelrx/demodnfm/nfmplugin.cpp +++ b/plugins/channelrx/demodnfm/nfmplugin.cpp @@ -7,7 +7,7 @@ const PluginDescriptor NFMPlugin::m_pluginDescriptor = { QString("NFM Demodulator"), - QString("3.1.1"), + QString("3.2.0"), QString("(c) Edouard Griffiths, F4EXB"), QString("https://github.com/f4exb/sdrangel"), true, diff --git a/sdrbase/dsp/phasediscri.h b/sdrbase/dsp/phasediscri.h index 7078f0859..fba979973 100644 --- a/sdrbase/dsp/phasediscri.h +++ b/sdrbase/dsp/phasediscri.h @@ -70,10 +70,47 @@ public: return (h1 - h2) * m_fmScaling; } + /** + * Second alternative + */ + Real phaseDiscriminator3(const Complex& sample, long double& magsq) + { + Real fltI = sample.real(); + Real fltQ = sample.imag(); + double fltNorm; + Real fltNormI; + Real fltNormQ; + Real fltVal; + + magsq = fltI*fltI + fltQ*fltQ; + fltNorm = std::sqrt(magsq); + + fltNormI= fltI/fltNorm; + fltNormQ= fltQ/fltNorm; + + fltVal = m_fltPreviousI*(fltNormQ - m_fltPreviousQ2); + fltVal -= m_fltPreviousQ*(fltNormI - m_fltPreviousI2); + fltVal += 2.0f; + fltVal /= 2.0f; // normally it is /4 + + m_fltPreviousQ2 = m_fltPreviousQ; + m_fltPreviousI2 = m_fltPreviousI; + + m_fltPreviousQ = fltNormQ; + m_fltPreviousI = fltNormI; + + return fltVal * m_fmScaling; + } + private: Complex m_m1Sample; Complex m_m2Sample; Real m_fmScaling; + Real m_fltPreviousI; + Real m_fltPreviousQ; + Real m_fltPreviousI2; + Real m_fltPreviousQ2; + }; #endif /* INCLUDE_DSP_PHASEDISCRI_H_ */