From eb47a29f4ab9597e466325f1b6b1cab7917ef8c2 Mon Sep 17 00:00:00 2001 From: f4exb Date: Sun, 26 Mar 2017 11:54:18 +0200 Subject: [PATCH] ATV Modulator: fixed calculation on sample rate change --- plugins/channeltx/modatv/atvmod.cpp | 40 +++++++++++++++++++---------- plugins/channeltx/modatv/atvmod.h | 4 +-- 2 files changed, 29 insertions(+), 15 deletions(-) diff --git a/plugins/channeltx/modatv/atvmod.cpp b/plugins/channeltx/modatv/atvmod.cpp index b89bfe674..85daa52a9 100644 --- a/plugins/channeltx/modatv/atvmod.cpp +++ b/plugins/channeltx/modatv/atvmod.cpp @@ -84,12 +84,10 @@ ATVMod::ATVMod() : m_DSBFilterBuffer = new Complex[m_ssbFftLen]; memset(m_DSBFilterBuffer, 0, sizeof(Complex)*(m_ssbFftLen)); - applyStandard(); - m_interpolatorDistanceRemain = 0.0f; m_interpolatorDistance = 1.0f; - apply(true); + apply(true); // does applyStandard() too; m_movingAverage.resize(16, 0); } @@ -691,10 +689,19 @@ void ATVMod::apply(bool force) || (m_config.m_atvModulation != m_running.m_atvModulation) || force) { int rateUnits, nbPointsPerRateUnit; - getBaseValues(m_config.m_nbLines * m_config.m_fps, rateUnits, nbPointsPerRateUnit); + getBaseValues(m_config.m_outputSampleRate, m_config.m_nbLines * m_config.m_fps, rateUnits, nbPointsPerRateUnit); m_tvSampleRate = (m_config.m_outputSampleRate / rateUnits) * rateUnits; // make sure working sample rate is a multiple of rate units m_pointsPerLine = (m_tvSampleRate / rateUnits) * nbPointsPerRateUnit; +// qDebug() << "ATVMod::apply: " +// << " m_nbLines: " << m_config.m_nbLines +// << " m_fps: " << m_config.m_fps +// << " rateUnits: " << rateUnits +// << " nbPointsPerRateUnit: " << nbPointsPerRateUnit +// << " m_outputSampleRate: " << m_config.m_outputSampleRate +// << " m_tvSampleRate: " << m_tvSampleRate +// << " m_pointsPerTU: " << m_pointsPerTU; + m_settingsMutex.lock(); if (m_tvSampleRate > 0) @@ -715,7 +722,7 @@ void ATVMod::apply(bool force) memset(m_SSBFilterBuffer, 0, sizeof(Complex)*(m_ssbFftLen>>1)); m_SSBFilterBufferIndex = 0; - applyStandard(); // set all timings + applyStandard(rateUnits, nbPointsPerRateUnit); // set all timings m_settingsMutex.unlock(); MsgReportEffectiveSampleRate *report; @@ -767,17 +774,18 @@ void ATVMod::apply(bool force) m_running.m_forceDecimator = m_config.m_forceDecimator; } -void ATVMod::getBaseValues(int linesPerSecond, int& sampleRateUnits, int& nbPointsPerRateUnit) +void ATVMod::getBaseValues(int outputSampleRate, int linesPerSecond, int& sampleRateUnits, int& nbPointsPerRateUnit) { - int i = 0; + int maxPoints = outputSampleRate / linesPerSecond; + int i = maxPoints; - for (; i < 100; i++) + for (; i > 0; i--) { - if (((100+i) * linesPerSecond) % 1000 == 0) + if ((i * linesPerSecond) % 1000 == 0) break; } - nbPointsPerRateUnit = (i == 100) ? 100 : 100+i; + nbPointsPerRateUnit = i; sampleRateUnits = nbPointsPerRateUnit * linesPerSecond; } @@ -798,10 +806,8 @@ float ATVMod::getRFBandwidthDivisor(ATVModulation modulation) } } -void ATVMod::applyStandard() +void ATVMod::applyStandard(int rateUnits, int nbPointsPerRateUnit) { - int rateUnits, nbPointsPerRateUnit; - getBaseValues(m_config.m_nbLines * m_config.m_fps, rateUnits, nbPointsPerRateUnit); m_pointsPerTU = m_tvSampleRate / rateUnits; // TV sample rate is already set at a multiple of rate units m_pointsPerSync = (uint32_t) roundf(4.7f * m_pointsPerTU); // normal sync pulse (4.7 us / rateUnits) @@ -819,6 +825,14 @@ void ATVMod::applyStandard() m_nbLines2 = (m_nbLines / 2) + 1; m_fps = m_config.m_fps * 1.0f; +// qDebug() << "ATVMod::applyStandard: " +// << " m_nbLines: " << m_config.m_nbLines +// << " m_fps: " << m_config.m_fps +// << " rateUnits: " << rateUnits +// << " nbPointsPerRateUnit: " << nbPointsPerRateUnit +// << " m_tvSampleRate: " << m_tvSampleRate +// << " m_pointsPerTU: " << m_pointsPerTU; + switch(m_config.m_atvStd) { case ATVStd405: // Follows loosely the 405 lines standard diff --git a/plugins/channeltx/modatv/atvmod.h b/plugins/channeltx/modatv/atvmod.h index 0be09c77b..313ff80c1 100644 --- a/plugins/channeltx/modatv/atvmod.h +++ b/plugins/channeltx/modatv/atvmod.h @@ -404,7 +404,7 @@ public: Real getMagSq() const { return m_movingAverage.average(); } void getCameraNumbers(std::vector& numbers); - static void getBaseValues(int linesPerSecond, int& sampleRateUnits, int& nbPointsPerRateUnit); + static void getBaseValues(int outputSampleRate, int linesPerSecond, int& sampleRateUnits, int& nbPointsPerRateUnit); static float getRFBandwidthDivisor(ATVModulation modulation); signals: @@ -699,7 +699,7 @@ private: void modulateSample(); Complex& modulateSSB(Real& sample); Complex& modulateVestigialSSB(Real& sample); - void applyStandard(); + void applyStandard(int rateUnits, int nbPointsPerRateUnit); void openImage(const QString& fileName); void openVideo(const QString& fileName); void resizeImage();