Calculate vertical twists only when needed

This commit is contained in:
Geraint 2024-03-19 08:32:10 +00:00 committed by Geraint Luff
parent e5057a9f54
commit 79b287ee0e

View File

@ -378,7 +378,6 @@ private:
struct Prediction { struct Prediction {
Sample energy = 0; Sample energy = 0;
Complex input; Complex input;
Complex shortVerticalTwist, longVerticalTwist;
Complex makeOutput(Complex phase) { Complex makeOutput(Complex phase) {
Sample phaseNorm = std::norm(phase); Sample phaseNorm = std::norm(phase);
@ -449,20 +448,6 @@ private:
Complex freqTwist = signalsmith::perf::mul<true>(prediction.input, prevInput); Complex freqTwist = signalsmith::perf::mul<true>(prediction.input, prevInput);
Complex phase = signalsmith::perf::mul(outputBin.output, freqTwist); Complex phase = signalsmith::perf::mul(outputBin.output, freqTwist);
outputBin.output = phase/(std::max(prevEnergy, prediction.energy) + noiseFloor); outputBin.output = phase/(std::max(prevEnergy, prediction.energy) + noiseFloor);
if (b > 0) {
Sample binTimeFactor = randomTimeFactor ? timeFactorDist(randomEngine) : timeFactor;
Complex downInput = getFractional<&Band::input>(c, mapPoint.inputBin - binTimeFactor);
prediction.shortVerticalTwist = signalsmith::perf::mul<true>(prediction.input, downInput);
if (b >= longVerticalStep) {
Complex longDownInput = getFractional<&Band::input>(c, mapPoint.inputBin - longVerticalStep*binTimeFactor);
prediction.longVerticalTwist = signalsmith::perf::mul<true>(prediction.input, longDownInput);
} else {
prediction.longVerticalTwist = 0;
}
} else {
prediction.shortVerticalTwist = prediction.longVerticalTwist = 0;
}
} }
} }
@ -485,27 +470,46 @@ private:
auto &outputBin = bins[b]; auto &outputBin = bins[b];
Complex phase = 0; Complex phase = 0;
auto mapPoint = outputMap[b];
// Upwards vertical steps // Upwards vertical steps
if (b > 0) { if (b > 0) {
Sample binTimeFactor = randomTimeFactor ? timeFactorDist(randomEngine) : timeFactor;
Complex downInput = getFractional<&Band::input>(maxChannel, mapPoint.inputBin - binTimeFactor);
Complex shortVerticalTwist = signalsmith::perf::mul<true>(prediction.input, downInput);
auto &downBin = bins[b - 1]; auto &downBin = bins[b - 1];
phase += signalsmith::perf::mul(downBin.output, prediction.shortVerticalTwist); phase += signalsmith::perf::mul(downBin.output, shortVerticalTwist);
if (b >= longVerticalStep) { if (b >= longVerticalStep) {
Complex longDownInput = getFractional<&Band::input>(maxChannel, mapPoint.inputBin - longVerticalStep*binTimeFactor);
Complex longVerticalTwist = signalsmith::perf::mul<true>(prediction.input, longDownInput);
auto &longDownBin = bins[b - longVerticalStep]; auto &longDownBin = bins[b - longVerticalStep];
phase += signalsmith::perf::mul(longDownBin.output, prediction.longVerticalTwist); phase += signalsmith::perf::mul(longDownBin.output, longVerticalTwist);
} }
} }
// Downwards vertical steps // Downwards vertical steps
if (b < bands - 1) { if (b < bands - 1) {
auto &upPrediction = predictions[b + 1]; auto &upPrediction = predictions[b + 1];
auto &upMapPoint = outputMap[b + 1];
Sample binTimeFactor = randomTimeFactor ? timeFactorDist(randomEngine) : timeFactor;
Complex downInput = getFractional<&Band::input>(maxChannel, upMapPoint.inputBin - binTimeFactor);
Complex shortVerticalTwist = signalsmith::perf::mul<true>(upPrediction.input, downInput);
auto &upBin = bins[b + 1]; auto &upBin = bins[b + 1];
phase += signalsmith::perf::mul<true>(upBin.output, upPrediction.shortVerticalTwist); phase += signalsmith::perf::mul<true>(upBin.output, shortVerticalTwist);
if (b < bands - longVerticalStep) { if (b < bands - longVerticalStep) {
auto &longUpPrediction = predictions[b + longVerticalStep]; auto &longUpPrediction = predictions[b + longVerticalStep];
auto &longUpMapPoint = outputMap[b + longVerticalStep];
Complex longDownInput = getFractional<&Band::input>(maxChannel, longUpMapPoint.inputBin - longVerticalStep*binTimeFactor);
Complex longVerticalTwist = signalsmith::perf::mul<true>(longUpPrediction.input, longDownInput);
auto &longUpBin = bins[b + longVerticalStep]; auto &longUpBin = bins[b + longVerticalStep];
phase += signalsmith::perf::mul<true>(longUpBin.output, longUpPrediction.longVerticalTwist); phase += signalsmith::perf::mul<true>(longUpBin.output, longVerticalTwist);
} }
} }