BogaudioModules

BogaudioModules for VCV Rack
Log | Files | Refs | README | LICENSE

commit 585f917e5fd8f0b284b5f3f50062d01f97b49618
parent 0405b8b8f93285f96e85279b5056731c61c2b233
Author: Matt Demanett <matt@demanett.net>
Date:   Thu, 31 Jan 2019 00:15:36 -0500

Improve accuracy of peak frequency readouts on ANALYZER(-XL). #35

Diffstat:
Msrc/analyzer_base.cpp | 15+++++++++++----
1 file changed, 11 insertions(+), 4 deletions(-)

diff --git a/src/analyzer_base.cpp b/src/analyzer_base.cpp @@ -19,8 +19,7 @@ ChannelAnalyzer::~ChannelAnalyzer() { } float ChannelAnalyzer::getPeak() { - float max = 0.0; - float sum = 0.0; + float max = 0.0f; int maxBin = 0; const float* bins = getBins(); for (int bin = 0; bin < _binsN; ++bin) { @@ -28,11 +27,19 @@ float ChannelAnalyzer::getPeak() { max = bins[bin]; maxBin = bin; } - sum += bins[bin]; } + const int bandsPerBin = _analyzer._size / _binsN; const float fWidth = (_analyzer._sampleRate / 2.0f) / (float)(_analyzer._size / bandsPerBin); - return (maxBin + 0.5f)*fWidth; + float sum = 0.0f; + float sumWeights = 0.0f; + int i = std::max(0, maxBin - 1); + int j = std::max(_binsN - 1, maxBin + 1); + for (; i <= j; ++i) { + sum += bins[i] * fWidth * i; + sumWeights += bins[i]; + } + return sum / sumWeights; } void ChannelAnalyzer::step(float sample) {