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;