diff --git a/plugins/channelrx/demodssb/ssbdemodsink.cpp b/plugins/channelrx/demodssb/ssbdemodsink.cpp index 4b32e0b56..7b1c453a2 100644 --- a/plugins/channelrx/demodssb/ssbdemodsink.cpp +++ b/plugins/channelrx/demodssb/ssbdemodsink.cpp @@ -82,6 +82,9 @@ SSBDemodSink::SSBDemodSink() : SSBFilter = new fftfilt(m_LowCutoff / m_audioSampleRate, m_Bandwidth / m_audioSampleRate, m_ssbFftLen); DSBFilter = new fftfilt((2.0f * m_Bandwidth) / m_audioSampleRate, 2 * m_ssbFftLen); + m_lowpassI.create(101, m_audioSampleRate, m_Bandwidth * 1.2); + m_lowpassQ.create(101, m_audioSampleRate, m_Bandwidth * 1.2); + applyChannelSettings(m_channelSampleRate, m_channelFrequencyOffset, true); applySettings(m_settings, true); } @@ -201,7 +204,9 @@ void SSBDemodSink::processOneSample(Complex &ci) else { // fftfilt::cmplx z = m_agcActive ? delayedSample * m_agc.getStepValue() : delayedSample; - fftfilt::cmplx& z = delayedSample; + fftfilt::cmplx z = (m_agcActive && m_agcClamping) ? + fftfilt::cmplx{m_lowpassI.filter(delayedSample.real()), m_lowpassQ.filter(delayedSample.imag())} + : delayedSample; if (m_audioBinaual) { @@ -318,6 +323,9 @@ void SSBDemodSink::applyAudioSampleRate(int sampleRate) SSBFilter->create_filter(m_LowCutoff / (float) sampleRate, m_Bandwidth / (float) sampleRate, m_settings.m_filterBank[m_settings.m_filterIndex].m_fftWindow); DSBFilter->create_dsb_filter(m_Bandwidth / (float) sampleRate, m_settings.m_filterBank[m_settings.m_filterIndex].m_fftWindow); + m_lowpassI.create(101, sampleRate, m_Bandwidth * 1.2); + m_lowpassQ.create(101, sampleRate, m_Bandwidth * 1.2); + int agcNbSamples = (sampleRate / 1000) * (1<create_filter(m_LowCutoff / (float) m_audioSampleRate, m_Bandwidth / (float) m_audioSampleRate, settings.m_filterBank[settings.m_filterIndex].m_fftWindow); DSBFilter->create_dsb_filter(m_Bandwidth / (float) m_audioSampleRate, settings.m_filterBank[settings.m_filterIndex].m_fftWindow); + m_lowpassI.create(101, m_audioSampleRate, m_Bandwidth * 1.2); + m_lowpassQ.create(101, m_audioSampleRate, m_Bandwidth * 1.2); } if ((m_settings.m_volume != settings.m_volume) || force) diff --git a/plugins/channelrx/demodssb/ssbdemodsink.h b/plugins/channelrx/demodssb/ssbdemodsink.h index 5c98e3d8c..7d26d2208 100644 --- a/plugins/channelrx/demodssb/ssbdemodsink.h +++ b/plugins/channelrx/demodssb/ssbdemodsink.h @@ -25,6 +25,7 @@ #include "dsp/interpolator.h" #include "dsp/fftfilt.h" #include "dsp/agc.h" +#include "dsp/firfilter.h" #include "audio/audiofifo.h" #include "util/doublebufferfifo.h" @@ -112,6 +113,9 @@ private: int m_agcThresholdGate; //!< Gate length in number of samples befor threshold triggers DoubleBufferFIFO m_squelchDelayLine; bool m_audioActive; //!< True if an audio signal is produced (no AGC or AGC and above threshold) + Lowpass m_lowpassI; + Lowpass m_lowpassQ; + NCOF m_nco; Interpolator m_interpolator;