Proper adjustment of outhop for extreme ratios
This commit is contained in:
@@ -138,6 +138,7 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
void updateGuidance(double ratio,
|
void updateGuidance(double ratio,
|
||||||
|
int outhop,
|
||||||
const double *const magnitudes,
|
const double *const magnitudes,
|
||||||
const double *const prevMagnitudes,
|
const double *const prevMagnitudes,
|
||||||
const double *const nextMagnitudes,
|
const double *const nextMagnitudes,
|
||||||
@@ -254,6 +255,11 @@ public:
|
|||||||
guidance.fftBands[2].f0 = higher;
|
guidance.fftBands[2].f0 = higher;
|
||||||
guidance.fftBands[2].f1 = nyquist;
|
guidance.fftBands[2].f1 = nyquist;
|
||||||
|
|
||||||
|
if (outhop > 256) {
|
||||||
|
guidance.fftBands[1].f1 = nyquist;
|
||||||
|
guidance.fftBands[2].f0 = nyquist;
|
||||||
|
}
|
||||||
|
|
||||||
double mid = std::max(lower, 1600.0);
|
double mid = std::max(lower, 1600.0);
|
||||||
|
|
||||||
guidance.phaseLockBands[0].p = 1;
|
guidance.phaseLockBands[0].p = 1;
|
||||||
|
|||||||
@@ -242,27 +242,37 @@ void
|
|||||||
R3StretcherImpl::calculateHop()
|
R3StretcherImpl::calculateHop()
|
||||||
{
|
{
|
||||||
double ratio = getEffectiveRatio();
|
double ratio = getEffectiveRatio();
|
||||||
double proposedOuthop = 256.0;
|
|
||||||
//!!! if (proposedOuthop * m_pitchScale > 2048.0) {
|
|
||||||
// proposedOuthop = 2048.0 / m_pitchScale;
|
|
||||||
// }
|
|
||||||
double inhop = 1.0;
|
|
||||||
|
|
||||||
if (ratio > 1.0) {
|
// In R2 we generally targeted a certain inhop, and calculated
|
||||||
inhop = proposedOuthop / ratio;
|
// outhop from that. Here we are the other way around. We aim for
|
||||||
|
// outhop = 256 at ratios around 1, reducing down to 128 for
|
||||||
|
// ratios far below 1 and up to 512 for ratios far above. As soon
|
||||||
|
// as outhop exceeds 256 we have to drop the 1024-bin FFT, as the
|
||||||
|
// overlap will be inadequate for it. That's among the jobs of the
|
||||||
|
// Guide class. (We can't go above 512 without changing the window
|
||||||
|
// shape or dropping the 2048-bin FFT, and we can't do either of
|
||||||
|
// those dynamically.)
|
||||||
|
|
||||||
|
double proposedOuthop = pow(2.0, 8.0 + 2.0 * log10(ratio));
|
||||||
|
if (proposedOuthop > 512.0) proposedOuthop = 512.0;
|
||||||
|
if (proposedOuthop < 128.0) proposedOuthop = 128.0;
|
||||||
|
|
||||||
|
std::cout << "calculateHop: for ratio " << ratio << " proposedOuthop = "
|
||||||
|
<< proposedOuthop << std::endl;
|
||||||
|
|
||||||
|
double inhop = proposedOuthop / ratio;
|
||||||
if (inhop < 1.0) {
|
if (inhop < 1.0) {
|
||||||
m_parameters.logger("WARNING: Extreme ratio yields ideal inhop < 1, results may be suspect");
|
m_parameters.logger("WARNING: Extreme ratio yields ideal inhop < 1, results may be suspect");
|
||||||
inhop = 1.0;
|
inhop = 1.0;
|
||||||
}
|
}
|
||||||
} else {
|
if (inhop > 768.0) {
|
||||||
inhop = std::min(proposedOuthop / ratio, 340.0);
|
m_parameters.logger("WARNING: Extreme ratio yields ideal inhop > 768, results may be suspect");
|
||||||
|
inhop = 768.0;
|
||||||
}
|
}
|
||||||
|
|
||||||
m_inhop = int(round(inhop));
|
m_inhop = int(round(inhop));
|
||||||
|
|
||||||
//!!! but if we now have outhop > 4096 ever, we will crash, so we must check
|
std::cout << "R3StretcherImpl::calculateHop: inhop = " << m_inhop << ", proposed outhop = " << proposedOuthop << ", mean outhop = " << m_inhop * ratio << std::endl;
|
||||||
|
|
||||||
// std::cout << "R3StretcherImpl::calculateHop: inhop = " << m_inhop << ", proposed outhop = " << proposedOuthop << ", mean outhop = " << m_inhop * ratio << std::endl;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
@@ -817,6 +827,7 @@ R3StretcherImpl::analyseChannel(int c, int inhop, int prevInhop, int prevOuthop)
|
|||||||
bool specialCaseUnity = true;
|
bool specialCaseUnity = true;
|
||||||
|
|
||||||
m_guide.updateGuidance(getEffectiveRatio(),
|
m_guide.updateGuidance(getEffectiveRatio(),
|
||||||
|
prevOuthop,
|
||||||
classifyScale->mag.data(),
|
classifyScale->mag.data(),
|
||||||
classifyScale->prevMag.data(),
|
classifyScale->prevMag.data(),
|
||||||
cd->readahead.mag.data(),
|
cd->readahead.mag.data(),
|
||||||
|
|||||||
Reference in New Issue
Block a user