# HG changeset patch # User Chris Cannam # Date 1381926816 -3600 # Node ID 235b99c7d4ce96b3c0d5e53aec1e946ca84e7f93 # Parent fe267879e0225e1a3a17ff27d5a633ec98430dac Cache calculated filters diff -r fe267879e022 -r 235b99c7d4ce 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;