diff --git a/plugins/channelrx/demodfreedv/freedvdemod.cpp b/plugins/channelrx/demodfreedv/freedvdemod.cpp index 8219f7068..d0020d501 100644 --- a/plugins/channelrx/demodfreedv/freedvdemod.cpp +++ b/plugins/channelrx/demodfreedv/freedvdemod.cpp @@ -54,7 +54,7 @@ FreeDVDemod::FreeDVStats::FreeDVStats() void FreeDVDemod::FreeDVStats::init() { - m_sync = 0; + m_sync = false; m_snrEst = -20; m_clockOffset = 0; m_freqOffset = 0; @@ -76,7 +76,7 @@ void FreeDVDemod::FreeDVStats::collect(struct freedv *freeDV) m_clockOffset = stats.clock_offset; m_freqOffset = stats.foff; m_syncMetric = stats.sync_metric; - m_sync = stats.sync; + m_sync = stats.sync != 0; m_snrEst = stats.snr_est; if (m_berFrameCount >= m_fps) @@ -85,8 +85,8 @@ void FreeDVDemod::FreeDVStats::collect(struct freedv *freeDV) m_ber = m_ber < 0 ? 0 : m_ber; m_berFrameCount = 0; m_lastTotalBitErrors = m_totalBitErrors; - qDebug("FreeDVStats::collect: demod sync: %d sync metric: %f demod snr: %3.2f dB BER: %d clock offset: %f freq offset: %f", - m_sync, m_syncMetric, m_snrEst, m_ber, m_clockOffset, m_freqOffset); +// qDebug("FreeDVStats::collect: demod sync: %s sync metric: %f demod snr: %3.2f dB BER: %d clock offset: %f freq offset: %f", +// m_sync ? "ok" : "ko", m_syncMetric, m_snrEst, m_ber, m_clockOffset, m_freqOffset); } m_berFrameCount++; @@ -486,8 +486,9 @@ void FreeDVDemod::applyFreeDVMode(FreeDVDemodSettings::FreeDVMode mode) uint32_t modemSampleRate = FreeDVDemodSettings::getModSampleRate(mode); m_settingsMutex.lock(); + SSBFilter->create_filter(m_lowCutoff / (float) modemSampleRate, m_hiCutoff / (float) modemSampleRate); - // baseband interpolator and filter + // baseband interpolator if (modemSampleRate != m_modemSampleRate) { MsgConfigureChannelizer* channelConfigMsg = MsgConfigureChannelizer::create( @@ -498,7 +499,6 @@ void FreeDVDemod::applyFreeDVMode(FreeDVDemodSettings::FreeDVMode mode) //m_interpolatorConsumed = false; m_interpolatorDistance = (Real) m_inputSampleRate / (Real) modemSampleRate; m_interpolator.create(16, m_inputSampleRate, m_hiCutoff * 1.5f, 2.0f); - SSBFilter->create_filter(m_lowCutoff / (float) modemSampleRate, m_hiCutoff / (float) modemSampleRate); int agcNbSamples = (modemSampleRate / 1000) * (1< 0) { - m_freeDVStats.m_fps = m_modemSampleRate / m_nin; - } - if (nSpeechSamples != m_nSpeechSamples) { if (m_speechOut) { @@ -606,9 +603,15 @@ void FreeDVDemod::applyFreeDVMode(FreeDVDemodSettings::FreeDVMode mode) m_iModem = 0; m_nin = freedv_nin(m_freeDV); + if (m_nin > 0) { + m_freeDVStats.m_fps = m_modemSampleRate / m_nin; + } + qDebug() << "FreeDVMod::applyFreeDVMode:" << " fdv_mode: " << fdv_mode << " m_modemSampleRate: " << m_modemSampleRate + << " m_lowCutoff: " << m_lowCutoff + << " m_hiCutoff: " << m_hiCutoff << " Fs: " << Fs << " Rs: " << Rs << " m_nSpeechSamples: " << m_nSpeechSamples diff --git a/plugins/channelrx/demodfreedv/freedvdemod.h b/plugins/channelrx/demodfreedv/freedvdemod.h index 5300f5fc5..9e8dd9939 100644 --- a/plugins/channelrx/demodfreedv/freedvdemod.h +++ b/plugins/channelrx/demodfreedv/freedvdemod.h @@ -163,6 +163,9 @@ public: } void getSNRLevels(double& avg, double& peak, int& nbSamples); + int getBER() const { return m_freeDVStats.m_ber; } + float getFrequencyOffset() const { return m_freeDVStats.m_freqOffset; } + bool isSync() const { return m_freeDVStats.m_sync; } virtual int webapiSettingsGet( SWGSDRangel::SWGChannelSettings& response, @@ -198,7 +201,7 @@ private: void init(); void collect(struct freedv *freedv); - int m_sync; + bool m_sync; float m_snrEst; float m_clockOffset; float m_freqOffset; diff --git a/plugins/channelrx/demodfreedv/freedvdemodgui.cpp b/plugins/channelrx/demodfreedv/freedvdemodgui.cpp index 5fd133e0a..63417adc8 100644 --- a/plugins/channelrx/demodfreedv/freedvdemodgui.cpp +++ b/plugins/channelrx/demodfreedv/freedvdemodgui.cpp @@ -83,14 +83,14 @@ bool FreeDVDemodGUI::deserialize(const QByteArray& data) if(m_settings.deserialize(data)) { displaySettings(); - applySettings(true); // will have true + applyBandwidths(5 - ui->spanLog2->value(), true); // does applySettings(true) return true; } else { m_settings.resetToDefaults(); displaySettings(); - applySettings(true); // will have true + applyBandwidths(5 - ui->spanLog2->value(), true); // does applySettings(true) return false; } } @@ -300,7 +300,7 @@ FreeDVDemodGUI::FreeDVDemodGUI(PluginAPI* pluginAPI, DeviceUISet *deviceUISet, B ui->deltaFrequency->setValueRange(false, 7, -9999999, 9999999); ui->channelPowerMeter->setColorTheme(LevelMeterSignalDB::ColorGreenAndBlue); ui->snrMeter->setColorTheme(LevelMeterSignalDB::ColorCyanAndBlue); - ui->snrMeter->setRange(-20, 30); + ui->snrMeter->setRange(-10, 30); ui->snrMeter->setAverageSmoothing(2); m_channelMarker.setVisible(true); // activate signal on the last setting only @@ -472,20 +472,32 @@ void FreeDVDemodGUI::tick() (FreeDVDemodSettings::m_mminPowerThresholdDBf + powDbPeak) / FreeDVDemodSettings::m_mminPowerThresholdDBf, nbMagsqSamples); - if (m_tickCount % 4 == 0) { - ui->channelPower->setText(tr("%1 dB").arg(powDbAvg, 0, 'f', 1)); - } - double snrAvg, snrPeak; int nbSNRSamples; m_freeDVDemod->getSNRLevels(snrAvg, snrPeak, nbSNRSamples); ui->snrMeter->levelChanged( - (20.0f + snrAvg) / 50.0f, - (20.0f + snrPeak) / 50.0f, + (10.0f + snrAvg) / 40.0f, + (10.0f + snrPeak) / 40.0f, nbSNRSamples ); + ui->berText->setText(tr("%1").arg(m_freeDVDemod->getBER())); + float freqOffset = m_freeDVDemod->getFrequencyOffset(); + int freqOffsetInt = freqOffset < -999 ? -999 : freqOffset > 999 ? 999 : freqOffset; + ui->freqOffset->setText(tr("%1Hz").arg(freqOffsetInt)); + + if (m_freeDVDemod->isSync()) { + ui->syncLabel->setStyleSheet("QLabel { background-color : green; }"); + } else { + ui->syncLabel->setStyleSheet("QLabel { background:rgb(79,79,79); }"); + } + + if (m_tickCount % 4 == 0) { + ui->channelPower->setText(tr("%1 dB").arg(powDbAvg, 0, 'f', 1)); + ui->snrText->setText(tr("%1 dB").arg(snrAvg < -90 ? -90 : snrAvg > 90 ? 90 : snrAvg, 0, 'f', 1)); + } + bool squelchOpen = m_freeDVDemod->getAudioActive(); if (squelchOpen != m_squelchOpen) diff --git a/plugins/channelrx/demodfreedv/freedvdemodgui.ui b/plugins/channelrx/demodfreedv/freedvdemodgui.ui index 7ba50d5f0..5e3c19b66 100644 --- a/plugins/channelrx/demodfreedv/freedvdemodgui.ui +++ b/plugins/channelrx/demodfreedv/freedvdemodgui.ui @@ -6,8 +6,8 @@ 0 0 - 412 - 476 + 442 + 523 @@ -36,7 +36,7 @@ 0 0 - 410 + 441 171 @@ -520,6 +520,12 @@ + + + 0 + 0 + + 180 @@ -532,12 +538,34 @@ 8 + + SNR estimation + - + + + + 52 + 0 + + + + SNR estimation + - dB + -10.0 dB + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + Qt::Vertical @@ -550,22 +578,78 @@ + + + 16 + 0 + + + + Bit Error Rate (bits/s) + 00 + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + 12 + 0 + + + + Sync indicator (OFDM only) + + + QFrame::StyledPanel + + + QFrame::Plain + - Syn + S + + + Qt::AlignCenter - + + + Qt::Vertical + + + + + - 00 + Df + + + + + + + + 50 + 0 + + + + Frequency offset estimation + + + -100Hz + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter diff --git a/plugins/channelrx/demodssb/ssbdemodgui.cpp b/plugins/channelrx/demodssb/ssbdemodgui.cpp index 94fc7e5f4..647eae087 100644 --- a/plugins/channelrx/demodssb/ssbdemodgui.cpp +++ b/plugins/channelrx/demodssb/ssbdemodgui.cpp @@ -67,14 +67,14 @@ bool SSBDemodGUI::deserialize(const QByteArray& data) if(m_settings.deserialize(data)) { displaySettings(); - applySettings(true); // will have true + applyBandwidths(5 - ui->spanLog2->value(), true); // does applySettings(true) return true; } else { m_settings.resetToDefaults(); displaySettings(); - applySettings(true); // will have true + applyBandwidths(5 - ui->spanLog2->value(), true); // does applySettings(true) return false; } } diff --git a/plugins/channelrx/demodssb/ssbplugin.cpp b/plugins/channelrx/demodssb/ssbplugin.cpp index 8a121fa1b..d80233b0d 100644 --- a/plugins/channelrx/demodssb/ssbplugin.cpp +++ b/plugins/channelrx/demodssb/ssbplugin.cpp @@ -10,7 +10,7 @@ const PluginDescriptor SSBPlugin::m_pluginDescriptor = { QString("SSB Demodulator"), - QString("4.3.2"), + QString("4.5.0"), QString("(c) Edouard Griffiths, F4EXB"), QString("https://github.com/f4exb/sdrangel"), true, diff --git a/plugins/channeltx/modfreedv/freedvmod.cpp b/plugins/channeltx/modfreedv/freedvmod.cpp index 7526755af..f37e1174c 100644 --- a/plugins/channeltx/modfreedv/freedvmod.cpp +++ b/plugins/channeltx/modfreedv/freedvmod.cpp @@ -616,6 +616,7 @@ void FreeDVMod::applyFreeDVMode(FreeDVModSettings::FreeDVMode mode) int modemSampleRate = FreeDVModSettings::getModSampleRate(mode); m_settingsMutex.lock(); + m_SSBFilter->create_filter(m_lowCutoff / modemSampleRate, m_hiCutoff / modemSampleRate); // baseband interpolator and filter if (modemSampleRate != m_modemSampleRate) @@ -628,7 +629,6 @@ void FreeDVMod::applyFreeDVMode(FreeDVModSettings::FreeDVMode mode) m_interpolatorConsumed = false; m_interpolatorDistance = (Real) modemSampleRate / (Real) m_outputSampleRate; m_interpolator.create(48, modemSampleRate, m_hiCutoff, 3.0); - m_SSBFilter->create_filter(m_lowCutoff / modemSampleRate, m_hiCutoff / modemSampleRate); m_modemSampleRate = modemSampleRate; if (getMessageQueueToGUI()) @@ -722,6 +722,8 @@ void FreeDVMod::applyFreeDVMode(FreeDVModSettings::FreeDVMode mode) qDebug() << "FreeDVMod::applyFreeDVMode:" << " fdv_mode: " << fdv_mode << " m_modemSampleRate: " << m_modemSampleRate + << " m_lowCutoff: " << m_lowCutoff + << " m_hiCutoff: " << m_hiCutoff << " Fs: " << Fs << " Rs: " << Rs << " m_nSpeechSamples: " << m_nSpeechSamples diff --git a/plugins/channeltx/modfreedv/freedvmodgui.ui b/plugins/channeltx/modfreedv/freedvmodgui.ui index 7f5f3db0d..db21b9f82 100644 --- a/plugins/channeltx/modfreedv/freedvmodgui.ui +++ b/plugins/channeltx/modfreedv/freedvmodgui.ui @@ -454,7 +454,7 @@ - Open record file (48 kHz 32 bit float LE mono) + Open record file (8 kHz 16 bit signed integer LE mono)