Revision control
Copy as Markdown
// Copyright (C) 2024 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
#include "qsinewavevalidator_p.h"
#include <QtCore/qmath.h>
#include <QtCore/QDebug>
QT_BEGIN_NAMESPACE
QSineWaveValidator::QSineWaveValidator(float notchFrequency, float sampleRate)
{
using namespace std;
float pi = static_cast<float>(M_PI);
float f0 = notchFrequency;
float Fs = sampleRate;
float Q = 1 / sqrt(2.f); // higher Q gives narrow bandwidth, but requires a larger number of
// frames during the transient
float w0 = 2 * pi * f0 / Fs;
float alpha = sin(w0) / (2 * Q);
b0 = 1;
b1 = -2 * cos(w0);
b2 = 1;
a0 = 1 + alpha;
a1 = -2 * cos(w0);
a2 = 1 - alpha;
}
void QSineWaveValidator::feedSample(float sample)
{
if (pendingFramesBeforeAnalysis == framesBeforeAnalysis) {
x.fill(sample);
y.fill(b0 / a0 * sample);
}
x[2] = x[1];
x[1] = x[0];
x[0] = sample;
y[2] = y[1];
y[1] = y[0];
y[0] = (b0 / a0) * x[0] + (b1 / a0) * x[1] + (b2 / a0) * x[2] - (a1 / a0) * y[1]
- (a2 / a0) * y[2];
accumPeak = std::max(std::abs(sample), accumPeak);
if (pendingFramesBeforeAnalysis) {
pendingFramesBeforeAnalysis -= 1;
return;
}
accumNotchPeak = std::max(std::abs(y[0]), accumNotchPeak);
}
float QSineWaveValidator::notchPeak() const
{
if (pendingFramesBeforeAnalysis)
qWarning() << "notchPeak during initial frames. Result will not be accurate";
return accumNotchPeak;
}
QT_END_NAMESPACE