Mercurial > hg > qm-dsp
comparison dsp/rateconversion/Resampler.cpp @ 483:fdaa63607c15
Untabify, indent, tidy
author | Chris Cannam <cannam@all-day-breakfast.com> |
---|---|
date | Fri, 31 May 2019 11:54:32 +0100 |
parents | 7ead6122aef7 |
children | 8b92623e81c9 |
comparison
equal
deleted
inserted
replaced
482:cbe668c7d724 | 483:fdaa63607c15 |
---|---|
68 // antialiasing filter, should be slightly below nyquist | 68 // antialiasing filter, should be slightly below nyquist |
69 m_peakToPole = m_peakToPole / (1.0 - bandwidth/2.0); | 69 m_peakToPole = m_peakToPole / (1.0 - bandwidth/2.0); |
70 } | 70 } |
71 | 71 |
72 KaiserWindow::Parameters params = | 72 KaiserWindow::Parameters params = |
73 KaiserWindow::parametersForBandwidth(snr, bandwidth, higher / m_gcd); | 73 KaiserWindow::parametersForBandwidth(snr, bandwidth, higher / m_gcd); |
74 | 74 |
75 params.length = | 75 params.length = |
76 (params.length % 2 == 0 ? params.length + 1 : params.length); | 76 (params.length % 2 == 0 ? params.length + 1 : params.length); |
77 | 77 |
78 params.length = | 78 params.length = |
79 (params.length > 200001 ? 200001 : params.length); | 79 (params.length > 200001 ? 200001 : params.length); |
80 | 80 |
81 m_filterLength = params.length; | 81 m_filterLength = params.length; |
172 | 172 |
173 m_phaseData = new Phase[inputSpacing]; | 173 m_phaseData = new Phase[inputSpacing]; |
174 | 174 |
175 for (int phase = 0; phase < inputSpacing; ++phase) { | 175 for (int phase = 0; phase < inputSpacing; ++phase) { |
176 | 176 |
177 Phase p; | 177 Phase p; |
178 | 178 |
179 p.nextPhase = phase - outputSpacing; | 179 p.nextPhase = phase - outputSpacing; |
180 while (p.nextPhase < 0) p.nextPhase += inputSpacing; | 180 while (p.nextPhase < 0) p.nextPhase += inputSpacing; |
181 p.nextPhase %= inputSpacing; | 181 p.nextPhase %= inputSpacing; |
182 | 182 |
183 p.drop = int(ceil(std::max(0.0, double(outputSpacing - phase)) | 183 p.drop = int(ceil(std::max(0.0, double(outputSpacing - phase)) |
184 / inputSpacing)); | 184 / inputSpacing)); |
185 | 185 |
186 int filtZipLength = int(ceil(double(m_filterLength - phase) | 186 int filtZipLength = int(ceil(double(m_filterLength - phase) |
187 / inputSpacing)); | 187 / inputSpacing)); |
188 | 188 |
189 for (int i = 0; i < filtZipLength; ++i) { | 189 for (int i = 0; i < filtZipLength; ++i) { |
190 p.filter.push_back(filter[i * inputSpacing + phase]); | 190 p.filter.push_back(filter[i * inputSpacing + phase]); |
191 } | 191 } |
192 | 192 |
193 m_phaseData[phase] = p; | 193 m_phaseData[phase] = p; |
194 } | 194 } |
195 | 195 |
196 #ifdef DEBUG_RESAMPLER | 196 #ifdef DEBUG_RESAMPLER |
197 int cp = 0; | 197 int cp = 0; |
198 int totDrop = 0; | 198 int totDrop = 0; |
266 m_buffer = vector<double>(fill, 0); | 266 m_buffer = vector<double>(fill, 0); |
267 m_bufferOrigin = 0; | 267 m_bufferOrigin = 0; |
268 | 268 |
269 #ifdef DEBUG_RESAMPLER | 269 #ifdef DEBUG_RESAMPLER |
270 cerr << "initial phase " << m_phase << " (as " << (m_filterLength/2) << " % " << inputSpacing << ")" | 270 cerr << "initial phase " << m_phase << " (as " << (m_filterLength/2) << " % " << inputSpacing << ")" |
271 << ", latency " << m_latency << endl; | 271 << ", latency " << m_latency << endl; |
272 #endif | 272 #endif |
273 } | 273 } |
274 | 274 |
275 double | 275 double |
276 Resampler::reconstructOne() | 276 Resampler::reconstructOne() |
295 | 295 |
296 const double *const R__ buf(m_buffer.data() + m_bufferOrigin); | 296 const double *const R__ buf(m_buffer.data() + m_bufferOrigin); |
297 const double *const R__ filt(pd.filter.data()); | 297 const double *const R__ filt(pd.filter.data()); |
298 | 298 |
299 for (int i = 0; i < n; ++i) { | 299 for (int i = 0; i < n; ++i) { |
300 // NB gcc can only vectorize this with -ffast-math | 300 // NB gcc can only vectorize this with -ffast-math |
301 v += buf[i] * filt[i]; | 301 v += buf[i] * filt[i]; |
302 } | 302 } |
303 | 303 |
304 m_bufferOrigin += pd.drop; | 304 m_bufferOrigin += pd.drop; |
305 m_phase = pd.nextPhase; | 305 m_phase = pd.nextPhase; |
306 return v; | 306 return v; |
319 #endif | 319 #endif |
320 | 320 |
321 double scaleFactor = (double(m_targetRate) / m_gcd) / m_peakToPole; | 321 double scaleFactor = (double(m_targetRate) / m_gcd) / m_peakToPole; |
322 | 322 |
323 while (outidx < maxout && | 323 while (outidx < maxout && |
324 m_buffer.size() >= m_phaseData[m_phase].filter.size() + m_bufferOrigin) { | 324 m_buffer.size() >= m_phaseData[m_phase].filter.size() + m_bufferOrigin) { |
325 dst[outidx] = scaleFactor * reconstructOne(); | 325 dst[outidx] = scaleFactor * reconstructOne(); |
326 outidx++; | 326 outidx++; |
327 } | 327 } |
328 | 328 |
329 if (m_bufferOrigin > (int)m_buffer.size()) { | 329 if (m_bufferOrigin > (int)m_buffer.size()) { |
330 cerr << "ERROR: m_bufferOrigin > m_buffer.size() [" | 330 cerr << "ERROR: m_bufferOrigin > m_buffer.size() [" |
331 << m_bufferOrigin << " > " << m_buffer.size() << "]" << endl; | 331 << m_bufferOrigin << " > " << m_buffer.size() << "]" << endl; |
390 #endif | 390 #endif |
391 #ifdef DEBUG_RESAMPLER_VERBOSE | 391 #ifdef DEBUG_RESAMPLER_VERBOSE |
392 int printN = 50; | 392 int printN = 50; |
393 cerr << "first " << printN << " in:" << endl; | 393 cerr << "first " << printN << " in:" << endl; |
394 for (int i = 0; i < printN && i < n; ++i) { | 394 for (int i = 0; i < printN && i < n; ++i) { |
395 if (i % 5 == 0) cerr << endl << i << "... "; | 395 if (i % 5 == 0) cerr << endl << i << "... "; |
396 cerr << data[i] << " "; | 396 cerr << data[i] << " "; |
397 } | 397 } |
398 cerr << endl; | 398 cerr << endl; |
399 #endif | 399 #endif |
400 | 400 |
401 int toReturn = got - latency; | 401 int toReturn = got - latency; |
402 if (toReturn > m) toReturn = m; | 402 if (toReturn > m) toReturn = m; |
403 | 403 |
404 vector<double> sliced(out.begin() + latency, | 404 vector<double> sliced(out.begin() + latency, |
405 out.begin() + latency + toReturn); | 405 out.begin() + latency + toReturn); |
406 | 406 |
407 #ifdef DEBUG_RESAMPLER_VERBOSE | 407 #ifdef DEBUG_RESAMPLER_VERBOSE |
408 cerr << "first " << printN << " out (after latency compensation), length " << sliced.size() << ":"; | 408 cerr << "first " << printN << " out (after latency compensation), length " << sliced.size() << ":"; |
409 for (int i = 0; i < printN && i < sliced.size(); ++i) { | 409 for (int i = 0; i < printN && i < sliced.size(); ++i) { |
410 if (i % 5 == 0) cerr << endl << i << "... "; | 410 if (i % 5 == 0) cerr << endl << i << "... "; |
411 cerr << sliced[i] << " "; | 411 cerr << sliced[i] << " "; |
412 } | 412 } |
413 cerr << endl; | 413 cerr << endl; |
414 #endif | 414 #endif |
415 | 415 |
416 return sliced; | 416 return sliced; |