Tidying up

This commit is contained in:
Geraint 2022-12-17 13:24:35 +00:00
parent 6364651d1b
commit c3addb7298

View File

@ -244,9 +244,12 @@ private:
std::vector<Sample> timeBuffer; std::vector<Sample> timeBuffer;
std::vector<Complex> rotCentreSpectrum, rotPrevInterval; std::vector<Complex> rotCentreSpectrum, rotPrevInterval;
Sample bandToFreq(int b) const { Sample bandToFreq(Sample b) const {
return (b + Sample(0.5))/stft.fftSize(); 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<Complex> &output) const { void timeShiftPhases(Sample shiftSamples, std::vector<Complex> &output) const {
for (int b = 0; b < stft.bands(); ++b) { for (int b = 0; b < stft.bands(); ++b) {
Sample phase = bandToFreq(b)*shiftSamples*Sample(-2*M_PI); Sample phase = bandToFreq(b)*shiftSamples*Sample(-2*M_PI);
@ -265,10 +268,7 @@ private:
} }
template<Complex Band::*member> template<Complex Band::*member>
Complex getBand(int channel, int index) { Complex getBand(int channel, int index) {
if (index >= stft.bands()) return 0; if (index < 0 || index >= stft.bands()) return 0;
if (index < 0) {
return std::conj(getBand<member>(channel, -1 - index));
}
return channelBands[index + channel*stft.bands()].*member; return channelBands[index + channel*stft.bands()].*member;
} }
template<Complex Band::*member> template<Complex Band::*member>
@ -285,8 +285,7 @@ private:
} }
template<Sample Band::*member> template<Sample Band::*member>
Sample getBand(int channel, int index) { Sample getBand(int channel, int index) {
if (index < 0) index = -1 - index; if (index < 0 || index >= stft.bands()) return 0;
if (index >= stft.bands()) return 0;
return channelBands[index + channel*stft.bands()].*member; return channelBands[index + channel*stft.bands()].*member;
} }
template<Sample Band::*member> template<Sample Band::*member>
@ -304,10 +303,6 @@ private:
struct Peak { struct Peak {
Sample input, output; Sample input, output;
bool operator< (const Peak &other) const {
return output < other.output;
}
}; };
std::vector<Peak> peaks; std::vector<Peak> peaks;
std::vector<Sample> energy, smoothedEnergy; std::vector<Sample> energy, smoothedEnergy;
@ -512,20 +507,17 @@ private:
int start = 0; int start = 0;
while (start < stft.bands()) { while (start < stft.bands()) {
if (energy[start] > smoothedEnergy[start]) { 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]) { while (end < stft.bands() && energy[end] > smoothedEnergy[end]) {
bandSum += end*energy[end];
energySum += energy[end];
++end; ++end;
} }
// Take the average frequency and energy across the peak range Sample avgBand = bandSum/energySum;
Sample freqSum = 0, energySum = 0; Sample avgFreq = bandToFreq(avgBand);
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 avgEnergy = energySum/(end - start); 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; start = end;
} }