changeset 371:33e9e964443c

Cache calculated filters
author Chris Cannam <c.cannam@qmul.ac.uk>
date Wed, 16 Oct 2013 13:33:36 +0100
parents 50d393750cfd
children d464286c007b
files dsp/rateconversion/Resampler.cpp
diffstat 1 files changed, 26 insertions(+), 6 deletions(-) [+]
line wrap: on
line diff
--- 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 <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;