37 double db = 20.0 * std::log10(magnitude);
39 return static_cast<float>(db);
44template <
typename SampleType>
46 const std::complex<double> z_inv = std::polar(1.0, -omega);
47 const std::complex<double> z_inv2 = z_inv * z_inv;
48 const std::complex<double> num =
49 static_cast<double>(
c.b0) +
static_cast<double>(
c.b1) * z_inv +
static_cast<double>(
c.b2) * z_inv2;
50 const std::complex<double> den =
51 1.0 +
static_cast<double>(
c.a1) * z_inv +
static_cast<double>(
c.a2) * z_inv2;
52 const double d = std::abs(den);
53 if (!(d > 0.0))
return 0.0;
54 return std::abs(num) / d;
67template <
typename SampleType>
69 const std::complex<double> z1(std::cos(omega), -std::sin(omega));
70 const std::complex<double> z2 = z1 * z1;
71 const auto delay = [&](
double p0,
double p1,
double p2) {
72 return std::real((p1 * z1 + 2.0 * p2 * z2) / (p0 + p1 * z1 + p2 * z2));
79template <
typename SampleType, std::
size_t Extent>
98 if (!(sample_rate > 0.0))
return 0.0;
99 const double omega = 2.0 * std::acos(-1.0) * freq_hz / sample_rate;
100 return std::clamp(omega, 0.0, std::acos(-1.0));
104template <
typename SampleType>
106 double sample_rate) {
111 double sample_rate) {
116template <
typename SampleType, std::
size_t Extent>
118 double freq_hz,
double sample_rate) {
123 double sample_rate) {
129template <
typename SampleType>
143 if (bin_count <= 1)
return 0.0;
144 const double nyquist = sample_rate * 0.5;
145 return nyquist *
static_cast<double>(index) /
static_cast<double>(bin_count - 1);
152inline double log_frequency_at(std::size_t index, std::size_t count,
double min_hz,
double max_hz) {
153 if (count <= 1)
return min_hz;
154 const double log_min = std::log10(min_hz);
155 const double log_max = std::log10(max_hz);
156 const double t =
static_cast<double>(index) /
static_cast<double>(count - 1);
157 return std::pow(10.0, log_min + t * (log_max - log_min));
166template <
typename SampleType, std::
size_t Extent>
168 double min_hz,
double max_hz,
double sample_rate,
169 std::span<float> out) {
170 const std::size_t n = out.size();
171 for (std::size_t
i = 0;
i < n; ++
i) {
178 double max_hz,
double sample_rate, std::span<float> out) {
Coefficients coefficients() const
Definition biquad.hpp:81
Definition additive_bank.hpp:218
float magnitude_to_db(double magnitude)
Convert a linear magnitude to dB, floored at min_response_db.
Definition frequency_response.hpp:35
void response_curve_db(std::span< const BiquadCoefficientsT< SampleType >, Extent > sos, double min_hz, double max_hz, double sample_rate, std::span< float > out)
Sample a cascade's magnitude response into out, at out.size() log-spaced frequencies spanning [min_hz...
Definition frequency_response.hpp:167
double cascade_magnitude(std::span< const BiquadCoefficientsT< SampleType >, Extent > sos, double omega)
Linear magnitude |H| of a cascade at angular frequency ω.
Definition frequency_response.hpp:80
constexpr float min_response_db
Floor applied to dB conversions.
Definition frequency_response.hpp:32
double fft_bin_frequency(std::size_t index, std::size_t bin_count, double sample_rate)
Center frequency of bin index in a real-FFT magnitude array.
Definition frequency_response.hpp:142
float magnitude_db(const BiquadT< SampleType > &filter, double freq_hz, double sample_rate)
Ask a live filter what it looks like: the magnitude, in dB, that this BiquadT is applying at freq_hz ...
Definition frequency_response.hpp:130
double section_magnitude(const BiquadCoefficientsT< SampleType > &c, double omega)
Linear magnitude |H(e^jω)| of one section at normalized angular frequency ω = 2π·f/fs (radians/sample...
Definition frequency_response.hpp:45
@ c
Definition spectrum_trace.hpp:35
@ delay
Definition envelope.hpp:57
double section_group_delay(const BiquadCoefficientsT< SampleType > &c, double omega)
Group delay of one biquad section at omega (radians per sample), in samples: -d(arg H)/d(omega) for H...
Definition frequency_response.hpp:68
float cascade_magnitude_db(std::span< const BiquadCoefficientsT< SampleType >, Extent > sos, double freq_hz, double sample_rate)
Magnitude of a cascade at a frequency in Hz, in dB.
Definition frequency_response.hpp:117
float section_magnitude_db(const BiquadCoefficientsT< SampleType > &c, double freq_hz, double sample_rate)
Magnitude of one section at a frequency in Hz, in dB.
Definition frequency_response.hpp:105
double log_frequency_at(std::size_t index, std::size_t count, double min_hz, double max_hz)
Frequency of sample index of count, log-spaced across [min_hz, max_hz].
Definition frequency_response.hpp:152
@ i
Definition formant_filter_bank.hpp:20
double angular_frequency(double freq_hz, double sample_rate)
Angular frequency (radians/sample) of freq_hz at sample_rate, clamped to [0, π].
Definition frequency_response.hpp:97
BiquadCoefficientsT< float > BiquadCoefficients
Definition biquad.hpp:29