mirror of
https://github.com/f4exb/sdrangel.git
synced 2024-09-30 00:36:36 -04:00
WFM Demod: implemented the signal gauge
This commit is contained in:
parent
2c8374bd9e
commit
6b97d9ea59
@ -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
|
||||||
|
@ -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;
|
||||||
|
@ -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();
|
||||||
|
|
||||||
|
@ -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,
|
||||||
|
Loading…
Reference in New Issue
Block a user