Mercurial > hg > qm-dsp
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 |