diff --git a/plugins/channelrx/demodfreedv/freedvdemod.cpp b/plugins/channelrx/demodfreedv/freedvdemod.cpp index e3c3191bb..8b22fa3ac 100644 --- a/plugins/channelrx/demodfreedv/freedvdemod.cpp +++ b/plugins/channelrx/demodfreedv/freedvdemod.cpp @@ -49,8 +49,8 @@ const QString FreeDVDemod::m_channelId = "FreeDVDemod"; FreeDVDemod::FreeDVDemod(DeviceSourceAPI *deviceAPI) : ChannelSinkAPI(m_channelIdURI), m_deviceAPI(deviceAPI), - m_hiCutoff(5000), - m_lowCutoff(300), + m_hiCutoff(6000), + m_lowCutoff(0), m_volume(2), m_spanLog2(3), m_sum(0), @@ -97,7 +97,7 @@ FreeDVDemod::FreeDVDemod(DeviceSourceAPI *deviceAPI) : m_agc.setClampMax(SDR_RX_SCALED/100.0); m_agc.setClamping(m_agcClamping); - SSBFilter = new fftfilt(m_lowCutoff / m_audioSampleRate, m_hiCutoff / m_audioSampleRate, ssbFftLen); + SSBFilter = new fftfilt(m_lowCutoff / m_modemSampleRate, m_hiCutoff / m_modemSampleRate, ssbFftLen); applyChannelSettings(m_inputSampleRate, m_inputFrequencyOffset, true); applySettings(m_settings, true); @@ -320,7 +320,7 @@ bool FreeDVDemod::handleMessage(const Message& cmd) void FreeDVDemod::pushSampleToDV(int16_t sample) { - qint16 speechSample, audioSample; + qint16 audioSample; if (m_iModem == m_nin) { @@ -328,9 +328,7 @@ void FreeDVDemod::pushSampleToDV(int16_t sample) for (int i = 0; i < nout; i++) { - speechSample = (qint16)(m_speechOut[i] * m_volume); - - while (!m_audioResampler.upSample(speechSample, audioSample)) { + while (!m_audioResampler.upSample(m_speechOut[i], audioSample)) { pushSampleToAudio(audioSample); } @@ -346,8 +344,8 @@ void FreeDVDemod::pushSampleToDV(int16_t sample) void FreeDVDemod::pushSampleToAudio(int16_t sample) { - m_audioBuffer[m_audioBufferFill].l = sample; - m_audioBuffer[m_audioBufferFill].r = sample; + m_audioBuffer[m_audioBufferFill].l = sample * m_volume; + m_audioBuffer[m_audioBufferFill].r = sample * m_volume; ++m_audioBufferFill; if (m_audioBufferFill >= m_audioBuffer.size()) @@ -379,7 +377,7 @@ void FreeDVDemod::applyChannelSettings(int inputSampleRate, int inputFrequencyOf m_settingsMutex.lock(); m_interpolator.create(16, inputSampleRate, m_hiCutoff * 1.5f, 2.0f); m_interpolatorDistanceRemain = 0; - m_interpolatorDistance = (Real) inputSampleRate / (Real) m_audioSampleRate; + m_interpolatorDistance = (Real) inputSampleRate / (Real) m_modemSampleRate; m_settingsMutex.unlock(); } @@ -394,7 +392,7 @@ void FreeDVDemod::applyAudioSampleRate(int sampleRate) m_settingsMutex.lock(); m_audioFifo.setSize(sampleRate); m_audioResampler.setDecimation(sampleRate / m_speechSampleRate); - m_audioResampler.setAudioFilters(sampleRate, m_speechSampleRate, 250, 3300); + m_audioResampler.setAudioFilters(sampleRate, sampleRate, 250, 3300, 4.0f); m_settingsMutex.unlock(); m_audioSampleRate = sampleRate; @@ -415,15 +413,17 @@ void FreeDVDemod::applyFreeDVMode(FreeDVDemodSettings::FreeDVMode mode) modemSampleRate, m_settings.m_inputFrequencyOffset); m_inputMessageQueue.push(channelConfigMsg); - m_interpolator.create(16, m_inputSampleRate, m_hiCutoff * 1.5f, 2.0f); m_interpolatorDistanceRemain = 0; + //m_interpolatorConsumed = false; m_interpolatorDistance = (Real) m_inputSampleRate / (Real) modemSampleRate; - + m_interpolator.create(16, m_inputSampleRate, m_hiCutoff * 1.5f, 2.0f); SSBFilter->create_filter(m_lowCutoff / (float) modemSampleRate, m_hiCutoff / (float) modemSampleRate); int agcNbSamples = (modemSampleRate / 1000) * (1< fcHigh - 100 ? fcHigh - 100 : fcLow; - m_audioFilter.setDecimFilters(srHigh, srLow, fcHigh, fcLow); + m_audioFilter.setDecimFilters(srHigh, srLow, fcHigh, fcLow, gain); } bool AudioResampler::downSample(qint16 sampleIn, qint16& sampleOut) diff --git a/sdrbase/audio/audioresampler.h b/sdrbase/audio/audioresampler.h index 55273bc82..577f85049 100644 --- a/sdrbase/audio/audioresampler.h +++ b/sdrbase/audio/audioresampler.h @@ -29,7 +29,7 @@ public: void setDecimation(uint32_t decimation); uint32_t getDecimation() const { return m_decimation; } - void setAudioFilters(int srHigh, int srLow, int fcLow, int fcHigh); + void setAudioFilters(int srHigh, int srLow, int fcLow, int fcHigh, float gain=1.0f); bool downSample(qint16 sampleIn, qint16& sampleOut); bool upSample(qint16 sampleIn, qint16& sampleOut);