Mercurial > hg > silvet
changeset 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 | 7de9fe5e9fab |
children | ccb1a437a828 9b17bbd16a5f |
files | src/Silvet.cpp src/Silvet.h |
diffstat | 2 files changed, 14 insertions(+), 25 deletions(-) [+] |
line wrap: on
line diff
--- a/src/Silvet.cpp Mon Apr 07 10:49:45 2014 +0100 +++ b/src/Silvet.cpp Mon Apr 07 14:18:22 2014 +0100 @@ -46,10 +46,6 @@ { delete m_resampler; delete m_cq; - for (int i = 0; i < (int)m_filterA.size(); ++i) { - delete m_filterA[i]; - delete m_filterB[i]; - } for (int i = 0; i < (int)m_postFilter.size(); ++i) { delete m_postFilter[i]; } @@ -287,20 +283,10 @@ (processingSampleRate, 27.5, processingSampleRate / 3, processingBPO, CQInterpolated::Linear); - for (int i = 0; i < (int)m_filterA.size(); ++i) { - delete m_filterA[i]; - delete m_filterB[i]; - } for (int i = 0; i < (int)m_postFilter.size(); ++i) { delete m_postFilter[i]; } - m_filterA.clear(); - m_filterB.clear(); m_postFilter.clear(); - for (int i = 0; i < processingHeight; ++i) { - m_filterA.push_back(new MedianFilter<double>(40)); - m_filterB.push_back(new MedianFilter<double>(40)); - } for (int i = 0; i < processingNotes; ++i) { m_postFilter.push_back(new MedianFilter<double>(3)); } @@ -432,21 +418,26 @@ // giving us 545 bins instead of 600 for (int j = 0; j < processingHeight; ++j) { + int ix = inCol.size() - j - 55; + outCol[j] = inCol[ix]; + } - int ix = inCol.size() - j - 55; + vector<double> noiseLevel1 = + MedianFilter<double>::filter(40, outCol); + for (int j = 0; j < processingHeight; ++j) { + noiseLevel1[j] = std::min(outCol[j], noiseLevel1[j]); + } - double val = inCol[ix]; - m_filterA[j]->push(val); - - double a = m_filterA[j]->get(); - m_filterB[j]->push(std::min(a, val)); - - double filtered = m_filterB[j]->get(); - outCol[j] = filtered; + vector<double> noiseLevel2 = + MedianFilter<double>::filter(40, noiseLevel1); + for (int j = 0; j < processingHeight; ++j) { + outCol[j] = std::max(outCol[j] - noiseLevel2[j], 0.0); } // then we only use every fourth filtered column, for 25 // columns per second in the eventual grid + //!!! why, if we're filtering the time columns, don't we just + // reduce to this frame rate before filtering at all? if (m_reducedColumnCount % 4 == 0) { out.push_back(outCol);
--- a/src/Silvet.h Mon Apr 07 10:49:45 2014 +0100 +++ b/src/Silvet.h Mon Apr 07 14:18:22 2014 +0100 @@ -74,8 +74,6 @@ typedef vector<vector<double> > Grid; - vector<MedianFilter<double> *> m_filterA; - vector<MedianFilter<double> *> m_filterB; vector<MedianFilter<double> *> m_postFilter; vector<set<int> > m_pianoRoll;