Pinking filter.
This is a linear time-invariant filter approximately attenuating 3 dB/oct from about 0.000046 × Nyquist frequency to about 0.9 × Nyquist frequency. It can be used to turn white noise into pink noise (hence the name).
The filter design is based on
P. P. La Pastina and S. D'Angelo, "Optimal Integer Order Approximation of Fractional Order Filters", Proc. 24th Intl. Conf. Digital Audio Effects (DAFx20in21), pp. 89-96, Vienna, Austria, September 2021.
Version: 1.2.1
License:
Requires:
Included in Brickworks, which is:
Here you can download one or more example VST3 plugins for Windows, macOS and Linux. Source code of the audio engine(s) is included in the archive(s).
Description | Link |
---|---|
Monophonic subtractive synth | Download |
Polyphonic subtractive synth | Download |
Module type: DSP
typedef struct bw_pink_filt_coeffs bw_pink_filt_coeffs;
Coefficients and related.
typedef struct bw_pink_filt_state bw_pink_filt_state;
Internal state and related.
static inline void bw_pink_filt_init(
bw_pink_filt_coeffs * BW_RESTRICT coeffs);
Initializes input parameter values in coeffs
.
static inline void bw_pink_filt_set_sample_rate(
bw_pink_filt_coeffs * BW_RESTRICT coeffs,
float sample_rate);
Sets the sample_rate
(Hz) value in coeffs
.
static inline void bw_pink_filt_reset_coeffs(
bw_pink_filt_coeffs * BW_RESTRICT coeffs);
Resets coefficients in coeffs
to assume their target values.
static inline float bw_pink_filt_reset_state(
const bw_pink_filt_coeffs * BW_RESTRICT coeffs,
bw_pink_filt_state * BW_RESTRICT state,
float x_0);
Resets the given state
to its initial values using the given coeffs
and the initial input value x_0
.
Returns the corresponding initial output value.
static inline void bw_pink_filt_reset_state_multi(
const bw_pink_filt_coeffs * BW_RESTRICT coeffs,
bw_pink_filt_state * BW_RESTRICT const * BW_RESTRICT state,
const float * x_0,
float * y_0,
size_t n_channels);
Resets each of the n_channels
state
s to its initial values using the given coeffs
and the corresponding initial input value in the x_0
array.
The corresponding initial output values are written into the y_0
array, if not BW_NULL
.
static inline void bw_pink_filt_update_coeffs_ctrl(
bw_pink_filt_coeffs * BW_RESTRICT coeffs);
Triggers control-rate update of coefficients in coeffs
.
static inline void bw_pink_filt_update_coeffs_audio(
bw_pink_filt_coeffs * BW_RESTRICT coeffs);
Triggers audio-rate update of coefficients in coeffs
.
static inline float bw_pink_filt_process1(
const bw_pink_filt_coeffs * BW_RESTRICT coeffs,
bw_pink_filt_state * BW_RESTRICT state,
float x);
static inline float bw_pink_filt_process1_scaling(
const bw_pink_filt_coeffs * BW_RESTRICT coeffs,
bw_pink_filt_state * BW_RESTRICT state,
float x);
These function process one input sample x
using coeffs
, while using and updating state
. They return the corresponding output sample.
In particular:
bw_pink_filt_process1()
assumes that sample rate scaling is disabled;bw_pink_filt_process1_scaling()
assumes that sample rate scaling is enabled.Whether sample rate scaling is enabled or not is unchecked even for debugging purposes.
static inline void bw_pink_filt_process(
bw_pink_filt_coeffs * BW_RESTRICT coeffs,
bw_pink_filt_state * BW_RESTRICT state,
const float * x,
float * y,
size_t n_samples);
Processes the first n_samples
of the input buffer x
and fills the first n_samples
of the output buffer y
, while using coeffs
and both using and updating state
.
static inline void bw_pink_filt_process_multi(
bw_pink_filt_coeffs * BW_RESTRICT coeffs,
bw_pink_filt_state * BW_RESTRICT const * BW_RESTRICT state,
const float * const * x,
float * const * y,
size_t n_channels,
size_t n_samples);
Processes the first n_samples
of the n_channels
input buffers x
and fills the first n_samples
of the n_channels
output buffers y
, while using the common coeffs
and both using and updating each of the n_channels
state
s.
static inline void bw_pink_filt_set_sample_rate_scaling(
bw_pink_filt_coeffs * BW_RESTRICT coeffs,
char value);
Sets whether the output should be scaled (value
non-0
) or not (0
) according to the sample rate in coeffs
.
In order to keep the magnitude response consistent at different sample rates, the output of this filter should be accordingly scaled. The 44100 Hz sample rate is used as a reference (that is, the scaling factor at that sample rate is 1.f
).
Default value: 0
(off).
static inline float bw_pink_filt_get_scaling_k(
const bw_pink_filt_coeffs * BW_RESTRICT coeffs);
Returns the sample rate scaling factor that is applied or would be applied if sample rate scaling were enabled, as stored in coeffs
.
coeffs
must be at least in the "sample-rate-set" state.
static inline char bw_pink_filt_coeffs_is_valid(
const bw_pink_filt_coeffs * BW_RESTRICT coeffs);
Tries to determine whether coeffs
is valid and returns non-0
if it seems to be the case and 0
if it is certainly not. False positives are possible, false negatives are not.
coeffs
must at least point to a readable memory block of size greater than or equal to that of bw_pink_filt_coeffs
.
static inline char bw_pink_filt_state_is_valid(
const bw_pink_filt_coeffs * BW_RESTRICT coeffs,
const bw_pink_filt_state * BW_RESTRICT state);
Tries to determine whether state
is valid and returns non-0
if it seems to be the case and 0
if it is certainly not. False positives are possible, false negatives are not.
If coeffs
is not BW_NULL
extra cross-checks might be performed (state
is supposed to be associated to coeffs
).
state
must at least point to a readable memory block of size greater than or equal to that of bw_pink_filt_state
.
template<size_t N_CHANNELS>
class PinkFilt {
public:
PinkFilt();
void setSampleRate(
float sampleRate);
void reset(
float x0 = 0.f,
float * BW_RESTRICT y0 = BW_NULL);
# ifndef BW_CXX_NO_ARRAY
void reset(
float x0,
std::array<float, N_CHANNELS> * BW_RESTRICT y0);
# endif
void reset(
const float * x0,
float * y0 = BW_NULL);
# ifndef BW_CXX_NO_ARRAY
void reset(
std::array<float, N_CHANNELS> x0,
std::array<float, N_CHANNELS> * BW_RESTRICT y0 = BW_NULL);
# endif
void process(
const float * const * x,
float * const * y,
size_t nSamples);
# ifndef BW_CXX_NO_ARRAY
void process(
std::array<const float *, N_CHANNELS> x,
std::array<float *, N_CHANNELS> y,
size_t nSamples);
# endif
void setSampleRateScaling(
bool value);
float getScalingK();
...
}
BW_NULL
in the C++ API and implementation.BW_INCLUDE_WITH_QUOTES
, BW_NO_CXX
, and BW_CXX_NO_EXTERN_C
.bw_pink_filt_process_multi()
to ensure that buffers used for both input and output appear at the same channel indices.BW_NULL
and BW_CXX_NO_ARRAY
.bw_pink_filt_reset_coeffs()
, bw_pink_filt_update_coeffs_ctrl()
, and bw_pink_filt_update_coeffs_audio()
.bw_pink_filt_reset_state()
.bw_pink_filt_reset_state_multi()
and updated C++ API in this regard.bw_pink_filt_reset_state()
returns the initial output value.reset()
functions taking arrays as arguments.bw_pink_filt_process()
and bw_pink_filt_process_multi()
now use size_t
to count samples and channels.const
and BW_RESTRICT
specifiers to input arguments and implementation.process()
function taking C-style arrays as arguments.bw_pink_filt_process1()
.bw_pink_filt_process_multi()
.bw_pink_filt_set_sample_rate_scaling()
definition.bw_pink_filt_coeffs
.