1
0
mirror of https://github.com/f4exb/sdrangel.git synced 2026-06-07 08:24:43 -04:00

BFM demod: apply de-emphasis

This commit is contained in:
f4exb
2015-12-08 02:00:30 +01:00
parent 2f8fda7137
commit e533997dbe
6 changed files with 138 additions and 22 deletions
+21 -7
View File
@@ -32,7 +32,9 @@ BFMDemod::BFMDemod(SampleSink* sampleSink) :
m_sampleSink(sampleSink),
m_audioFifo(4, 250000),
m_settingsMutex(QMutex::Recursive),
m_pilotPLL(19000/384000, 50/384000, 0.01)
m_pilotPLL(19000/384000, 50/384000, 0.01),
m_deemphasisFilterX(default_deemphasis * 48000 * 1.0e-6),
m_deemphasisFilterY(default_deemphasis * 48000 * 1.0e-6)
{
setObjectName("BFMDemod");
@@ -43,6 +45,8 @@ BFMDemod::BFMDemod(SampleSink* sampleSink) :
m_config.m_squelch = -60.0;
m_config.m_volume = 2.0;
m_config.m_audioSampleRate = DSPEngine::instance()->getAudioSampleRate(); // normally 48 kHz
m_deemphasisFilterX.configure(default_deemphasis * m_config.m_audioSampleRate * 1.0e-6);
m_deemphasisFilterY.configure(default_deemphasis * m_config.m_audioSampleRate * 1.0e-6);
m_rfFilter = new fftfilt(-50000.0 / 384000.0, 50000.0 / 384000.0, rfFilterFftLength);
apply();
@@ -120,7 +124,7 @@ void BFMDemod::feed(const SampleVector::const_iterator& begin, const SampleVecto
m_m1Sample = rf[i];
m_sampleBuffer.push_back(Sample(demod * (1<<15), 0.0));
quint16 sampleStereo;
Real sampleStereo;
// Process stereo if stereo mode is selected
@@ -135,7 +139,7 @@ void BFMDemod::feed(const SampleVector::const_iterator& begin, const SampleVecto
if (m_interpolatorStereo.interpolate(&m_interpolatorStereoDistanceRemain, s, &cs))
{
sampleStereo = (qint16)(cs.real() * 3000 * m_running.m_volume);
sampleStereo = cs.real();
}
}
@@ -143,15 +147,19 @@ void BFMDemod::feed(const SampleVector::const_iterator& begin, const SampleVecto
if (m_interpolator.interpolate(&m_interpolatorDistanceRemain, e, &ci))
{
quint16 sample = (qint16)(ci.real() * 3000 * m_running.m_volume);
if (m_running.m_audioStereo)
{
m_audioBuffer[m_audioBufferFill].l = sample + sampleStereo;
m_audioBuffer[m_audioBufferFill].r = sample - sampleStereo;
Real deemph_l, deemph_r; // Pre-emphasis is applied on each channel before multiplexing
m_deemphasisFilterX.process(ci.real() + sampleStereo, deemph_l);
m_deemphasisFilterY.process(ci.real() - sampleStereo, deemph_r);
m_audioBuffer[m_audioBufferFill].l = (qint16)(deemph_l * 3000 * m_running.m_volume);
m_audioBuffer[m_audioBufferFill].r = (qint16)(deemph_r * 3000 * m_running.m_volume);
}
else
{
Real deemph;
m_deemphasisFilterX.process(ci.real() + sampleStereo, deemph);
quint16 sample = (qint16)(deemph * 3000 * m_running.m_volume);
m_audioBuffer[m_audioBufferFill].l = sample;
m_audioBuffer[m_audioBufferFill].r = sample;
}
@@ -319,6 +327,12 @@ void BFMDemod::apply()
m_squelchLevel *= m_squelchLevel;
}
if (m_config.m_audioSampleRate != m_running.m_audioSampleRate)
{
m_deemphasisFilterX.configure(default_deemphasis * m_config.m_audioSampleRate * 1.0e-6);
m_deemphasisFilterY.configure(default_deemphasis * m_config.m_audioSampleRate * 1.0e-6);
}
m_running.m_inputSampleRate = m_config.m_inputSampleRate;
m_running.m_inputFrequencyOffset = m_config.m_inputFrequencyOffset;
m_running.m_rfBandwidth = m_config.m_rfBandwidth;
+5
View File
@@ -27,6 +27,7 @@
#include "dsp/movingaverage.h"
#include "dsp/fftfilt.h"
#include "dsp/phaselock.h"
#include "dsp/filterrc.h"
#include "audio/audiofifo.h"
#include "util/message.h"
@@ -147,6 +148,10 @@ private:
StereoPhaseLock m_pilotPLL;
Real m_pilotPLLSamples[2];
LowPassFilterRC m_deemphasisFilterX;
LowPassFilterRC m_deemphasisFilterY;
static const Real default_deemphasis = 50.0; // 50 us
void apply();
};