diff --git a/plugins/channelrx/demodatv/atvdemod.cpp b/plugins/channelrx/demodatv/atvdemod.cpp index c72bf8328..81bc6557e 100644 --- a/plugins/channelrx/demodatv/atvdemod.cpp +++ b/plugins/channelrx/demodatv/atvdemod.cpp @@ -193,13 +193,13 @@ void ATVDemod::feed(const SampleVector::const_iterator& begin, const SampleVecto #endif Complex c(fltI, fltQ); + if (m_objRFRunning.m_intFrequencyOffset != 0) + { + c *= m_nco.nextIQ(); + } + if (m_objRFRunning.m_blndecimatorEnable) { - if (m_objRFRunning.m_intFrequencyOffset != 0) - { - c *= m_nco.nextIQ(); - } - if (m_interpolator.decimate(&m_interpolatorDistanceRemain, c, &ci)) { demod(ci); @@ -231,10 +231,28 @@ void ATVDemod::demod(Complex& c) float fltVal; int intVal; + //********** FFT filtering ********** + + if (m_objRFRunning.m_blnFFTFiltering) + { + int n_out; + fftfilt::cmplx *filtered; + + n_out = m_DSBFilter->runAsym(c, &filtered, m_objRFRunning.m_enmModulation != ATV_VAML); // all usb except explicitely lsb + + if (n_out > 0) + { + memcpy((void *) m_DSBFilterBuffer, (const void *) filtered, n_out*sizeof(Complex)); + m_DSBFilterBufferIndex = 0; + } + + m_DSBFilterBufferIndex++; + } + //********** demodulation ********** - float& fltI = c.real(); - float& fltQ = c.imag(); + float& fltI = m_objRFRunning.m_blnFFTFiltering ? m_DSBFilterBuffer[m_DSBFilterBufferIndex-1].real() : c.real(); + float& fltQ = m_objRFRunning.m_blnFFTFiltering ? m_DSBFilterBuffer[m_DSBFilterBufferIndex-1].imag() : c.imag(); double magSq = fltI*fltI + fltQ*fltQ; m_objMagSqAverage.feed(magSq); @@ -647,6 +665,19 @@ void ATVDemod::applySettings() getOutputMessageQueue()->push(report); } + if ((m_objConfigPrivate.m_intTVSampleRate != m_objRunningPrivate.m_intTVSampleRate) + || (m_objRFConfig.m_fltRFBandwidth != m_objRFRunning.m_fltRFBandwidth) + || (m_objRFConfig.m_fltRFOppBandwidth != m_objRFRunning.m_fltRFOppBandwidth)) + { + m_objSettingsMutex.lock(); + m_DSBFilter->create_asym_filter(m_objRFConfig.m_fltRFOppBandwidth / m_objConfigPrivate.m_intTVSampleRate, + m_objRFConfig.m_fltRFBandwidth / m_objConfigPrivate.m_intTVSampleRate); + memset(m_DSBFilterBuffer, 0, sizeof(Complex)*(m_ssbFftLen)); + m_DSBFilterBufferIndex = 0; + m_objSettingsMutex.unlock(); + } + + m_objRunning = m_objConfig; m_objRFRunning = m_objRFConfig; m_objRunningPrivate = m_objConfigPrivate; diff --git a/plugins/channelrx/demodatv/atvdemodgui.cpp b/plugins/channelrx/demodatv/atvdemodgui.cpp index 0b86924a1..4b9375ede 100644 --- a/plugins/channelrx/demodatv/atvdemodgui.cpp +++ b/plugins/channelrx/demodatv/atvdemodgui.cpp @@ -186,7 +186,9 @@ bool ATVDemodGUI::handleMessage(const Message& objMessage) void ATVDemodGUI::viewChanged() { + qDebug("ATVDemodGUI::viewChanged"); applySettings(); + applyRFSettings(); } void ATVDemodGUI::channelSampleRateChanged() diff --git a/plugins/channelrx/demodatv/atvdemodgui.ui b/plugins/channelrx/demodatv/atvdemodgui.ui index 85e9d13a3..9513fb0b1 100644 --- a/plugins/channelrx/demodatv/atvdemodgui.ui +++ b/plugins/channelrx/demodatv/atvdemodgui.ui @@ -54,6 +54,9 @@ + + Toggle decimator on/off + @@ -70,6 +73,9 @@ + + Channel center frequency shift direction + @@ -104,6 +110,9 @@ 12 + + Channel center frequency shift + @@ -123,6 +132,9 @@ 0 + + Effective channel sample rate (kS/s) + 00000k @@ -184,6 +196,9 @@ 0 + + Channel power + -100.0 dB @@ -238,6 +253,9 @@ + + Asymmetrical filter opposite band cutoff + Qt::RightToLeft @@ -257,6 +275,9 @@ + + Asymmetrical filter in band cutoff / Decimator filter cutoff + 1