Pulp 1.88.0
Cross-platform audio plugin framework
Loading...
Searching...
No Matches
pulp::signal::OversamplerT< SampleType > Class Template Reference

#include <oversampling.hpp>

Classes

struct  Latency

Public Types

enum class  Factor { x2 = 2 , x4 = 4 , x8 = 8 , x16 = 16 }
enum class  Kind { fir_biquad , polyphase_iir , linear_phase_fir }
 Which anti-aliasing filter family the oversampler uses. More...
enum class  Quality { standard , pristine }

Public Member Functions

 OversamplerT ()
void set_factor (Factor f)
 RT contract: set_factor(), set_sample_rate(), set_kind(), and reset() are setup/control operations that mutate filter state and should run outside the audio callback.
void set_sample_rate (SampleType sr)
void set_kind (Kind kind)
void set_quality (Quality quality)
Kind kind () const
Quality quality () const
Factor factor () const
int factor_value () const
Latency latency () const noexcept
 Linear-phase modes expose a constant delay suitable for host compensation.
int latency_samples () const noexcept
double group_delay_samples (double frequency) const noexcept
 Group delay of the round trip (upsample, identity callback, downsample) in base-rate samples at frequency cycles per base sample.
template<typename Callback>
SampleType process (SampleType input, Callback &&callback)
SampleType process (SampleType input, const std::function< SampleType(SampleType)> &callback)
template<typename Callback>
void process_block (const SampleType *input, SampleType *output, std::size_t num_samples, Callback &&callback)
void reset ()

Static Public Member Functions

static HalfBandIirDesign polyphase_stage_design (Quality quality, int stage) noexcept
 The elliptic half-band design stage stage (0 to 3) uses in the polyphase_iir lane at quality.
static double polyphase_stopband_db (Quality quality) noexcept
 The polyphase lane's stopband floor at quality, in dB (negative): the worst equiripple level over every stage design.

Member Enumeration Documentation

◆ Factor

template<typename SampleType = float>
enum class pulp::signal::OversamplerT::Factor
strong
Enumerator
x2 
x4 
x8 
x16 

◆ Kind

template<typename SampleType = float>
enum class pulp::signal::OversamplerT::Kind
strong

Which anti-aliasing filter family the oversampler uses.

Enumerator
fir_biquad 

Butterworth biquad lowpass on both sides; ~7 dB rejection.

polyphase_iir 

Elliptic half-band polyphase IIR (allpass network). Default.

linear_phase_fir 

Linear-phase FIR with reported integer latency.

◆ Quality

template<typename SampleType = float>
enum class pulp::signal::OversamplerT::Quality
strong
Enumerator
standard 

FIR: 96 dB, flat to 0.40 Fs. IIR: 114.6 dB, flat to 0.485 Fs.

pristine 

FIR: 140 dB, flat to 0.45 Fs. IIR: 153.2 dB, flat to 0.485 Fs.

Constructor & Destructor Documentation

◆ OversamplerT()

template<typename SampleType = float>
pulp::signal::OversamplerT< SampleType >::OversamplerT ( )
inline

Member Function Documentation

◆ factor()

template<typename SampleType = float>
Factor pulp::signal::OversamplerT< SampleType >::factor ( ) const
inline

◆ factor_value()

template<typename SampleType = float>
int pulp::signal::OversamplerT< SampleType >::factor_value ( ) const
inline

◆ group_delay_samples()

template<typename SampleType = float>
double pulp::signal::OversamplerT< SampleType >::group_delay_samples ( double frequency) const
inlinenoexcept

Group delay of the round trip (upsample, identity callback, downsample) in base-rate samples at frequency cycles per base sample.

Constant and equal to latency().exact_input_samples for the linear-phase lane. The figure is the LTI delay of the filter cascade; the biquad lane rejects images so weakly that above ~0.2 Fs the decimator folds a tone's own image back onto it, and the measured phase there departs from it.

◆ kind()

template<typename SampleType = float>
Kind pulp::signal::OversamplerT< SampleType >::kind ( ) const
inline

◆ latency()

template<typename SampleType = float>
Latency pulp::signal::OversamplerT< SampleType >::latency ( ) const
inlinenoexcept

Linear-phase modes expose a constant delay suitable for host compensation.

Minimum-phase IIR modes have frequency-dependent group delay, so constant is false and no exact scalar is claimed; see group_delay_samples().

◆ latency_samples()

template<typename SampleType = float>
int pulp::signal::OversamplerT< SampleType >::latency_samples ( ) const
inlinenoexcept

◆ polyphase_stage_design()

template<typename SampleType = float>
HalfBandIirDesign pulp::signal::OversamplerT< SampleType >::polyphase_stage_design ( Quality quality,
int stage )
inlinestaticnoexcept

The elliptic half-band design stage stage (0 to 3) uses in the polyphase_iir lane at quality.

Stage 0 runs at twice the base rate, stage s at 2^(s+1) times it; frequencies in the design are relative to that stage's own rate. A stage outside 0..3 returns an invalid design.

◆ polyphase_stopband_db()

template<typename SampleType = float>
double pulp::signal::OversamplerT< SampleType >::polyphase_stopband_db ( Quality quality)
inlinestaticnoexcept

The polyphase lane's stopband floor at quality, in dB (negative): the worst equiripple level over every stage design.

Each stage guards the same absolute base band, so the lane rejects images and aliases into that band by at least this much at any factor. -114.62 dB standard, -153.23 dB pristine; documentation quotes them as 114.6 and 153.2 dB.

◆ process() [1/2]

template<typename SampleType = float>
template<typename Callback>
SampleType pulp::signal::OversamplerT< SampleType >::process ( SampleType input,
Callback && callback )
inline

◆ process() [2/2]

template<typename SampleType = float>
SampleType pulp::signal::OversamplerT< SampleType >::process ( SampleType input,
const std::function< SampleType(SampleType)> & callback )
inline

◆ process_block()

template<typename SampleType = float>
template<typename Callback>
void pulp::signal::OversamplerT< SampleType >::process_block ( const SampleType * input,
SampleType * output,
std::size_t num_samples,
Callback && callback )
inline

◆ quality()

template<typename SampleType = float>
Quality pulp::signal::OversamplerT< SampleType >::quality ( ) const
inline

◆ reset()

template<typename SampleType = float>
void pulp::signal::OversamplerT< SampleType >::reset ( )
inline

◆ set_factor()

template<typename SampleType = float>
void pulp::signal::OversamplerT< SampleType >::set_factor ( Factor f)
inline

RT contract: set_factor(), set_sample_rate(), set_kind(), and reset() are setup/control operations that mutate filter state and should run outside the audio callback.

After configuration, process() and process_block() are allocation-free whenever the supplied callback is — including for a std::function callback, which is taken by reference and never copied per sample. A std::function still costs an indirect call, so hot paths should prefer the templated overload.

◆ set_kind()

template<typename SampleType = float>
void pulp::signal::OversamplerT< SampleType >::set_kind ( Kind kind)
inline

◆ set_quality()

template<typename SampleType = float>
void pulp::signal::OversamplerT< SampleType >::set_quality ( Quality quality)
inline

◆ set_sample_rate()

template<typename SampleType = float>
void pulp::signal::OversamplerT< SampleType >::set_sample_rate ( SampleType sr)
inline

The documentation for this class was generated from the following file: