WFM Demod: implemented the signal gauge

This commit is contained in:
f4exb 2017-04-26 11:09:07 +02:00
parent 2c8374bd9e
commit 6b97d9ea59
4 changed files with 52 additions and 8 deletions

View File

@ -31,7 +31,13 @@ MESSAGE_CLASS_DEFINITION(WFMDemod::MsgConfigureWFMDemod, Message)
WFMDemod::WFMDemod(BasebandSampleSink* sampleSink) :
m_sampleSink(sampleSink),
m_audioFifo(4, 250000),
m_settingsMutex(QMutex::Recursive)
m_settingsMutex(QMutex::Recursive),
m_squelchOpen(false),
m_magsq(0.0f),
m_magsqSum(0.0f),
m_magsqPeak(0.0f),
m_magsqCount(0)
{
setObjectName("WFMDemod");
@ -90,16 +96,26 @@ void WFMDemod::feed(const SampleVector::const_iterator& begin, const SampleVecto
for (SampleVector::const_iterator it = begin; it != end; ++it)
{
Complex c(it->real() / 32768.0f, it->imag() / 32768.0f);
//Complex c(it->real() / 32768.0f, it->imag() / 32768.0f);
Complex c(it->real(), it->imag());
c *= m_nco.nextIQ();
rf_out = m_rfFilter->runFilt(c, &rf); // filter RF before demod
for (int i =0 ; i <rf_out; i++)
for (int i = 0 ; i < rf_out; i++)
{
demod = m_phaseDiscri.phaseDiscriminatorDelta(rf[i], msq, fmDev);
Real magsq = msq / (1<<30);
m_movingAverage.feed(msq);
m_movingAverage.feed(magsq);
m_magsqSum += magsq;
if (magsq > m_magsqPeak)
{
m_magsqPeak = magsq;
}
m_magsqCount++;
if(m_movingAverage.average() >= m_squelchLevel)
m_squelchState = m_running.m_rfBandwidth / 20; // decay rate

View File

@ -53,6 +53,17 @@ public:
Real getMagSq() const { return m_movingAverage.average(); }
bool getSquelchOpen() const { return m_squelchOpen; }
void getMagSqLevels(Real& avg, Real& peak, int& nbSamples)
{
avg = m_magsqSum / m_magsqCount;
m_magsq = avg;
peak = m_magsqPeak;
nbSamples = m_magsqCount;
m_magsqSum = 0.0f;
m_magsqPeak = 0.0f;
m_magsqCount = 0;
}
private:
class MsgConfigureWFMDemod : public Message {
MESSAGE_CLASS_DECLARATION
@ -131,6 +142,10 @@ private:
Real m_squelchLevel;
int m_squelchState;
bool m_squelchOpen;
Real m_magsq; //!< displayed averaged value
Real m_magsqSum;
Real m_magsqPeak;
int m_magsqCount;
Real m_lastArgument;
MovingAverage<double> m_movingAverage;

View File

@ -224,6 +224,7 @@ WFMDemodGUI::WFMDemodGUI(PluginAPI* pluginAPI, DeviceSourceAPI *deviceAPI, QWidg
ui->setupUi(this);
ui->deltaFrequency->setColorMapper(ColorMapper(ColorMapper::ReverseGold));
ui->deltaFrequency->setValueRange(7, 0U, 9999999U);
ui->channelPowerMeter->setColorTheme(LevelMeterSignalDB::ColorGreenAndBlue);
setAttribute(Qt::WA_DeleteOnClose, true);
@ -314,9 +315,21 @@ 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));
// Real powDb = CalcDb::dbPower(m_wfmDemod->getMagSq());
// m_channelPowerDbAvg.feed(powDb);
// ui->channelPower->setText(QString::number(m_channelPowerDbAvg.average(), 'f', 1));
Real magsqAvg, magsqPeak;
int nbMagsqSamples;
m_wfmDemod->getMagSqLevels(magsqAvg, magsqPeak, nbMagsqSamples);
Real powDbAvg = CalcDb::dbPower(magsqAvg);
Real powDbPeak = CalcDb::dbPower(magsqPeak);
ui->channelPower->setText(QString::number(powDbAvg, 'f', 1));
ui->channelPowerMeter->levelChanged(
(100.0f + powDbAvg) / 100.0f,
(100.0f + powDbPeak) / 100.0f,
nbMagsqSamples);
bool squelchOpen = m_wfmDemod->getSquelchOpen();

View File

@ -7,7 +7,7 @@
const PluginDescriptor WFMPlugin::m_pluginDescriptor = {
QString("WFM Demodulator"),
QString("3.1.0"),
QString("3.4.1"),
QString("(c) Edouard Griffiths, F4EXB"),
QString("https://github.com/f4exb/sdrangel"),
true,