From 8ed709d274357ede9c1b9e6a1e2d513dd5a4dcb6 Mon Sep 17 00:00:00 2001 From: Chris Cannam Date: Tue, 7 Jun 2022 11:05:50 +0100 Subject: [PATCH] Don't run median filters for higher frequencies than we're going to use anyway --- src/finer/BinClassifier.h | 4 +++- src/finer/BinSegmenter.h | 17 +++++++---------- src/finer/R3StretcherImpl.cpp | 14 +++++++++++--- 3 files changed, 21 insertions(+), 14 deletions(-) diff --git a/src/finer/BinClassifier.h b/src/finer/BinClassifier.h index 105fcf8..94b1fa6 100644 --- a/src/finer/BinClassifier.h +++ b/src/finer/BinClassifier.h @@ -98,7 +98,9 @@ public: m_hFilters->reset(); } - void classify(const double *const mag, Classification *classification) { + void classify(const double *const mag, // input, of at least binCount bins + Classification *classification) // output, of binCount bins + { const int n = m_parameters.binCount; for (int i = 0; i < n; ++i) { diff --git a/src/finer/BinSegmenter.h b/src/finer/BinSegmenter.h index 20efb46..00fb1e4 100644 --- a/src/finer/BinSegmenter.h +++ b/src/finer/BinSegmenter.h @@ -45,21 +45,21 @@ public: struct Parameters { int fftSize; + int binCount; double sampleRate; - Parameters(int _fftSize, double _sampleRate) : - fftSize(_fftSize), sampleRate(_sampleRate) { } + Parameters(int _fftSize, int _binCount, double _sampleRate) : + fftSize(_fftSize), binCount(_binCount), sampleRate(_sampleRate) { } }; BinSegmenter(Parameters parameters) : m_parameters(parameters), - m_binCount(m_parameters.fftSize/2 + 1), - m_numeric(m_binCount, 0), - m_classFilter(m_binCount / 64) + m_numeric(m_parameters.binCount, 0), + m_classFilter(16) { } Segmentation segment(const BinClassifier::Classification *classification) { - int n = m_binCount; + int n = m_parameters.binCount; for (int i = 0; i < n; ++i) { switch (classification[i]) { case BinClassifier::Classification::Harmonic: @@ -79,12 +79,10 @@ public: } } double nyquist = m_parameters.sampleRate / 2.0; - int top = binForFrequency(16000.0); - if (top >= n) top = n-1; double f1 = nyquist; double f2 = nyquist; bool inPercussive = false; - for (int i = top; i > 0; --i) { + for (int i = n - 1; i > 0; --i) { if (m_numeric[i] == 1) { // percussive if (!inPercussive) { inPercussive = true; @@ -103,7 +101,6 @@ public: protected: Parameters m_parameters; - int m_binCount; std::vector m_numeric; MovingMedian m_classFilter; diff --git a/src/finer/R3StretcherImpl.cpp b/src/finer/R3StretcherImpl.cpp index 0d42995..4849dbc 100644 --- a/src/finer/R3StretcherImpl.cpp +++ b/src/finer/R3StretcherImpl.cpp @@ -43,12 +43,20 @@ R3StretcherImpl::R3StretcherImpl(Parameters parameters, m_prevOuthop(1), m_draining(false) { + double maxClassifierFrequency = 16000.0; + if (maxClassifierFrequency > m_parameters.sampleRate/2) { + maxClassifierFrequency = m_parameters.sampleRate/2; + } + int classificationBins = + int(floor(m_guideConfiguration.classificationFftSize * + maxClassifierFrequency / m_parameters.sampleRate)); + BinSegmenter::Parameters segmenterParameters (m_guideConfiguration.classificationFftSize, - m_parameters.sampleRate); + classificationBins, m_parameters.sampleRate); + BinClassifier::Parameters classifierParameters - (m_guideConfiguration.classificationFftSize / 2 + 1, - 9, 1, 10, 2.0, 2.0, 1.0e-7); + (classificationBins, 9, 1, 10, 2.0, 2.0, 1.0e-7); int inRingBufferSize = m_guideConfiguration.longestFftSize * 2; int outRingBufferSize = m_guideConfiguration.longestFftSize * 16;