diff --git a/plugins/channelrx/chanalyzer/chanalyzergui.cpp b/plugins/channelrx/chanalyzer/chanalyzergui.cpp index cb3d7ef23..8a966b09c 100644 --- a/plugins/channelrx/chanalyzer/chanalyzergui.cpp +++ b/plugins/channelrx/chanalyzer/chanalyzergui.cpp @@ -196,8 +196,8 @@ void ChannelAnalyzerGUI::channelMarkerHighlightedByCursor() void ChannelAnalyzerGUI::tick() { Real powDb = CalcDb::dbPower(m_channelAnalyzer->getMagSq()); - m_channelPowerDbAvg.feed(powDb); - ui->channelPower->setText(QString::number(m_channelPowerDbAvg.average(), 'f', 1)); + m_channelPowerDbAvg(powDb); + ui->channelPower->setText(QString::number((Real) m_channelPowerDbAvg, 'f', 1)); } void ChannelAnalyzerGUI::on_deltaMinus_toggled(bool minus) @@ -331,8 +331,7 @@ ChannelAnalyzerGUI::ChannelAnalyzerGUI(PluginAPI* pluginAPI, DeviceUISet *device m_channelMarker(this), m_doApplySettings(true), m_rate(6000), - m_spanLog2(3), - m_channelPowerDbAvg(40,0) + m_spanLog2(3) { ui->setupUi(this); setAttribute(Qt::WA_DeleteOnClose, true); diff --git a/plugins/channelrx/chanalyzer/chanalyzergui.h b/plugins/channelrx/chanalyzer/chanalyzergui.h index 793da1c19..d81a8dc9c 100644 --- a/plugins/channelrx/chanalyzer/chanalyzergui.h +++ b/plugins/channelrx/chanalyzer/chanalyzergui.h @@ -20,7 +20,8 @@ #include #include "gui/rollupwidget.h" #include "dsp/channelmarker.h" -#include "dsp/movingaverage.h" +#include "dsp/dsptypes.h" +#include "util/movingaverage.h" #include "util/messagequeue.h" class PluginAPI; @@ -65,7 +66,7 @@ private: bool m_doApplySettings; int m_rate; int m_spanLog2; - MovingAverage m_channelPowerDbAvg; + MovingAverageUtil m_channelPowerDbAvg; ChannelAnalyzer* m_channelAnalyzer; SpectrumScopeComboVis* m_spectrumScopeComboVis; diff --git a/plugins/channelrx/chanalyzerng/chanalyzernggui.cpp b/plugins/channelrx/chanalyzerng/chanalyzernggui.cpp index 3441cb265..72be0e3bf 100644 --- a/plugins/channelrx/chanalyzerng/chanalyzernggui.cpp +++ b/plugins/channelrx/chanalyzerng/chanalyzernggui.cpp @@ -235,8 +235,8 @@ void ChannelAnalyzerNGGUI::channelMarkerHighlightedByCursor() void ChannelAnalyzerNGGUI::tick() { double powDb = CalcDb::dbPower(m_channelAnalyzer->getMagSq()); - m_channelPowerDbAvg.feed(powDb); - ui->channelPower->setText(tr("%1 dB").arg(m_channelPowerDbAvg.average(), 0, 'f', 1)); + m_channelPowerDbAvg(powDb); + ui->channelPower->setText(tr("%1 dB").arg((Real) m_channelPowerDbAvg, 0, 'f', 1)); } void ChannelAnalyzerNGGUI::on_channelSampleRate_changed(quint64 value) @@ -388,8 +388,7 @@ ChannelAnalyzerNGGUI::ChannelAnalyzerNGGUI(PluginAPI* pluginAPI, DeviceUISet *de m_channelMarker(this), m_doApplySettings(true), m_rate(6000), - m_spanLog2(0), - m_channelPowerDbAvg(40,0) + m_spanLog2(0) { ui->setupUi(this); setAttribute(Qt::WA_DeleteOnClose, true); diff --git a/plugins/channelrx/chanalyzerng/chanalyzernggui.h b/plugins/channelrx/chanalyzerng/chanalyzernggui.h index f0baff683..e620b00fe 100644 --- a/plugins/channelrx/chanalyzerng/chanalyzernggui.h +++ b/plugins/channelrx/chanalyzerng/chanalyzernggui.h @@ -20,7 +20,8 @@ #include #include "gui/rollupwidget.h" #include "dsp/channelmarker.h" -#include "dsp/movingaverage.h" +#include "dsp/dsptypes.h" +#include "util/movingaverage.h" #include "util/messagequeue.h" class PluginAPI; @@ -65,7 +66,7 @@ private: bool m_doApplySettings; int m_rate; //!< sample rate after final in-channel decimation (spanlog2) int m_spanLog2; - MovingAverage m_channelPowerDbAvg; + MovingAverageUtil m_channelPowerDbAvg; ChannelAnalyzerNG* m_channelAnalyzer; SpectrumScopeNGComboVis* m_spectrumScopeComboVis; diff --git a/plugins/channelrx/demodam/amdemod.cpp b/plugins/channelrx/demodam/amdemod.cpp index 9f79bd6a2..01d57940d 100644 --- a/plugins/channelrx/demodam/amdemod.cpp +++ b/plugins/channelrx/demodam/amdemod.cpp @@ -45,7 +45,6 @@ AMDemod::AMDemod(DeviceSourceAPI *deviceAPI) : m_magsqSum(0.0f), m_magsqPeak(0.0f), m_magsqCount(0), - m_movingAverage(40, 0), m_volumeAGC(1200, 1.0), m_audioFifo(48000), m_settingsMutex(QMutex::Recursive) @@ -55,7 +54,6 @@ AMDemod::AMDemod(DeviceSourceAPI *deviceAPI) : m_audioBuffer.resize(1<<14); m_audioBufferFill = 0; - m_movingAverage.resize(16, 0); m_volumeAGC.resize(4096, 0.003, 0); m_magsq = 0.0; diff --git a/plugins/channelrx/demodam/amdemod.h b/plugins/channelrx/demodam/amdemod.h index ccbab6fb5..de54a4148 100644 --- a/plugins/channelrx/demodam/amdemod.h +++ b/plugins/channelrx/demodam/amdemod.h @@ -24,7 +24,7 @@ #include "channel/channelsinkapi.h" #include "dsp/nco.h" #include "dsp/interpolator.h" -#include "dsp/movingaverage.h" +#include "util/movingaverage.h" #include "dsp/agc.h" #include "dsp/bandpass.h" #include "audio/audiofifo.h" @@ -143,7 +143,7 @@ private: double m_magsqPeak; int m_magsqCount; - MovingAverage m_movingAverage; + MovingAverageUtil m_movingAverage; SimpleAGC m_volumeAGC; Bandpass m_bandpass; @@ -164,8 +164,8 @@ private: Real re = ci.real() / SDR_RX_SCALED; Real im = ci.imag() / SDR_RX_SCALED; Real magsq = re*re + im*im; - m_movingAverage.feed(magsq); - m_magsq = m_movingAverage.average(); + m_movingAverage(magsq); + m_magsq = m_movingAverage.asDouble(); m_magsqSum += magsq; if (magsq > m_magsqPeak) diff --git a/plugins/channelrx/demodatv/atvdemod.cpp b/plugins/channelrx/demodatv/atvdemod.cpp index db14c76aa..3b3ff4f3b 100644 --- a/plugins/channelrx/demodatv/atvdemod.cpp +++ b/plugins/channelrx/demodatv/atvdemod.cpp @@ -60,7 +60,6 @@ ATVDemod::ATVDemod(DeviceSourceAPI *deviceAPI) : m_intRowIndex(0), m_intLineIndex(0), m_objAvgColIndex(3), - m_objMagSqAverage(40, 0), m_bfoPLL(200/1000000, 100/1000000, 0.01), m_bfoFilter(200.0, 1000000.0, 0.9), m_interpolatorDistance(1.0f), @@ -78,8 +77,6 @@ ATVDemod::ATVDemod(DeviceSourceAPI *deviceAPI) : m_intNumberOfLines=0; m_interleaved = true; - m_objMagSqAverage.resize(32, 1.0); - m_DSBFilter = new fftfilt((2.0f * m_rfConfig.m_fltRFBandwidth) / 1000000, 2 * m_ssbFftLen); // arbitrary 1 MS/s sample rate m_DSBFilterBuffer = new Complex[m_ssbFftLen]; memset(m_DSBFilterBuffer, 0, sizeof(Complex)*(m_ssbFftLen)); @@ -281,7 +278,7 @@ void ATVDemod::demod(Complex& c) { //Amplitude FM magSq = fltI*fltI + fltQ*fltQ; - m_objMagSqAverage.feed(magSq); + m_objMagSqAverage(magSq); fltNorm = sqrt(magSq); fltNormI= fltI/fltNorm; fltNormQ= fltQ/fltNorm; @@ -336,7 +333,7 @@ void ATVDemod::demod(Complex& c) { //Amplitude AM magSq = fltI*fltI + fltQ*fltQ; - m_objMagSqAverage.feed(magSq); + m_objMagSqAverage(magSq); fltNorm = sqrt(magSq); fltVal = fltNorm / SDR_RX_SCALEF; @@ -359,7 +356,7 @@ void ATVDemod::demod(Complex& c) else if ((m_rfRunning.m_enmModulation == ATV_USB) || (m_rfRunning.m_enmModulation == ATV_LSB)) { magSq = fltI*fltI + fltQ*fltQ; - m_objMagSqAverage.feed(magSq); + m_objMagSqAverage(magSq); fltNorm = sqrt(magSq); Real bfoValues[2]; @@ -398,13 +395,13 @@ void ATVDemod::demod(Complex& c) float rawDeviation; fltVal = m_objPhaseDiscri.phaseDiscriminatorDelta(c, magSq, rawDeviation) + 0.5f; //fltVal = fltVal < 0.0f ? 0.0f : fltVal > 1.0f ? 1.0f : fltVal; - m_objMagSqAverage.feed(magSq); + m_objMagSqAverage(magSq); fltNorm = sqrt(magSq); } else { magSq = fltI*fltI + fltQ*fltQ; - m_objMagSqAverage.feed(magSq); + m_objMagSqAverage(magSq); fltNorm = sqrt(magSq); fltVal = 0.0f; } diff --git a/plugins/channelrx/demodatv/atvdemod.h b/plugins/channelrx/demodatv/atvdemod.h index 056c77fd2..22d348392 100644 --- a/plugins/channelrx/demodatv/atvdemod.h +++ b/plugins/channelrx/demodatv/atvdemod.h @@ -29,7 +29,7 @@ #include "dsp/downchannelizer.h" #include "dsp/nco.h" #include "dsp/interpolator.h" -#include "dsp/movingaverage.h" +#include "util/movingaverage.h" #include "dsp/fftfilt.h" #include "dsp/agc.h" #include "dsp/phaselock.h" @@ -234,7 +234,7 @@ public: void setATVScreen(ATVScreenInterface *objScreen); int getSampleRate(); int getEffectiveSampleRate(); - double getMagSq() const { return m_objMagSqAverage.average(); } //!< Beware this is scaled to 2^30 + double getMagSq() const { return m_objMagSqAverage; } //!< Beware this is scaled to 2^30 bool getBFOLocked(); static const QString m_channelIdURI; @@ -457,7 +457,7 @@ private: //*************** RF *************** - MovingAverage m_objMagSqAverage; + MovingAverageUtil m_objMagSqAverage; NCO m_nco; SimplePhaseLock m_bfoPLL; diff --git a/plugins/channelrx/demodatv/atvdemodgui.cpp b/plugins/channelrx/demodatv/atvdemodgui.cpp index 530f9e95f..c794eb420 100644 --- a/plugins/channelrx/demodatv/atvdemodgui.cpp +++ b/plugins/channelrx/demodatv/atvdemodgui.cpp @@ -274,7 +274,6 @@ ATVDemodGUI::ATVDemodGUI(PluginAPI* objPluginAPI, DeviceUISet *deviceUISet, Base m_deviceUISet(deviceUISet), m_channelMarker(this), m_blnDoApplySettings(true), - m_objMagSqAverage(40, 0), m_intTickCount(0), m_inputSampleRate(48000) { @@ -308,8 +307,6 @@ ATVDemodGUI::ATVDemodGUI(PluginAPI* objPluginAPI, DeviceUISet *deviceUISet, Base m_deviceUISet->addChannelMarker(&m_channelMarker); m_deviceUISet->addRollupWidget(this); - m_objMagSqAverage.resize(4, 1.0); - ui->scopeGUI->setBuddies(m_scopeVis->getInputMessageQueue(), m_scopeVis, ui->glScope); resetToDefaults(); // does applySettings() @@ -473,8 +470,8 @@ void ATVDemodGUI::tick() { if (m_atvDemod) { - m_objMagSqAverage.feed(m_atvDemod->getMagSq()); - double magSqDB = CalcDb::dbPower(m_objMagSqAverage.average() / (SDR_RX_SCALED*SDR_RX_SCALED)); + m_objMagSqAverage(m_atvDemod->getMagSq()); + double magSqDB = CalcDb::dbPower(m_objMagSqAverage / (SDR_RX_SCALED*SDR_RX_SCALED)); ui->channePowerText->setText(tr("%1 dB").arg(magSqDB, 0, 'f', 1)); if (m_atvDemod->getBFOLocked()) { diff --git a/plugins/channelrx/demodatv/atvdemodgui.h b/plugins/channelrx/demodatv/atvdemodgui.h index 6c8a19bfa..07defe5cc 100644 --- a/plugins/channelrx/demodatv/atvdemodgui.h +++ b/plugins/channelrx/demodatv/atvdemodgui.h @@ -21,7 +21,7 @@ #include #include "gui/rollupwidget.h" #include "dsp/channelmarker.h" -#include "dsp/movingaverage.h" +#include "util/movingaverage.h" #include "util/messagequeue.h" class PluginAPI; @@ -67,7 +67,7 @@ private: bool m_blnDoApplySettings; - MovingAverage m_objMagSqAverage; + MovingAverageUtil m_objMagSqAverage; int m_intTickCount; ScopeVisNG* m_scopeVis; diff --git a/plugins/channelrx/demodbfm/bfmdemodgui.cpp b/plugins/channelrx/demodbfm/bfmdemodgui.cpp index fdce5b17d..ff1ebcd0b 100644 --- a/plugins/channelrx/demodbfm/bfmdemodgui.cpp +++ b/plugins/channelrx/demodbfm/bfmdemodgui.cpp @@ -330,7 +330,6 @@ BFMDemodGUI::BFMDemodGUI(PluginAPI* pluginAPI, DeviceUISet *deviceUISet, Baseban m_deviceUISet(deviceUISet), m_channelMarker(this), m_rdsTimerCount(0), - m_channelPowerDbAvg(20,0), m_rate(625000) { ui->setupUi(this); @@ -485,10 +484,6 @@ void BFMDemodGUI::tick() ui->channelPower->setText(QString::number(powDbAvg, 'f', 1)); -// Real powDb = CalcDb::dbPower(m_bfmDemod->getMagSq()); -// m_channelPowerDbAvg.feed(powDb); -// ui->channelPower->setText(QString::number(m_channelPowerDbAvg.average(), 'f', 1)); - Real pilotPowDb = CalcDb::dbPower(m_bfmDemod->getPilotLevel()); QString pilotPowDbStr; pilotPowDbStr.sprintf("%+02.1f", pilotPowDb); diff --git a/plugins/channelrx/demodbfm/bfmdemodgui.h b/plugins/channelrx/demodbfm/bfmdemodgui.h index 34cf6baf6..a008bb22b 100644 --- a/plugins/channelrx/demodbfm/bfmdemodgui.h +++ b/plugins/channelrx/demodbfm/bfmdemodgui.h @@ -21,7 +21,6 @@ #include #include "gui/rollupwidget.h" #include "dsp/channelmarker.h" -#include "dsp/movingaverage.h" #include "util/messagequeue.h" #include "bfmdemodsettings.h" @@ -71,7 +70,6 @@ private: SpectrumVis* m_spectrumVis; BFMDemod* m_bfmDemod; - MovingAverage m_channelPowerDbAvg; int m_rate; std::vector m_g14ComboIndex; MessageQueue m_inputMessageQueue; diff --git a/plugins/channelrx/demodbfm/bfmdemodsettings.h b/plugins/channelrx/demodbfm/bfmdemodsettings.h index 363034d6d..b79f6e114 100644 --- a/plugins/channelrx/demodbfm/bfmdemodsettings.h +++ b/plugins/channelrx/demodbfm/bfmdemodsettings.h @@ -17,6 +17,8 @@ #ifndef PLUGINS_CHANNELRX_DEMODBFM_BFMDEMODSETTINGS_H_ #define PLUGINS_CHANNELRX_DEMODBFM_BFMDEMODSETTINGS_H_ +#include "dsp/dsptypes.h" + class Serializable; struct BFMDemodSettings diff --git a/plugins/channelrx/demoddsd/dsddemod.cpp b/plugins/channelrx/demoddsd/dsddemod.cpp index 6f188d37c..e649f9fc8 100644 --- a/plugins/channelrx/demoddsd/dsddemod.cpp +++ b/plugins/channelrx/demoddsd/dsddemod.cpp @@ -51,7 +51,6 @@ DSDDemod::DSDDemod(DeviceSourceAPI *deviceAPI) : m_squelchGate(0), m_squelchLevel(1e-4), m_squelchOpen(false), - m_movingAverage(40, 0), m_fmExcursion(24), m_audioFifo1(48000), m_audioFifo2(48000), @@ -69,7 +68,6 @@ DSDDemod::DSDDemod(DeviceSourceAPI *deviceAPI) : m_sampleBufferIndex = 0; m_scaleFromShort = SDR_RX_SAMP_SZ < sizeof(short)*8 ? 1 : 1<<(SDR_RX_SAMP_SZ - sizeof(short)*8); - m_movingAverage.resize(16, 0); m_magsq = 0.0f; m_magsqSum = 0.0f; m_magsqPeak = 0.0f; @@ -133,7 +131,7 @@ void DSDDemod::feed(const SampleVector::const_iterator& begin, const SampleVecto Real re = ci.real() / SDR_RX_SCALED; Real im = ci.imag() / SDR_RX_SCALED; Real magsq = re*re + im*im; - m_movingAverage.feed(magsq); + m_movingAverage(magsq); m_magsqSum += magsq; @@ -149,7 +147,7 @@ void DSDDemod::feed(const SampleVector::const_iterator& begin, const SampleVecto // AF processing - if (m_movingAverage.average() > m_squelchLevel) + if (m_movingAverage.asDouble() > m_squelchLevel) { if (m_squelchGate > 0) { diff --git a/plugins/channelrx/demoddsd/dsddemod.h b/plugins/channelrx/demoddsd/dsddemod.h index 299703474..2554f4f2a 100644 --- a/plugins/channelrx/demoddsd/dsddemod.h +++ b/plugins/channelrx/demoddsd/dsddemod.h @@ -29,7 +29,7 @@ #include "dsp/lowpass.h" #include "dsp/bandpass.h" #include "dsp/afsquelch.h" -#include "dsp/movingaverage.h" +#include "util/movingaverage.h" #include "dsp/afsquelch.h" #include "audio/audiofifo.h" #include "util/message.h" @@ -175,7 +175,7 @@ private: double m_squelchLevel; bool m_squelchOpen; - MovingAverage m_movingAverage; + MovingAverageUtil m_movingAverage; double m_magsq; double m_magsqSum; double m_magsqPeak; diff --git a/plugins/channelrx/demodnfm/nfmdemod.cpp b/plugins/channelrx/demodnfm/nfmdemod.cpp index c1d2e1a57..96f5a392b 100644 --- a/plugins/channelrx/demodnfm/nfmdemod.cpp +++ b/plugins/channelrx/demodnfm/nfmdemod.cpp @@ -62,7 +62,6 @@ NFMDemod::NFMDemod(DeviceSourceAPI *devieAPI) : m_magsqSum(0.0f), m_magsqPeak(0.0f), m_magsqCount(0), - m_movingAverage(40, 0), m_afSquelch(2, afSqTones), m_fmExcursion(2400), m_audioFifo(48000), @@ -74,7 +73,6 @@ NFMDemod::NFMDemod(DeviceSourceAPI *devieAPI) : m_audioBufferFill = 0; m_agcLevel = 1.0; - m_movingAverage.resize(32, 0); m_ctcssDetector.setCoefficients(3000, 6000.0); // 0.5s / 2 Hz resolution m_afSquelch.setCoefficients(24, 600, 48000.0, 200, 0); // 0.5ms test period, 300ms average span, 48kS/s SR, 100ms attack, no decay @@ -162,7 +160,7 @@ void NFMDemod::feed(const SampleVector::const_iterator& begin, const SampleVecto Real demod = m_phaseDiscri.phaseDiscriminatorDelta(ci, magsqRaw, deviation); Real magsq = magsqRaw / (SDR_RX_SCALED*SDR_RX_SCALED); - m_movingAverage.feed(magsq); + m_movingAverage(magsq); m_magsqSum += magsq; if (magsq > m_magsqPeak) @@ -198,7 +196,7 @@ void NFMDemod::feed(const SampleVector::const_iterator& begin, const SampleVecto } else { - if (m_movingAverage.average() < m_squelchLevel) + if ((Real) m_movingAverage < m_squelchLevel) { if (m_squelchCount > 0) { @@ -464,7 +462,7 @@ void NFMDemod::applySettings(const NFMDemodSettings& settings, bool force) else { // input is a value in centi-Bels m_squelchLevel = std::pow(10.0, settings.m_squelch / 100.0); - m_movingAverage.fill(0.0); + m_movingAverage.reset(); } m_squelchCount = 0; // reset squelch open counter diff --git a/plugins/channelrx/demodnfm/nfmdemod.h b/plugins/channelrx/demodnfm/nfmdemod.h index 060ebfb23..ac5bfeae7 100644 --- a/plugins/channelrx/demodnfm/nfmdemod.h +++ b/plugins/channelrx/demodnfm/nfmdemod.h @@ -33,6 +33,7 @@ #include "dsp/ctcssdetector.h" #include "audio/audiofifo.h" #include "util/message.h" +#include "util/movingaverage.h" #include "nfmdemodsettings.h" @@ -200,7 +201,7 @@ private: Real m_lastArgument; //Complex m_m1Sample; //Complex m_m2Sample; - MovingAverage m_movingAverage; + MovingAverageUtil m_movingAverage; AFSquelch m_afSquelch; Real m_agcLevel; // AGC will aim to this level Real m_agcFloor; // AGC will not go below this level diff --git a/plugins/channelrx/demodwfm/wfmdemod.cpp b/plugins/channelrx/demodwfm/wfmdemod.cpp index 20db5d5fe..f03865caf 100644 --- a/plugins/channelrx/demodwfm/wfmdemod.cpp +++ b/plugins/channelrx/demodwfm/wfmdemod.cpp @@ -47,7 +47,6 @@ WFMDemod::WFMDemod(DeviceSourceAPI* deviceAPI) : m_magsqSum(0.0f), m_magsqPeak(0.0f), m_magsqCount(0), - m_movingAverage(40, 0), m_sampleSink(0), m_audioFifo(250000), m_settingsMutex(QMutex::Recursive) @@ -60,8 +59,6 @@ WFMDemod::WFMDemod(DeviceSourceAPI* deviceAPI) : m_audioBuffer.resize(16384); m_audioBufferFill = 0; - m_movingAverage.resize(16, 0); - DSPEngine::instance()->addAudioSink(&m_audioFifo); m_udpBufferAudio = new UDPSink(this, m_udpBlockSize, m_settings.m_udpPort); @@ -114,7 +111,7 @@ void WFMDemod::feed(const SampleVector::const_iterator& begin, const SampleVecto demod = m_phaseDiscri.phaseDiscriminatorDelta(rf[i], msq, fmDev); Real magsq = msq / (SDR_RX_SCALED*SDR_RX_SCALED); - m_movingAverage.feed(magsq); + m_movingAverage(magsq); m_magsqSum += magsq; if (magsq > m_magsqPeak) @@ -124,7 +121,7 @@ void WFMDemod::feed(const SampleVector::const_iterator& begin, const SampleVecto m_magsqCount++; - if(m_movingAverage.average() >= m_squelchLevel) + if((Real) m_movingAverage >= m_squelchLevel) m_squelchState = m_settings.m_rfBandwidth / 20; // decay rate if (m_squelchState > 0) diff --git a/plugins/channelrx/demodwfm/wfmdemod.h b/plugins/channelrx/demodwfm/wfmdemod.h index 5956cc60d..176c268cd 100644 --- a/plugins/channelrx/demodwfm/wfmdemod.h +++ b/plugins/channelrx/demodwfm/wfmdemod.h @@ -26,7 +26,7 @@ #include "dsp/nco.h" #include "dsp/interpolator.h" #include "dsp/lowpass.h" -#include "dsp/movingaverage.h" +#include "util/movingaverage.h" #include "dsp/fftfilt.h" #include "dsp/phasediscri.h" #include "audio/audiofifo.h" @@ -105,7 +105,7 @@ public: virtual QByteArray serialize() const; virtual bool deserialize(const QByteArray& data); - double getMagSq() const { return m_movingAverage.average(); } + double getMagSq() const { return m_movingAverage.asDouble(); } bool getSquelchOpen() const { return m_squelchOpen; } void getMagSqLevels(double& avg, double& peak, int& nbSamples) @@ -151,7 +151,7 @@ private: int m_magsqCount; Real m_lastArgument; - MovingAverage m_movingAverage; + MovingAverageUtil m_movingAverage; Real m_fmExcursion; AudioVector m_audioBuffer; diff --git a/plugins/channelrx/demodwfm/wfmdemodgui.cpp b/plugins/channelrx/demodwfm/wfmdemodgui.cpp index 37eb3e3aa..3280f8420 100644 --- a/plugins/channelrx/demodwfm/wfmdemodgui.cpp +++ b/plugins/channelrx/demodwfm/wfmdemodgui.cpp @@ -166,8 +166,7 @@ WFMDemodGUI::WFMDemodGUI(PluginAPI* pluginAPI, DeviceUISet *deviceUISet, Baseban m_pluginAPI(pluginAPI), m_deviceUISet(deviceUISet), m_channelMarker(this), - m_basicSettingsShown(false), - m_channelPowerDbAvg(20,0) + m_basicSettingsShown(false) { ui->setupUi(this); setAttribute(Qt::WA_DeleteOnClose, true); @@ -290,10 +289,6 @@ void WFMDemodGUI::enterEvent(QEvent*) void WFMDemodGUI::tick() { -// Real powDb = CalcDb::dbPower(m_wfmDemod->getMagSq()); -// m_channelPowerDbAvg.feed(powDb); -// ui->channelPower->setText(QString::number(m_channelPowerDbAvg.average(), 'f', 1)); - double magsqAvg, magsqPeak; int nbMagsqSamples; m_wfmDemod->getMagSqLevels(magsqAvg, magsqPeak, nbMagsqSamples); diff --git a/plugins/channelrx/demodwfm/wfmdemodgui.h b/plugins/channelrx/demodwfm/wfmdemodgui.h index 7cc526232..a9b85ba32 100644 --- a/plugins/channelrx/demodwfm/wfmdemodgui.h +++ b/plugins/channelrx/demodwfm/wfmdemodgui.h @@ -4,7 +4,6 @@ #include #include "gui/rollupwidget.h" #include "dsp/channelmarker.h" -#include "dsp/movingaverage.h" #include "util/messagequeue.h" #include "wfmdemodsettings.h" @@ -52,7 +51,6 @@ private: bool m_squelchOpen; WFMDemod* m_wfmDemod; - MovingAverage m_channelPowerDbAvg; MessageQueue m_inputMessageQueue; explicit WFMDemodGUI(PluginAPI* pluginAPI, DeviceUISet *deviceUISet, BasebandSampleSink *rxChannel, QWidget* parent = 0); diff --git a/plugins/channelrx/demodwfm/wfmdemodsettings.h b/plugins/channelrx/demodwfm/wfmdemodsettings.h index 7cbaf1f9f..9c643d12b 100644 --- a/plugins/channelrx/demodwfm/wfmdemodsettings.h +++ b/plugins/channelrx/demodwfm/wfmdemodsettings.h @@ -18,6 +18,8 @@ #ifndef PLUGINS_CHANNELRX_DEMODWFM_WFMDEMODSETTINGS_H_ #define PLUGINS_CHANNELRX_DEMODWFM_WFMDEMODSETTINGS_H_ +#include "dsp/dsptypes.h" + class Serializable; struct WFMDemodSettings diff --git a/plugins/channelrx/tcpsrc/tcpsrcgui.cpp b/plugins/channelrx/tcpsrc/tcpsrcgui.cpp index 5e0cc50eb..804b92a33 100644 --- a/plugins/channelrx/tcpsrc/tcpsrcgui.cpp +++ b/plugins/channelrx/tcpsrc/tcpsrcgui.cpp @@ -112,8 +112,8 @@ void TCPSrcGUI::channelMarkerHighlightedByCursor() void TCPSrcGUI::tick() { double powDb = CalcDb::dbPower(m_tcpSrc->getMagSq()); - m_channelPowerDbAvg.feed(powDb); - ui->channelPower->setText(QString::number(m_channelPowerDbAvg.average(), 'f', 1)); + m_channelPowerDbAvg(powDb); + ui->channelPower->setText(QString::number(m_channelPowerDbAvg.asDouble(), 'f', 1)); } TCPSrcGUI::TCPSrcGUI(PluginAPI* pluginAPI, DeviceUISet *deviceUISet, BasebandSampleSink *rxChannel, QWidget* parent) : @@ -123,7 +123,6 @@ TCPSrcGUI::TCPSrcGUI(PluginAPI* pluginAPI, DeviceUISet *deviceUISet, BasebandSam m_deviceUISet(deviceUISet), m_tcpSrc(0), m_channelMarker(this), - m_channelPowerDbAvg(40,0), m_rfBandwidthChanged(false), m_doApplySettings(true) { diff --git a/plugins/channelrx/tcpsrc/tcpsrcgui.h b/plugins/channelrx/tcpsrc/tcpsrcgui.h index ca1dded43..c671a7d80 100644 --- a/plugins/channelrx/tcpsrc/tcpsrcgui.h +++ b/plugins/channelrx/tcpsrc/tcpsrcgui.h @@ -6,7 +6,7 @@ #include "gui/rollupwidget.h" #include "dsp/channelmarker.h" -#include "dsp/movingaverage.h" +#include "util/movingaverage.h" #include "util/messagequeue.h" #include "tcpsrc.h" @@ -49,7 +49,7 @@ private: DeviceUISet* m_deviceUISet; TCPSrc* m_tcpSrc; ChannelMarker m_channelMarker; - MovingAverage m_channelPowerDbAvg; + MovingAverageUtil m_channelPowerDbAvg; // settings TCPSrcSettings m_settings; diff --git a/plugins/channeltx/modam/ammod.cpp b/plugins/channeltx/modam/ammod.cpp index 479eb39c2..9f26df94d 100644 --- a/plugins/channeltx/modam/ammod.cpp +++ b/plugins/channeltx/modam/ammod.cpp @@ -46,8 +46,6 @@ AMMod::AMMod(DeviceSinkAPI *deviceAPI) : m_basebandSampleRate(48000), m_outputSampleRate(48000), m_inputFrequencyOffset(0), - m_movingAverage(40, 0), - m_volumeAGC(40, 0), m_audioFifo(4800), m_settingsMutex(QMutex::Recursive), m_fileSize(0), @@ -63,8 +61,6 @@ AMMod::AMMod(DeviceSinkAPI *deviceAPI) : m_audioBuffer.resize(1<<14); m_audioBufferFill = 0; - m_movingAverage.resize(16, 0); - m_volumeAGC.resize(4096, 0.003, 0); m_magsq = 0.0; m_toneNco.setFreq(1000.0, m_settings.m_audioSampleRate); @@ -131,8 +127,8 @@ void AMMod::pull(Sample& sample) double magsq = ci.real() * ci.real() + ci.imag() * ci.imag(); magsq /= (SDR_TX_SCALED*SDR_TX_SCALED); - m_movingAverage.feed(magsq); - m_magsq = m_movingAverage.average(); + m_movingAverage(magsq); + m_magsq = m_movingAverage.asDouble(); sample.m_real = (FixReal) ci.real(); sample.m_imag = (FixReal) ci.imag(); diff --git a/plugins/channeltx/modam/ammod.h b/plugins/channeltx/modam/ammod.h index 0dc73ac09..1ed8d3651 100644 --- a/plugins/channeltx/modam/ammod.h +++ b/plugins/channeltx/modam/ammod.h @@ -27,7 +27,7 @@ #include "dsp/nco.h" #include "dsp/ncof.h" #include "dsp/interpolator.h" -#include "dsp/movingaverage.h" +#include "util/movingaverage.h" #include "dsp/agc.h" #include "dsp/cwkeyer.h" #include "audio/audiofifo.h" @@ -286,8 +286,7 @@ private: bool m_interpolatorConsumed; double m_magsq; - MovingAverage m_movingAverage; - SimpleAGC m_volumeAGC; + MovingAverageUtil m_movingAverage; AudioVector m_audioBuffer; uint m_audioBufferFill; diff --git a/plugins/channeltx/modam/ammodgui.cpp b/plugins/channeltx/modam/ammodgui.cpp index 277aa38a9..79027a693 100644 --- a/plugins/channeltx/modam/ammodgui.cpp +++ b/plugins/channeltx/modam/ammodgui.cpp @@ -266,7 +266,6 @@ AMModGUI::AMModGUI(PluginAPI* pluginAPI, DeviceUISet *deviceUISet, BasebandSampl m_deviceUISet(deviceUISet), m_channelMarker(this), m_doApplySettings(true), - m_channelPowerDbAvg(20,0), m_recordLength(0), m_recordSampleRate(48000), m_samplesCount(0), @@ -395,8 +394,8 @@ void AMModGUI::enterEvent(QEvent*) void AMModGUI::tick() { double powDb = CalcDb::dbPower(m_amMod->getMagSq()); - m_channelPowerDbAvg.feed(powDb); - ui->channelPower->setText(tr("%1 dB").arg(m_channelPowerDbAvg.average(), 0, 'f', 1)); + m_channelPowerDbAvg(powDb); + ui->channelPower->setText(tr("%1 dB").arg(m_channelPowerDbAvg.asDouble(), 0, 'f', 1)); if (((++m_tickCount & 0xf) == 0) && (m_modAFInput == AMMod::AMModInputFile)) { diff --git a/plugins/channeltx/modam/ammodgui.h b/plugins/channeltx/modam/ammodgui.h index bcfddced8..82b4efbf3 100644 --- a/plugins/channeltx/modam/ammodgui.h +++ b/plugins/channeltx/modam/ammodgui.h @@ -20,7 +20,7 @@ #include #include "gui/rollupwidget.h" #include "dsp/channelmarker.h" -#include "dsp/movingaverage.h" +#include "util/movingaverage.h" #include "util/messagequeue.h" #include "ammod.h" @@ -66,7 +66,7 @@ private: bool m_doApplySettings; AMMod* m_amMod; - MovingAverage m_channelPowerDbAvg; + MovingAverageUtil m_channelPowerDbAvg; QString m_fileName; quint32 m_recordLength; diff --git a/plugins/channeltx/modatv/atvmod.cpp b/plugins/channeltx/modatv/atvmod.cpp index 35dc83fdf..bab9b2b21 100644 --- a/plugins/channeltx/modatv/atvmod.cpp +++ b/plugins/channeltx/modatv/atvmod.cpp @@ -60,7 +60,6 @@ ATVMod::ATVMod(DeviceSinkAPI *deviceAPI) : m_settingsMutex(QMutex::Recursive), m_horizontalCount(0), m_lineCount(0), - m_movingAverage(40, 0), m_imageOK(false), m_videoFPSq(1.0f), m_videoFPSCount(0.0f), @@ -90,8 +89,6 @@ ATVMod::ATVMod(DeviceSinkAPI *deviceAPI) : m_interpolatorDistanceRemain = 0.0f; m_interpolatorDistance = 1.0f; - m_movingAverage.resize(16, 0); - m_channelizer = new UpChannelizer(this); m_threadedChannelizer = new ThreadedBasebandSampleSource(m_channelizer, this); m_deviceAPI->addThreadedSource(m_threadedChannelizer); @@ -165,7 +162,7 @@ void ATVMod::pullFinalize(Complex& ci, Sample& sample) double magsq = ci.real() * ci.real() + ci.imag() * ci.imag(); magsq /= (SDR_TX_SCALED*SDR_TX_SCALED); - m_movingAverage.feed(magsq); + m_movingAverage(magsq); sample.m_real = (FixReal) ci.real(); sample.m_imag = (FixReal) ci.imag(); diff --git a/plugins/channeltx/modatv/atvmod.h b/plugins/channeltx/modatv/atvmod.h index 7045ad66d..ff3c1fab4 100644 --- a/plugins/channeltx/modatv/atvmod.h +++ b/plugins/channeltx/modatv/atvmod.h @@ -31,7 +31,7 @@ #include "channel/channelsourceapi.h" #include "dsp/nco.h" #include "dsp/interpolator.h" -#include "dsp/movingaverage.h" +#include "util/movingaverage.h" #include "dsp/fftfilt.h" #include "util/message.h" @@ -412,7 +412,7 @@ public: virtual bool deserialize(const QByteArray& data); int getEffectiveSampleRate() const { return m_tvSampleRate; }; - double getMagSq() const { return m_movingAverage.average(); } + double getMagSq() const { return m_movingAverage.asDouble(); } void getCameraNumbers(std::vector& numbers); static void getBaseValues(int outputSampleRate, int linesPerSecond, int& sampleRateUnits, uint32_t& nbPointsPerRateUnit); @@ -512,7 +512,7 @@ private: int m_lineCount; //!< current line index in frame float m_fps; //!< resulting frames per second - MovingAverage m_movingAverage; + MovingAverageUtil m_movingAverage; quint32 m_levelCalcCount; Real m_peakLevel; Real m_levelSum; diff --git a/plugins/channeltx/modatv/atvmodgui.cpp b/plugins/channeltx/modatv/atvmodgui.cpp index dea11ae3b..9627c332c 100644 --- a/plugins/channeltx/modatv/atvmodgui.cpp +++ b/plugins/channeltx/modatv/atvmodgui.cpp @@ -586,7 +586,6 @@ ATVModGUI::ATVModGUI(PluginAPI* pluginAPI, DeviceUISet *deviceUISet, BasebandSam m_deviceUISet(deviceUISet), m_channelMarker(this), m_doApplySettings(true), - m_channelPowerDbAvg(20,0), m_videoLength(0), m_videoFrameRate(48000), m_frameCount(0), @@ -741,8 +740,8 @@ void ATVModGUI::enterEvent(QEvent*) void ATVModGUI::tick() { double powDb = CalcDb::dbPower(m_atvMod->getMagSq()); - m_channelPowerDbAvg.feed(powDb); - ui->channelPower->setText(tr("%1 dB").arg(m_channelPowerDbAvg.average(), 0, 'f', 1)); + m_channelPowerDbAvg(powDb); + ui->channelPower->setText(tr("%1 dB").arg(m_channelPowerDbAvg.asDouble(), 0, 'f', 1)); if (((++m_tickCount & 0xf) == 0) && (ui->inputSelect->currentIndex() == (int) ATVModSettings::ATVModInputVideo)) { diff --git a/plugins/channeltx/modatv/atvmodgui.h b/plugins/channeltx/modatv/atvmodgui.h index f89dbb6dc..6d262dca4 100644 --- a/plugins/channeltx/modatv/atvmodgui.h +++ b/plugins/channeltx/modatv/atvmodgui.h @@ -20,7 +20,7 @@ #include #include "gui/rollupwidget.h" #include "dsp/channelmarker.h" -#include "dsp/movingaverage.h" +#include "util/movingaverage.h" #include "util/messagequeue.h" #include "atvmod.h" @@ -65,7 +65,7 @@ private: bool m_doApplySettings; ATVMod* m_atvMod; - MovingAverage m_channelPowerDbAvg; + MovingAverageUtil m_channelPowerDbAvg; QString m_imageFileName; QString m_videoFileName; diff --git a/plugins/channeltx/modnfm/nfmmod.cpp b/plugins/channeltx/modnfm/nfmmod.cpp index 2d49ef740..b6122e13d 100644 --- a/plugins/channeltx/modnfm/nfmmod.cpp +++ b/plugins/channeltx/modnfm/nfmmod.cpp @@ -52,8 +52,6 @@ NFMMod::NFMMod(DeviceSinkAPI *deviceAPI) : m_outputSampleRate(48000), m_inputFrequencyOffset(0), m_modPhasor(0.0f), - m_movingAverage(40, 0), - m_volumeAGC(40, 0), m_audioFifo(4800), m_settingsMutex(QMutex::Recursive), m_fileSize(0), @@ -68,8 +66,6 @@ NFMMod::NFMMod(DeviceSinkAPI *deviceAPI) : m_audioBuffer.resize(1<<14); m_audioBufferFill = 0; - m_movingAverage.resize(16, 0); - m_volumeAGC.resize(4096, 0.003, 0); m_magsq = 0.0; m_toneNco.setFreq(1000.0, m_settings.m_audioSampleRate); @@ -137,8 +133,8 @@ void NFMMod::pull(Sample& sample) double magsq = ci.real() * ci.real() + ci.imag() * ci.imag(); magsq /= (SDR_TX_SCALED*SDR_TX_SCALED); - m_movingAverage.feed(magsq); - m_magsq = m_movingAverage.average(); + m_movingAverage(magsq); + m_magsq = m_movingAverage.asDouble(); sample.m_real = (FixReal) ci.real(); sample.m_imag = (FixReal) ci.imag(); diff --git a/plugins/channeltx/modnfm/nfmmod.h b/plugins/channeltx/modnfm/nfmmod.h index 6725c56d5..76815e08d 100644 --- a/plugins/channeltx/modnfm/nfmmod.h +++ b/plugins/channeltx/modnfm/nfmmod.h @@ -29,7 +29,7 @@ #include "dsp/interpolator.h" #include "dsp/lowpass.h" #include "dsp/bandpass.h" -#include "dsp/movingaverage.h" +#include "util/movingaverage.h" #include "dsp/agc.h" #include "dsp/cwkeyer.h" #include "audio/audiofifo.h" @@ -281,8 +281,7 @@ private: Bandpass m_bandpass; double m_magsq; - MovingAverage m_movingAverage; - SimpleAGC m_volumeAGC; + MovingAverageUtil m_movingAverage; AudioVector m_audioBuffer; uint m_audioBufferFill; diff --git a/plugins/channeltx/modnfm/nfmmodgui.cpp b/plugins/channeltx/modnfm/nfmmodgui.cpp index a52eaa9d5..7d4553a67 100644 --- a/plugins/channeltx/modnfm/nfmmodgui.cpp +++ b/plugins/channeltx/modnfm/nfmmodgui.cpp @@ -294,7 +294,6 @@ NFMModGUI::NFMModGUI(PluginAPI* pluginAPI, DeviceUISet *deviceUISet, BasebandSam m_deviceUISet(deviceUISet), m_channelMarker(this), m_doApplySettings(true), - m_channelPowerDbAvg(20,0), m_recordLength(0), m_recordSampleRate(48000), m_samplesCount(0), @@ -450,8 +449,8 @@ void NFMModGUI::enterEvent(QEvent*) void NFMModGUI::tick() { double powDb = CalcDb::dbPower(m_nfmMod->getMagSq()); - m_channelPowerDbAvg.feed(powDb); - ui->channelPower->setText(tr("%1 dB").arg(m_channelPowerDbAvg.average(), 0, 'f', 1)); + m_channelPowerDbAvg(powDb); + ui->channelPower->setText(tr("%1 dB").arg(m_channelPowerDbAvg.asDouble(), 0, 'f', 1)); if (((++m_tickCount & 0xf) == 0) && (m_settings.m_modAFInput == NFMModSettings::NFMModInputFile)) { diff --git a/plugins/channeltx/modnfm/nfmmodgui.h b/plugins/channeltx/modnfm/nfmmodgui.h index aba5c6bbf..d07a7b1a0 100644 --- a/plugins/channeltx/modnfm/nfmmodgui.h +++ b/plugins/channeltx/modnfm/nfmmodgui.h @@ -20,7 +20,7 @@ #include #include "gui/rollupwidget.h" #include "dsp/channelmarker.h" -#include "dsp/movingaverage.h" +#include "util/movingaverage.h" #include "util/messagequeue.h" #include "nfmmod.h" @@ -64,7 +64,7 @@ private: bool m_doApplySettings; NFMMod* m_nfmMod; - MovingAverage m_channelPowerDbAvg; + MovingAverageUtil m_channelPowerDbAvg; QString m_fileName; quint32 m_recordLength; diff --git a/plugins/channeltx/modssb/ssbmod.cpp b/plugins/channeltx/modssb/ssbmod.cpp index 662abc634..57685f8ce 100644 --- a/plugins/channeltx/modssb/ssbmod.cpp +++ b/plugins/channeltx/modssb/ssbmod.cpp @@ -55,7 +55,6 @@ SSBMod::SSBMod(DeviceSinkAPI *deviceAPI) : m_SSBFilterBufferIndex(0), m_DSBFilterBufferIndex(0), m_sampleSink(0), - m_movingAverage(40, 0), m_audioFifo(4800), m_settingsMutex(QMutex::Recursive), m_fileSize(0), @@ -84,7 +83,6 @@ SSBMod::SSBMod(DeviceSinkAPI *deviceAPI) : m_undersampleCount = 0; m_sumCount = 0; - m_movingAverage.resize(16, 0); m_magsq = 0.0; m_toneNco.setFreq(1000.0, m_settings.m_audioSampleRate); @@ -166,8 +164,8 @@ void SSBMod::pull(Sample& sample) double magsq = ci.real() * ci.real() + ci.imag() * ci.imag(); magsq /= (SDR_TX_SCALED*SDR_TX_SCALED); - m_movingAverage.feed(magsq); - m_magsq = m_movingAverage.average(); + m_movingAverage(magsq); + m_magsq = m_movingAverage.asDouble(); sample.m_real = (FixReal) ci.real(); sample.m_imag = (FixReal) ci.imag(); diff --git a/plugins/channeltx/modssb/ssbmod.h b/plugins/channeltx/modssb/ssbmod.h index 79c2fe620..3929813a7 100644 --- a/plugins/channeltx/modssb/ssbmod.h +++ b/plugins/channeltx/modssb/ssbmod.h @@ -27,7 +27,7 @@ #include "dsp/basebandsamplesink.h" #include "dsp/ncof.h" #include "dsp/interpolator.h" -#include "dsp/movingaverage.h" +#include "util/movingaverage.h" #include "dsp/agc.h" #include "dsp/fftfilt.h" #include "dsp/cwkeyer.h" @@ -303,7 +303,7 @@ private: int m_sumCount; double m_magsq; - MovingAverage m_movingAverage; + MovingAverageUtil m_movingAverage; AudioVector m_audioBuffer; uint m_audioBufferFill; diff --git a/plugins/channeltx/modssb/ssbmodgui.cpp b/plugins/channeltx/modssb/ssbmodgui.cpp index 3f093e40e..2ad877ce9 100644 --- a/plugins/channeltx/modssb/ssbmodgui.cpp +++ b/plugins/channeltx/modssb/ssbmodgui.cpp @@ -352,7 +352,6 @@ SSBModGUI::SSBModGUI(PluginAPI* pluginAPI, DeviceUISet *deviceUISet, BasebandSam m_channelMarker(this), m_doApplySettings(true), m_spectrumRate(6000), - m_channelPowerDbAvg(20,0), m_recordLength(0), m_recordSampleRate(48000), m_samplesCount(0), @@ -672,8 +671,8 @@ void SSBModGUI::enterEvent(QEvent*) void SSBModGUI::tick() { double powDb = CalcDb::dbPower(m_ssbMod->getMagSq()); - m_channelPowerDbAvg.feed(powDb); - ui->channelPower->setText(tr("%1 dB").arg(m_channelPowerDbAvg.average(), 0, 'f', 1)); + m_channelPowerDbAvg(powDb); + ui->channelPower->setText(tr("%1 dB").arg(m_channelPowerDbAvg.asDouble(), 0, 'f', 1)); if (((++m_tickCount & 0xf) == 0) && (m_modAFInput == SSBMod::SSBModInputFile)) { diff --git a/plugins/channeltx/modssb/ssbmodgui.h b/plugins/channeltx/modssb/ssbmodgui.h index ca27ab9d1..55ba7360c 100644 --- a/plugins/channeltx/modssb/ssbmodgui.h +++ b/plugins/channeltx/modssb/ssbmodgui.h @@ -22,7 +22,7 @@ #include #include "gui/rollupwidget.h" #include "dsp/channelmarker.h" -#include "dsp/movingaverage.h" +#include "util/movingaverage.h" #include "util/messagequeue.h" #include "ssbmod.h" @@ -69,7 +69,7 @@ private: SpectrumVis* m_spectrumVis; SSBMod* m_ssbMod; - MovingAverage m_channelPowerDbAvg; + MovingAverageUtil m_channelPowerDbAvg; QString m_fileName; quint32 m_recordLength; diff --git a/plugins/channeltx/modwfm/wfmmod.cpp b/plugins/channeltx/modwfm/wfmmod.cpp index 87bf31fc6..b9aa3ee09 100644 --- a/plugins/channeltx/modwfm/wfmmod.cpp +++ b/plugins/channeltx/modwfm/wfmmod.cpp @@ -51,8 +51,6 @@ WFMMod::WFMMod(DeviceSinkAPI *deviceAPI) : m_outputSampleRate(384000), m_inputFrequencyOffset(0), m_modPhasor(0.0f), - m_movingAverage(40, 0), - m_volumeAGC(40, 0), m_audioFifo(4800), m_settingsMutex(QMutex::Recursive), m_fileSize(0), @@ -73,8 +71,6 @@ WFMMod::WFMMod(DeviceSinkAPI *deviceAPI) : m_audioBuffer.resize(1<<14); m_audioBufferFill = 0; - m_movingAverage.resize(16, 0); - m_volumeAGC.resize(4096, 0.003, 0); m_magsq = 0.0; m_toneNco.setFreq(1000.0, m_settings.m_audioSampleRate); @@ -159,8 +155,8 @@ void WFMMod::pull(Sample& sample) double magsq = ci.real() * ci.real() + ci.imag() * ci.imag(); magsq /= (SDR_TX_SCALED*SDR_TX_SCALED); - m_movingAverage.feed(magsq); - m_magsq = m_movingAverage.average(); + m_movingAverage(magsq); + m_magsq = m_movingAverage.asDouble(); sample.m_real = (FixReal) ci.real(); sample.m_imag = (FixReal) ci.imag(); diff --git a/plugins/channeltx/modwfm/wfmmod.h b/plugins/channeltx/modwfm/wfmmod.h index baf6e08a1..b324c79dc 100644 --- a/plugins/channeltx/modwfm/wfmmod.h +++ b/plugins/channeltx/modwfm/wfmmod.h @@ -28,7 +28,7 @@ #include "dsp/ncof.h" #include "dsp/interpolator.h" #include "dsp/fftfilt.h" -#include "dsp/movingaverage.h" +#include "util/movingaverage.h" #include "dsp/agc.h" #include "dsp/cwkeyer.h" #include "audio/audiofifo.h" @@ -294,8 +294,7 @@ private: int m_rfFilterBufferIndex; double m_magsq; - MovingAverage m_movingAverage; - SimpleAGC m_volumeAGC; + MovingAverageUtil m_movingAverage; AudioVector m_audioBuffer; uint m_audioBufferFill; diff --git a/plugins/channeltx/modwfm/wfmmodgui.cpp b/plugins/channeltx/modwfm/wfmmodgui.cpp index 777e66a17..d6a62b91a 100644 --- a/plugins/channeltx/modwfm/wfmmodgui.cpp +++ b/plugins/channeltx/modwfm/wfmmodgui.cpp @@ -272,7 +272,6 @@ WFMModGUI::WFMModGUI(PluginAPI* pluginAPI, DeviceUISet *deviceUISet, BasebandSam m_deviceUISet(deviceUISet), m_channelMarker(this), m_doApplySettings(true), - m_channelPowerDbAvg(20,0), m_recordLength(0), m_recordSampleRate(48000), m_samplesCount(0), @@ -415,8 +414,8 @@ void WFMModGUI::enterEvent(QEvent*) void WFMModGUI::tick() { double powDb = CalcDb::dbPower(m_wfmMod->getMagSq()); - m_channelPowerDbAvg.feed(powDb); - ui->channelPower->setText(tr("%1 dB").arg(m_channelPowerDbAvg.average(), 0, 'f', 1)); + m_channelPowerDbAvg(powDb); + ui->channelPower->setText(tr("%1 dB").arg(m_channelPowerDbAvg.asDouble(), 0, 'f', 1)); if (((++m_tickCount & 0xf) == 0) && (m_modAFInput == WFMMod::WFMModInputFile)) { diff --git a/plugins/channeltx/modwfm/wfmmodgui.h b/plugins/channeltx/modwfm/wfmmodgui.h index ab3502d7a..aca95366b 100644 --- a/plugins/channeltx/modwfm/wfmmodgui.h +++ b/plugins/channeltx/modwfm/wfmmodgui.h @@ -20,7 +20,7 @@ #include #include "gui/rollupwidget.h" #include "dsp/channelmarker.h" -#include "dsp/movingaverage.h" +#include "util/movingaverage.h" #include "util/messagequeue.h" #include "wfmmod.h" @@ -68,7 +68,7 @@ private: // ThreadedBasebandSampleSource* m_threadedChannelizer; // UpChannelizer* m_channelizer; WFMMod* m_wfmMod; - MovingAverage m_channelPowerDbAvg; + MovingAverageUtil m_channelPowerDbAvg; QString m_fileName; quint32 m_recordLength; diff --git a/plugins/channeltx/udpsink/udpsinkgui.cpp b/plugins/channeltx/udpsink/udpsinkgui.cpp index 36ef4dbbf..f6e01794c 100644 --- a/plugins/channeltx/udpsink/udpsinkgui.cpp +++ b/plugins/channeltx/udpsink/udpsinkgui.cpp @@ -107,8 +107,6 @@ UDPSinkGUI::UDPSinkGUI(PluginAPI* pluginAPI, DeviceUISet *deviceUISet, BasebandS ui(new Ui::UDPSinkGUI), m_pluginAPI(pluginAPI), m_deviceUISet(deviceUISet), - m_channelPowerAvg(4, 1e-10), - m_inPowerAvg(4, 1e-10), m_tickCount(0), m_channelMarker(this), m_rfBandwidthChanged(false), @@ -454,14 +452,14 @@ void UDPSinkGUI::enterEvent(QEvent*) void UDPSinkGUI::tick() { - m_channelPowerAvg.feed(m_udpSink->getMagSq()); - m_inPowerAvg.feed(m_udpSink->getInMagSq()); + m_channelPowerAvg(m_udpSink->getMagSq()); + m_inPowerAvg(m_udpSink->getInMagSq()); if (m_tickCount % 4 == 0) { - double powDb = CalcDb::dbPower(m_channelPowerAvg.average()); + double powDb = CalcDb::dbPower(m_channelPowerAvg.asDouble()); ui->channelPower->setText(tr("%1 dB").arg(powDb, 0, 'f', 1)); - double inPowDb = CalcDb::dbPower(m_inPowerAvg.average()); + double inPowDb = CalcDb::dbPower(m_inPowerAvg.asDouble()); ui->inputPower->setText(tr("%1").arg(inPowDb, 0, 'f', 1)); } diff --git a/plugins/channeltx/udpsink/udpsinkgui.h b/plugins/channeltx/udpsink/udpsinkgui.h index 6fc476910..c70001189 100644 --- a/plugins/channeltx/udpsink/udpsinkgui.h +++ b/plugins/channeltx/udpsink/udpsinkgui.h @@ -23,6 +23,7 @@ #include "gui/rollupwidget.h" #include "dsp/channelmarker.h" #include "util/messagequeue.h" +#include "util/movingaverage.h" #include "udpsink.h" #include "udpsinksettings.h" @@ -62,8 +63,8 @@ private: DeviceUISet* m_deviceUISet; SpectrumVis* m_spectrumVis; UDPSink* m_udpSink; - MovingAverage m_channelPowerAvg; - MovingAverage m_inPowerAvg; + MovingAverageUtil m_channelPowerAvg; + MovingAverageUtil m_inPowerAvg; uint32_t m_tickCount; ChannelMarker m_channelMarker; diff --git a/sdrbase/util/movingaverage.h b/sdrbase/util/movingaverage.h index 08cc7a77d..326921526 100644 --- a/sdrbase/util/movingaverage.h +++ b/sdrbase/util/movingaverage.h @@ -32,6 +32,13 @@ class MovingAverageUtil : m_num_samples(0), m_index(0), m_total(0) { } + void reset() + { + m_num_samples = 0; + m_index = 0; + m_total = 0; + } + void operator()(T sample) { if (m_num_samples < N) // fill up @@ -42,14 +49,14 @@ class MovingAverageUtil else // roll { T& oldest = m_samples[m_index]; - m_index = (m_index + 1) % N; m_total += sample - oldest; oldest = sample; + m_index = (m_index + 1) % N; } } - operator double() const { return m_num_samples > 0 ? m_total / std::min(m_num_samples, N) : 0.0d; } - operator float() const { return m_num_samples > 0 ? m_total / std::min(m_num_samples, N) : 0.0f; } + double asDouble() const { return m_total / N; } + float asFloat() const { return m_total / N; } operator T() const { return m_total / N; } private: