comparison src/Silvet.cpp @ 46:d7f1c10f4e1d

Fix noise-reduction filtering (it was going the wrong way)
author Chris Cannam
date Mon, 07 Apr 2014 14:18:22 +0100
parents b49597c93132
children ccb1a437a828 9b17bbd16a5f
comparison
equal deleted inserted replaced
43:7de9fe5e9fab 46:d7f1c10f4e1d
44 44
45 Silvet::~Silvet() 45 Silvet::~Silvet()
46 { 46 {
47 delete m_resampler; 47 delete m_resampler;
48 delete m_cq; 48 delete m_cq;
49 for (int i = 0; i < (int)m_filterA.size(); ++i) {
50 delete m_filterA[i];
51 delete m_filterB[i];
52 }
53 for (int i = 0; i < (int)m_postFilter.size(); ++i) { 49 for (int i = 0; i < (int)m_postFilter.size(); ++i) {
54 delete m_postFilter[i]; 50 delete m_postFilter[i];
55 } 51 }
56 } 52 }
57 53
285 281
286 m_cq = new CQInterpolated 282 m_cq = new CQInterpolated
287 (processingSampleRate, 27.5, processingSampleRate / 3, processingBPO, 283 (processingSampleRate, 27.5, processingSampleRate / 3, processingBPO,
288 CQInterpolated::Linear); 284 CQInterpolated::Linear);
289 285
290 for (int i = 0; i < (int)m_filterA.size(); ++i) {
291 delete m_filterA[i];
292 delete m_filterB[i];
293 }
294 for (int i = 0; i < (int)m_postFilter.size(); ++i) { 286 for (int i = 0; i < (int)m_postFilter.size(); ++i) {
295 delete m_postFilter[i]; 287 delete m_postFilter[i];
296 } 288 }
297 m_filterA.clear();
298 m_filterB.clear();
299 m_postFilter.clear(); 289 m_postFilter.clear();
300 for (int i = 0; i < processingHeight; ++i) {
301 m_filterA.push_back(new MedianFilter<double>(40));
302 m_filterB.push_back(new MedianFilter<double>(40));
303 }
304 for (int i = 0; i < processingNotes; ++i) { 290 for (int i = 0; i < processingNotes; ++i) {
305 m_postFilter.push_back(new MedianFilter<double>(3)); 291 m_postFilter.push_back(new MedianFilter<double>(3));
306 } 292 }
307 m_pianoRoll.clear(); 293 m_pianoRoll.clear();
308 m_columnCount = 0; 294 m_columnCount = 0;
430 // each column, and we want it the other way around) and 416 // each column, and we want it the other way around) and
431 // then ignore the first 55 (lowest-frequency) bins, 417 // then ignore the first 55 (lowest-frequency) bins,
432 // giving us 545 bins instead of 600 418 // giving us 545 bins instead of 600
433 419
434 for (int j = 0; j < processingHeight; ++j) { 420 for (int j = 0; j < processingHeight; ++j) {
435
436 int ix = inCol.size() - j - 55; 421 int ix = inCol.size() - j - 55;
437 422 outCol[j] = inCol[ix];
438 double val = inCol[ix]; 423 }
439 m_filterA[j]->push(val); 424
440 425 vector<double> noiseLevel1 =
441 double a = m_filterA[j]->get(); 426 MedianFilter<double>::filter(40, outCol);
442 m_filterB[j]->push(std::min(a, val)); 427 for (int j = 0; j < processingHeight; ++j) {
443 428 noiseLevel1[j] = std::min(outCol[j], noiseLevel1[j]);
444 double filtered = m_filterB[j]->get(); 429 }
445 outCol[j] = filtered; 430
431 vector<double> noiseLevel2 =
432 MedianFilter<double>::filter(40, noiseLevel1);
433 for (int j = 0; j < processingHeight; ++j) {
434 outCol[j] = std::max(outCol[j] - noiseLevel2[j], 0.0);
446 } 435 }
447 436
448 // then we only use every fourth filtered column, for 25 437 // then we only use every fourth filtered column, for 25
449 // columns per second in the eventual grid 438 // columns per second in the eventual grid
439 //!!! why, if we're filtering the time columns, don't we just
440 // reduce to this frame rate before filtering at all?
450 441
451 if (m_reducedColumnCount % 4 == 0) { 442 if (m_reducedColumnCount % 4 == 0) {
452 out.push_back(outCol); 443 out.push_back(outCol);
453 } 444 }
454 445