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:
parent
b0a97510e2
commit
a1c84718ef
@ -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);
|
||||||
|
@ -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++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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_ */
|
||||||
|
Loading…
Reference in New Issue
Block a user