From 4457247749071f937a6886fbd0b714e49f057f5e Mon Sep 17 00:00:00 2001 From: Chris Cannam Date: Thu, 9 Jun 2022 14:56:20 +0100 Subject: [PATCH] Synchronise frequency channel cutoffs across channels. Not the most elegant way to do this I think --- src/finer/Guide.h | 5 +++-- src/finer/R3StretcherImpl.cpp | 33 +++++++++++++++++++++++++++++++-- src/finer/R3StretcherImpl.h | 4 +++- 3 files changed, 37 insertions(+), 5 deletions(-) diff --git a/src/finer/Guide.h b/src/finer/Guide.h index e3239a9..a779da0 100644 --- a/src/finer/Guide.h +++ b/src/finer/Guide.h @@ -140,6 +140,7 @@ public: void updateGuidance(double ratio, const double *const magnitudes, const double *const prevMagnitudes, + const double *const channelMixedMagnitudes, const BinSegmenter::Segmentation &segmentation, const BinSegmenter::Segmentation &prevSegmentation, const BinSegmenter::Segmentation &nextSegmentation, @@ -221,13 +222,13 @@ public: if (lower > m_maxLower) lower = m_maxLower; */ double prevLower = guidance.fftBands[0].f1; - double lower = descendToValley(prevLower, magnitudes); + double lower = descendToValley(prevLower, channelMixedMagnitudes); if (lower > m_maxLower || lower < m_minLower) { lower = m_defaultLower; } double prevHigher = guidance.fftBands[1].f1; - double higher = descendToValley(prevHigher, magnitudes); + double higher = descendToValley(prevHigher, channelMixedMagnitudes); if (higher > m_maxHigher || higher < m_minHigher) { higher = m_defaultHigher; } diff --git a/src/finer/R3StretcherImpl.cpp b/src/finer/R3StretcherImpl.cpp index f10483c..22580ce 100644 --- a/src/finer/R3StretcherImpl.cpp +++ b/src/finer/R3StretcherImpl.cpp @@ -38,6 +38,7 @@ R3StretcherImpl::R3StretcherImpl(Parameters parameters, m_guide(Guide::Parameters(m_parameters.sampleRate, parameters.logger)), m_guideConfiguration(m_guide.getConfiguration()), m_channelAssembly(m_parameters.channels), + m_mixedClassifyMags(m_guideConfiguration.classificationFftSize / 2 + 1, 0.0), m_inhop(1), m_prevOuthop(1), m_draining(false) @@ -389,7 +390,24 @@ R3StretcherImpl::consume() // Analysis for (int c = 0; c < channels; ++c) { - analyseChannel(c, inhop, m_prevInhop, m_prevOuthop); + analyseChannel(c, inhop, m_prevInhop); + } + + for (int c = 0; c < channels; ++c) { + auto &classifyScale = + m_channelData.at(c)-> + scales.at(m_guideConfiguration.classificationFftSize); + if (c == 0) { + v_copy(m_mixedClassifyMags.data(), classifyScale->mag.data(), + classifyScale->mag.size()); + } else { + v_add(m_mixedClassifyMags.data(), classifyScale->mag.data(), + classifyScale->mag.size()); + } + } + + for (int c = 0; c < channels; ++c) { + guideChannel(c, m_prevInhop, m_prevOuthop); } // Phase update. This is synchronised across all channels @@ -465,7 +483,7 @@ R3StretcherImpl::consume() } void -R3StretcherImpl::analyseChannel(int c, int inhop, int prevInhop, int prevOuthop) +R3StretcherImpl::analyseChannel(int c, int inhop, int prevInhop) { int longest = m_guideConfiguration.longestFftSize; int classify = m_guideConfiguration.classificationFftSize; @@ -651,7 +669,17 @@ R3StretcherImpl::analyseChannel(int c, int inhop, int prevInhop, int prevOuthop) cd->prevSegmentation = cd->segmentation; cd->segmentation = cd->nextSegmentation; cd->nextSegmentation = cd->segmenter->segment(cd->nextClassification.data()); +} +void +R3StretcherImpl::guideChannel(int c, int prevInhop, int prevOuthop) +{ + auto &cd = m_channelData.at(c); + int classify = m_guideConfiguration.classificationFftSize; + auto &classifyScale = cd->scales.at(classify); + + + /* if (c == 0) { double pb = cd->nextSegmentation.percussiveBelow; @@ -682,6 +710,7 @@ R3StretcherImpl::analyseChannel(int c, int inhop, int prevInhop, int prevOuthop) m_guide.updateGuidance(instantaneousRatio, classifyScale->mag.data(), classifyScale->prevMag.data(), + m_mixedClassifyMags.data(), cd->segmentation, cd->prevSegmentation, cd->nextSegmentation, diff --git a/src/finer/R3StretcherImpl.h b/src/finer/R3StretcherImpl.h index ab6db5f..0aa8ffa 100644 --- a/src/finer/R3StretcherImpl.h +++ b/src/finer/R3StretcherImpl.h @@ -259,6 +259,7 @@ protected: Guide m_guide; Guide::Configuration m_guideConfiguration; ChannelAssembly m_channelAssembly; + FixedVector m_mixedClassifyMags; std::unique_ptr m_calculator; std::unique_ptr m_resampler; std::atomic m_inhop; @@ -268,7 +269,8 @@ protected: void consume(); void calculateHop(); - void analyseChannel(int channel, int inhop, int prevInhop, int prevOuthop); + void analyseChannel(int channel, int inhop, int prevInhop); + void guideChannel(int channel, int prevInhop, int prevOuthop); void analyseFormant(int channel); void adjustFormant(int channel); void synthesiseChannel(int channel, int outhop);