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

NFM, SSB and WFM Mods : use specific method to apply channelizer sample rate and frequency offset changes. Separate this data from settings

This commit is contained in:
f4exb
2017-12-30 00:18:51 +01:00
parent 6041530353
commit e5baca1a37
17 changed files with 207 additions and 279 deletions
+72 -96
View File
@@ -45,7 +45,9 @@ const int SSBMod::m_ssbFftLen = 1024;
SSBMod::SSBMod(DeviceSinkAPI *deviceAPI) :
ChannelSourceAPI(m_channelIdURI),
m_deviceAPI(deviceAPI),
m_absoluteFrequencyOffset(0),
m_basebandSampleRate(48000),
m_outputSampleRate(48000),
m_inputFrequencyOffset(0),
m_SSBFilter(0),
m_DSBFilter(0),
m_SSBFilterBuffer(0),
@@ -172,7 +174,7 @@ void SSBMod::pull(Sample& sample)
void SSBMod::pullAudio(int nbSamples)
{
unsigned int nbSamplesAudio = nbSamples * ((Real) m_settings.m_audioSampleRate / (Real) m_settings.m_basebandSampleRate);
unsigned int nbSamplesAudio = nbSamples * ((Real) m_settings.m_audioSampleRate / (Real) m_basebandSampleRate);
if (nbSamplesAudio > m_audioBuffer.size())
{
@@ -522,7 +524,7 @@ void SSBMod::calculateLevel(Complex& sample)
void SSBMod::start()
{
qDebug() << "SSBMod::start: m_outputSampleRate: " << m_settings.m_outputSampleRate
qDebug() << "SSBMod::start: m_outputSampleRate: " << m_outputSampleRate
<< " m_inputFrequencyOffset: " << m_settings.m_inputFrequencyOffset;
m_audioFifo.clear();
@@ -537,98 +539,30 @@ bool SSBMod::handleMessage(const Message& cmd)
if (UpChannelizer::MsgChannelizerNotification::match(cmd))
{
UpChannelizer::MsgChannelizerNotification& notif = (UpChannelizer::MsgChannelizerNotification&) cmd;
qDebug() << "SSBMod::handleMessage: MsgChannelizerNotification";
SSBModSettings settings = m_settings;
settings.m_basebandSampleRate = notif.getBasebandSampleRate();
settings.m_outputSampleRate = notif.getSampleRate();
settings.m_inputFrequencyOffset = notif.getFrequencyOffset();
applySettings(settings);
qDebug() << "SSBMod::handleMessage: MsgChannelizerNotification:"
<< " m_basebandSampleRate: " << settings.m_basebandSampleRate
<< " m_outputSampleRate: " << settings.m_outputSampleRate
<< " m_inputFrequencyOffset: " << settings.m_inputFrequencyOffset;
applyChannelSettings(notif.getBasebandSampleRate(), notif.getSampleRate(), notif.getFrequencyOffset());
return true;
}
else if (MsgConfigureChannelizer::match(cmd))
{
MsgConfigureChannelizer& cfg = (MsgConfigureChannelizer&) cmd;
qDebug() << "SSBMod::handleMessage: MsgConfigureChannelizer: sampleRate: " << cfg.getSampleRate()
<< " centerFrequency: " << cfg.getCenterFrequency();
m_channelizer->configure(m_channelizer->getInputMessageQueue(),
cfg.getSampleRate(),
cfg.getCenterFrequency());
qDebug() << "SSBMod::handleMessage: MsgConfigureChannelizer: sampleRate: " << cfg.getSampleRate()
<< " centerFrequency: " << cfg.getCenterFrequency();
return true;
}
else if (MsgConfigureSSBMod::match(cmd))
{
float band, lowCutoff;
MsgConfigureSSBMod& cfg = (MsgConfigureSSBMod&) cmd;
qDebug() << "SSBMod::handleMessage: MsgConfigureSSBMod";
SSBModSettings settings = cfg.getSettings();
// These settings are set with UpChannelizer::MsgChannelizerNotification
m_absoluteFrequencyOffset = settings.m_inputFrequencyOffset;
settings.m_basebandSampleRate = m_settings.m_basebandSampleRate;
settings.m_outputSampleRate = m_settings.m_outputSampleRate;
settings.m_inputFrequencyOffset = m_settings.m_inputFrequencyOffset;
band = settings.m_bandwidth;
lowCutoff = settings.m_lowCutoff;
if (band < 0) // negative means LSB
{
band = -band; // turn to positive
lowCutoff = -lowCutoff;
settings.m_usb = false; // and take note of side band
}
else
{
settings.m_usb = true;
}
if (band < 100.0f) // at least 100 Hz
{
band = 100.0f;
lowCutoff = 0;
}
if (band - lowCutoff < 100.0f) {
lowCutoff = band - 100.0f;
}
settings.m_bandwidth = band;
settings.m_lowCutoff = lowCutoff;
applySettings(settings, cfg.getForce());
qDebug() << "SSBMod::handleMessage: MsgConfigureSSBMod:"
<< " m_bandwidth: " << settings.m_bandwidth
<< " m_lowCutoff: " << settings.m_lowCutoff
<< " m_toneFrequency: " << settings.m_toneFrequency
<< " m_volumeFactor: " << settings.m_volumeFactor
<< " m_spanLog2: " << settings.m_spanLog2
<< " m_outputSampleRate: " << m_settings.m_outputSampleRate
<< " m_audioSampleRate: " << settings.m_audioSampleRate
<< " m_audioBinaural: " << settings.m_audioBinaural
<< " m_audioFlipChannels: " << settings.m_audioFlipChannels
<< " m_dsb: " << settings.m_dsb
<< " m_audioMute: " << settings.m_audioMute
<< " m_playLoop: " << settings.m_playLoop
<< " m_agc: " << settings.m_agc
<< " m_agcTime: " << settings.m_agcTime
<< " m_agcOrder: " << settings.m_agcOrder
<< " m_agcThresholdEnable: " << settings.m_agcThresholdEnable
<< " m_agcThreshold: " << settings.m_agcThreshold
<< " m_agcThresholdGate: " << settings.m_agcThresholdGate
<< " m_agcThresholdDelay: " << settings.m_agcThresholdDelay
<< " force: " << cfg.getForce();
applySettings(cfg.getSettings(), cfg.getForce());
return true;
}
@@ -711,35 +645,74 @@ void SSBMod::seekFileStream(int seekPercentage)
}
}
void SSBMod::applySettings(const SSBModSettings& settings, bool force)
void SSBMod::applyChannelSettings(int basebandSampleRate, int outputSampleRate, int inputFrequencyOffset)
{
if ((settings.m_bandwidth != m_settings.m_bandwidth) ||
(settings.m_lowCutoff != m_settings.m_lowCutoff) ||
(settings.m_audioSampleRate != m_settings.m_audioSampleRate) || force)
qDebug() << "SSBMod::applyChannelSettings:"
<< " basebandSampleRate: " << basebandSampleRate
<< " outputSampleRate: " << outputSampleRate
<< " inputFrequencyOffset: " << inputFrequencyOffset;
if ((inputFrequencyOffset != m_inputFrequencyOffset) ||
(outputSampleRate != m_outputSampleRate))
{
m_settingsMutex.lock();
m_SSBFilter->create_filter(settings.m_lowCutoff / settings.m_audioSampleRate, settings.m_bandwidth / settings.m_audioSampleRate);
m_DSBFilter->create_dsb_filter((2.0f * settings.m_bandwidth) / settings.m_audioSampleRate);
m_carrierNco.setFreq(inputFrequencyOffset, outputSampleRate);
m_settingsMutex.unlock();
}
if ((settings.m_inputFrequencyOffset != m_settings.m_inputFrequencyOffset) ||
(settings.m_outputSampleRate != m_settings.m_outputSampleRate) || force)
{
m_settingsMutex.lock();
m_carrierNco.setFreq(settings.m_inputFrequencyOffset, settings.m_outputSampleRate);
m_settingsMutex.unlock();
}
if((settings.m_outputSampleRate != m_settings.m_outputSampleRate) ||
(settings.m_bandwidth != m_settings.m_bandwidth) ||
(settings.m_audioSampleRate != m_settings.m_audioSampleRate) || force)
if (outputSampleRate != m_outputSampleRate)
{
m_settingsMutex.lock();
m_interpolatorDistanceRemain = 0;
m_interpolatorConsumed = false;
m_interpolatorDistance = (Real) settings.m_audioSampleRate / (Real) settings.m_outputSampleRate;
m_interpolator.create(48, settings.m_audioSampleRate, settings.m_bandwidth, 3.0);
m_interpolatorDistance = (Real) m_settings.m_audioSampleRate / (Real) m_outputSampleRate;
m_interpolator.create(48, m_settings.m_audioSampleRate, m_settings.m_bandwidth, 3.0);
m_settingsMutex.unlock();
}
m_basebandSampleRate = basebandSampleRate;
m_outputSampleRate = outputSampleRate;
m_inputFrequencyOffset = inputFrequencyOffset;
}
void SSBMod::applySettings(const SSBModSettings& settings, bool force)
{
float band = settings.m_bandwidth;
float lowCutoff = settings.m_lowCutoff;
bool usb = settings.m_usb;
if ((settings.m_bandwidth != m_settings.m_bandwidth) ||
(settings.m_lowCutoff != m_settings.m_lowCutoff) ||
(settings.m_audioSampleRate != m_settings.m_audioSampleRate) || force)
{
if (band < 0) // negative means LSB
{
band = -band; // turn to positive
lowCutoff = -lowCutoff;
usb = false; // and take note of side band
}
else
{
usb = true;
}
if (band < 100.0f) // at least 100 Hz
{
band = 100.0f;
lowCutoff = 0;
}
if (band - lowCutoff < 100.0f) {
lowCutoff = band - 100.0f;
}
m_settingsMutex.lock();
m_interpolatorDistanceRemain = 0;
m_interpolatorConsumed = false;
m_interpolatorDistance = (Real) settings.m_audioSampleRate / (Real) m_outputSampleRate;
m_interpolator.create(48, settings.m_audioSampleRate, band, 3.0);
m_SSBFilter->create_filter(lowCutoff / settings.m_audioSampleRate, band / settings.m_audioSampleRate);
m_DSBFilter->create_dsb_filter((2.0f * band) / settings.m_audioSampleRate);
m_settingsMutex.unlock();
}
@@ -799,6 +772,9 @@ void SSBMod::applySettings(const SSBModSettings& settings, bool force)
}
m_settings = settings;
m_settings.m_bandwidth = band;
m_settings.m_lowCutoff = lowCutoff;
m_settings.m_usb = usb;
}
QByteArray SSBMod::serialize() const