# HG changeset patch # User Chris Cannam # Date 1381926816 -3600 # Node ID 33e9e964443c4c78f58cb27ecc79e4cc89f3f2ef # Parent 50d393750cfd0ec413708c27e67055e0efa3e6a2 Cache calculated filters diff -r 50d393750cfd -r 33e9e964443c dsp/rateconversion/Resampler.cpp --- a/dsp/rateconversion/Resampler.cpp Wed Oct 16 13:33:18 2013 +0100 +++ b/dsp/rateconversion/Resampler.cpp Wed Oct 16 13:33:36 2013 +0100 @@ -5,6 +5,7 @@ #include "qm-dsp/maths/MathUtilities.h" #include "qm-dsp/base/KaiserWindow.h" #include "qm-dsp/base/SincWindow.h" +#include "qm-dsp/thread/Thread.h" #include #include @@ -27,6 +28,13 @@ delete[] m_phaseData; } +// peakToPole -> length -> beta -> window +static map > > > +knownFilters; + +static Mutex +knownFilterMutex; + void Resampler::initialise() { @@ -45,13 +53,25 @@ m_filterLength = params.length; - KaiserWindow kw(params); - SincWindow sw(m_filterLength, peakToPole * 2); + vector filter; + knownFilterMutex.lock(); - vector filter(m_filterLength, 0.0); - for (int i = 0; i < m_filterLength; ++i) filter[i] = 1.0; - sw.cut(filter.data()); - kw.cut(filter.data()); + if (knownFilters[peakToPole][m_filterLength].find(params.beta) == + knownFilters[peakToPole][m_filterLength].end()) { + + KaiserWindow kw(params); + SincWindow sw(m_filterLength, peakToPole * 2); + + filter = vector(m_filterLength, 0.0); + for (int i = 0; i < m_filterLength; ++i) filter[i] = 1.0; + sw.cut(filter.data()); + kw.cut(filter.data()); + + knownFilters[peakToPole][m_filterLength][params.beta] = filter; + } + + filter = knownFilters[peakToPole][m_filterLength][params.beta]; + knownFilterMutex.unlock(); int inputSpacing = m_targetRate / m_gcd; int outputSpacing = m_sourceRate / m_gcd;