Synchronise frequency channel cutoffs across channels. Not the most elegant way to do this I think
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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,6 +669,16 @@ 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) {
|
||||
@@ -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,
|
||||
|
||||
@@ -259,6 +259,7 @@ protected:
|
||||
Guide m_guide;
|
||||
Guide::Configuration m_guideConfiguration;
|
||||
ChannelAssembly m_channelAssembly;
|
||||
FixedVector<double> m_mixedClassifyMags;
|
||||
std::unique_ptr<StretchCalculator> m_calculator;
|
||||
std::unique_ptr<Resampler> m_resampler;
|
||||
std::atomic<int> 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);
|
||||
|
||||
Reference in New Issue
Block a user