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) {