From e5baca1a375272e9d4c6dfd765ee1a711661776c Mon Sep 17 00:00:00 2001 From: f4exb Date: Sat, 30 Dec 2017 00:18:51 +0100 Subject: [PATCH] NFM, SSB and WFM Mods : use specific method to apply channelizer sample rate and frequency offset changes. Separate this data from settings --- plugins/channeltx/modnfm/nfmmod.cpp | 110 ++++++------ plugins/channeltx/modnfm/nfmmod.h | 6 +- plugins/channeltx/modnfm/nfmmodsettings.cpp | 2 - plugins/channeltx/modnfm/nfmmodsettings.h | 2 - plugins/channeltx/modssb/ssbmod.cpp | 168 ++++++++---------- plugins/channeltx/modssb/ssbmod.h | 5 +- plugins/channeltx/modssb/ssbmodsettings.cpp | 2 - plugins/channeltx/modssb/ssbmodsettings.h | 2 - plugins/channeltx/modwfm/wfmmod.cpp | 124 +++++++------ plugins/channeltx/modwfm/wfmmod.h | 5 +- plugins/channeltx/modwfm/wfmmodsettings.cpp | 2 - plugins/channeltx/modwfm/wfmmodsettings.h | 2 - sdrbase/resources/index.html | 8 +- .../sdrangel/api/swagger/include/NFMMod.yaml | 4 - swagger/sdrangel/code/html2/index.html | 8 +- .../code/qt5/client/SWGNFMModSettings.cpp | 28 --- .../code/qt5/client/SWGNFMModSettings.h | 8 - 17 files changed, 207 insertions(+), 279 deletions(-) diff --git a/plugins/channeltx/modnfm/nfmmod.cpp b/plugins/channeltx/modnfm/nfmmod.cpp index 2dc199074..3e15e2405 100644 --- a/plugins/channeltx/modnfm/nfmmod.cpp +++ b/plugins/channeltx/modnfm/nfmmod.cpp @@ -48,7 +48,9 @@ const int NFMMod::m_levelNbSamples = 480; // every 10ms NFMMod::NFMMod(DeviceSinkAPI *deviceAPI) : ChannelSourceAPI(m_channelIdURI), m_deviceAPI(deviceAPI), - m_absoluteFrequencyOffset(0), + m_basebandSampleRate(48000), + m_outputSampleRate(48000), + m_inputFrequencyOffset(0), m_modPhasor(0.0f), m_movingAverage(40, 0), m_volumeAGC(40, 0), @@ -143,7 +145,7 @@ void NFMMod::pull(Sample& sample) void NFMMod::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()) { @@ -264,8 +266,8 @@ void NFMMod::calculateLevel(Real& sample) void NFMMod::start() { - qDebug() << "NFMMod::start: m_outputSampleRate: " << m_settings.m_outputSampleRate - << " m_inputFrequencyOffset: " << m_settings.m_inputFrequencyOffset; + qDebug() << "NFMMod::start: m_outputSampleRate: " << m_outputSampleRate + << " m_inputFrequencyOffset: " << m_inputFrequencyOffset; m_audioFifo.clear(); } @@ -279,60 +281,31 @@ bool NFMMod::handleMessage(const Message& cmd) if (UpChannelizer::MsgChannelizerNotification::match(cmd)) { UpChannelizer::MsgChannelizerNotification& notif = (UpChannelizer::MsgChannelizerNotification&) cmd; + qDebug() << "NFMMod::handleMessage: UpChannelizer::MsgChannelizerNotification"; - NFMModSettings settings = m_settings; - - settings.m_basebandSampleRate = notif.getBasebandSampleRate(); - settings.m_outputSampleRate = notif.getSampleRate(); - settings.m_inputFrequencyOffset = notif.getFrequencyOffset(); - - applySettings(settings); - - qDebug() << "NFMMod::handleMessage: UpChannelizer::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() << "NFMMod::handleMessage: MsgConfigureChannelizer:" + << " getSampleRate: " << cfg.getSampleRate() + << " getCenterFrequency: " << cfg.getCenterFrequency(); m_channelizer->configure(m_channelizer->getInputMessageQueue(), cfg.getSampleRate(), cfg.getCenterFrequency()); - qDebug() << "NFMMod::handleMessage: MsgConfigureChannelizer:" - << " getSampleRate: " << cfg.getSampleRate() - << " getCenterFrequency: " << cfg.getCenterFrequency(); - return true; } else if (MsgConfigureNFMMod::match(cmd)) { MsgConfigureNFMMod& cfg = (MsgConfigureNFMMod&) cmd; + qDebug() << "NFMMod::handleMessage: MsgConfigureNFMMod"; - NFMModSettings settings = cfg.getSettings(); - - m_absoluteFrequencyOffset = settings.m_inputFrequencyOffset; - settings.m_outputSampleRate = m_settings.m_outputSampleRate; - settings.m_inputFrequencyOffset = m_settings.m_inputFrequencyOffset; - - qDebug() << "NFMMod::handleMessage: MsgConfigureNFMMod:" - << " m_rfBandwidth: " << settings.m_rfBandwidth - << " m_afBandwidth: " << settings.m_afBandwidth - << " m_fmDeviation: " << settings.m_fmDeviation - << " m_volumeFactor: " << settings.m_volumeFactor - << " m_toneFrequency: " << settings.m_toneFrequency - << " m_ctcssIndex: " << settings.m_ctcssIndex - << " m_ctcssOn: " << settings.m_ctcssOn - << " m_channelMute: " << settings.m_channelMute - << " m_playLoop: " << settings.m_playLoop - << " m_modAFInout " << settings.m_modAFInput - << " force: " << cfg.getForce(); - - applySettings(settings, cfg.getForce()); + applySettings(cfg.getSettings(), cfg.getForce()); return true; } @@ -412,24 +385,59 @@ void NFMMod::seekFileStream(int seekPercentage) } } -void NFMMod::applySettings(const NFMModSettings& settings, bool force) +void NFMMod::applyChannelSettings(int basebandSampleRate, int outputSampleRate, int inputFrequencyOffset) { - if ((settings.m_inputFrequencyOffset != m_settings.m_inputFrequencyOffset) || - (settings.m_outputSampleRate != m_settings.m_outputSampleRate) || force) + qDebug() << "NFMMod::applyChannelSettings:" + << " basebandSampleRate: " << basebandSampleRate + << " outputSampleRate: " << outputSampleRate + << " inputFrequencyOffset: " << inputFrequencyOffset; + + if ((inputFrequencyOffset != m_inputFrequencyOffset) || + (outputSampleRate != m_outputSampleRate)) { m_settingsMutex.lock(); - m_carrierNco.setFreq(settings.m_inputFrequencyOffset, settings.m_outputSampleRate); + m_carrierNco.setFreq(inputFrequencyOffset, m_outputSampleRate); m_settingsMutex.unlock(); } - if((settings.m_outputSampleRate != m_settings.m_outputSampleRate) || - (settings.m_rfBandwidth != m_settings.m_rfBandwidth) || + if (outputSampleRate != m_outputSampleRate) + { + m_settingsMutex.lock(); + m_interpolatorDistanceRemain = 0; + m_interpolatorConsumed = false; + m_interpolatorDistance = (Real) m_settings.m_audioSampleRate / (Real) outputSampleRate; + m_interpolator.create(48, m_settings.m_audioSampleRate, m_settings.m_rfBandwidth / 2.2, 3.0); + m_settingsMutex.unlock(); + } + + m_basebandSampleRate = basebandSampleRate; + m_outputSampleRate = outputSampleRate; + m_inputFrequencyOffset = inputFrequencyOffset; +} + +void NFMMod::applySettings(const NFMModSettings& settings, bool force) +{ + qDebug() << "NFMMod::applySettings:" + << " m_inputFrequencyOffset: " << settings.m_inputFrequencyOffset + << " m_rfBandwidth: " << settings.m_rfBandwidth + << " m_afBandwidth: " << settings.m_afBandwidth + << " m_fmDeviation: " << settings.m_fmDeviation + << " m_volumeFactor: " << settings.m_volumeFactor + << " m_toneFrequency: " << settings.m_toneFrequency + << " m_ctcssIndex: " << settings.m_ctcssIndex + << " m_ctcssOn: " << settings.m_ctcssOn + << " m_channelMute: " << settings.m_channelMute + << " m_playLoop: " << settings.m_playLoop + << " m_modAFInout " << settings.m_modAFInput + << " force: " << force; + + if((settings.m_rfBandwidth != m_settings.m_rfBandwidth) || (settings.m_audioSampleRate != m_settings.m_audioSampleRate) || force) { m_settingsMutex.lock(); m_interpolatorDistanceRemain = 0; m_interpolatorConsumed = false; - m_interpolatorDistance = (Real) settings.m_audioSampleRate / (Real) settings.m_outputSampleRate; + m_interpolatorDistance = (Real) settings.m_audioSampleRate / (Real) m_outputSampleRate; m_interpolator.create(48, settings.m_audioSampleRate, settings.m_rfBandwidth / 2.2, 3.0); m_settingsMutex.unlock(); } @@ -499,14 +507,12 @@ int NFMMod::webapiSettingsGet( response.setNfmModSettings(new SWGSDRangel::SWGNFMModSettings()); response.getNfmModSettings()->setAfBandwidth(m_settings.m_afBandwidth); response.getNfmModSettings()->setAudioSampleRate(m_settings.m_audioSampleRate); - response.getNfmModSettings()->setBasebandSampleRate(m_settings.m_basebandSampleRate); response.getNfmModSettings()->setChannelMute(m_settings.m_channelMute ? 1 : 0); response.getNfmModSettings()->setCtcssIndex(m_settings.m_ctcssIndex); response.getNfmModSettings()->setCtcssOn(m_settings.m_ctcssOn ? 1 : 0); response.getNfmModSettings()->setFmDeviation(m_settings.m_fmDeviation); response.getNfmModSettings()->setInputFrequencyOffset(m_settings.m_inputFrequencyOffset); response.getNfmModSettings()->setModAfInput((int) m_settings.m_modAFInput); - response.getNfmModSettings()->setOutputSampleRate(m_settings.m_outputSampleRate); response.getNfmModSettings()->setPlayLoop(m_settings.m_playLoop ? 1 : 0); response.getNfmModSettings()->setRfBandwidth(m_settings.m_rfBandwidth); response.getNfmModSettings()->setRgbColor(m_settings.m_rgbColor); @@ -542,9 +548,6 @@ int NFMMod::webapiSettingsPutPatch( if (channelSettingsKeys.contains("audioSampleRate")) { settings.m_audioSampleRate = response.getNfmModSettings()->getAudioSampleRate(); } - if (channelSettingsKeys.contains("basebandSampleRate")) { - settings.m_basebandSampleRate = response.getNfmModSettings()->getBasebandSampleRate(); - } if (channelSettingsKeys.contains("channelMute")) { settings.m_channelMute = response.getNfmModSettings()->getChannelMute() != 0; } @@ -565,9 +568,6 @@ int NFMMod::webapiSettingsPutPatch( if (channelSettingsKeys.contains("modAFInput")) { settings.m_modAFInput = (NFMModSettings::NFMModInputAF) response.getNfmModSettings()->getModAfInput(); } - if (channelSettingsKeys.contains("outputSampleRate")) { - settings.m_outputSampleRate = response.getNfmModSettings()->getOutputSampleRate(); - } if (channelSettingsKeys.contains("playLoop")) { settings.m_playLoop = response.getNfmModSettings()->getPlayLoop() != 0; } diff --git a/plugins/channeltx/modnfm/nfmmod.h b/plugins/channeltx/modnfm/nfmmod.h index 1e10abfbc..233a38edb 100644 --- a/plugins/channeltx/modnfm/nfmmod.h +++ b/plugins/channeltx/modnfm/nfmmod.h @@ -263,8 +263,10 @@ private: ThreadedBasebandSampleSource* m_threadedChannelizer; UpChannelizer* m_channelizer; + int m_basebandSampleRate; + int m_outputSampleRate; + int m_inputFrequencyOffset; NFMModSettings m_settings; - int m_absoluteFrequencyOffset; NCO m_carrierNco; NCOF m_toneNco; @@ -302,7 +304,7 @@ private: CWKeyer m_cwKeyer; static const int m_levelNbSamples; - //void apply(); + void applyChannelSettings(int basebandSampleRate, int outputSampleRate, int inputFrequencyOffset); void applySettings(const NFMModSettings& settings, bool force = false); void pullAF(Real& sample); void calculateLevel(Real& sample); diff --git a/plugins/channeltx/modnfm/nfmmodsettings.cpp b/plugins/channeltx/modnfm/nfmmodsettings.cpp index 4e3630ad6..a35e7158b 100644 --- a/plugins/channeltx/modnfm/nfmmodsettings.cpp +++ b/plugins/channeltx/modnfm/nfmmodsettings.cpp @@ -46,8 +46,6 @@ NFMModSettings::NFMModSettings() : void NFMModSettings::resetToDefaults() { m_afBandwidth = 3000; - m_basebandSampleRate = 48000; - m_outputSampleRate = 48000; m_inputFrequencyOffset = 0; m_rfBandwidth = 12500.0f; m_fmDeviation = 5000.0f; diff --git a/plugins/channeltx/modnfm/nfmmodsettings.h b/plugins/channeltx/modnfm/nfmmodsettings.h index 221640185..889267b1d 100644 --- a/plugins/channeltx/modnfm/nfmmodsettings.h +++ b/plugins/channeltx/modnfm/nfmmodsettings.h @@ -37,8 +37,6 @@ struct NFMModSettings static const int m_nbCTCSSFreqs; static const float m_ctcssFreqs[]; - int m_basebandSampleRate; - int m_outputSampleRate; qint64 m_inputFrequencyOffset; Real m_rfBandwidth; Real m_afBandwidth; diff --git a/plugins/channeltx/modssb/ssbmod.cpp b/plugins/channeltx/modssb/ssbmod.cpp index 9a186a824..daaa2595a 100644 --- a/plugins/channeltx/modssb/ssbmod.cpp +++ b/plugins/channeltx/modssb/ssbmod.cpp @@ -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 diff --git a/plugins/channeltx/modssb/ssbmod.h b/plugins/channeltx/modssb/ssbmod.h index 1c8961c39..e5a1db10e 100644 --- a/plugins/channeltx/modssb/ssbmod.h +++ b/plugins/channeltx/modssb/ssbmod.h @@ -275,8 +275,10 @@ private: ThreadedBasebandSampleSource* m_threadedChannelizer; UpChannelizer* m_channelizer; + int m_basebandSampleRate; + int m_outputSampleRate; + int m_inputFrequencyOffset; SSBModSettings m_settings; - int m_absoluteFrequencyOffset; NCOF m_carrierNco; NCOF m_toneNco; @@ -325,6 +327,7 @@ private: static const int m_levelNbSamples; + void applyChannelSettings(int basebandSampleRate, int outputSampleRate, int inputFrequencyOffset); void applySettings(const SSBModSettings& settings, bool force = false); void pullAF(Complex& sample); void calculateLevel(Complex& sample); diff --git a/plugins/channeltx/modssb/ssbmodsettings.cpp b/plugins/channeltx/modssb/ssbmodsettings.cpp index 081f9e9a1..6f3df4b8c 100644 --- a/plugins/channeltx/modssb/ssbmodsettings.cpp +++ b/plugins/channeltx/modssb/ssbmodsettings.cpp @@ -45,8 +45,6 @@ SSBModSettings::SSBModSettings() : void SSBModSettings::resetToDefaults() { - m_basebandSampleRate = 48000; - m_outputSampleRate = 48000; m_inputFrequencyOffset = 0; m_bandwidth = 3000.0; m_lowCutoff = 300.0; diff --git a/plugins/channeltx/modssb/ssbmodsettings.h b/plugins/channeltx/modssb/ssbmodsettings.h index 982de2e00..516d283e0 100644 --- a/plugins/channeltx/modssb/ssbmodsettings.h +++ b/plugins/channeltx/modssb/ssbmodsettings.h @@ -28,8 +28,6 @@ struct SSBModSettings static const int m_nbAGCTimeConstants; static const int m_agcTimeConstant[]; - int m_basebandSampleRate; - int m_outputSampleRate; qint64 m_inputFrequencyOffset; Real m_bandwidth; Real m_lowCutoff; diff --git a/plugins/channeltx/modwfm/wfmmod.cpp b/plugins/channeltx/modwfm/wfmmod.cpp index 0e2dad4ca..3471888d9 100644 --- a/plugins/channeltx/modwfm/wfmmod.cpp +++ b/plugins/channeltx/modwfm/wfmmod.cpp @@ -47,6 +47,9 @@ const int WFMMod::m_rfFilterFFTLength = 1024; WFMMod::WFMMod(DeviceSinkAPI *deviceAPI) : ChannelSourceAPI(m_channelIdURI), m_deviceAPI(deviceAPI), + m_basebandSampleRate(384000), + m_outputSampleRate(384000), + m_inputFrequencyOffset(0), m_modPhasor(0.0f), m_movingAverage(40, 0), m_volumeAGC(40, 0), @@ -75,11 +78,11 @@ WFMMod::WFMMod(DeviceSinkAPI *deviceAPI) : m_magsq = 0.0; m_toneNco.setFreq(1000.0, m_settings.m_audioSampleRate); - m_toneNcoRF.setFreq(1000.0, m_settings.m_outputSampleRate); + m_toneNcoRF.setFreq(1000.0, m_outputSampleRate); DSPEngine::instance()->addAudioSource(&m_audioFifo); // CW keyer - m_cwKeyer.setSampleRate(m_settings.m_outputSampleRate); + m_cwKeyer.setSampleRate(m_outputSampleRate); m_cwKeyer.setWPM(13); m_cwKeyer.setMode(CWKeyerSettings::CWNone); m_cwKeyer.reset(); @@ -134,7 +137,7 @@ void WFMMod::pull(Sample& sample) pullAF(ri); } - m_modPhasor += (m_settings.m_fmDeviation / (float) m_settings.m_outputSampleRate) * ri.real() * M_PI * 2.0f; + m_modPhasor += (m_settings.m_fmDeviation / (float) m_outputSampleRate) * ri.real() * M_PI * 2.0f; ci.real(cos(m_modPhasor) * 29204.0f); // -1 dB ci.imag(sin(m_modPhasor) * 29204.0f); @@ -164,7 +167,7 @@ void WFMMod::pull(Sample& sample) void WFMMod::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()) { @@ -275,8 +278,8 @@ void WFMMod::calculateLevel(const Real& sample) void WFMMod::start() { - qDebug() << "WFMMod::start: m_outputSampleRate: " << m_settings.m_outputSampleRate - << " m_inputFrequencyOffset: " << m_settings.m_inputFrequencyOffset; + qDebug() << "WFMMod::start: m_outputSampleRate: " << m_outputSampleRate + << " m_inputFrequencyOffset: " << m_inputFrequencyOffset; m_audioFifo.clear(); } @@ -290,58 +293,33 @@ bool WFMMod::handleMessage(const Message& cmd) if (UpChannelizer::MsgChannelizerNotification::match(cmd)) { UpChannelizer::MsgChannelizerNotification& notif = (UpChannelizer::MsgChannelizerNotification&) cmd; + qDebug() << "WFMMod::handleMessage: MsgChannelizerNotification"; - WFMModSettings settings = m_settings; - - settings.m_basebandSampleRate = notif.getBasebandSampleRate(); - settings.m_outputSampleRate = notif.getSampleRate(); - settings.m_inputFrequencyOffset = notif.getFrequencyOffset(); - - applySettings(settings); - - qDebug() << "WFMMod::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() << "WFMMod::handleMessage: MsgConfigureChannelizer:" + << " getSampleRate: " << cfg.getSampleRate() + << " getCenterFrequency: " << cfg.getCenterFrequency(); m_channelizer->configure(m_channelizer->getInputMessageQueue(), cfg.getSampleRate(), cfg.getCenterFrequency()); - qDebug() << "WFMMod::handleMessage: MsgConfigureChannelizer:" - << " getSampleRate: " << cfg.getSampleRate() - << " getCenterFrequency: " << cfg.getCenterFrequency(); - return true; } else if (MsgConfigureWFMMod::match(cmd)) { MsgConfigureWFMMod& cfg = (MsgConfigureWFMMod&) cmd; + qDebug() << "NFWFMMod::handleMessage: MsgConfigureWFMMod"; WFMModSettings settings = cfg.getSettings(); - 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; - - qDebug() << "NFWFMMod::handleMessage: MsgConfigureWFMMod:" - << " m_rfBandwidth: " << settings.m_rfBandwidth - << " m_afBandwidth: " << settings.m_afBandwidth - << " m_fmDeviation: " << settings.m_fmDeviation - << " m_volumeFactor: " << settings.m_volumeFactor - << " m_toneFrequency: " << settings.m_toneFrequency - << " m_channelMute: " << settings.m_channelMute - << " m_playLoop: " << settings.m_playLoop - << " force: " << cfg.getForce(); - - applySettings(settings, cfg.getForce()); + applySettings(cfg.getSettings(), cfg.getForce()); return true; } @@ -424,34 +402,71 @@ void WFMMod::seekFileStream(int seekPercentage) } } -void WFMMod::applySettings(const WFMModSettings& settings, bool force) +void WFMMod::applyChannelSettings(int basebandSampleRate, int outputSampleRate, int inputFrequencyOffset) { - if ((settings.m_inputFrequencyOffset != m_settings.m_inputFrequencyOffset) || - (settings.m_outputSampleRate != m_settings.m_outputSampleRate)) + qDebug() << "WFMMod::applyChannelSettings:" + << " basebandSampleRate: " << basebandSampleRate + << " outputSampleRate: " << outputSampleRate + << " inputFrequencyOffset: " << inputFrequencyOffset; + + if ((inputFrequencyOffset != m_inputFrequencyOffset) || + (outputSampleRate != m_outputSampleRate)) { m_settingsMutex.lock(); - m_carrierNco.setFreq(settings.m_inputFrequencyOffset, settings.m_outputSampleRate); + m_carrierNco.setFreq(inputFrequencyOffset, outputSampleRate); m_settingsMutex.unlock(); } - if((settings.m_outputSampleRate != m_settings.m_outputSampleRate) || - (settings.m_audioSampleRate != m_settings.m_audioSampleRate) || + if (outputSampleRate != m_outputSampleRate) + { + m_settingsMutex.lock(); + m_interpolatorDistanceRemain = 0; + m_interpolatorConsumed = false; + m_interpolatorDistance = (Real) m_settings.m_audioSampleRate / (Real) outputSampleRate; + m_interpolator.create(48, m_settings.m_audioSampleRate, m_settings.m_rfBandwidth / 2.2, 3.0); + Real lowCut = -(m_settings.m_rfBandwidth / 2.0) / m_outputSampleRate; + Real hiCut = (m_settings.m_rfBandwidth / 2.0) / m_outputSampleRate; + m_rfFilter->create_filter(lowCut, hiCut); + m_toneNcoRF.setFreq(m_settings.m_toneFrequency, m_outputSampleRate); + m_cwKeyer.setSampleRate(m_outputSampleRate); + m_cwKeyer.reset(); + m_settingsMutex.unlock(); + } + + m_basebandSampleRate = basebandSampleRate; + m_outputSampleRate = outputSampleRate; + m_inputFrequencyOffset = inputFrequencyOffset; +} + +void WFMMod::applySettings(const WFMModSettings& settings, bool force) +{ + qDebug() << "WFMMod::applySettings:" + << " m_inputFrequencyOffset: " << settings.m_inputFrequencyOffset + << " m_rfBandwidth: " << settings.m_rfBandwidth + << " m_afBandwidth: " << settings.m_afBandwidth + << " m_fmDeviation: " << settings.m_fmDeviation + << " m_volumeFactor: " << settings.m_volumeFactor + << " m_toneFrequency: " << settings.m_toneFrequency + << " m_channelMute: " << settings.m_channelMute + << " m_playLoop: " << settings.m_playLoop + << " force: " << force; + + if((settings.m_audioSampleRate != m_settings.m_audioSampleRate) || (settings.m_afBandwidth != m_settings.m_afBandwidth) || force) { m_settingsMutex.lock(); m_interpolatorDistanceRemain = 0; m_interpolatorConsumed = false; - m_interpolatorDistance = (Real) settings.m_audioSampleRate / (Real) settings.m_outputSampleRate; + m_interpolatorDistance = (Real) settings.m_audioSampleRate / (Real) m_outputSampleRate; m_interpolator.create(48, settings.m_audioSampleRate, settings.m_rfBandwidth / 2.2, 3.0); m_settingsMutex.unlock(); } - if ((settings.m_rfBandwidth != m_settings.m_rfBandwidth) || - (settings.m_outputSampleRate != m_settings.m_outputSampleRate) || force) + if ((settings.m_rfBandwidth != m_settings.m_rfBandwidth) || force) { m_settingsMutex.lock(); - Real lowCut = -(settings.m_rfBandwidth / 2.0) / settings.m_outputSampleRate; - Real hiCut = (settings.m_rfBandwidth / 2.0) / settings.m_outputSampleRate; + Real lowCut = -(settings.m_rfBandwidth / 2.0) / m_outputSampleRate; + Real hiCut = (settings.m_rfBandwidth / 2.0) / m_outputSampleRate; m_rfFilter->create_filter(lowCut, hiCut); m_settingsMutex.unlock(); } @@ -464,20 +479,13 @@ void WFMMod::applySettings(const WFMModSettings& settings, bool force) m_settingsMutex.unlock(); } - if ((settings.m_toneFrequency != m_settings.m_toneFrequency) || - (settings.m_outputSampleRate != m_settings.m_outputSampleRate) || force) + if ((settings.m_toneFrequency != m_settings.m_toneFrequency) || force) { m_settingsMutex.lock(); - m_toneNcoRF.setFreq(settings.m_toneFrequency, settings.m_outputSampleRate); + m_toneNcoRF.setFreq(settings.m_toneFrequency, m_outputSampleRate); m_settingsMutex.unlock(); } - if ((settings.m_outputSampleRate != m_settings.m_outputSampleRate) || force) - { - m_cwKeyer.setSampleRate(settings.m_outputSampleRate); - m_cwKeyer.reset(); - } - m_settings = settings; } diff --git a/plugins/channeltx/modwfm/wfmmod.h b/plugins/channeltx/modwfm/wfmmod.h index 6731fd8fd..37c8cbffd 100644 --- a/plugins/channeltx/modwfm/wfmmod.h +++ b/plugins/channeltx/modwfm/wfmmod.h @@ -273,8 +273,10 @@ private: ThreadedBasebandSampleSource* m_threadedChannelizer; UpChannelizer* m_channelizer; + int m_basebandSampleRate; + int m_outputSampleRate; + int m_inputFrequencyOffset; WFMModSettings m_settings; - int m_absoluteFrequencyOffset; NCO m_carrierNco; NCOF m_toneNco; @@ -315,6 +317,7 @@ private: CWKeyer m_cwKeyer; static const int m_levelNbSamples; + void applyChannelSettings(int basebandSampleRate, int outputSampleRate, int inputFrequencyOffset); void applySettings(const WFMModSettings& settings, bool force = false); void pullAF(Complex& sample); void calculateLevel(const Real& sample); diff --git a/plugins/channeltx/modwfm/wfmmodsettings.cpp b/plugins/channeltx/modwfm/wfmmodsettings.cpp index 084ab9255..864db9264 100644 --- a/plugins/channeltx/modwfm/wfmmodsettings.cpp +++ b/plugins/channeltx/modwfm/wfmmodsettings.cpp @@ -37,8 +37,6 @@ WFMModSettings::WFMModSettings() : void WFMModSettings::resetToDefaults() { - m_basebandSampleRate = 384000; - m_outputSampleRate = 384000; m_inputFrequencyOffset = 0; m_rfBandwidth = 125000.0f; m_afBandwidth = 15000.0f; diff --git a/plugins/channeltx/modwfm/wfmmodsettings.h b/plugins/channeltx/modwfm/wfmmodsettings.h index 7a3dc4167..f83b8cf22 100644 --- a/plugins/channeltx/modwfm/wfmmodsettings.h +++ b/plugins/channeltx/modwfm/wfmmodsettings.h @@ -26,8 +26,6 @@ struct WFMModSettings static const int m_nbRfBW; static const int m_rfBW[]; - int m_basebandSampleRate; - int m_outputSampleRate; qint64 m_inputFrequencyOffset; Real m_rfBandwidth; Real m_afBandwidth; diff --git a/sdrbase/resources/index.html b/sdrbase/resources/index.html index 74caa7202..f4c1052e2 100644 --- a/sdrbase/resources/index.html +++ b/sdrbase/resources/index.html @@ -1360,12 +1360,6 @@ margin-bottom: 20px; }; defs.NFMModSettings = { "properties" : { - "basebandSampleRate" : { - "type" : "integer" - }, - "outputSampleRate" : { - "type" : "integer" - }, "inputFrequencyOffset" : { "type" : "integer", "format" : "int64" @@ -16388,7 +16382,7 @@ except ApiException as e:
- Generated 2017-12-29T05:27:24.640+01:00 + Generated 2017-12-29T23:23:36.890+01:00
diff --git a/swagger/sdrangel/api/swagger/include/NFMMod.yaml b/swagger/sdrangel/api/swagger/include/NFMMod.yaml index 81d9de8e7..0ce05274b 100644 --- a/swagger/sdrangel/api/swagger/include/NFMMod.yaml +++ b/swagger/sdrangel/api/swagger/include/NFMMod.yaml @@ -1,10 +1,6 @@ NFMModSettings: description: NFMMod properties: - basebandSampleRate: - type: integer - outputSampleRate: - type: integer inputFrequencyOffset: type: integer format: int64 diff --git a/swagger/sdrangel/code/html2/index.html b/swagger/sdrangel/code/html2/index.html index 74caa7202..f4c1052e2 100644 --- a/swagger/sdrangel/code/html2/index.html +++ b/swagger/sdrangel/code/html2/index.html @@ -1360,12 +1360,6 @@ margin-bottom: 20px; }; defs.NFMModSettings = { "properties" : { - "basebandSampleRate" : { - "type" : "integer" - }, - "outputSampleRate" : { - "type" : "integer" - }, "inputFrequencyOffset" : { "type" : "integer", "format" : "int64" @@ -16388,7 +16382,7 @@ except ApiException as e:
- Generated 2017-12-29T05:27:24.640+01:00 + Generated 2017-12-29T23:23:36.890+01:00
diff --git a/swagger/sdrangel/code/qt5/client/SWGNFMModSettings.cpp b/swagger/sdrangel/code/qt5/client/SWGNFMModSettings.cpp index 795584b43..6e99b7141 100644 --- a/swagger/sdrangel/code/qt5/client/SWGNFMModSettings.cpp +++ b/swagger/sdrangel/code/qt5/client/SWGNFMModSettings.cpp @@ -37,8 +37,6 @@ SWGNFMModSettings::~SWGNFMModSettings() { void SWGNFMModSettings::init() { - baseband_sample_rate = 0; - output_sample_rate = 0; input_frequency_offset = 0L; rf_bandwidth = 0.0f; af_bandwidth = 0.0f; @@ -71,8 +69,6 @@ SWGNFMModSettings::cleanup() { - - if(title != nullptr) { delete title; } @@ -94,8 +90,6 @@ SWGNFMModSettings::fromJson(QString &json) { void SWGNFMModSettings::fromJsonObject(QJsonObject &pJson) { - ::SWGSDRangel::setValue(&baseband_sample_rate, pJson["basebandSampleRate"], "qint32", ""); - ::SWGSDRangel::setValue(&output_sample_rate, pJson["outputSampleRate"], "qint32", ""); ::SWGSDRangel::setValue(&input_frequency_offset, pJson["inputFrequencyOffset"], "qint64", ""); ::SWGSDRangel::setValue(&rf_bandwidth, pJson["rfBandwidth"], "float", ""); ::SWGSDRangel::setValue(&af_bandwidth, pJson["afBandwidth"], "float", ""); @@ -127,10 +121,6 @@ QJsonObject* SWGNFMModSettings::asJsonObject() { QJsonObject* obj = new QJsonObject(); - obj->insert("basebandSampleRate", QJsonValue(baseband_sample_rate)); - - obj->insert("outputSampleRate", QJsonValue(output_sample_rate)); - obj->insert("inputFrequencyOffset", QJsonValue(input_frequency_offset)); obj->insert("rfBandwidth", QJsonValue(rf_bandwidth)); @@ -164,24 +154,6 @@ SWGNFMModSettings::asJsonObject() { return obj; } -qint32 -SWGNFMModSettings::getBasebandSampleRate() { - return baseband_sample_rate; -} -void -SWGNFMModSettings::setBasebandSampleRate(qint32 baseband_sample_rate) { - this->baseband_sample_rate = baseband_sample_rate; -} - -qint32 -SWGNFMModSettings::getOutputSampleRate() { - return output_sample_rate; -} -void -SWGNFMModSettings::setOutputSampleRate(qint32 output_sample_rate) { - this->output_sample_rate = output_sample_rate; -} - qint64 SWGNFMModSettings::getInputFrequencyOffset() { return input_frequency_offset; diff --git a/swagger/sdrangel/code/qt5/client/SWGNFMModSettings.h b/swagger/sdrangel/code/qt5/client/SWGNFMModSettings.h index 2d58e534c..0782af71e 100644 --- a/swagger/sdrangel/code/qt5/client/SWGNFMModSettings.h +++ b/swagger/sdrangel/code/qt5/client/SWGNFMModSettings.h @@ -43,12 +43,6 @@ public: void fromJsonObject(QJsonObject &json); SWGNFMModSettings* fromJson(QString &jsonString); - qint32 getBasebandSampleRate(); - void setBasebandSampleRate(qint32 baseband_sample_rate); - - qint32 getOutputSampleRate(); - void setOutputSampleRate(qint32 output_sample_rate); - qint64 getInputFrequencyOffset(); void setInputFrequencyOffset(qint64 input_frequency_offset); @@ -96,8 +90,6 @@ public: private: - qint32 baseband_sample_rate; - qint32 output_sample_rate; qint64 input_frequency_offset; float rf_bandwidth; float af_bandwidth;