mirror of
https://github.com/f4exb/sdrangel.git
synced 2024-11-23 00:18:37 -05:00
Moving average cleanup
This commit is contained in:
parent
4cd6d5bd6e
commit
b0a97510e2
@ -196,8 +196,8 @@ void ChannelAnalyzerGUI::channelMarkerHighlightedByCursor()
|
|||||||
void ChannelAnalyzerGUI::tick()
|
void ChannelAnalyzerGUI::tick()
|
||||||
{
|
{
|
||||||
Real powDb = CalcDb::dbPower(m_channelAnalyzer->getMagSq());
|
Real powDb = CalcDb::dbPower(m_channelAnalyzer->getMagSq());
|
||||||
m_channelPowerDbAvg.feed(powDb);
|
m_channelPowerDbAvg(powDb);
|
||||||
ui->channelPower->setText(QString::number(m_channelPowerDbAvg.average(), 'f', 1));
|
ui->channelPower->setText(QString::number((Real) m_channelPowerDbAvg, 'f', 1));
|
||||||
}
|
}
|
||||||
|
|
||||||
void ChannelAnalyzerGUI::on_deltaMinus_toggled(bool minus)
|
void ChannelAnalyzerGUI::on_deltaMinus_toggled(bool minus)
|
||||||
@ -331,8 +331,7 @@ ChannelAnalyzerGUI::ChannelAnalyzerGUI(PluginAPI* pluginAPI, DeviceUISet *device
|
|||||||
m_channelMarker(this),
|
m_channelMarker(this),
|
||||||
m_doApplySettings(true),
|
m_doApplySettings(true),
|
||||||
m_rate(6000),
|
m_rate(6000),
|
||||||
m_spanLog2(3),
|
m_spanLog2(3)
|
||||||
m_channelPowerDbAvg(40,0)
|
|
||||||
{
|
{
|
||||||
ui->setupUi(this);
|
ui->setupUi(this);
|
||||||
setAttribute(Qt::WA_DeleteOnClose, true);
|
setAttribute(Qt::WA_DeleteOnClose, true);
|
||||||
|
@ -20,7 +20,8 @@
|
|||||||
#include <plugin/plugininstancegui.h>
|
#include <plugin/plugininstancegui.h>
|
||||||
#include "gui/rollupwidget.h"
|
#include "gui/rollupwidget.h"
|
||||||
#include "dsp/channelmarker.h"
|
#include "dsp/channelmarker.h"
|
||||||
#include "dsp/movingaverage.h"
|
#include "dsp/dsptypes.h"
|
||||||
|
#include "util/movingaverage.h"
|
||||||
#include "util/messagequeue.h"
|
#include "util/messagequeue.h"
|
||||||
|
|
||||||
class PluginAPI;
|
class PluginAPI;
|
||||||
@ -65,7 +66,7 @@ private:
|
|||||||
bool m_doApplySettings;
|
bool m_doApplySettings;
|
||||||
int m_rate;
|
int m_rate;
|
||||||
int m_spanLog2;
|
int m_spanLog2;
|
||||||
MovingAverage<Real> m_channelPowerDbAvg;
|
MovingAverageUtil<Real, double, 40> m_channelPowerDbAvg;
|
||||||
|
|
||||||
ChannelAnalyzer* m_channelAnalyzer;
|
ChannelAnalyzer* m_channelAnalyzer;
|
||||||
SpectrumScopeComboVis* m_spectrumScopeComboVis;
|
SpectrumScopeComboVis* m_spectrumScopeComboVis;
|
||||||
|
@ -235,8 +235,8 @@ void ChannelAnalyzerNGGUI::channelMarkerHighlightedByCursor()
|
|||||||
void ChannelAnalyzerNGGUI::tick()
|
void ChannelAnalyzerNGGUI::tick()
|
||||||
{
|
{
|
||||||
double powDb = CalcDb::dbPower(m_channelAnalyzer->getMagSq());
|
double powDb = CalcDb::dbPower(m_channelAnalyzer->getMagSq());
|
||||||
m_channelPowerDbAvg.feed(powDb);
|
m_channelPowerDbAvg(powDb);
|
||||||
ui->channelPower->setText(tr("%1 dB").arg(m_channelPowerDbAvg.average(), 0, 'f', 1));
|
ui->channelPower->setText(tr("%1 dB").arg((Real) m_channelPowerDbAvg, 0, 'f', 1));
|
||||||
}
|
}
|
||||||
|
|
||||||
void ChannelAnalyzerNGGUI::on_channelSampleRate_changed(quint64 value)
|
void ChannelAnalyzerNGGUI::on_channelSampleRate_changed(quint64 value)
|
||||||
@ -388,8 +388,7 @@ ChannelAnalyzerNGGUI::ChannelAnalyzerNGGUI(PluginAPI* pluginAPI, DeviceUISet *de
|
|||||||
m_channelMarker(this),
|
m_channelMarker(this),
|
||||||
m_doApplySettings(true),
|
m_doApplySettings(true),
|
||||||
m_rate(6000),
|
m_rate(6000),
|
||||||
m_spanLog2(0),
|
m_spanLog2(0)
|
||||||
m_channelPowerDbAvg(40,0)
|
|
||||||
{
|
{
|
||||||
ui->setupUi(this);
|
ui->setupUi(this);
|
||||||
setAttribute(Qt::WA_DeleteOnClose, true);
|
setAttribute(Qt::WA_DeleteOnClose, true);
|
||||||
|
@ -20,7 +20,8 @@
|
|||||||
#include <plugin/plugininstancegui.h>
|
#include <plugin/plugininstancegui.h>
|
||||||
#include "gui/rollupwidget.h"
|
#include "gui/rollupwidget.h"
|
||||||
#include "dsp/channelmarker.h"
|
#include "dsp/channelmarker.h"
|
||||||
#include "dsp/movingaverage.h"
|
#include "dsp/dsptypes.h"
|
||||||
|
#include "util/movingaverage.h"
|
||||||
#include "util/messagequeue.h"
|
#include "util/messagequeue.h"
|
||||||
|
|
||||||
class PluginAPI;
|
class PluginAPI;
|
||||||
@ -65,7 +66,7 @@ private:
|
|||||||
bool m_doApplySettings;
|
bool m_doApplySettings;
|
||||||
int m_rate; //!< sample rate after final in-channel decimation (spanlog2)
|
int m_rate; //!< sample rate after final in-channel decimation (spanlog2)
|
||||||
int m_spanLog2;
|
int m_spanLog2;
|
||||||
MovingAverage<double> m_channelPowerDbAvg;
|
MovingAverageUtil<Real, double, 40> m_channelPowerDbAvg;
|
||||||
|
|
||||||
ChannelAnalyzerNG* m_channelAnalyzer;
|
ChannelAnalyzerNG* m_channelAnalyzer;
|
||||||
SpectrumScopeNGComboVis* m_spectrumScopeComboVis;
|
SpectrumScopeNGComboVis* m_spectrumScopeComboVis;
|
||||||
|
@ -45,7 +45,6 @@ AMDemod::AMDemod(DeviceSourceAPI *deviceAPI) :
|
|||||||
m_magsqSum(0.0f),
|
m_magsqSum(0.0f),
|
||||||
m_magsqPeak(0.0f),
|
m_magsqPeak(0.0f),
|
||||||
m_magsqCount(0),
|
m_magsqCount(0),
|
||||||
m_movingAverage(40, 0),
|
|
||||||
m_volumeAGC(1200, 1.0),
|
m_volumeAGC(1200, 1.0),
|
||||||
m_audioFifo(48000),
|
m_audioFifo(48000),
|
||||||
m_settingsMutex(QMutex::Recursive)
|
m_settingsMutex(QMutex::Recursive)
|
||||||
@ -55,7 +54,6 @@ AMDemod::AMDemod(DeviceSourceAPI *deviceAPI) :
|
|||||||
m_audioBuffer.resize(1<<14);
|
m_audioBuffer.resize(1<<14);
|
||||||
m_audioBufferFill = 0;
|
m_audioBufferFill = 0;
|
||||||
|
|
||||||
m_movingAverage.resize(16, 0);
|
|
||||||
m_volumeAGC.resize(4096, 0.003, 0);
|
m_volumeAGC.resize(4096, 0.003, 0);
|
||||||
m_magsq = 0.0;
|
m_magsq = 0.0;
|
||||||
|
|
||||||
|
@ -24,7 +24,7 @@
|
|||||||
#include "channel/channelsinkapi.h"
|
#include "channel/channelsinkapi.h"
|
||||||
#include "dsp/nco.h"
|
#include "dsp/nco.h"
|
||||||
#include "dsp/interpolator.h"
|
#include "dsp/interpolator.h"
|
||||||
#include "dsp/movingaverage.h"
|
#include "util/movingaverage.h"
|
||||||
#include "dsp/agc.h"
|
#include "dsp/agc.h"
|
||||||
#include "dsp/bandpass.h"
|
#include "dsp/bandpass.h"
|
||||||
#include "audio/audiofifo.h"
|
#include "audio/audiofifo.h"
|
||||||
@ -143,7 +143,7 @@ private:
|
|||||||
double m_magsqPeak;
|
double m_magsqPeak;
|
||||||
int m_magsqCount;
|
int m_magsqCount;
|
||||||
|
|
||||||
MovingAverage<double> m_movingAverage;
|
MovingAverageUtil<Real, double, 16> m_movingAverage;
|
||||||
SimpleAGC m_volumeAGC;
|
SimpleAGC m_volumeAGC;
|
||||||
Bandpass<Real> m_bandpass;
|
Bandpass<Real> m_bandpass;
|
||||||
|
|
||||||
@ -164,8 +164,8 @@ private:
|
|||||||
Real re = ci.real() / SDR_RX_SCALED;
|
Real re = ci.real() / SDR_RX_SCALED;
|
||||||
Real im = ci.imag() / SDR_RX_SCALED;
|
Real im = ci.imag() / SDR_RX_SCALED;
|
||||||
Real magsq = re*re + im*im;
|
Real magsq = re*re + im*im;
|
||||||
m_movingAverage.feed(magsq);
|
m_movingAverage(magsq);
|
||||||
m_magsq = m_movingAverage.average();
|
m_magsq = m_movingAverage.asDouble();
|
||||||
m_magsqSum += magsq;
|
m_magsqSum += magsq;
|
||||||
|
|
||||||
if (magsq > m_magsqPeak)
|
if (magsq > m_magsqPeak)
|
||||||
|
@ -60,7 +60,6 @@ ATVDemod::ATVDemod(DeviceSourceAPI *deviceAPI) :
|
|||||||
m_intRowIndex(0),
|
m_intRowIndex(0),
|
||||||
m_intLineIndex(0),
|
m_intLineIndex(0),
|
||||||
m_objAvgColIndex(3),
|
m_objAvgColIndex(3),
|
||||||
m_objMagSqAverage(40, 0),
|
|
||||||
m_bfoPLL(200/1000000, 100/1000000, 0.01),
|
m_bfoPLL(200/1000000, 100/1000000, 0.01),
|
||||||
m_bfoFilter(200.0, 1000000.0, 0.9),
|
m_bfoFilter(200.0, 1000000.0, 0.9),
|
||||||
m_interpolatorDistance(1.0f),
|
m_interpolatorDistance(1.0f),
|
||||||
@ -78,8 +77,6 @@ ATVDemod::ATVDemod(DeviceSourceAPI *deviceAPI) :
|
|||||||
m_intNumberOfLines=0;
|
m_intNumberOfLines=0;
|
||||||
m_interleaved = true;
|
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_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];
|
m_DSBFilterBuffer = new Complex[m_ssbFftLen];
|
||||||
memset(m_DSBFilterBuffer, 0, sizeof(Complex)*(m_ssbFftLen));
|
memset(m_DSBFilterBuffer, 0, sizeof(Complex)*(m_ssbFftLen));
|
||||||
@ -281,7 +278,7 @@ void ATVDemod::demod(Complex& c)
|
|||||||
{
|
{
|
||||||
//Amplitude FM
|
//Amplitude FM
|
||||||
magSq = fltI*fltI + fltQ*fltQ;
|
magSq = fltI*fltI + fltQ*fltQ;
|
||||||
m_objMagSqAverage.feed(magSq);
|
m_objMagSqAverage(magSq);
|
||||||
fltNorm = sqrt(magSq);
|
fltNorm = sqrt(magSq);
|
||||||
fltNormI= fltI/fltNorm;
|
fltNormI= fltI/fltNorm;
|
||||||
fltNormQ= fltQ/fltNorm;
|
fltNormQ= fltQ/fltNorm;
|
||||||
@ -336,7 +333,7 @@ void ATVDemod::demod(Complex& c)
|
|||||||
{
|
{
|
||||||
//Amplitude AM
|
//Amplitude AM
|
||||||
magSq = fltI*fltI + fltQ*fltQ;
|
magSq = fltI*fltI + fltQ*fltQ;
|
||||||
m_objMagSqAverage.feed(magSq);
|
m_objMagSqAverage(magSq);
|
||||||
fltNorm = sqrt(magSq);
|
fltNorm = sqrt(magSq);
|
||||||
fltVal = fltNorm / SDR_RX_SCALEF;
|
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))
|
else if ((m_rfRunning.m_enmModulation == ATV_USB) || (m_rfRunning.m_enmModulation == ATV_LSB))
|
||||||
{
|
{
|
||||||
magSq = fltI*fltI + fltQ*fltQ;
|
magSq = fltI*fltI + fltQ*fltQ;
|
||||||
m_objMagSqAverage.feed(magSq);
|
m_objMagSqAverage(magSq);
|
||||||
fltNorm = sqrt(magSq);
|
fltNorm = sqrt(magSq);
|
||||||
|
|
||||||
Real bfoValues[2];
|
Real bfoValues[2];
|
||||||
@ -398,13 +395,13 @@ void ATVDemod::demod(Complex& c)
|
|||||||
float rawDeviation;
|
float rawDeviation;
|
||||||
fltVal = m_objPhaseDiscri.phaseDiscriminatorDelta(c, magSq, rawDeviation) + 0.5f;
|
fltVal = m_objPhaseDiscri.phaseDiscriminatorDelta(c, magSq, rawDeviation) + 0.5f;
|
||||||
//fltVal = fltVal < 0.0f ? 0.0f : fltVal > 1.0f ? 1.0f : fltVal;
|
//fltVal = fltVal < 0.0f ? 0.0f : fltVal > 1.0f ? 1.0f : fltVal;
|
||||||
m_objMagSqAverage.feed(magSq);
|
m_objMagSqAverage(magSq);
|
||||||
fltNorm = sqrt(magSq);
|
fltNorm = sqrt(magSq);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
magSq = fltI*fltI + fltQ*fltQ;
|
magSq = fltI*fltI + fltQ*fltQ;
|
||||||
m_objMagSqAverage.feed(magSq);
|
m_objMagSqAverage(magSq);
|
||||||
fltNorm = sqrt(magSq);
|
fltNorm = sqrt(magSq);
|
||||||
fltVal = 0.0f;
|
fltVal = 0.0f;
|
||||||
}
|
}
|
||||||
|
@ -29,7 +29,7 @@
|
|||||||
#include "dsp/downchannelizer.h"
|
#include "dsp/downchannelizer.h"
|
||||||
#include "dsp/nco.h"
|
#include "dsp/nco.h"
|
||||||
#include "dsp/interpolator.h"
|
#include "dsp/interpolator.h"
|
||||||
#include "dsp/movingaverage.h"
|
#include "util/movingaverage.h"
|
||||||
#include "dsp/fftfilt.h"
|
#include "dsp/fftfilt.h"
|
||||||
#include "dsp/agc.h"
|
#include "dsp/agc.h"
|
||||||
#include "dsp/phaselock.h"
|
#include "dsp/phaselock.h"
|
||||||
@ -234,7 +234,7 @@ public:
|
|||||||
void setATVScreen(ATVScreenInterface *objScreen);
|
void setATVScreen(ATVScreenInterface *objScreen);
|
||||||
int getSampleRate();
|
int getSampleRate();
|
||||||
int getEffectiveSampleRate();
|
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();
|
bool getBFOLocked();
|
||||||
|
|
||||||
static const QString m_channelIdURI;
|
static const QString m_channelIdURI;
|
||||||
@ -457,7 +457,7 @@ private:
|
|||||||
|
|
||||||
//*************** RF ***************
|
//*************** RF ***************
|
||||||
|
|
||||||
MovingAverage<double> m_objMagSqAverage;
|
MovingAverageUtil<double, double, 32> m_objMagSqAverage;
|
||||||
|
|
||||||
NCO m_nco;
|
NCO m_nco;
|
||||||
SimplePhaseLock m_bfoPLL;
|
SimplePhaseLock m_bfoPLL;
|
||||||
|
@ -274,7 +274,6 @@ ATVDemodGUI::ATVDemodGUI(PluginAPI* objPluginAPI, DeviceUISet *deviceUISet, Base
|
|||||||
m_deviceUISet(deviceUISet),
|
m_deviceUISet(deviceUISet),
|
||||||
m_channelMarker(this),
|
m_channelMarker(this),
|
||||||
m_blnDoApplySettings(true),
|
m_blnDoApplySettings(true),
|
||||||
m_objMagSqAverage(40, 0),
|
|
||||||
m_intTickCount(0),
|
m_intTickCount(0),
|
||||||
m_inputSampleRate(48000)
|
m_inputSampleRate(48000)
|
||||||
{
|
{
|
||||||
@ -308,8 +307,6 @@ ATVDemodGUI::ATVDemodGUI(PluginAPI* objPluginAPI, DeviceUISet *deviceUISet, Base
|
|||||||
m_deviceUISet->addChannelMarker(&m_channelMarker);
|
m_deviceUISet->addChannelMarker(&m_channelMarker);
|
||||||
m_deviceUISet->addRollupWidget(this);
|
m_deviceUISet->addRollupWidget(this);
|
||||||
|
|
||||||
m_objMagSqAverage.resize(4, 1.0);
|
|
||||||
|
|
||||||
ui->scopeGUI->setBuddies(m_scopeVis->getInputMessageQueue(), m_scopeVis, ui->glScope);
|
ui->scopeGUI->setBuddies(m_scopeVis->getInputMessageQueue(), m_scopeVis, ui->glScope);
|
||||||
|
|
||||||
resetToDefaults(); // does applySettings()
|
resetToDefaults(); // does applySettings()
|
||||||
@ -473,8 +470,8 @@ void ATVDemodGUI::tick()
|
|||||||
{
|
{
|
||||||
if (m_atvDemod)
|
if (m_atvDemod)
|
||||||
{
|
{
|
||||||
m_objMagSqAverage.feed(m_atvDemod->getMagSq());
|
m_objMagSqAverage(m_atvDemod->getMagSq());
|
||||||
double magSqDB = CalcDb::dbPower(m_objMagSqAverage.average() / (SDR_RX_SCALED*SDR_RX_SCALED));
|
double magSqDB = CalcDb::dbPower(m_objMagSqAverage / (SDR_RX_SCALED*SDR_RX_SCALED));
|
||||||
ui->channePowerText->setText(tr("%1 dB").arg(magSqDB, 0, 'f', 1));
|
ui->channePowerText->setText(tr("%1 dB").arg(magSqDB, 0, 'f', 1));
|
||||||
|
|
||||||
if (m_atvDemod->getBFOLocked()) {
|
if (m_atvDemod->getBFOLocked()) {
|
||||||
|
@ -21,7 +21,7 @@
|
|||||||
#include <plugin/plugininstancegui.h>
|
#include <plugin/plugininstancegui.h>
|
||||||
#include "gui/rollupwidget.h"
|
#include "gui/rollupwidget.h"
|
||||||
#include "dsp/channelmarker.h"
|
#include "dsp/channelmarker.h"
|
||||||
#include "dsp/movingaverage.h"
|
#include "util/movingaverage.h"
|
||||||
#include "util/messagequeue.h"
|
#include "util/messagequeue.h"
|
||||||
|
|
||||||
class PluginAPI;
|
class PluginAPI;
|
||||||
@ -67,7 +67,7 @@ private:
|
|||||||
|
|
||||||
bool m_blnDoApplySettings;
|
bool m_blnDoApplySettings;
|
||||||
|
|
||||||
MovingAverage<double> m_objMagSqAverage;
|
MovingAverageUtil<double, double, 4> m_objMagSqAverage;
|
||||||
int m_intTickCount;
|
int m_intTickCount;
|
||||||
|
|
||||||
ScopeVisNG* m_scopeVis;
|
ScopeVisNG* m_scopeVis;
|
||||||
|
@ -330,7 +330,6 @@ BFMDemodGUI::BFMDemodGUI(PluginAPI* pluginAPI, DeviceUISet *deviceUISet, Baseban
|
|||||||
m_deviceUISet(deviceUISet),
|
m_deviceUISet(deviceUISet),
|
||||||
m_channelMarker(this),
|
m_channelMarker(this),
|
||||||
m_rdsTimerCount(0),
|
m_rdsTimerCount(0),
|
||||||
m_channelPowerDbAvg(20,0),
|
|
||||||
m_rate(625000)
|
m_rate(625000)
|
||||||
{
|
{
|
||||||
ui->setupUi(this);
|
ui->setupUi(this);
|
||||||
@ -485,10 +484,6 @@ void BFMDemodGUI::tick()
|
|||||||
|
|
||||||
ui->channelPower->setText(QString::number(powDbAvg, 'f', 1));
|
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());
|
Real pilotPowDb = CalcDb::dbPower(m_bfmDemod->getPilotLevel());
|
||||||
QString pilotPowDbStr;
|
QString pilotPowDbStr;
|
||||||
pilotPowDbStr.sprintf("%+02.1f", pilotPowDb);
|
pilotPowDbStr.sprintf("%+02.1f", pilotPowDb);
|
||||||
|
@ -21,7 +21,6 @@
|
|||||||
#include <plugin/plugininstancegui.h>
|
#include <plugin/plugininstancegui.h>
|
||||||
#include "gui/rollupwidget.h"
|
#include "gui/rollupwidget.h"
|
||||||
#include "dsp/channelmarker.h"
|
#include "dsp/channelmarker.h"
|
||||||
#include "dsp/movingaverage.h"
|
|
||||||
#include "util/messagequeue.h"
|
#include "util/messagequeue.h"
|
||||||
#include "bfmdemodsettings.h"
|
#include "bfmdemodsettings.h"
|
||||||
|
|
||||||
@ -71,7 +70,6 @@ private:
|
|||||||
SpectrumVis* m_spectrumVis;
|
SpectrumVis* m_spectrumVis;
|
||||||
|
|
||||||
BFMDemod* m_bfmDemod;
|
BFMDemod* m_bfmDemod;
|
||||||
MovingAverage<double> m_channelPowerDbAvg;
|
|
||||||
int m_rate;
|
int m_rate;
|
||||||
std::vector<unsigned int> m_g14ComboIndex;
|
std::vector<unsigned int> m_g14ComboIndex;
|
||||||
MessageQueue m_inputMessageQueue;
|
MessageQueue m_inputMessageQueue;
|
||||||
|
@ -17,6 +17,8 @@
|
|||||||
#ifndef PLUGINS_CHANNELRX_DEMODBFM_BFMDEMODSETTINGS_H_
|
#ifndef PLUGINS_CHANNELRX_DEMODBFM_BFMDEMODSETTINGS_H_
|
||||||
#define PLUGINS_CHANNELRX_DEMODBFM_BFMDEMODSETTINGS_H_
|
#define PLUGINS_CHANNELRX_DEMODBFM_BFMDEMODSETTINGS_H_
|
||||||
|
|
||||||
|
#include "dsp/dsptypes.h"
|
||||||
|
|
||||||
class Serializable;
|
class Serializable;
|
||||||
|
|
||||||
struct BFMDemodSettings
|
struct BFMDemodSettings
|
||||||
|
@ -51,7 +51,6 @@ DSDDemod::DSDDemod(DeviceSourceAPI *deviceAPI) :
|
|||||||
m_squelchGate(0),
|
m_squelchGate(0),
|
||||||
m_squelchLevel(1e-4),
|
m_squelchLevel(1e-4),
|
||||||
m_squelchOpen(false),
|
m_squelchOpen(false),
|
||||||
m_movingAverage(40, 0),
|
|
||||||
m_fmExcursion(24),
|
m_fmExcursion(24),
|
||||||
m_audioFifo1(48000),
|
m_audioFifo1(48000),
|
||||||
m_audioFifo2(48000),
|
m_audioFifo2(48000),
|
||||||
@ -69,7 +68,6 @@ DSDDemod::DSDDemod(DeviceSourceAPI *deviceAPI) :
|
|||||||
m_sampleBufferIndex = 0;
|
m_sampleBufferIndex = 0;
|
||||||
m_scaleFromShort = SDR_RX_SAMP_SZ < sizeof(short)*8 ? 1 : 1<<(SDR_RX_SAMP_SZ - sizeof(short)*8);
|
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_magsq = 0.0f;
|
||||||
m_magsqSum = 0.0f;
|
m_magsqSum = 0.0f;
|
||||||
m_magsqPeak = 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 re = ci.real() / SDR_RX_SCALED;
|
||||||
Real im = ci.imag() / SDR_RX_SCALED;
|
Real im = ci.imag() / SDR_RX_SCALED;
|
||||||
Real magsq = re*re + im*im;
|
Real magsq = re*re + im*im;
|
||||||
m_movingAverage.feed(magsq);
|
m_movingAverage(magsq);
|
||||||
|
|
||||||
m_magsqSum += magsq;
|
m_magsqSum += magsq;
|
||||||
|
|
||||||
@ -149,7 +147,7 @@ void DSDDemod::feed(const SampleVector::const_iterator& begin, const SampleVecto
|
|||||||
|
|
||||||
// AF processing
|
// AF processing
|
||||||
|
|
||||||
if (m_movingAverage.average() > m_squelchLevel)
|
if (m_movingAverage.asDouble() > m_squelchLevel)
|
||||||
{
|
{
|
||||||
if (m_squelchGate > 0)
|
if (m_squelchGate > 0)
|
||||||
{
|
{
|
||||||
|
@ -29,7 +29,7 @@
|
|||||||
#include "dsp/lowpass.h"
|
#include "dsp/lowpass.h"
|
||||||
#include "dsp/bandpass.h"
|
#include "dsp/bandpass.h"
|
||||||
#include "dsp/afsquelch.h"
|
#include "dsp/afsquelch.h"
|
||||||
#include "dsp/movingaverage.h"
|
#include "util/movingaverage.h"
|
||||||
#include "dsp/afsquelch.h"
|
#include "dsp/afsquelch.h"
|
||||||
#include "audio/audiofifo.h"
|
#include "audio/audiofifo.h"
|
||||||
#include "util/message.h"
|
#include "util/message.h"
|
||||||
@ -175,7 +175,7 @@ private:
|
|||||||
double m_squelchLevel;
|
double m_squelchLevel;
|
||||||
bool m_squelchOpen;
|
bool m_squelchOpen;
|
||||||
|
|
||||||
MovingAverage<double> m_movingAverage;
|
MovingAverageUtil<Real, double, 16> m_movingAverage;
|
||||||
double m_magsq;
|
double m_magsq;
|
||||||
double m_magsqSum;
|
double m_magsqSum;
|
||||||
double m_magsqPeak;
|
double m_magsqPeak;
|
||||||
|
@ -62,7 +62,6 @@ NFMDemod::NFMDemod(DeviceSourceAPI *devieAPI) :
|
|||||||
m_magsqSum(0.0f),
|
m_magsqSum(0.0f),
|
||||||
m_magsqPeak(0.0f),
|
m_magsqPeak(0.0f),
|
||||||
m_magsqCount(0),
|
m_magsqCount(0),
|
||||||
m_movingAverage(40, 0),
|
|
||||||
m_afSquelch(2, afSqTones),
|
m_afSquelch(2, afSqTones),
|
||||||
m_fmExcursion(2400),
|
m_fmExcursion(2400),
|
||||||
m_audioFifo(48000),
|
m_audioFifo(48000),
|
||||||
@ -74,7 +73,6 @@ NFMDemod::NFMDemod(DeviceSourceAPI *devieAPI) :
|
|||||||
m_audioBufferFill = 0;
|
m_audioBufferFill = 0;
|
||||||
|
|
||||||
m_agcLevel = 1.0;
|
m_agcLevel = 1.0;
|
||||||
m_movingAverage.resize(32, 0);
|
|
||||||
|
|
||||||
m_ctcssDetector.setCoefficients(3000, 6000.0); // 0.5s / 2 Hz resolution
|
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
|
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 demod = m_phaseDiscri.phaseDiscriminatorDelta(ci, magsqRaw, deviation);
|
||||||
|
|
||||||
Real magsq = magsqRaw / (SDR_RX_SCALED*SDR_RX_SCALED);
|
Real magsq = magsqRaw / (SDR_RX_SCALED*SDR_RX_SCALED);
|
||||||
m_movingAverage.feed(magsq);
|
m_movingAverage(magsq);
|
||||||
m_magsqSum += magsq;
|
m_magsqSum += magsq;
|
||||||
|
|
||||||
if (magsq > m_magsqPeak)
|
if (magsq > m_magsqPeak)
|
||||||
@ -198,7 +196,7 @@ void NFMDemod::feed(const SampleVector::const_iterator& begin, const SampleVecto
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (m_movingAverage.average() < m_squelchLevel)
|
if ((Real) m_movingAverage < m_squelchLevel)
|
||||||
{
|
{
|
||||||
if (m_squelchCount > 0)
|
if (m_squelchCount > 0)
|
||||||
{
|
{
|
||||||
@ -464,7 +462,7 @@ void NFMDemod::applySettings(const NFMDemodSettings& settings, bool force)
|
|||||||
else
|
else
|
||||||
{ // input is a value in centi-Bels
|
{ // input is a value in centi-Bels
|
||||||
m_squelchLevel = std::pow(10.0, settings.m_squelch / 100.0);
|
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
|
m_squelchCount = 0; // reset squelch open counter
|
||||||
|
@ -33,6 +33,7 @@
|
|||||||
#include "dsp/ctcssdetector.h"
|
#include "dsp/ctcssdetector.h"
|
||||||
#include "audio/audiofifo.h"
|
#include "audio/audiofifo.h"
|
||||||
#include "util/message.h"
|
#include "util/message.h"
|
||||||
|
#include "util/movingaverage.h"
|
||||||
|
|
||||||
#include "nfmdemodsettings.h"
|
#include "nfmdemodsettings.h"
|
||||||
|
|
||||||
@ -200,7 +201,7 @@ private:
|
|||||||
Real m_lastArgument;
|
Real m_lastArgument;
|
||||||
//Complex m_m1Sample;
|
//Complex m_m1Sample;
|
||||||
//Complex m_m2Sample;
|
//Complex m_m2Sample;
|
||||||
MovingAverage<double> m_movingAverage;
|
MovingAverageUtil<Real, double, 32> m_movingAverage;
|
||||||
AFSquelch m_afSquelch;
|
AFSquelch m_afSquelch;
|
||||||
Real m_agcLevel; // AGC will aim to this level
|
Real m_agcLevel; // AGC will aim to this level
|
||||||
Real m_agcFloor; // AGC will not go below this level
|
Real m_agcFloor; // AGC will not go below this level
|
||||||
|
@ -47,7 +47,6 @@ WFMDemod::WFMDemod(DeviceSourceAPI* deviceAPI) :
|
|||||||
m_magsqSum(0.0f),
|
m_magsqSum(0.0f),
|
||||||
m_magsqPeak(0.0f),
|
m_magsqPeak(0.0f),
|
||||||
m_magsqCount(0),
|
m_magsqCount(0),
|
||||||
m_movingAverage(40, 0),
|
|
||||||
m_sampleSink(0),
|
m_sampleSink(0),
|
||||||
m_audioFifo(250000),
|
m_audioFifo(250000),
|
||||||
m_settingsMutex(QMutex::Recursive)
|
m_settingsMutex(QMutex::Recursive)
|
||||||
@ -60,8 +59,6 @@ WFMDemod::WFMDemod(DeviceSourceAPI* deviceAPI) :
|
|||||||
m_audioBuffer.resize(16384);
|
m_audioBuffer.resize(16384);
|
||||||
m_audioBufferFill = 0;
|
m_audioBufferFill = 0;
|
||||||
|
|
||||||
m_movingAverage.resize(16, 0);
|
|
||||||
|
|
||||||
DSPEngine::instance()->addAudioSink(&m_audioFifo);
|
DSPEngine::instance()->addAudioSink(&m_audioFifo);
|
||||||
m_udpBufferAudio = new UDPSink<qint16>(this, m_udpBlockSize, m_settings.m_udpPort);
|
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);
|
demod = m_phaseDiscri.phaseDiscriminatorDelta(rf[i], msq, fmDev);
|
||||||
Real magsq = msq / (SDR_RX_SCALED*SDR_RX_SCALED);
|
Real magsq = msq / (SDR_RX_SCALED*SDR_RX_SCALED);
|
||||||
|
|
||||||
m_movingAverage.feed(magsq);
|
m_movingAverage(magsq);
|
||||||
m_magsqSum += magsq;
|
m_magsqSum += magsq;
|
||||||
|
|
||||||
if (magsq > m_magsqPeak)
|
if (magsq > m_magsqPeak)
|
||||||
@ -124,7 +121,7 @@ void WFMDemod::feed(const SampleVector::const_iterator& begin, const SampleVecto
|
|||||||
|
|
||||||
m_magsqCount++;
|
m_magsqCount++;
|
||||||
|
|
||||||
if(m_movingAverage.average() >= m_squelchLevel)
|
if((Real) m_movingAverage >= m_squelchLevel)
|
||||||
m_squelchState = m_settings.m_rfBandwidth / 20; // decay rate
|
m_squelchState = m_settings.m_rfBandwidth / 20; // decay rate
|
||||||
|
|
||||||
if (m_squelchState > 0)
|
if (m_squelchState > 0)
|
||||||
|
@ -26,7 +26,7 @@
|
|||||||
#include "dsp/nco.h"
|
#include "dsp/nco.h"
|
||||||
#include "dsp/interpolator.h"
|
#include "dsp/interpolator.h"
|
||||||
#include "dsp/lowpass.h"
|
#include "dsp/lowpass.h"
|
||||||
#include "dsp/movingaverage.h"
|
#include "util/movingaverage.h"
|
||||||
#include "dsp/fftfilt.h"
|
#include "dsp/fftfilt.h"
|
||||||
#include "dsp/phasediscri.h"
|
#include "dsp/phasediscri.h"
|
||||||
#include "audio/audiofifo.h"
|
#include "audio/audiofifo.h"
|
||||||
@ -105,7 +105,7 @@ public:
|
|||||||
virtual QByteArray serialize() const;
|
virtual QByteArray serialize() const;
|
||||||
virtual bool deserialize(const QByteArray& data);
|
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; }
|
bool getSquelchOpen() const { return m_squelchOpen; }
|
||||||
|
|
||||||
void getMagSqLevels(double& avg, double& peak, int& nbSamples)
|
void getMagSqLevels(double& avg, double& peak, int& nbSamples)
|
||||||
@ -151,7 +151,7 @@ private:
|
|||||||
int m_magsqCount;
|
int m_magsqCount;
|
||||||
|
|
||||||
Real m_lastArgument;
|
Real m_lastArgument;
|
||||||
MovingAverage<double> m_movingAverage;
|
MovingAverageUtil<Real, double, 16> m_movingAverage;
|
||||||
Real m_fmExcursion;
|
Real m_fmExcursion;
|
||||||
|
|
||||||
AudioVector m_audioBuffer;
|
AudioVector m_audioBuffer;
|
||||||
|
@ -166,8 +166,7 @@ WFMDemodGUI::WFMDemodGUI(PluginAPI* pluginAPI, DeviceUISet *deviceUISet, Baseban
|
|||||||
m_pluginAPI(pluginAPI),
|
m_pluginAPI(pluginAPI),
|
||||||
m_deviceUISet(deviceUISet),
|
m_deviceUISet(deviceUISet),
|
||||||
m_channelMarker(this),
|
m_channelMarker(this),
|
||||||
m_basicSettingsShown(false),
|
m_basicSettingsShown(false)
|
||||||
m_channelPowerDbAvg(20,0)
|
|
||||||
{
|
{
|
||||||
ui->setupUi(this);
|
ui->setupUi(this);
|
||||||
setAttribute(Qt::WA_DeleteOnClose, true);
|
setAttribute(Qt::WA_DeleteOnClose, true);
|
||||||
@ -290,10 +289,6 @@ void WFMDemodGUI::enterEvent(QEvent*)
|
|||||||
|
|
||||||
void WFMDemodGUI::tick()
|
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;
|
double magsqAvg, magsqPeak;
|
||||||
int nbMagsqSamples;
|
int nbMagsqSamples;
|
||||||
m_wfmDemod->getMagSqLevels(magsqAvg, magsqPeak, nbMagsqSamples);
|
m_wfmDemod->getMagSqLevels(magsqAvg, magsqPeak, nbMagsqSamples);
|
||||||
|
@ -4,7 +4,6 @@
|
|||||||
#include <plugin/plugininstancegui.h>
|
#include <plugin/plugininstancegui.h>
|
||||||
#include "gui/rollupwidget.h"
|
#include "gui/rollupwidget.h"
|
||||||
#include "dsp/channelmarker.h"
|
#include "dsp/channelmarker.h"
|
||||||
#include "dsp/movingaverage.h"
|
|
||||||
#include "util/messagequeue.h"
|
#include "util/messagequeue.h"
|
||||||
|
|
||||||
#include "wfmdemodsettings.h"
|
#include "wfmdemodsettings.h"
|
||||||
@ -52,7 +51,6 @@ private:
|
|||||||
bool m_squelchOpen;
|
bool m_squelchOpen;
|
||||||
|
|
||||||
WFMDemod* m_wfmDemod;
|
WFMDemod* m_wfmDemod;
|
||||||
MovingAverage<double> m_channelPowerDbAvg;
|
|
||||||
MessageQueue m_inputMessageQueue;
|
MessageQueue m_inputMessageQueue;
|
||||||
|
|
||||||
explicit WFMDemodGUI(PluginAPI* pluginAPI, DeviceUISet *deviceUISet, BasebandSampleSink *rxChannel, QWidget* parent = 0);
|
explicit WFMDemodGUI(PluginAPI* pluginAPI, DeviceUISet *deviceUISet, BasebandSampleSink *rxChannel, QWidget* parent = 0);
|
||||||
|
@ -18,6 +18,8 @@
|
|||||||
#ifndef PLUGINS_CHANNELRX_DEMODWFM_WFMDEMODSETTINGS_H_
|
#ifndef PLUGINS_CHANNELRX_DEMODWFM_WFMDEMODSETTINGS_H_
|
||||||
#define PLUGINS_CHANNELRX_DEMODWFM_WFMDEMODSETTINGS_H_
|
#define PLUGINS_CHANNELRX_DEMODWFM_WFMDEMODSETTINGS_H_
|
||||||
|
|
||||||
|
#include "dsp/dsptypes.h"
|
||||||
|
|
||||||
class Serializable;
|
class Serializable;
|
||||||
|
|
||||||
struct WFMDemodSettings
|
struct WFMDemodSettings
|
||||||
|
@ -112,8 +112,8 @@ void TCPSrcGUI::channelMarkerHighlightedByCursor()
|
|||||||
void TCPSrcGUI::tick()
|
void TCPSrcGUI::tick()
|
||||||
{
|
{
|
||||||
double powDb = CalcDb::dbPower(m_tcpSrc->getMagSq());
|
double powDb = CalcDb::dbPower(m_tcpSrc->getMagSq());
|
||||||
m_channelPowerDbAvg.feed(powDb);
|
m_channelPowerDbAvg(powDb);
|
||||||
ui->channelPower->setText(QString::number(m_channelPowerDbAvg.average(), 'f', 1));
|
ui->channelPower->setText(QString::number(m_channelPowerDbAvg.asDouble(), 'f', 1));
|
||||||
}
|
}
|
||||||
|
|
||||||
TCPSrcGUI::TCPSrcGUI(PluginAPI* pluginAPI, DeviceUISet *deviceUISet, BasebandSampleSink *rxChannel, QWidget* parent) :
|
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_deviceUISet(deviceUISet),
|
||||||
m_tcpSrc(0),
|
m_tcpSrc(0),
|
||||||
m_channelMarker(this),
|
m_channelMarker(this),
|
||||||
m_channelPowerDbAvg(40,0),
|
|
||||||
m_rfBandwidthChanged(false),
|
m_rfBandwidthChanged(false),
|
||||||
m_doApplySettings(true)
|
m_doApplySettings(true)
|
||||||
{
|
{
|
||||||
|
@ -6,7 +6,7 @@
|
|||||||
|
|
||||||
#include "gui/rollupwidget.h"
|
#include "gui/rollupwidget.h"
|
||||||
#include "dsp/channelmarker.h"
|
#include "dsp/channelmarker.h"
|
||||||
#include "dsp/movingaverage.h"
|
#include "util/movingaverage.h"
|
||||||
#include "util/messagequeue.h"
|
#include "util/messagequeue.h"
|
||||||
|
|
||||||
#include "tcpsrc.h"
|
#include "tcpsrc.h"
|
||||||
@ -49,7 +49,7 @@ private:
|
|||||||
DeviceUISet* m_deviceUISet;
|
DeviceUISet* m_deviceUISet;
|
||||||
TCPSrc* m_tcpSrc;
|
TCPSrc* m_tcpSrc;
|
||||||
ChannelMarker m_channelMarker;
|
ChannelMarker m_channelMarker;
|
||||||
MovingAverage<double> m_channelPowerDbAvg;
|
MovingAverageUtil<Real, double, 40> m_channelPowerDbAvg;
|
||||||
|
|
||||||
// settings
|
// settings
|
||||||
TCPSrcSettings m_settings;
|
TCPSrcSettings m_settings;
|
||||||
|
@ -46,8 +46,6 @@ AMMod::AMMod(DeviceSinkAPI *deviceAPI) :
|
|||||||
m_basebandSampleRate(48000),
|
m_basebandSampleRate(48000),
|
||||||
m_outputSampleRate(48000),
|
m_outputSampleRate(48000),
|
||||||
m_inputFrequencyOffset(0),
|
m_inputFrequencyOffset(0),
|
||||||
m_movingAverage(40, 0),
|
|
||||||
m_volumeAGC(40, 0),
|
|
||||||
m_audioFifo(4800),
|
m_audioFifo(4800),
|
||||||
m_settingsMutex(QMutex::Recursive),
|
m_settingsMutex(QMutex::Recursive),
|
||||||
m_fileSize(0),
|
m_fileSize(0),
|
||||||
@ -63,8 +61,6 @@ AMMod::AMMod(DeviceSinkAPI *deviceAPI) :
|
|||||||
m_audioBuffer.resize(1<<14);
|
m_audioBuffer.resize(1<<14);
|
||||||
m_audioBufferFill = 0;
|
m_audioBufferFill = 0;
|
||||||
|
|
||||||
m_movingAverage.resize(16, 0);
|
|
||||||
m_volumeAGC.resize(4096, 0.003, 0);
|
|
||||||
m_magsq = 0.0;
|
m_magsq = 0.0;
|
||||||
|
|
||||||
m_toneNco.setFreq(1000.0, m_settings.m_audioSampleRate);
|
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();
|
double magsq = ci.real() * ci.real() + ci.imag() * ci.imag();
|
||||||
magsq /= (SDR_TX_SCALED*SDR_TX_SCALED);
|
magsq /= (SDR_TX_SCALED*SDR_TX_SCALED);
|
||||||
m_movingAverage.feed(magsq);
|
m_movingAverage(magsq);
|
||||||
m_magsq = m_movingAverage.average();
|
m_magsq = m_movingAverage.asDouble();
|
||||||
|
|
||||||
sample.m_real = (FixReal) ci.real();
|
sample.m_real = (FixReal) ci.real();
|
||||||
sample.m_imag = (FixReal) ci.imag();
|
sample.m_imag = (FixReal) ci.imag();
|
||||||
|
@ -27,7 +27,7 @@
|
|||||||
#include "dsp/nco.h"
|
#include "dsp/nco.h"
|
||||||
#include "dsp/ncof.h"
|
#include "dsp/ncof.h"
|
||||||
#include "dsp/interpolator.h"
|
#include "dsp/interpolator.h"
|
||||||
#include "dsp/movingaverage.h"
|
#include "util/movingaverage.h"
|
||||||
#include "dsp/agc.h"
|
#include "dsp/agc.h"
|
||||||
#include "dsp/cwkeyer.h"
|
#include "dsp/cwkeyer.h"
|
||||||
#include "audio/audiofifo.h"
|
#include "audio/audiofifo.h"
|
||||||
@ -286,8 +286,7 @@ private:
|
|||||||
bool m_interpolatorConsumed;
|
bool m_interpolatorConsumed;
|
||||||
|
|
||||||
double m_magsq;
|
double m_magsq;
|
||||||
MovingAverage<double> m_movingAverage;
|
MovingAverageUtil<double, double, 16> m_movingAverage;
|
||||||
SimpleAGC m_volumeAGC;
|
|
||||||
|
|
||||||
AudioVector m_audioBuffer;
|
AudioVector m_audioBuffer;
|
||||||
uint m_audioBufferFill;
|
uint m_audioBufferFill;
|
||||||
|
@ -266,7 +266,6 @@ AMModGUI::AMModGUI(PluginAPI* pluginAPI, DeviceUISet *deviceUISet, BasebandSampl
|
|||||||
m_deviceUISet(deviceUISet),
|
m_deviceUISet(deviceUISet),
|
||||||
m_channelMarker(this),
|
m_channelMarker(this),
|
||||||
m_doApplySettings(true),
|
m_doApplySettings(true),
|
||||||
m_channelPowerDbAvg(20,0),
|
|
||||||
m_recordLength(0),
|
m_recordLength(0),
|
||||||
m_recordSampleRate(48000),
|
m_recordSampleRate(48000),
|
||||||
m_samplesCount(0),
|
m_samplesCount(0),
|
||||||
@ -395,8 +394,8 @@ void AMModGUI::enterEvent(QEvent*)
|
|||||||
void AMModGUI::tick()
|
void AMModGUI::tick()
|
||||||
{
|
{
|
||||||
double powDb = CalcDb::dbPower(m_amMod->getMagSq());
|
double powDb = CalcDb::dbPower(m_amMod->getMagSq());
|
||||||
m_channelPowerDbAvg.feed(powDb);
|
m_channelPowerDbAvg(powDb);
|
||||||
ui->channelPower->setText(tr("%1 dB").arg(m_channelPowerDbAvg.average(), 0, 'f', 1));
|
ui->channelPower->setText(tr("%1 dB").arg(m_channelPowerDbAvg.asDouble(), 0, 'f', 1));
|
||||||
|
|
||||||
if (((++m_tickCount & 0xf) == 0) && (m_modAFInput == AMMod::AMModInputFile))
|
if (((++m_tickCount & 0xf) == 0) && (m_modAFInput == AMMod::AMModInputFile))
|
||||||
{
|
{
|
||||||
|
@ -20,7 +20,7 @@
|
|||||||
#include <plugin/plugininstancegui.h>
|
#include <plugin/plugininstancegui.h>
|
||||||
#include "gui/rollupwidget.h"
|
#include "gui/rollupwidget.h"
|
||||||
#include "dsp/channelmarker.h"
|
#include "dsp/channelmarker.h"
|
||||||
#include "dsp/movingaverage.h"
|
#include "util/movingaverage.h"
|
||||||
#include "util/messagequeue.h"
|
#include "util/messagequeue.h"
|
||||||
|
|
||||||
#include "ammod.h"
|
#include "ammod.h"
|
||||||
@ -66,7 +66,7 @@ private:
|
|||||||
bool m_doApplySettings;
|
bool m_doApplySettings;
|
||||||
|
|
||||||
AMMod* m_amMod;
|
AMMod* m_amMod;
|
||||||
MovingAverage<double> m_channelPowerDbAvg;
|
MovingAverageUtil<double, double, 20> m_channelPowerDbAvg;
|
||||||
|
|
||||||
QString m_fileName;
|
QString m_fileName;
|
||||||
quint32 m_recordLength;
|
quint32 m_recordLength;
|
||||||
|
@ -60,7 +60,6 @@ ATVMod::ATVMod(DeviceSinkAPI *deviceAPI) :
|
|||||||
m_settingsMutex(QMutex::Recursive),
|
m_settingsMutex(QMutex::Recursive),
|
||||||
m_horizontalCount(0),
|
m_horizontalCount(0),
|
||||||
m_lineCount(0),
|
m_lineCount(0),
|
||||||
m_movingAverage(40, 0),
|
|
||||||
m_imageOK(false),
|
m_imageOK(false),
|
||||||
m_videoFPSq(1.0f),
|
m_videoFPSq(1.0f),
|
||||||
m_videoFPSCount(0.0f),
|
m_videoFPSCount(0.0f),
|
||||||
@ -90,8 +89,6 @@ ATVMod::ATVMod(DeviceSinkAPI *deviceAPI) :
|
|||||||
m_interpolatorDistanceRemain = 0.0f;
|
m_interpolatorDistanceRemain = 0.0f;
|
||||||
m_interpolatorDistance = 1.0f;
|
m_interpolatorDistance = 1.0f;
|
||||||
|
|
||||||
m_movingAverage.resize(16, 0);
|
|
||||||
|
|
||||||
m_channelizer = new UpChannelizer(this);
|
m_channelizer = new UpChannelizer(this);
|
||||||
m_threadedChannelizer = new ThreadedBasebandSampleSource(m_channelizer, this);
|
m_threadedChannelizer = new ThreadedBasebandSampleSource(m_channelizer, this);
|
||||||
m_deviceAPI->addThreadedSource(m_threadedChannelizer);
|
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();
|
double magsq = ci.real() * ci.real() + ci.imag() * ci.imag();
|
||||||
magsq /= (SDR_TX_SCALED*SDR_TX_SCALED);
|
magsq /= (SDR_TX_SCALED*SDR_TX_SCALED);
|
||||||
m_movingAverage.feed(magsq);
|
m_movingAverage(magsq);
|
||||||
|
|
||||||
sample.m_real = (FixReal) ci.real();
|
sample.m_real = (FixReal) ci.real();
|
||||||
sample.m_imag = (FixReal) ci.imag();
|
sample.m_imag = (FixReal) ci.imag();
|
||||||
|
@ -31,7 +31,7 @@
|
|||||||
#include "channel/channelsourceapi.h"
|
#include "channel/channelsourceapi.h"
|
||||||
#include "dsp/nco.h"
|
#include "dsp/nco.h"
|
||||||
#include "dsp/interpolator.h"
|
#include "dsp/interpolator.h"
|
||||||
#include "dsp/movingaverage.h"
|
#include "util/movingaverage.h"
|
||||||
#include "dsp/fftfilt.h"
|
#include "dsp/fftfilt.h"
|
||||||
#include "util/message.h"
|
#include "util/message.h"
|
||||||
|
|
||||||
@ -412,7 +412,7 @@ public:
|
|||||||
virtual bool deserialize(const QByteArray& data);
|
virtual bool deserialize(const QByteArray& data);
|
||||||
|
|
||||||
int getEffectiveSampleRate() const { return m_tvSampleRate; };
|
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);
|
void getCameraNumbers(std::vector<int>& numbers);
|
||||||
|
|
||||||
static void getBaseValues(int outputSampleRate, int linesPerSecond, int& sampleRateUnits, uint32_t& nbPointsPerRateUnit);
|
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
|
int m_lineCount; //!< current line index in frame
|
||||||
float m_fps; //!< resulting frames per second
|
float m_fps; //!< resulting frames per second
|
||||||
|
|
||||||
MovingAverage<double> m_movingAverage;
|
MovingAverageUtil<double, double, 16> m_movingAverage;
|
||||||
quint32 m_levelCalcCount;
|
quint32 m_levelCalcCount;
|
||||||
Real m_peakLevel;
|
Real m_peakLevel;
|
||||||
Real m_levelSum;
|
Real m_levelSum;
|
||||||
|
@ -586,7 +586,6 @@ ATVModGUI::ATVModGUI(PluginAPI* pluginAPI, DeviceUISet *deviceUISet, BasebandSam
|
|||||||
m_deviceUISet(deviceUISet),
|
m_deviceUISet(deviceUISet),
|
||||||
m_channelMarker(this),
|
m_channelMarker(this),
|
||||||
m_doApplySettings(true),
|
m_doApplySettings(true),
|
||||||
m_channelPowerDbAvg(20,0),
|
|
||||||
m_videoLength(0),
|
m_videoLength(0),
|
||||||
m_videoFrameRate(48000),
|
m_videoFrameRate(48000),
|
||||||
m_frameCount(0),
|
m_frameCount(0),
|
||||||
@ -741,8 +740,8 @@ void ATVModGUI::enterEvent(QEvent*)
|
|||||||
void ATVModGUI::tick()
|
void ATVModGUI::tick()
|
||||||
{
|
{
|
||||||
double powDb = CalcDb::dbPower(m_atvMod->getMagSq());
|
double powDb = CalcDb::dbPower(m_atvMod->getMagSq());
|
||||||
m_channelPowerDbAvg.feed(powDb);
|
m_channelPowerDbAvg(powDb);
|
||||||
ui->channelPower->setText(tr("%1 dB").arg(m_channelPowerDbAvg.average(), 0, 'f', 1));
|
ui->channelPower->setText(tr("%1 dB").arg(m_channelPowerDbAvg.asDouble(), 0, 'f', 1));
|
||||||
|
|
||||||
if (((++m_tickCount & 0xf) == 0) && (ui->inputSelect->currentIndex() == (int) ATVModSettings::ATVModInputVideo))
|
if (((++m_tickCount & 0xf) == 0) && (ui->inputSelect->currentIndex() == (int) ATVModSettings::ATVModInputVideo))
|
||||||
{
|
{
|
||||||
|
@ -20,7 +20,7 @@
|
|||||||
#include <plugin/plugininstancegui.h>
|
#include <plugin/plugininstancegui.h>
|
||||||
#include "gui/rollupwidget.h"
|
#include "gui/rollupwidget.h"
|
||||||
#include "dsp/channelmarker.h"
|
#include "dsp/channelmarker.h"
|
||||||
#include "dsp/movingaverage.h"
|
#include "util/movingaverage.h"
|
||||||
#include "util/messagequeue.h"
|
#include "util/messagequeue.h"
|
||||||
|
|
||||||
#include "atvmod.h"
|
#include "atvmod.h"
|
||||||
@ -65,7 +65,7 @@ private:
|
|||||||
bool m_doApplySettings;
|
bool m_doApplySettings;
|
||||||
|
|
||||||
ATVMod* m_atvMod;
|
ATVMod* m_atvMod;
|
||||||
MovingAverage<double> m_channelPowerDbAvg;
|
MovingAverageUtil<double, double, 20> m_channelPowerDbAvg;
|
||||||
|
|
||||||
QString m_imageFileName;
|
QString m_imageFileName;
|
||||||
QString m_videoFileName;
|
QString m_videoFileName;
|
||||||
|
@ -52,8 +52,6 @@ NFMMod::NFMMod(DeviceSinkAPI *deviceAPI) :
|
|||||||
m_outputSampleRate(48000),
|
m_outputSampleRate(48000),
|
||||||
m_inputFrequencyOffset(0),
|
m_inputFrequencyOffset(0),
|
||||||
m_modPhasor(0.0f),
|
m_modPhasor(0.0f),
|
||||||
m_movingAverage(40, 0),
|
|
||||||
m_volumeAGC(40, 0),
|
|
||||||
m_audioFifo(4800),
|
m_audioFifo(4800),
|
||||||
m_settingsMutex(QMutex::Recursive),
|
m_settingsMutex(QMutex::Recursive),
|
||||||
m_fileSize(0),
|
m_fileSize(0),
|
||||||
@ -68,8 +66,6 @@ NFMMod::NFMMod(DeviceSinkAPI *deviceAPI) :
|
|||||||
m_audioBuffer.resize(1<<14);
|
m_audioBuffer.resize(1<<14);
|
||||||
m_audioBufferFill = 0;
|
m_audioBufferFill = 0;
|
||||||
|
|
||||||
m_movingAverage.resize(16, 0);
|
|
||||||
m_volumeAGC.resize(4096, 0.003, 0);
|
|
||||||
m_magsq = 0.0;
|
m_magsq = 0.0;
|
||||||
|
|
||||||
m_toneNco.setFreq(1000.0, m_settings.m_audioSampleRate);
|
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();
|
double magsq = ci.real() * ci.real() + ci.imag() * ci.imag();
|
||||||
magsq /= (SDR_TX_SCALED*SDR_TX_SCALED);
|
magsq /= (SDR_TX_SCALED*SDR_TX_SCALED);
|
||||||
m_movingAverage.feed(magsq);
|
m_movingAverage(magsq);
|
||||||
m_magsq = m_movingAverage.average();
|
m_magsq = m_movingAverage.asDouble();
|
||||||
|
|
||||||
sample.m_real = (FixReal) ci.real();
|
sample.m_real = (FixReal) ci.real();
|
||||||
sample.m_imag = (FixReal) ci.imag();
|
sample.m_imag = (FixReal) ci.imag();
|
||||||
|
@ -29,7 +29,7 @@
|
|||||||
#include "dsp/interpolator.h"
|
#include "dsp/interpolator.h"
|
||||||
#include "dsp/lowpass.h"
|
#include "dsp/lowpass.h"
|
||||||
#include "dsp/bandpass.h"
|
#include "dsp/bandpass.h"
|
||||||
#include "dsp/movingaverage.h"
|
#include "util/movingaverage.h"
|
||||||
#include "dsp/agc.h"
|
#include "dsp/agc.h"
|
||||||
#include "dsp/cwkeyer.h"
|
#include "dsp/cwkeyer.h"
|
||||||
#include "audio/audiofifo.h"
|
#include "audio/audiofifo.h"
|
||||||
@ -281,8 +281,7 @@ private:
|
|||||||
Bandpass<Real> m_bandpass;
|
Bandpass<Real> m_bandpass;
|
||||||
|
|
||||||
double m_magsq;
|
double m_magsq;
|
||||||
MovingAverage<double> m_movingAverage;
|
MovingAverageUtil<double, double, 16> m_movingAverage;
|
||||||
SimpleAGC m_volumeAGC;
|
|
||||||
|
|
||||||
AudioVector m_audioBuffer;
|
AudioVector m_audioBuffer;
|
||||||
uint m_audioBufferFill;
|
uint m_audioBufferFill;
|
||||||
|
@ -294,7 +294,6 @@ NFMModGUI::NFMModGUI(PluginAPI* pluginAPI, DeviceUISet *deviceUISet, BasebandSam
|
|||||||
m_deviceUISet(deviceUISet),
|
m_deviceUISet(deviceUISet),
|
||||||
m_channelMarker(this),
|
m_channelMarker(this),
|
||||||
m_doApplySettings(true),
|
m_doApplySettings(true),
|
||||||
m_channelPowerDbAvg(20,0),
|
|
||||||
m_recordLength(0),
|
m_recordLength(0),
|
||||||
m_recordSampleRate(48000),
|
m_recordSampleRate(48000),
|
||||||
m_samplesCount(0),
|
m_samplesCount(0),
|
||||||
@ -450,8 +449,8 @@ void NFMModGUI::enterEvent(QEvent*)
|
|||||||
void NFMModGUI::tick()
|
void NFMModGUI::tick()
|
||||||
{
|
{
|
||||||
double powDb = CalcDb::dbPower(m_nfmMod->getMagSq());
|
double powDb = CalcDb::dbPower(m_nfmMod->getMagSq());
|
||||||
m_channelPowerDbAvg.feed(powDb);
|
m_channelPowerDbAvg(powDb);
|
||||||
ui->channelPower->setText(tr("%1 dB").arg(m_channelPowerDbAvg.average(), 0, 'f', 1));
|
ui->channelPower->setText(tr("%1 dB").arg(m_channelPowerDbAvg.asDouble(), 0, 'f', 1));
|
||||||
|
|
||||||
if (((++m_tickCount & 0xf) == 0) && (m_settings.m_modAFInput == NFMModSettings::NFMModInputFile))
|
if (((++m_tickCount & 0xf) == 0) && (m_settings.m_modAFInput == NFMModSettings::NFMModInputFile))
|
||||||
{
|
{
|
||||||
|
@ -20,7 +20,7 @@
|
|||||||
#include <plugin/plugininstancegui.h>
|
#include <plugin/plugininstancegui.h>
|
||||||
#include "gui/rollupwidget.h"
|
#include "gui/rollupwidget.h"
|
||||||
#include "dsp/channelmarker.h"
|
#include "dsp/channelmarker.h"
|
||||||
#include "dsp/movingaverage.h"
|
#include "util/movingaverage.h"
|
||||||
#include "util/messagequeue.h"
|
#include "util/messagequeue.h"
|
||||||
|
|
||||||
#include "nfmmod.h"
|
#include "nfmmod.h"
|
||||||
@ -64,7 +64,7 @@ private:
|
|||||||
bool m_doApplySettings;
|
bool m_doApplySettings;
|
||||||
|
|
||||||
NFMMod* m_nfmMod;
|
NFMMod* m_nfmMod;
|
||||||
MovingAverage<double> m_channelPowerDbAvg;
|
MovingAverageUtil<double, double, 20> m_channelPowerDbAvg;
|
||||||
|
|
||||||
QString m_fileName;
|
QString m_fileName;
|
||||||
quint32 m_recordLength;
|
quint32 m_recordLength;
|
||||||
|
@ -55,7 +55,6 @@ SSBMod::SSBMod(DeviceSinkAPI *deviceAPI) :
|
|||||||
m_SSBFilterBufferIndex(0),
|
m_SSBFilterBufferIndex(0),
|
||||||
m_DSBFilterBufferIndex(0),
|
m_DSBFilterBufferIndex(0),
|
||||||
m_sampleSink(0),
|
m_sampleSink(0),
|
||||||
m_movingAverage(40, 0),
|
|
||||||
m_audioFifo(4800),
|
m_audioFifo(4800),
|
||||||
m_settingsMutex(QMutex::Recursive),
|
m_settingsMutex(QMutex::Recursive),
|
||||||
m_fileSize(0),
|
m_fileSize(0),
|
||||||
@ -84,7 +83,6 @@ SSBMod::SSBMod(DeviceSinkAPI *deviceAPI) :
|
|||||||
m_undersampleCount = 0;
|
m_undersampleCount = 0;
|
||||||
m_sumCount = 0;
|
m_sumCount = 0;
|
||||||
|
|
||||||
m_movingAverage.resize(16, 0);
|
|
||||||
m_magsq = 0.0;
|
m_magsq = 0.0;
|
||||||
|
|
||||||
m_toneNco.setFreq(1000.0, m_settings.m_audioSampleRate);
|
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();
|
double magsq = ci.real() * ci.real() + ci.imag() * ci.imag();
|
||||||
magsq /= (SDR_TX_SCALED*SDR_TX_SCALED);
|
magsq /= (SDR_TX_SCALED*SDR_TX_SCALED);
|
||||||
m_movingAverage.feed(magsq);
|
m_movingAverage(magsq);
|
||||||
m_magsq = m_movingAverage.average();
|
m_magsq = m_movingAverage.asDouble();
|
||||||
|
|
||||||
sample.m_real = (FixReal) ci.real();
|
sample.m_real = (FixReal) ci.real();
|
||||||
sample.m_imag = (FixReal) ci.imag();
|
sample.m_imag = (FixReal) ci.imag();
|
||||||
|
@ -27,7 +27,7 @@
|
|||||||
#include "dsp/basebandsamplesink.h"
|
#include "dsp/basebandsamplesink.h"
|
||||||
#include "dsp/ncof.h"
|
#include "dsp/ncof.h"
|
||||||
#include "dsp/interpolator.h"
|
#include "dsp/interpolator.h"
|
||||||
#include "dsp/movingaverage.h"
|
#include "util/movingaverage.h"
|
||||||
#include "dsp/agc.h"
|
#include "dsp/agc.h"
|
||||||
#include "dsp/fftfilt.h"
|
#include "dsp/fftfilt.h"
|
||||||
#include "dsp/cwkeyer.h"
|
#include "dsp/cwkeyer.h"
|
||||||
@ -303,7 +303,7 @@ private:
|
|||||||
int m_sumCount;
|
int m_sumCount;
|
||||||
|
|
||||||
double m_magsq;
|
double m_magsq;
|
||||||
MovingAverage<double> m_movingAverage;
|
MovingAverageUtil<double, double, 16> m_movingAverage;
|
||||||
|
|
||||||
AudioVector m_audioBuffer;
|
AudioVector m_audioBuffer;
|
||||||
uint m_audioBufferFill;
|
uint m_audioBufferFill;
|
||||||
|
@ -352,7 +352,6 @@ SSBModGUI::SSBModGUI(PluginAPI* pluginAPI, DeviceUISet *deviceUISet, BasebandSam
|
|||||||
m_channelMarker(this),
|
m_channelMarker(this),
|
||||||
m_doApplySettings(true),
|
m_doApplySettings(true),
|
||||||
m_spectrumRate(6000),
|
m_spectrumRate(6000),
|
||||||
m_channelPowerDbAvg(20,0),
|
|
||||||
m_recordLength(0),
|
m_recordLength(0),
|
||||||
m_recordSampleRate(48000),
|
m_recordSampleRate(48000),
|
||||||
m_samplesCount(0),
|
m_samplesCount(0),
|
||||||
@ -672,8 +671,8 @@ void SSBModGUI::enterEvent(QEvent*)
|
|||||||
void SSBModGUI::tick()
|
void SSBModGUI::tick()
|
||||||
{
|
{
|
||||||
double powDb = CalcDb::dbPower(m_ssbMod->getMagSq());
|
double powDb = CalcDb::dbPower(m_ssbMod->getMagSq());
|
||||||
m_channelPowerDbAvg.feed(powDb);
|
m_channelPowerDbAvg(powDb);
|
||||||
ui->channelPower->setText(tr("%1 dB").arg(m_channelPowerDbAvg.average(), 0, 'f', 1));
|
ui->channelPower->setText(tr("%1 dB").arg(m_channelPowerDbAvg.asDouble(), 0, 'f', 1));
|
||||||
|
|
||||||
if (((++m_tickCount & 0xf) == 0) && (m_modAFInput == SSBMod::SSBModInputFile))
|
if (((++m_tickCount & 0xf) == 0) && (m_modAFInput == SSBMod::SSBModInputFile))
|
||||||
{
|
{
|
||||||
|
@ -22,7 +22,7 @@
|
|||||||
#include <plugin/plugininstancegui.h>
|
#include <plugin/plugininstancegui.h>
|
||||||
#include "gui/rollupwidget.h"
|
#include "gui/rollupwidget.h"
|
||||||
#include "dsp/channelmarker.h"
|
#include "dsp/channelmarker.h"
|
||||||
#include "dsp/movingaverage.h"
|
#include "util/movingaverage.h"
|
||||||
#include "util/messagequeue.h"
|
#include "util/messagequeue.h"
|
||||||
|
|
||||||
#include "ssbmod.h"
|
#include "ssbmod.h"
|
||||||
@ -69,7 +69,7 @@ private:
|
|||||||
|
|
||||||
SpectrumVis* m_spectrumVis;
|
SpectrumVis* m_spectrumVis;
|
||||||
SSBMod* m_ssbMod;
|
SSBMod* m_ssbMod;
|
||||||
MovingAverage<double> m_channelPowerDbAvg;
|
MovingAverageUtil<double, double, 20> m_channelPowerDbAvg;
|
||||||
|
|
||||||
QString m_fileName;
|
QString m_fileName;
|
||||||
quint32 m_recordLength;
|
quint32 m_recordLength;
|
||||||
|
@ -51,8 +51,6 @@ WFMMod::WFMMod(DeviceSinkAPI *deviceAPI) :
|
|||||||
m_outputSampleRate(384000),
|
m_outputSampleRate(384000),
|
||||||
m_inputFrequencyOffset(0),
|
m_inputFrequencyOffset(0),
|
||||||
m_modPhasor(0.0f),
|
m_modPhasor(0.0f),
|
||||||
m_movingAverage(40, 0),
|
|
||||||
m_volumeAGC(40, 0),
|
|
||||||
m_audioFifo(4800),
|
m_audioFifo(4800),
|
||||||
m_settingsMutex(QMutex::Recursive),
|
m_settingsMutex(QMutex::Recursive),
|
||||||
m_fileSize(0),
|
m_fileSize(0),
|
||||||
@ -73,8 +71,6 @@ WFMMod::WFMMod(DeviceSinkAPI *deviceAPI) :
|
|||||||
m_audioBuffer.resize(1<<14);
|
m_audioBuffer.resize(1<<14);
|
||||||
m_audioBufferFill = 0;
|
m_audioBufferFill = 0;
|
||||||
|
|
||||||
m_movingAverage.resize(16, 0);
|
|
||||||
m_volumeAGC.resize(4096, 0.003, 0);
|
|
||||||
m_magsq = 0.0;
|
m_magsq = 0.0;
|
||||||
|
|
||||||
m_toneNco.setFreq(1000.0, m_settings.m_audioSampleRate);
|
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();
|
double magsq = ci.real() * ci.real() + ci.imag() * ci.imag();
|
||||||
magsq /= (SDR_TX_SCALED*SDR_TX_SCALED);
|
magsq /= (SDR_TX_SCALED*SDR_TX_SCALED);
|
||||||
m_movingAverage.feed(magsq);
|
m_movingAverage(magsq);
|
||||||
m_magsq = m_movingAverage.average();
|
m_magsq = m_movingAverage.asDouble();
|
||||||
|
|
||||||
sample.m_real = (FixReal) ci.real();
|
sample.m_real = (FixReal) ci.real();
|
||||||
sample.m_imag = (FixReal) ci.imag();
|
sample.m_imag = (FixReal) ci.imag();
|
||||||
|
@ -28,7 +28,7 @@
|
|||||||
#include "dsp/ncof.h"
|
#include "dsp/ncof.h"
|
||||||
#include "dsp/interpolator.h"
|
#include "dsp/interpolator.h"
|
||||||
#include "dsp/fftfilt.h"
|
#include "dsp/fftfilt.h"
|
||||||
#include "dsp/movingaverage.h"
|
#include "util/movingaverage.h"
|
||||||
#include "dsp/agc.h"
|
#include "dsp/agc.h"
|
||||||
#include "dsp/cwkeyer.h"
|
#include "dsp/cwkeyer.h"
|
||||||
#include "audio/audiofifo.h"
|
#include "audio/audiofifo.h"
|
||||||
@ -294,8 +294,7 @@ private:
|
|||||||
int m_rfFilterBufferIndex;
|
int m_rfFilterBufferIndex;
|
||||||
|
|
||||||
double m_magsq;
|
double m_magsq;
|
||||||
MovingAverage<double> m_movingAverage;
|
MovingAverageUtil<double, double, 16> m_movingAverage;
|
||||||
SimpleAGC m_volumeAGC;
|
|
||||||
|
|
||||||
AudioVector m_audioBuffer;
|
AudioVector m_audioBuffer;
|
||||||
uint m_audioBufferFill;
|
uint m_audioBufferFill;
|
||||||
|
@ -272,7 +272,6 @@ WFMModGUI::WFMModGUI(PluginAPI* pluginAPI, DeviceUISet *deviceUISet, BasebandSam
|
|||||||
m_deviceUISet(deviceUISet),
|
m_deviceUISet(deviceUISet),
|
||||||
m_channelMarker(this),
|
m_channelMarker(this),
|
||||||
m_doApplySettings(true),
|
m_doApplySettings(true),
|
||||||
m_channelPowerDbAvg(20,0),
|
|
||||||
m_recordLength(0),
|
m_recordLength(0),
|
||||||
m_recordSampleRate(48000),
|
m_recordSampleRate(48000),
|
||||||
m_samplesCount(0),
|
m_samplesCount(0),
|
||||||
@ -415,8 +414,8 @@ void WFMModGUI::enterEvent(QEvent*)
|
|||||||
void WFMModGUI::tick()
|
void WFMModGUI::tick()
|
||||||
{
|
{
|
||||||
double powDb = CalcDb::dbPower(m_wfmMod->getMagSq());
|
double powDb = CalcDb::dbPower(m_wfmMod->getMagSq());
|
||||||
m_channelPowerDbAvg.feed(powDb);
|
m_channelPowerDbAvg(powDb);
|
||||||
ui->channelPower->setText(tr("%1 dB").arg(m_channelPowerDbAvg.average(), 0, 'f', 1));
|
ui->channelPower->setText(tr("%1 dB").arg(m_channelPowerDbAvg.asDouble(), 0, 'f', 1));
|
||||||
|
|
||||||
if (((++m_tickCount & 0xf) == 0) && (m_modAFInput == WFMMod::WFMModInputFile))
|
if (((++m_tickCount & 0xf) == 0) && (m_modAFInput == WFMMod::WFMModInputFile))
|
||||||
{
|
{
|
||||||
|
@ -20,7 +20,7 @@
|
|||||||
#include <plugin/plugininstancegui.h>
|
#include <plugin/plugininstancegui.h>
|
||||||
#include "gui/rollupwidget.h"
|
#include "gui/rollupwidget.h"
|
||||||
#include "dsp/channelmarker.h"
|
#include "dsp/channelmarker.h"
|
||||||
#include "dsp/movingaverage.h"
|
#include "util/movingaverage.h"
|
||||||
#include "util/messagequeue.h"
|
#include "util/messagequeue.h"
|
||||||
|
|
||||||
#include "wfmmod.h"
|
#include "wfmmod.h"
|
||||||
@ -68,7 +68,7 @@ private:
|
|||||||
// ThreadedBasebandSampleSource* m_threadedChannelizer;
|
// ThreadedBasebandSampleSource* m_threadedChannelizer;
|
||||||
// UpChannelizer* m_channelizer;
|
// UpChannelizer* m_channelizer;
|
||||||
WFMMod* m_wfmMod;
|
WFMMod* m_wfmMod;
|
||||||
MovingAverage<double> m_channelPowerDbAvg;
|
MovingAverageUtil<double, double, 20> m_channelPowerDbAvg;
|
||||||
|
|
||||||
QString m_fileName;
|
QString m_fileName;
|
||||||
quint32 m_recordLength;
|
quint32 m_recordLength;
|
||||||
|
@ -107,8 +107,6 @@ UDPSinkGUI::UDPSinkGUI(PluginAPI* pluginAPI, DeviceUISet *deviceUISet, BasebandS
|
|||||||
ui(new Ui::UDPSinkGUI),
|
ui(new Ui::UDPSinkGUI),
|
||||||
m_pluginAPI(pluginAPI),
|
m_pluginAPI(pluginAPI),
|
||||||
m_deviceUISet(deviceUISet),
|
m_deviceUISet(deviceUISet),
|
||||||
m_channelPowerAvg(4, 1e-10),
|
|
||||||
m_inPowerAvg(4, 1e-10),
|
|
||||||
m_tickCount(0),
|
m_tickCount(0),
|
||||||
m_channelMarker(this),
|
m_channelMarker(this),
|
||||||
m_rfBandwidthChanged(false),
|
m_rfBandwidthChanged(false),
|
||||||
@ -454,14 +452,14 @@ void UDPSinkGUI::enterEvent(QEvent*)
|
|||||||
|
|
||||||
void UDPSinkGUI::tick()
|
void UDPSinkGUI::tick()
|
||||||
{
|
{
|
||||||
m_channelPowerAvg.feed(m_udpSink->getMagSq());
|
m_channelPowerAvg(m_udpSink->getMagSq());
|
||||||
m_inPowerAvg.feed(m_udpSink->getInMagSq());
|
m_inPowerAvg(m_udpSink->getInMagSq());
|
||||||
|
|
||||||
if (m_tickCount % 4 == 0)
|
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));
|
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));
|
ui->inputPower->setText(tr("%1").arg(inPowDb, 0, 'f', 1));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -23,6 +23,7 @@
|
|||||||
#include "gui/rollupwidget.h"
|
#include "gui/rollupwidget.h"
|
||||||
#include "dsp/channelmarker.h"
|
#include "dsp/channelmarker.h"
|
||||||
#include "util/messagequeue.h"
|
#include "util/messagequeue.h"
|
||||||
|
#include "util/movingaverage.h"
|
||||||
|
|
||||||
#include "udpsink.h"
|
#include "udpsink.h"
|
||||||
#include "udpsinksettings.h"
|
#include "udpsinksettings.h"
|
||||||
@ -62,8 +63,8 @@ private:
|
|||||||
DeviceUISet* m_deviceUISet;
|
DeviceUISet* m_deviceUISet;
|
||||||
SpectrumVis* m_spectrumVis;
|
SpectrumVis* m_spectrumVis;
|
||||||
UDPSink* m_udpSink;
|
UDPSink* m_udpSink;
|
||||||
MovingAverage<double> m_channelPowerAvg;
|
MovingAverageUtil<double, double, 4> m_channelPowerAvg;
|
||||||
MovingAverage<double> m_inPowerAvg;
|
MovingAverageUtil<double, double, 4> m_inPowerAvg;
|
||||||
uint32_t m_tickCount;
|
uint32_t m_tickCount;
|
||||||
ChannelMarker m_channelMarker;
|
ChannelMarker m_channelMarker;
|
||||||
|
|
||||||
|
@ -32,6 +32,13 @@ class MovingAverageUtil
|
|||||||
: m_num_samples(0), m_index(0), m_total(0)
|
: 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)
|
void operator()(T sample)
|
||||||
{
|
{
|
||||||
if (m_num_samples < N) // fill up
|
if (m_num_samples < N) // fill up
|
||||||
@ -42,14 +49,14 @@ class MovingAverageUtil
|
|||||||
else // roll
|
else // roll
|
||||||
{
|
{
|
||||||
T& oldest = m_samples[m_index];
|
T& oldest = m_samples[m_index];
|
||||||
m_index = (m_index + 1) % N;
|
|
||||||
m_total += sample - oldest;
|
m_total += sample - oldest;
|
||||||
oldest = sample;
|
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; }
|
double asDouble() const { return m_total / N; }
|
||||||
operator float() const { return m_num_samples > 0 ? m_total / std::min(m_num_samples, N) : 0.0f; }
|
float asFloat() const { return m_total / N; }
|
||||||
operator T() const { return m_total / N; }
|
operator T() const { return m_total / N; }
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
Loading…
Reference in New Issue
Block a user