From c3addb7298aa22d5658e490999324e046495d493 Mon Sep 17 00:00:00 2001 From: Geraint Date: Sat, 17 Dec 2022 13:24:35 +0000 Subject: [PATCH] Tidying up --- signalsmith-stretch.h | 34 +++++++++++++--------------------- 1 file changed, 13 insertions(+), 21 deletions(-) diff --git a/signalsmith-stretch.h b/signalsmith-stretch.h index a4151aa..114ef29 100644 --- a/signalsmith-stretch.h +++ b/signalsmith-stretch.h @@ -244,9 +244,12 @@ private: std::vector timeBuffer; std::vector rotCentreSpectrum, rotPrevInterval; - Sample bandToFreq(int b) const { + Sample bandToFreq(Sample b) const { return (b + Sample(0.5))/stft.fftSize(); } + Sample freqToBand(Sample f) const { + return f*stft.fftSize() - Sample(0.5); + } void timeShiftPhases(Sample shiftSamples, std::vector &output) const { for (int b = 0; b < stft.bands(); ++b) { Sample phase = bandToFreq(b)*shiftSamples*Sample(-2*M_PI); @@ -265,10 +268,7 @@ private: } template Complex getBand(int channel, int index) { - if (index >= stft.bands()) return 0; - if (index < 0) { - return std::conj(getBand(channel, -1 - index)); - } + if (index < 0 || index >= stft.bands()) return 0; return channelBands[index + channel*stft.bands()].*member; } template @@ -285,8 +285,7 @@ private: } template Sample getBand(int channel, int index) { - if (index < 0) index = -1 - index; - if (index >= stft.bands()) return 0; + if (index < 0 || index >= stft.bands()) return 0; return channelBands[index + channel*stft.bands()].*member; } template @@ -304,10 +303,6 @@ private: struct Peak { Sample input, output; - - bool operator< (const Peak &other) const { - return output < other.output; - } }; std::vector peaks; std::vector energy, smoothedEnergy; @@ -512,20 +507,17 @@ private: int start = 0; while (start < stft.bands()) { if (energy[start] > smoothedEnergy[start]) { - int end = start + 1; + int end = start; + Sample bandSum = 0, energySum = 0; while (end < stft.bands() && energy[end] > smoothedEnergy[end]) { + bandSum += end*energy[end]; + energySum += energy[end]; ++end; } - // Take the average frequency and energy across the peak range - Sample freqSum = 0, energySum = 0; - for (int b = start; b < end; ++b) { - Sample e = energy[b]; - freqSum += (b + 0.5)*e; - energySum += e; - } - Sample avgFreq = freqSum/(stft.fftSize()*energySum); + Sample avgBand = bandSum/energySum; + Sample avgFreq = bandToFreq(avgBand); Sample avgEnergy = energySum/(end - start); - peaks.emplace_back(Peak{avgFreq*stft.fftSize(), mapFreq(avgFreq)*stft.fftSize()}); + peaks.emplace_back(Peak{avgBand, freqToBand(mapFreq(avgFreq))}); start = end; }