diff --git a/plugins/channelrx/chanalyzerng/chanalyzerng.cpp b/plugins/channelrx/chanalyzerng/chanalyzerng.cpp index 95c2cfcaa..0cb8a928e 100644 --- a/plugins/channelrx/chanalyzerng/chanalyzerng.cpp +++ b/plugins/channelrx/chanalyzerng/chanalyzerng.cpp @@ -148,8 +148,7 @@ void ChannelAnalyzerNG::processOneSample(Complex& c, fftfilt::cmplx *sideband) Real re = m_sum.real() / SDR_RX_SCALED; Real im = m_sum.imag() / SDR_RX_SCALED; m_magsq = re*re + im*im; - Real mixI = 1.0f; - Real mixQ = 0.0f; + std::complex mix; if (m_settings.m_pll) { @@ -157,40 +156,17 @@ void ChannelAnalyzerNG::processOneSample(Complex& c, fftfilt::cmplx *sideband) { m_fll.feed(re, im); // Use -fPLL to mix (exchange PLL real and image in the complex multiplication) - mixI = m_sum.real() * m_fll.getImag() - m_sum.imag() * m_fll.getReal(); - mixQ = m_sum.real() * m_fll.getReal() + m_sum.imag() * m_fll.getImag(); -// mixI = m_fll.getReal() * SDR_RX_SCALED; -// mixQ = m_fll.getImag() * SDR_RX_SCALED; + mix = m_sum * std::conj(m_fll.getComplex()); } else { m_pll.feed(re, im); // Use -fPLL to mix (exchange PLL real and image in the complex multiplication) - mixI = m_sum.real() * m_pll.getImag() - m_sum.imag() * m_pll.getReal(); - mixQ = m_sum.real() * m_pll.getReal() + m_sum.imag() * m_pll.getImag(); - } - - if (m_settings.m_ssb & !m_usb) - { // invert spectrum for LSB - m_sampleBuffer.push_back(Sample(mixQ, mixI)); - } - else - { - m_sampleBuffer.push_back(Sample(mixI, mixQ)); - } - } - else - { - if (m_settings.m_ssb & !m_usb) - { // invert spectrum for LSB - m_sampleBuffer.push_back(Sample(m_sum.imag(), m_sum.real())); - } - else - { - m_sampleBuffer.push_back(Sample(m_sum.real(), m_sum.imag())); + mix = m_sum * std::conj(m_pll.getComplex()); } } + feedOneSample(m_settings.m_pll ? mix : m_sum, m_settings.m_fll ? m_fll.getComplex() : m_pll.getComplex()); m_sum = 0; } } diff --git a/plugins/channelrx/chanalyzerng/chanalyzerng.h b/plugins/channelrx/chanalyzerng/chanalyzerng.h index 8b326bdd1..f4afa6bda 100644 --- a/plugins/channelrx/chanalyzerng/chanalyzerng.h +++ b/plugins/channelrx/chanalyzerng/chanalyzerng.h @@ -240,6 +240,32 @@ private: void applySettings(const ChannelAnalyzerNGSettings& settings, bool force = false); void setFilters(int sampleRate, float bandwidth, float lowCutoff); void processOneSample(Complex& c, fftfilt::cmplx *sideband); + + inline void feedOneSample(const fftfilt::cmplx& s, const fftfilt::cmplx& pll) + { + switch (m_settings.m_inputType) + { + case ChannelAnalyzerNGSettings::InputPLL: + { + if (m_settings.m_ssb & !m_usb) { // invert spectrum for LSB + m_sampleBuffer.push_back(Sample(pll.imag(), pll.real())); + } else { + m_sampleBuffer.push_back(Sample(pll.real(), pll.imag())); + } + } + break; + case ChannelAnalyzerNGSettings::InputSignal: + default: + { + if (m_settings.m_ssb & !m_usb) { // invert spectrum for LSB + m_sampleBuffer.push_back(Sample(s.imag(), s.real())); + } else { + m_sampleBuffer.push_back(Sample(s.real(), s.imag())); + } + } + break; + } + } }; #endif // INCLUDE_CHANALYZERNG_H diff --git a/plugins/channelrx/chanalyzerng/chanalyzerngsettings.cpp b/plugins/channelrx/chanalyzerng/chanalyzerngsettings.cpp index c282220f1..0cf60f4d1 100644 --- a/plugins/channelrx/chanalyzerng/chanalyzerngsettings.cpp +++ b/plugins/channelrx/chanalyzerng/chanalyzerngsettings.cpp @@ -41,6 +41,7 @@ void ChannelAnalyzerNGSettings::resetToDefaults() m_pll = false; m_fll = false; m_pllPskOrder = 1; + m_inputType = InputSignal; m_rgbColor = QColor(128, 128, 128).rgb(); } @@ -61,6 +62,7 @@ QByteArray ChannelAnalyzerNGSettings::serialize() const s.writeBool(11, m_pll); s.writeBool(12, m_fll); s.writeU32(13, m_pllPskOrder); + s.writeS32(14, (int) m_inputType); return s.final(); } @@ -78,6 +80,7 @@ bool ChannelAnalyzerNGSettings::deserialize(const QByteArray& data) if(d.getVersion() == 1) { QByteArray bytetmp; + int tmp; d.readS32(1, &m_frequency, 0); d.readS32(2, &m_bandwidth, 5000); @@ -102,6 +105,8 @@ bool ChannelAnalyzerNGSettings::deserialize(const QByteArray& data) d.readBool(11, &m_pll, false); d.readBool(12, &m_fll, false); d.readU32(13, &m_pllPskOrder, 1); + d.readS32(14, &tmp, 0); + m_inputType = (InputType) tmp; return true; } diff --git a/plugins/channelrx/chanalyzerng/chanalyzerngsettings.h b/plugins/channelrx/chanalyzerng/chanalyzerngsettings.h index a030ba943..55a9ff42d 100644 --- a/plugins/channelrx/chanalyzerng/chanalyzerngsettings.h +++ b/plugins/channelrx/chanalyzerng/chanalyzerngsettings.h @@ -23,6 +23,13 @@ class Serializable; struct ChannelAnalyzerNGSettings { + enum InputType + { + InputSignal, + InputPLL, + InputAutoCorr + }; + int m_frequency; bool m_downSample; quint32 m_downSampleRate; @@ -33,6 +40,7 @@ struct ChannelAnalyzerNGSettings bool m_pll; bool m_fll; unsigned int m_pllPskOrder; + InputType m_inputType; quint32 m_rgbColor; QString m_title; Serializable *m_channelMarker;