24template <
typename SampleType =
float>
30 resonance_ = std::clamp(r, SampleType{0.0f}, SampleType{1.0f});
36 return process_with_profile<kDefaultLadderSaturation>(input);
41 return process_with_profile<LadderSaturation::exact>(input);
46 return process_with_profile<LadderSaturation::realtime_efficient>(input);
51 for (
int i = 0;
i < num_samples; ++
i)
57 for (std::size_t
i = 0;
i < num_samples; ++
i)
63 for (std::size_t
i = 0;
i < num_samples; ++
i)
68 for (
auto& s : stage_) s = 0;
69 for (
auto& s : saturated_stage_) s = 0;
76 return SampleType{1.0f} -
77 std::exp(SampleType{-2.0f} * SampleType{3.14159265f} * cutoff_hz / sample_rate);
85 template <LadderSaturation Saturation>
static SampleType
saturate(SampleType x) {
86 if constexpr (std::is_same_v<SampleType, float>)
93 template <LadderSaturation Saturation> SampleType process_with_profile(SampleType input) {
96 resonance_ * SampleType{4.0f} * (stage_[3] - input * SampleType{0.5f});
102 for (
int i = 0;
i < 4; ++
i) {
107 stage_[
i] + g_ * (saturated_prev - saturated_stage_[
i]));
109 saturated_prev = saturated_stage_[
i];
115 SampleType sample_rate_ = SampleType{44100.0f};
116 SampleType cutoff_ = SampleType{1000.0f};
117 SampleType resonance_ = SampleType{0.0f};
119 SampleType stage_[4] = {};
120 SampleType saturated_stage_[4] = {};
Definition ladder_filter.hpp:25
void process_realtime_efficient(SampleType *buffer, std::size_t num_samples)
Process a buffer in place with the Padé FastMath::tanh stages.
Definition ladder_filter.hpp:62
void set_frequency(SampleType hz)
Definition ladder_filter.hpp:28
void process(SampleType *buffer, int num_samples)
Process a buffer in place with the default saturator.
Definition ladder_filter.hpp:50
void reset()
Definition ladder_filter.hpp:67
SampleType process_reference(SampleType input)
Process one sample with exact std::tanh stages.
Definition ladder_filter.hpp:40
void set_sample_rate(SampleType sr)
Definition ladder_filter.hpp:27
void set_resonance(SampleType r)
Definition ladder_filter.hpp:29
SampleType process(SampleType input)
Process one sample with the default saturator (see LadderSaturation).
Definition ladder_filter.hpp:35
SampleType process_realtime_efficient(SampleType input)
Process one sample with the Padé FastMath::tanh stages.
Definition ladder_filter.hpp:45
static SampleType stage_coefficient(SampleType cutoff_hz, SampleType sample_rate)
One-pole stage coefficient for a cutoff and sample rate: g = 1 - exp(-2 pi fc / fs).
Definition ladder_filter.hpp:75
static SampleType saturate(SampleType x)
Saturating non-linearity.
Definition ladder_filter.hpp:85
void process_reference(SampleType *buffer, std::size_t num_samples)
Process a buffer in place with exact std::tanh stages.
Definition ladder_filter.hpp:56
Scalar math helpers for real-time audio DSP.
Definition additive_bank.hpp:218
@ feedback
Definition comb_filter.hpp:18
@ buffer
A borrowed static buffer with a traversable playhead.
Definition granular.hpp:110
LadderFilterT< double > LadderFilter64
Definition ladder_filter.hpp:128
LadderFilterT< float > LadderFilter
Definition ladder_filter.hpp:127
T snap_to_zero(T x)
Returns 0 if |x| < snap_threshold, else x.
Definition denormal.hpp:45
@ i
Definition formant_filter_bank.hpp:20
float ladder_tanh_profiled(float x)
The ladder's float saturator for an explicit choice.
Definition fast_math.hpp:668