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:
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) {