comparison dsp/rateconversion/Resampler.cpp @ 138:e89d489af128

Add one-shot resample function
author Chris Cannam
date Sun, 13 Oct 2013 12:47:50 +0100
parents dce8337a83c8
children 7fe0da91e9c3
comparison
equal deleted inserted replaced
137:dce8337a83c8 138:e89d489af128
5 #include "qm-dsp/maths/MathUtilities.h" 5 #include "qm-dsp/maths/MathUtilities.h"
6 #include "qm-dsp/base/KaiserWindow.h" 6 #include "qm-dsp/base/KaiserWindow.h"
7 #include "qm-dsp/base/SincWindow.h" 7 #include "qm-dsp/base/SincWindow.h"
8 8
9 #include <iostream> 9 #include <iostream>
10 #include <vector>
11
12 using std::vector;
10 13
11 Resampler::Resampler(int sourceRate, int targetRate) : 14 Resampler::Resampler(int sourceRate, int targetRate) :
12 m_sourceRate(sourceRate), 15 m_sourceRate(sourceRate),
13 m_targetRate(targetRate) 16 m_targetRate(targetRate)
14 { 17 {
143 //!!! save any excess 146 //!!! save any excess
144 147
145 return m; 148 return m;
146 } 149 }
147 150
151 std::vector<double>
152 Resampler::resample(int sourceRate, int targetRate, const double *data, int n)
153 {
154 Resampler r(sourceRate, targetRate);
155
156 int latency = r.getLatency();
157
158 int m = int(ceil((n * targetRate) / sourceRate));
159 int m1 = m + latency;
160 int n1 = int((m1 * sourceRate) / targetRate);
161
162 vector<double> pad(n1 - n, 0.0);
163 vector<double> out(m1, 0.0);
164
165 int got = r.process(data, out.data(), n);
166 got += r.process(pad.data(), out.data() + got, pad.size());
167
168 return vector<double>(out.begin() + latency, out.begin() + got);
169 }
170