diff --git a/plugins/channelrx/demodatv/atvdemodgui.cpp b/plugins/channelrx/demodatv/atvdemodgui.cpp index fa7ed094f..79057c636 100644 --- a/plugins/channelrx/demodatv/atvdemodgui.cpp +++ b/plugins/channelrx/demodatv/atvdemodgui.cpp @@ -136,6 +136,10 @@ void ATVDemodGUI::displaySettings() ui->bfoText->setText(QString("%1").arg(m_settings.m_bfoFrequency * 1.0, 0, 'f', 0)); ui->fmDeviation->setValue((int) (m_settings.m_fmDeviation * 1000.0f)); ui->fmDeviationText->setText(QString("%1").arg(m_settings.m_fmDeviation * 100.0, 0, 'f', 1)); + ui->amScaleFactor->setValue(m_settings.m_amScalingFactor); + ui->amScaleFactorText->setText(QString("%1").arg(m_settings.m_amScalingFactor)); + ui->amScaleOffset->setValue(m_settings.m_amOffsetFactor); + ui->amScaleOffsetText->setText(QString("%1").arg(m_settings.m_amOffsetFactor)); blockApplySettings(false); applyTVSampleRate(); @@ -436,7 +440,7 @@ void ATVDemodGUI::on_lineTime_valueChanged(int value) void ATVDemodGUI::on_topTime_valueChanged(int value) { - ui->topTime->setToolTip(QString("Horizontal sync pulse length adjustment (%1)").arg(value)); + ui->topTime->setToolTip(QString("Horizontal sync pulse length adjustment (%1 %)").arg(value)); m_settings.m_topTimeFactor = value; topTimeUpdate(); applySettings(); @@ -552,6 +556,22 @@ void ATVDemodGUI::on_fmDeviation_valueChanged(int value) applySettings(); } +void ATVDemodGUI::on_amScaleFactor_valueChanged(int value) +{ + ui->amScaleFactor->setValue(m_settings.m_amScalingFactor); + ui->amScaleFactorText->setText(QString("%1").arg(m_settings.m_amScalingFactor)); + m_settings.m_amScalingFactor = value; + applySettings(); +} + +void ATVDemodGUI::on_amScaleOffset_valueChanged(int value) +{ + ui->amScaleOffset->setValue(m_settings.m_amOffsetFactor); + ui->amScaleOffsetText->setText(QString("%1").arg(m_settings.m_amOffsetFactor)); + m_settings.m_amOffsetFactor = value; + applySettings(); +} + void ATVDemodGUI::on_screenTabWidget_currentChanged(int index) { m_atvDemod->setVideoTabIndex(index); @@ -585,15 +605,7 @@ void ATVDemodGUI::lineTimeUpdate() void ATVDemodGUI::topTimeUpdate() { float nominalTopTime = ATVDemodSettings::getNominalLineTime(m_settings.m_nbLines, m_settings.m_fps) * (4.7f / 64.0f); - int topTimeScaleFactor = (int) std::log10(nominalTopTime); - - if (m_tvSampleRate == 0) { - m_fltTopTimeMultiplier = std::pow(10.0, topTimeScaleFactor-3); - } else { - m_fltTopTimeMultiplier = 1.0f / m_tvSampleRate; - } - - float topTime = nominalTopTime + m_fltTopTimeMultiplier * ui->topTime->value(); + float topTime = nominalTopTime * (ui->topTime->value() / 100.0f); if (topTime < 0.0) ui->topTimeText->setText("invalid"); diff --git a/plugins/channelrx/demodatv/atvdemodgui.h b/plugins/channelrx/demodatv/atvdemodgui.h index 36f0a94b2..8d6c2135e 100644 --- a/plugins/channelrx/demodatv/atvdemodgui.h +++ b/plugins/channelrx/demodatv/atvdemodgui.h @@ -77,7 +77,6 @@ private: ScopeVis* m_scopeVis; float m_fltLineTimeMultiplier; - float m_fltTopTimeMultiplier; int m_rfSliderDivisor; int m_basebandSampleRate; int m_tvSampleRate; @@ -124,6 +123,8 @@ private slots: void on_deltaFrequency_changed(qint64 value); void on_bfo_valueChanged(int value); void on_fmDeviation_valueChanged(int value); + void on_amScaleFactor_valueChanged(int value); + void on_amScaleOffset_valueChanged(int value); void on_screenTabWidget_currentChanged(int index); }; diff --git a/plugins/channelrx/demodatv/atvdemodgui.ui b/plugins/channelrx/demodatv/atvdemodgui.ui index 0e33ab50f..f42c7fd7d 100644 --- a/plugins/channelrx/demodatv/atvdemodgui.ui +++ b/plugins/channelrx/demodatv/atvdemodgui.ui @@ -367,6 +367,108 @@ + + + + Qt::Vertical + + + + + + + AM + + + + + + + + 24 + 24 + + + + Adjust AM scaling as % of nominal scale + + + 50 + + + 200 + + + 1 + + + 100 + + + + + + + + 26 + 0 + + + + % of nominal scale + + + 100 + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + + 24 + 24 + + + + AM offset as % of adjusted scale + + + -50 + + + 50 + + + 1 + + + 0 + + + + + + + + 26 + 0 + + + + % of full scale + + + -50 + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + @@ -906,10 +1008,10 @@ Horizontal sync pulse length adjustment - -30 + 1 - 30 + 100 1 @@ -918,7 +1020,7 @@ 1 - 0 + 25 Qt::Horizontal diff --git a/plugins/channelrx/demodatv/atvdemodsettings.cpp b/plugins/channelrx/demodatv/atvdemodsettings.cpp index 6981f2389..963a7d2e6 100644 --- a/plugins/channelrx/demodatv/atvdemodsettings.cpp +++ b/plugins/channelrx/demodatv/atvdemodsettings.cpp @@ -35,6 +35,8 @@ void ATVDemodSettings::resetToDefaults() m_bfoFrequency = 0.0f; m_atvModulation = ATV_FM1; m_fmDeviation = 0.5f; + m_amScalingFactor = 100; + m_amOffsetFactor = 0; m_fftFiltering = false; m_fftOppBandwidth = 0; m_fftBandwidth = 6000; @@ -48,7 +50,7 @@ void ATVDemodSettings::resetToDefaults() m_levelSynchroTop = 0.1f; m_levelBlack = 0.3f; m_lineTimeFactor = 0; - m_topTimeFactor = 0; + m_topTimeFactor = 25; m_rgbColor = QColor(255, 255, 255).rgb(); m_title = "ATV Demodulator"; m_udpAddress = "127.0.0.1"; @@ -85,6 +87,10 @@ QByteArray ATVDemodSettings::serialize() const s.writeString(20, m_title); s.writeS32(21, m_streamIndex); + s.writeS32(22, m_amScalingFactor); + s.writeS32(23, m_amOffsetFactor); + s.writeBool(24, m_fftFiltering); + s.writeBool(25, m_forceDecimator); return s.final(); } @@ -111,7 +117,7 @@ bool ATVDemodSettings::deserialize(const QByteArray& arrData) d.readS32(4, &tmp, 310); m_levelBlack = tmp / 1000.0f; d.readS32(5, &m_lineTimeFactor, 0); - d.readS32(6, &m_topTimeFactor, 0); + d.readS32(6, &m_topTimeFactor, 25); d.readS32(7, &tmp, 0); m_atvModulation = static_cast(tmp); d.readS32(8, &tmp, 25); @@ -132,6 +138,10 @@ bool ATVDemodSettings::deserialize(const QByteArray& arrData) d.readS32(18, &tmp, 1); m_atvStd = static_cast(tmp); d.readS32(21, &m_streamIndex, 0); + d.readS32(22, &m_amScalingFactor, 100); + d.readS32(23, &m_amOffsetFactor, 0); + d.readBool(24, &m_fftFiltering, false); + d.readBool(25, &m_forceDecimator, false); return true; } @@ -310,25 +320,9 @@ float ATVDemodSettings::getLineTime(unsigned int sampleRate) return nominalLineTime + m_fltLineTimeMultiplier * m_lineTimeFactor; } -/** - * calculates m_fltTopTimeMultiplier - */ -void ATVDemodSettings::topTimeUpdate(unsigned int sampleRate) -{ - float nominalTopTime = getNominalLineTime(m_nbLines, m_fps) * (4.7f / 64.0f); - int topTimeScaleFactor = (int) std::log10(nominalTopTime); - - if (sampleRate == 0) { - m_fltTopTimeMultiplier = std::pow(10.0, topTimeScaleFactor-3); - } else { - m_fltTopTimeMultiplier = 1.0f / sampleRate; - } -} - float ATVDemodSettings::getTopTime(unsigned int sampleRate) { - topTimeUpdate(sampleRate); - return getNominalLineTime(m_nbLines, m_fps) * (4.7f / 64.0f) + m_fltTopTimeMultiplier * m_topTimeFactor; + return getNominalLineTime(m_nbLines, m_fps) * (4.7f / 64.0f) * (m_topTimeFactor / 100.0f); } int ATVDemodSettings::getRFSliderDivisor(unsigned int sampleRate) diff --git a/plugins/channelrx/demodatv/atvdemodsettings.h b/plugins/channelrx/demodatv/atvdemodsettings.h index be36120df..161037856 100644 --- a/plugins/channelrx/demodatv/atvdemodsettings.h +++ b/plugins/channelrx/demodatv/atvdemodsettings.h @@ -51,6 +51,8 @@ struct ATVDemodSettings int m_bfoFrequency; //!< BFO frequency (Hz) ATVModulation m_atvModulation; //!< RF modulation type float m_fmDeviation; //!< Expected FM deviation + int m_amScalingFactor; //!< Factor in % to apply to detected signal scale + int m_amOffsetFactor; //!< Factor in % to apply to adjusted signal scale bool m_fftFiltering; //!< Toggle FFT filter unsigned int m_fftOppBandwidth; //!< FFT filter lower frequency cutoff (Hz) unsigned int m_fftBandwidth; //!< FFT filter high frequency cutoff (Hz) @@ -66,7 +68,7 @@ struct ATVDemodSettings float m_levelSynchroTop; //!< Horizontal synchronization top level (0.0 to 1.0 scale) float m_levelBlack; //!< Black level (0.0 to 1.0 scale) int m_lineTimeFactor; //!< added: +/- 100 something - int m_topTimeFactor; //!< added: +/- 30 something + int m_topTimeFactor; //!< percentage of nominal horizontal top (pulse) time // common channel settings quint32 m_rgbColor; @@ -96,10 +98,8 @@ struct ATVDemodSettings private: void lineTimeUpdate(unsigned int sampleRate); - void topTimeUpdate(unsigned int sampleRate); float m_fltLineTimeMultiplier; - float m_fltTopTimeMultiplier; int m_rfSliderDivisor; }; diff --git a/plugins/channelrx/demodatv/atvdemodsink.cpp b/plugins/channelrx/demodatv/atvdemodsink.cpp index a7527f80c..075eea5cc 100644 --- a/plugins/channelrx/demodatv/atvdemodsink.cpp +++ b/plugins/channelrx/demodatv/atvdemodsink.cpp @@ -298,6 +298,10 @@ void ATVDemodSink::demod(Complex& c) m_ampDelta = 1.0f; } + // readjustment + m_ampDelta /= m_settings.m_amScalingFactor / 100.0f; + m_ampMin += m_ampDelta * (m_settings.m_amOffsetFactor / 100.0f); + // qDebug("ATVDemod::demod: m_ampMin: %f m_ampMax: %f m_ampDelta: %f", m_ampMin, m_ampMax, m_ampDelta); //Reset extrema @@ -409,7 +413,7 @@ void ATVDemodSink::applyStandard(int sampleRate, const ATVDemodSettings& setting m_numberSamplesPerLineSignals = (int) ((12.0f/64.0f) * lineDuration * sampleRate); // 12.0 = 2.6 + 4.7 + 4.7 : front porch + horizontal sync pulse + back porch m_numberSamplesPerHSync = (int) ((9.6f/64.0f) * lineDuration * sampleRate); // 9.4 = 4.7 + 4.7 : horizontal sync pulse + back porch m_numberSamplesPerHTopNom = (int) ((4.7f/64.0f) * lineDuration * sampleRate); // 4.7 : horizontal sync pulse (ultra black) nominal value - m_numberSamplesPerHTop = m_numberSamplesPerHTopNom + settings.m_topTimeFactor; // adjust the value used in the system + m_numberSamplesPerHTop = m_numberSamplesPerHTopNom * (settings.m_topTimeFactor / 100.0f); // adjust the value used in the system } bool ATVDemodSink::getBFOLocked() @@ -585,7 +589,7 @@ void ATVDemodSink::applySettings(const ATVDemodSettings& settings, bool force) } if ((settings.m_topTimeFactor != m_settings.m_topTimeFactor) || force) { - m_numberSamplesPerHTop = m_numberSamplesPerHTopNom + settings.m_topTimeFactor; + m_numberSamplesPerHTop = m_numberSamplesPerHTopNom * (settings.m_topTimeFactor / 100.0f); } if ((settings.m_fmDeviation != m_settings.m_fmDeviation) || force) {