Mercurial > hg > decimation
changeset 9:8112ee43f17f
Cache calculated filters
author | Chris Cannam |
---|---|
date | Wed, 16 Oct 2013 13:33:36 +0100 |
parents | 94c1cadc6caf |
children | f81f1dd66598 |
files | garage-resampler/Makefile garage-resampler/Resampler.cpp |
diffstat | 2 files changed, 31 insertions(+), 9 deletions(-) [+] |
line wrap: on
line diff
--- a/garage-resampler/Makefile Wed Oct 16 13:33:18 2013 +0100 +++ b/garage-resampler/Makefile Wed Oct 16 13:33:36 2013 +0100 @@ -1,7 +1,9 @@ -CFLAGS := -I../.. $(CFLAGS) -CXXFLAGS := -I../.. -Wall -g $(CXXFLAGS) -#CXXFLAGS := -I../.. -Wall -O3 $(CXXFLAGS) +DEFINES := -DUSE_PTHREADS + +CFLAGS := -I../.. $(CFLAGS) $(DEFINES) +CXXFLAGS := -I../.. -Wall -g $(CXXFLAGS) $(DEFINES) +#CXXFLAGS := -I../.. -Wall -O3 -ffast-math -ftree-vectorize -ftree-vectorizer-verbose=3 $(CXXFLAGS) $(DEFINES) LDFLAGS := $(LDFLAGS) -lboost_unit_test_framework LIBS := ../../qm-dsp/libqm-dsp.a
--- a/garage-resampler/Resampler.cpp Wed Oct 16 13:33:18 2013 +0100 +++ b/garage-resampler/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 <iostream> #include <vector> @@ -27,6 +28,13 @@ delete[] m_phaseData; } +// peakToPole -> length -> beta -> window +static map<int, map<int, map<double, vector<double> > > > +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<double> filter; + knownFilterMutex.lock(); - vector<double> 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<double>(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;