1
0
mirror of https://github.com/f4exb/sdrangel.git synced 2024-11-12 11:26:11 -05:00

Simple AGC cleanup

This commit is contained in:
f4exb 2018-02-03 17:06:16 +01:00
parent b0a97510e2
commit a1c84718ef
3 changed files with 24 additions and 37 deletions

View File

@ -45,7 +45,7 @@ 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_volumeAGC(1200, 1.0), m_volumeAGC(0.003),
m_audioFifo(48000), m_audioFifo(48000),
m_settingsMutex(QMutex::Recursive) m_settingsMutex(QMutex::Recursive)
{ {
@ -54,7 +54,6 @@ AMDemod::AMDemod(DeviceSourceAPI *deviceAPI) :
m_audioBuffer.resize(1<<14); m_audioBuffer.resize(1<<14);
m_audioBufferFill = 0; m_audioBufferFill = 0;
m_volumeAGC.resize(4096, 0.003, 0);
m_magsq = 0.0; m_magsq = 0.0;
DSPEngine::instance()->addAudioSink(&m_audioFifo); DSPEngine::instance()->addAudioSink(&m_audioFifo);

View File

@ -144,7 +144,7 @@ private:
int m_magsqCount; int m_magsqCount;
MovingAverageUtil<Real, double, 16> m_movingAverage; MovingAverageUtil<Real, double, 16> m_movingAverage;
SimpleAGC m_volumeAGC; SimpleAGC<4096> m_volumeAGC;
Bandpass<Real> m_bandpass; Bandpass<Real> m_bandpass;
AudioVector m_audioBuffer; AudioVector m_audioBuffer;
@ -179,10 +179,6 @@ private:
{ {
if (m_squelchCount <= m_settings.m_audioSampleRate / 10) if (m_squelchCount <= m_settings.m_audioSampleRate / 10)
{ {
if (m_squelchCount == m_settings.m_audioSampleRate / 20) {
m_volumeAGC.fill(1.0);
}
m_squelchCount++; m_squelchCount++;
} }
} }

View File

@ -9,6 +9,7 @@
#define INCLUDE_GPL_DSP_AGC_H_ #define INCLUDE_GPL_DSP_AGC_H_
#include "movingaverage.h" #include "movingaverage.h"
#include "util/movingaverage.h"
class AGC class AGC
{ {
@ -81,56 +82,47 @@ private:
bool m_squelchOpen; bool m_squelchOpen;
}; };
template<uint32_t AvgSize>
class SimpleAGC class SimpleAGC
{ {
public: public:
SimpleAGC(int historySize, Real initial, Real cutoff=0, Real clip=0) : SimpleAGC(Real cutoff=0, Real clip=0) :
m_squelchOpen(false), m_squelchOpen(false),
m_fill(initial), m_cutoff(cutoff),
m_cutoff(cutoff), m_clip(clip)
m_clip(clip),
m_moving_average(historySize, initial)
{} {}
void resize(int historySize, Real initial, Real cutoff=0, Real clip=0) void resize(Real cutoff=0, Real clip=0)
{ {
m_fill = initial; m_cutoff = cutoff;
m_cutoff = cutoff; m_clip = clip;
m_clip = clip;
m_moving_average.resize(historySize, initial);
}
void fill(double value)
{
m_moving_average.fill(value);
} }
Real getValue() Real getValue()
{ {
if (m_moving_average.average() > m_clip) if ((Real) m_moving_average > m_clip)
{ {
return m_moving_average.average(); return (Real) m_moving_average;
} else } else
{ {
return m_clip; return m_clip;
} }
} }
void feed(Real value) void feed(Real value)
{ {
if (value > m_cutoff) if (value > m_cutoff)
{ {
m_moving_average.feed(value); m_moving_average(value);
} }
} }
private: private:
bool m_squelchOpen; // open for processing bool m_squelchOpen; // open for processing
Real m_fill; // refill average at this level
Real m_cutoff; // consider samples only above this level Real m_cutoff; // consider samples only above this level
Real m_clip; // never go below this level Real m_clip; // never go below this level
MovingAverage<double> m_moving_average; // Averaging engine. The stack length conditions the smoothness of AGC. //MovingAverage<double> m_moving_average; // Averaging engine. The stack length conditions the smoothness of AGC.
MovingAverageUtil<Real, double, AvgSize> m_moving_average;
}; };
#endif /* INCLUDE_GPL_DSP_AGC_H_ */ #endif /* INCLUDE_GPL_DSP_AGC_H_ */