Perform polar-to-cartesian conversions only on range that will actually be used

This commit is contained in:
Chris Cannam
2022-06-17 16:52:55 +01:00
parent 6128ba6d36
commit b4e921003f

View File

@@ -976,45 +976,30 @@ R3StretcherImpl::synthesiseChannel(int c, int outhop)
// The frequency filter is applied naively in the frequency // The frequency filter is applied naively in the frequency
// domain. Aliasing is reduced by the shorter resynthesis // domain. Aliasing is reduced by the shorter resynthesis
// window // window. We resynthesise each scale individually, then sum -
// it's easier to manage scaling for in situations with a
// varying resynthesis hop
int lowBin = binForFrequency(band.f0, fftSize, m_parameters.sampleRate); int lowBin = binForFrequency(band.f0, fftSize, m_parameters.sampleRate);
int highBin = binForFrequency(band.f1, fftSize, m_parameters.sampleRate); int highBin = binForFrequency(band.f1, fftSize, m_parameters.sampleRate);
if (highBin % 2 == 0 && highBin > 0) --highBin; if (highBin % 2 == 0 && highBin > 0) --highBin;
for (int i = 0; i < lowBin; ++i) { if (lowBin > 0) {
scale->mag[i] = 0.0; v_zero(scale->real.data(), lowBin);
v_zero(scale->imag.data(), lowBin);
} }
for (int i = lowBin; i < highBin; ++i) {
scale->mag[i] *= winscale;
}
for (int i = highBin; i < fftSize/2 + 1; ++i) {
scale->mag[i] = 0.0;
}
}
// Resynthesise each FFT size (scale) individually, then sum. This v_scale(scale->mag.data() + lowBin, winscale, highBin - lowBin);
// is easier to manage scaling for in situations with a varying
// resynthesis hop
for (auto &it : cd->scales) { v_polar_to_cartesian(scale->real.data() + lowBin,
int fftSize = it.first; scale->imag.data() + lowBin,
auto &scale = it.second; scale->mag.data() + lowBin,
auto &scaleData = m_scaleData.at(fftSize); scale->advancedPhase.data() + lowBin,
highBin - lowBin);
for (const auto &b : m_guideConfiguration.fftBandLimits) { if (highBin < fftSize/2 + 1) {
if (b.fftSize == fftSize) { v_zero(scale->real.data() + highBin, fftSize/2 + 1 - highBin);
int offset = b.b0min; v_zero(scale->imag.data() + highBin, fftSize/2 + 1 - highBin);
v_zero(scale->real.data(), fftSize/2 + 1);
v_zero(scale->imag.data(), fftSize/2 + 1);
v_polar_to_cartesian
(scale->real.data() + offset,
scale->imag.data() + offset,
scale->mag.data() + offset,
scale->advancedPhase.data() + offset,
b.b1max - offset);
break;
}
} }
scaleData->fft.inverse(scale->real.data(), scaleData->fft.inverse(scale->real.data(),