diff --git a/plugins/channeltx/modatv/atvmod.cpp b/plugins/channeltx/modatv/atvmod.cpp index adea5c502..abdfcff08 100644 --- a/plugins/channeltx/modatv/atvmod.cpp +++ b/plugins/channeltx/modatv/atvmod.cpp @@ -39,6 +39,7 @@ const float ATVMod::m_spanLevel = 0.7f; const int ATVMod::m_levelNbSamples = 10000; // every 10ms const int ATVMod::m_nbBars = 6; const int ATVMod::m_cameraFPSTestNbFrames = 100; +const int ATVMod::m_ssbFftLen = 1024; ATVMod::ATVMod() : m_modPhasor(0.0f), @@ -54,7 +55,9 @@ ATVMod::ATVMod() : m_videoEOF(false), m_videoOK(false), m_cameraIndex(-1), - m_showOverlayText(false) + m_showOverlayText(false), + m_SSBFilter(0), + m_SSBFilterBuffer(0) { setObjectName("ATVMod"); scanCameras(); @@ -65,6 +68,10 @@ ATVMod::ATVMod() : m_config.m_atvModInput = ATVModInputHBars; m_config.m_atvStd = ATVStdPAL625; + m_SSBFilter = new fftfilt(0, m_config.m_rfBandwidth / m_config.m_outputSampleRate, m_ssbFftLen); + m_SSBFilterBuffer = new Complex[m_ssbFftLen>>1]; // filter returns data exactly half of its size + memset(m_SSBFilterBuffer, 0, sizeof(Complex)*(m_ssbFftLen>>1)); + applyStandard(); m_interpolatorDistanceRemain = 0.0f; @@ -583,6 +590,10 @@ void ATVMod::apply(bool force) m_tvSampleRate = m_config.m_outputSampleRate; } + m_SSBFilter->create_filter(0, m_config.m_rfBandwidth / m_config.m_outputSampleRate); + memset(m_SSBFilterBuffer, 0, sizeof(Complex)*(m_ssbFftLen>>1)); + m_SSBFilterBufferIndex = 0; + applyStandard(); // set all timings m_settingsMutex.unlock(); } diff --git a/plugins/channeltx/modatv/atvmod.h b/plugins/channeltx/modatv/atvmod.h index f4668f464..bceebd43d 100644 --- a/plugins/channeltx/modatv/atvmod.h +++ b/plugins/channeltx/modatv/atvmod.h @@ -31,6 +31,7 @@ #include "dsp/nco.h" #include "dsp/interpolator.h" #include "dsp/movingaverage.h" +#include "dsp/fftfilt.h" #include "util/message.h" class ATVMod : public BasebandSampleSource { @@ -530,6 +531,11 @@ private: std::string m_overlayText; bool m_showOverlayText; + fftfilt* m_SSBFilter; + Complex* m_SSBFilterBuffer; + int m_SSBFilterBufferIndex; + static const int m_ssbFftLen; + static const float m_blackLevel; static const float m_spanLevel; static const int m_levelNbSamples;