From d872a79a27bbcc8bd1410fe289aceff169763ddb Mon Sep 17 00:00:00 2001 From: Bob Date: Thu, 8 Nov 2012 21:42:55 +0100 Subject: [PATCH] fixed: use a ringbuffer to avoid calling memmove on every sample --- src/fft.cpp | 18 ++++++++++++++---- src/fft.h | 1 + 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/src/fft.cpp b/src/fft.cpp index b41f213..01ab8ff 100644 --- a/src/fft.cpp +++ b/src/fft.cpp @@ -27,6 +27,7 @@ Cfft::Cfft() { m_inbuf = NULL; + m_inbufpos = 0; m_fftin = NULL; m_outbuf = NULL; m_window = NULL; @@ -69,6 +70,7 @@ void Cfft::Free() fftw_free(m_outbuf); delete[] m_window; m_inbuf = NULL; + m_inbufpos = 0; m_fftin = NULL; m_outbuf = NULL; m_window = NULL; @@ -83,10 +85,16 @@ void Cfft::Free() void Cfft::ApplyWindow() { - float* in = m_inbuf; + float* in = m_inbuf + m_inbufpos; float* inend = m_inbuf + m_bufsize; - float* window = m_window; float* out = m_fftin; + float* window = m_window; + + while (in != inend) + *(out++) = *(in++) * *(window++); + + in = m_inbuf; + inend = m_inbuf + m_inbufpos; while (in != inend) *(out++) = *(in++) * *(window++); @@ -94,7 +102,9 @@ void Cfft::ApplyWindow() void Cfft::AddSample(float sample) { - memmove(m_inbuf, m_inbuf + 1, (m_bufsize - 1) * sizeof(float)); - m_inbuf[m_bufsize - 1] = sample; + m_inbuf[m_inbufpos] = sample; + m_inbufpos++; + if (m_inbufpos == m_bufsize) + m_inbufpos = 0; } diff --git a/src/fft.h b/src/fft.h index a574280..04f08f8 100644 --- a/src/fft.h +++ b/src/fft.h @@ -34,6 +34,7 @@ class Cfft void AddSample(float sample); float* m_inbuf; + unsigned int m_inbufpos; float* m_fftin; float* m_window; fftwf_complex* m_outbuf;