DSPark 1.8.0
Header-only C++20 DSP for real-time and offline audio
Loading...
Searching...
No Matches
ScaledSumSquares.h
1// DSPark -- Professional Audio DSP Framework
2// Copyright (c) 2026 Cristian Moresi -- MIT License
3
4#pragma once
5
11#include <algorithm>
12#include <cmath>
13
14namespace dspark::detail {
15
18{
19public:
20 void reset() noexcept { scale_ = sum_ = 0; }
21 void add(double value) noexcept
22 {
23 const double magnitude = std::abs(value);
24 if (magnitude > scale_)
25 {
26 const double ratio = scale_ / magnitude;
27 sum_ = 1 + sum_ * ratio * ratio;
28 scale_ = magnitude;
29 }
30 else if (magnitude > 0)
31 {
32 const double ratio = magnitude / scale_;
33 sum_ += ratio * ratio;
34 }
35 }
36 [[nodiscard]] double peak() const noexcept { return scale_; }
37 [[nodiscard]] double rms(double count) const noexcept
38 {
39 return count > 0 ? scale_ * std::sqrt(std::min(1.0, sum_ / count)) : 0;
40 }
41private:
42 double scale_ = 0, sum_ = 0;
43};
44} // namespace dspark::detail
Scaled sum of squares; caller validates finite input and counts values.
double rms(double count) const noexcept
void add(double value) noexcept