1
0
mirror of https://github.com/f4exb/sdrangel.git synced 2026-07-26 03:54:30 -04:00

Fix FFT Overlap for spectrum view

Movement of the buffer was double what should have been intended
Added warning to std::copy uses that overlaping copy is undefined
behaviour
This commit is contained in:
Arne Jünemann
2023-10-23 14:48:40 +02:00
parent 9799874c17
commit 1034c79c30
3 changed files with 14 additions and 15 deletions
+6 -4
View File
@@ -327,7 +327,7 @@ void SpectrumVis::feed(const ComplexVector::const_iterator& cbegin, const Comple
while (begin < end)
{
std::size_t todo = end - begin;
std::size_t samplesNeeded = m_refillSize - m_fftBufferFill;
std::size_t samplesNeeded = m_settings.m_fftSize - m_fftBufferFill;
if (todo >= samplesNeeded)
{
@@ -338,6 +338,7 @@ void SpectrumVis::feed(const ComplexVector::const_iterator& cbegin, const Comple
processFFT(positiveOnly);
// advance buffer respecting the fft overlap factor
// undefined bahavior if the memory regions overlap, valid code for 50% overlap
std::copy(m_fftBuffer.begin() + m_refillSize, m_fftBuffer.end(), m_fftBuffer.begin());
// start over
@@ -377,7 +378,7 @@ void SpectrumVis::feed(const SampleVector::const_iterator& cbegin, const SampleV
while (begin < end)
{
std::size_t todo = end - begin;
std::size_t samplesNeeded = m_refillSize - m_fftBufferFill;
std::size_t samplesNeeded = m_settings.m_fftSize - m_fftBufferFill;
if (todo >= samplesNeeded)
{
@@ -391,6 +392,7 @@ void SpectrumVis::feed(const SampleVector::const_iterator& cbegin, const SampleV
processFFT(positiveOnly);
// advance buffer respecting the fft overlap factor
// undefined bahavior if the memory regions overlap, valid code for 50% overlap
std::copy(m_fftBuffer.begin() + m_refillSize, m_fftBuffer.end(), m_fftBuffer.begin());
// start over
@@ -890,8 +892,8 @@ void SpectrumVis::applySettings(const SpectrumSettings& settings, bool force)
if ((fftSize != m_settings.m_fftSize)
|| (settings.m_fftOverlap != m_settings.m_fftOverlap) || force)
{
m_overlapSize = settings.m_fftOverlap < 0 ? 0 :
settings.m_fftOverlap < fftSize/2 ? settings.m_fftOverlap : (fftSize/2) - 1;
m_overlapSize = settings.m_fftOverlap < 0 ? 0 :
settings.m_fftOverlap < fftSize ? settings.m_fftOverlap : (fftSize/2);
m_refillSize = fftSize - m_overlapSize;
m_fftBufferFill = m_overlapSize;
}