Mercurial > hg > svcore
comparison data/model/FFTModel.cpp @ 1154:aa588c391d1a 3.0-integration
Convert 3d model column type from QVector to std::vector; replace another user of ResizeableBitset
| author | Chris Cannam |
|---|---|
| date | Fri, 22 Jan 2016 13:39:45 +0000 |
| parents | e994747fb9dd |
| children | 546d4e417346 |
comparison
equal
deleted
inserted
replaced
| 1153:ece369c5bb68 | 1154:aa588c391d1a |
|---|---|
| 96 FFTModel::Column | 96 FFTModel::Column |
| 97 FFTModel::getColumn(int x) const | 97 FFTModel::getColumn(int x) const |
| 98 { | 98 { |
| 99 auto cplx = getFFTColumn(x); | 99 auto cplx = getFFTColumn(x); |
| 100 Column col; | 100 Column col; |
| 101 col.reserve(int(cplx.size())); | 101 col.reserve(cplx.size()); |
| 102 for (auto c: cplx) col.push_back(abs(c)); | 102 for (auto c: cplx) col.push_back(abs(c)); |
| 103 return col; | 103 return move(col); |
| 104 } | 104 } |
| 105 | 105 |
| 106 float | 106 float |
| 107 FFTModel::getMagnitudeAt(int x, int y) const | 107 FFTModel::getMagnitudeAt(int x, int y) const |
| 108 { | 108 { |
| 114 float | 114 float |
| 115 FFTModel::getMaximumMagnitudeAt(int x) const | 115 FFTModel::getMaximumMagnitudeAt(int x) const |
| 116 { | 116 { |
| 117 Column col(getColumn(x)); | 117 Column col(getColumn(x)); |
| 118 float max = 0.f; | 118 float max = 0.f; |
| 119 for (int i = 0; i < col.size(); ++i) { | 119 int n = int(col.size()); |
| 120 for (int i = 0; i < n; ++i) { | |
| 120 if (col[i] > max) max = col[i]; | 121 if (col[i] > max) max = col[i]; |
| 121 } | 122 } |
| 122 return max; | 123 return max; |
| 123 } | 124 } |
| 124 | 125 |
| 311 if (m_cached.size() >= m_cacheSize) { | 312 if (m_cached.size() >= m_cacheSize) { |
| 312 m_cached.pop_front(); | 313 m_cached.pop_front(); |
| 313 } | 314 } |
| 314 m_cached.push_back(sc); | 315 m_cached.push_back(sc); |
| 315 | 316 |
| 316 return col; | 317 return move(col); |
| 317 } | 318 } |
| 318 | 319 |
| 319 bool | 320 bool |
| 320 FFTModel::estimateStableFrequency(int x, int y, double &frequency) | 321 FFTModel::estimateStableFrequency(int x, int y, double &frequency) |
| 321 { | 322 { |
| 386 } | 387 } |
| 387 return peaks; | 388 return peaks; |
| 388 } | 389 } |
| 389 | 390 |
| 390 Column values = getColumn(x); | 391 Column values = getColumn(x); |
| 392 int nv = int(values.size()); | |
| 391 | 393 |
| 392 float mean = 0.f; | 394 float mean = 0.f; |
| 393 for (int i = 0; i < values.size(); ++i) mean += values[i]; | 395 for (int i = 0; i < nv; ++i) mean += values[i]; |
| 394 if (values.size() > 0) mean = mean / float(values.size()); | 396 if (nv > 0) mean = mean / float(values.size()); |
| 395 | 397 |
| 396 // For peak picking we use a moving median window, picking the | 398 // For peak picking we use a moving median window, picking the |
| 397 // highest value within each continuous region of values that | 399 // highest value within each continuous region of values that |
| 398 // exceed the median. For pitch adaptivity, we adjust the window | 400 // exceed the median. For pitch adaptivity, we adjust the window |
| 399 // size to a roughly constant pitch range (about four tones). | 401 // size to a roughly constant pitch range (about four tones). |
| 410 int binmin; | 412 int binmin; |
| 411 if (ymin > halfWin) binmin = ymin - halfWin; | 413 if (ymin > halfWin) binmin = ymin - halfWin; |
| 412 else binmin = 0; | 414 else binmin = 0; |
| 413 | 415 |
| 414 int binmax; | 416 int binmax; |
| 415 if (ymax + halfWin < values.size()) binmax = ymax + halfWin; | 417 if (ymax + halfWin < nv) binmax = ymax + halfWin; |
| 416 else binmax = values.size()-1; | 418 else binmax = nv - 1; |
| 417 | 419 |
| 418 int prevcentre = 0; | 420 int prevcentre = 0; |
| 419 | 421 |
| 420 for (int bin = binmin; bin <= binmax; ++bin) { | 422 for (int bin = binmin; bin <= binmax; ++bin) { |
| 421 | 423 |
| 432 } | 434 } |
| 433 | 435 |
| 434 int actualSize = int(window.size()); | 436 int actualSize = int(window.size()); |
| 435 | 437 |
| 436 if (type == MajorPitchAdaptivePeaks) { | 438 if (type == MajorPitchAdaptivePeaks) { |
| 437 if (ymax + halfWin < values.size()) binmax = ymax + halfWin; | 439 if (ymax + halfWin < nv) binmax = ymax + halfWin; |
| 438 else binmax = values.size()-1; | 440 else binmax = nv - 1; |
| 439 } | 441 } |
| 440 | 442 |
| 441 deque<float> sorted(window); | 443 deque<float> sorted(window); |
| 442 sort(sorted.begin(), sorted.end()); | 444 sort(sorted.begin(), sorted.end()); |
| 443 float median = sorted[int(float(sorted.size()) * dist)]; | 445 float median = sorted[int(float(sorted.size()) * dist)]; |
| 453 | 455 |
| 454 if (centre > median) { | 456 if (centre > median) { |
| 455 inrange.push_back(centrebin); | 457 inrange.push_back(centrebin); |
| 456 } | 458 } |
| 457 | 459 |
| 458 if (centre <= median || centrebin+1 == values.size()) { | 460 if (centre <= median || centrebin+1 == nv) { |
| 459 if (!inrange.empty()) { | 461 if (!inrange.empty()) { |
| 460 int peakbin = 0; | 462 int peakbin = 0; |
| 461 float peakval = 0.f; | 463 float peakval = 0.f; |
| 462 for (int i = 0; i < (int)inrange.size(); ++i) { | 464 for (int i = 0; i < (int)inrange.size(); ++i) { |
| 463 if (i == 0 || values[inrange[i]] > peakval) { | 465 if (i == 0 || values[inrange[i]] > peakval) { |
