1
0
mirror of https://github.com/f4exb/sdrangel.git synced 2024-09-28 15:56:33 -04:00

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) : WFMDemod::WFMDemod(BasebandSampleSink* sampleSink) :
m_sampleSink(sampleSink), m_sampleSink(sampleSink),
m_audioFifo(4, 250000), 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"); 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) 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(); c *= m_nco.nextIQ();
rf_out = m_rfFilter->runFilt(c, &rf); // filter RF before demod 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); 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) if(m_movingAverage.average() >= m_squelchLevel)
m_squelchState = m_running.m_rfBandwidth / 20; // decay rate m_squelchState = m_running.m_rfBandwidth / 20; // decay rate

View File

@ -53,6 +53,17 @@ public:
Real getMagSq() const { return m_movingAverage.average(); } Real getMagSq() const { return m_movingAverage.average(); }
bool getSquelchOpen() const { return m_squelchOpen; } 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: private:
class MsgConfigureWFMDemod : public Message { class MsgConfigureWFMDemod : public Message {
MESSAGE_CLASS_DECLARATION MESSAGE_CLASS_DECLARATION
@ -131,6 +142,10 @@ private:
Real m_squelchLevel; Real m_squelchLevel;
int m_squelchState; int m_squelchState;
bool m_squelchOpen; bool m_squelchOpen;
Real m_magsq; //!< displayed averaged value
Real m_magsqSum;
Real m_magsqPeak;
int m_magsqCount;
Real m_lastArgument; Real m_lastArgument;
MovingAverage<double> m_movingAverage; MovingAverage<double> m_movingAverage;

View File

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

View File

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