1
0
mirror of https://github.com/f4exb/sdrangel.git synced 2024-11-22 16:08:39 -05:00

Moving average cleanup

This commit is contained in:
f4exb 2018-02-03 10:33:02 +01:00
parent 4cd6d5bd6e
commit b0a97510e2
47 changed files with 108 additions and 152 deletions

View File

@ -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);

View File

@ -20,7 +20,8 @@
#include <plugin/plugininstancegui.h>
#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<Real> m_channelPowerDbAvg;
MovingAverageUtil<Real, double, 40> m_channelPowerDbAvg;
ChannelAnalyzer* m_channelAnalyzer;
SpectrumScopeComboVis* m_spectrumScopeComboVis;

View File

@ -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);

View File

@ -20,7 +20,8 @@
#include <plugin/plugininstancegui.h>
#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<double> m_channelPowerDbAvg;
MovingAverageUtil<Real, double, 40> m_channelPowerDbAvg;
ChannelAnalyzerNG* m_channelAnalyzer;
SpectrumScopeNGComboVis* m_spectrumScopeComboVis;

View File

@ -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;

View File

@ -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<double> m_movingAverage;
MovingAverageUtil<Real, double, 16> m_movingAverage;
SimpleAGC m_volumeAGC;
Bandpass<Real> 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)

View File

@ -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;
}

View File

@ -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<double> m_objMagSqAverage;
MovingAverageUtil<double, double, 32> m_objMagSqAverage;
NCO m_nco;
SimplePhaseLock m_bfoPLL;

View File

@ -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()) {

View File

@ -21,7 +21,7 @@
#include <plugin/plugininstancegui.h>
#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<double> m_objMagSqAverage;
MovingAverageUtil<double, double, 4> m_objMagSqAverage;
int m_intTickCount;
ScopeVisNG* m_scopeVis;

View File

@ -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);

View File

@ -21,7 +21,6 @@
#include <plugin/plugininstancegui.h>
#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<double> m_channelPowerDbAvg;
int m_rate;
std::vector<unsigned int> m_g14ComboIndex;
MessageQueue m_inputMessageQueue;

View File

@ -17,6 +17,8 @@
#ifndef PLUGINS_CHANNELRX_DEMODBFM_BFMDEMODSETTINGS_H_
#define PLUGINS_CHANNELRX_DEMODBFM_BFMDEMODSETTINGS_H_
#include "dsp/dsptypes.h"
class Serializable;
struct BFMDemodSettings

View File

@ -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)
{

View File

@ -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<double> m_movingAverage;
MovingAverageUtil<Real, double, 16> m_movingAverage;
double m_magsq;
double m_magsqSum;
double m_magsqPeak;

View File

@ -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

View File

@ -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<double> m_movingAverage;
MovingAverageUtil<Real, double, 32> m_movingAverage;
AFSquelch m_afSquelch;
Real m_agcLevel; // AGC will aim to this level
Real m_agcFloor; // AGC will not go below this level

View File

@ -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<qint16>(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)

View File

@ -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<double> m_movingAverage;
MovingAverageUtil<Real, double, 16> m_movingAverage;
Real m_fmExcursion;
AudioVector m_audioBuffer;

View File

@ -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);

View File

@ -4,7 +4,6 @@
#include <plugin/plugininstancegui.h>
#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<double> m_channelPowerDbAvg;
MessageQueue m_inputMessageQueue;
explicit WFMDemodGUI(PluginAPI* pluginAPI, DeviceUISet *deviceUISet, BasebandSampleSink *rxChannel, QWidget* parent = 0);

View File

@ -18,6 +18,8 @@
#ifndef PLUGINS_CHANNELRX_DEMODWFM_WFMDEMODSETTINGS_H_
#define PLUGINS_CHANNELRX_DEMODWFM_WFMDEMODSETTINGS_H_
#include "dsp/dsptypes.h"
class Serializable;
struct WFMDemodSettings

View File

@ -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)
{

View File

@ -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<double> m_channelPowerDbAvg;
MovingAverageUtil<Real, double, 40> m_channelPowerDbAvg;
// settings
TCPSrcSettings m_settings;

View File

@ -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();

View File

@ -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<double> m_movingAverage;
SimpleAGC m_volumeAGC;
MovingAverageUtil<double, double, 16> m_movingAverage;
AudioVector m_audioBuffer;
uint m_audioBufferFill;

View File

@ -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))
{

View File

@ -20,7 +20,7 @@
#include <plugin/plugininstancegui.h>
#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<double> m_channelPowerDbAvg;
MovingAverageUtil<double, double, 20> m_channelPowerDbAvg;
QString m_fileName;
quint32 m_recordLength;

View File

@ -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();

View File

@ -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<int>& 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<double> m_movingAverage;
MovingAverageUtil<double, double, 16> m_movingAverage;
quint32 m_levelCalcCount;
Real m_peakLevel;
Real m_levelSum;

View File

@ -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))
{

View File

@ -20,7 +20,7 @@
#include <plugin/plugininstancegui.h>
#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<double> m_channelPowerDbAvg;
MovingAverageUtil<double, double, 20> m_channelPowerDbAvg;
QString m_imageFileName;
QString m_videoFileName;

View File

@ -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();

View File

@ -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<Real> m_bandpass;
double m_magsq;
MovingAverage<double> m_movingAverage;
SimpleAGC m_volumeAGC;
MovingAverageUtil<double, double, 16> m_movingAverage;
AudioVector m_audioBuffer;
uint m_audioBufferFill;

View File

@ -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))
{

View File

@ -20,7 +20,7 @@
#include <plugin/plugininstancegui.h>
#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<double> m_channelPowerDbAvg;
MovingAverageUtil<double, double, 20> m_channelPowerDbAvg;
QString m_fileName;
quint32 m_recordLength;

View File

@ -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();

View File

@ -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<double> m_movingAverage;
MovingAverageUtil<double, double, 16> m_movingAverage;
AudioVector m_audioBuffer;
uint m_audioBufferFill;

View File

@ -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))
{

View File

@ -22,7 +22,7 @@
#include <plugin/plugininstancegui.h>
#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<double> m_channelPowerDbAvg;
MovingAverageUtil<double, double, 20> m_channelPowerDbAvg;
QString m_fileName;
quint32 m_recordLength;

View File

@ -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();

View File

@ -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<double> m_movingAverage;
SimpleAGC m_volumeAGC;
MovingAverageUtil<double, double, 16> m_movingAverage;
AudioVector m_audioBuffer;
uint m_audioBufferFill;

View File

@ -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))
{

View File

@ -20,7 +20,7 @@
#include <plugin/plugininstancegui.h>
#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<double> m_channelPowerDbAvg;
MovingAverageUtil<double, double, 20> m_channelPowerDbAvg;
QString m_fileName;
quint32 m_recordLength;

View File

@ -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));
}

View File

@ -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<double> m_channelPowerAvg;
MovingAverage<double> m_inPowerAvg;
MovingAverageUtil<double, double, 4> m_channelPowerAvg;
MovingAverageUtil<double, double, 4> m_inPowerAvg;
uint32_t m_tickCount;
ChannelMarker m_channelMarker;

View File

@ -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: