CUGL 2.3 Cornell University Game Library
Searching...
No Matches
cugl::dsp::TwoZeroFIR Class Reference

`#include <CUTwoZeroFIR.h>`

## Public Member Functions

TwoZeroFIR ()

TwoZeroFIR (unsigned channels)

TwoZeroFIR (unsigned channels, float b0, float b1, float b2)

TwoZeroFIR (const TwoZeroFIR &copy)

TwoZeroFIR (TwoZeroFIR &&filter)

~TwoZeroFIR ()

unsigned getChannels () const

void setChannels (unsigned channels)

void setCoeff (const std::vector< float > &bvals, const std::vector< float > &avals)

const std::vector< float > getBCoeff () const

const std::vector< float > getACoeff () const

void setBCoeff (float b0, float b1, float b2)

void setNotch (float frequency, float radius)

void setZeroes (float zero1, float zero2)

void step (float gain, float *input, float *output)

void calculate (float gain, float *input, float *output, size_t size)

void clear ()

size_t flush (float *output)

## Static Public Attributes

static bool VECTORIZE

## Detailed Description

This class implements a two-zero digital filter.

This is the simplest class for implementing a "notch" in a frequency while maintaining a constant filter gain. There is a convenience method for defining this notch. However, filters are not intended to be model classes, and so it does not save the defining frequency.

Frequencies are specified in "normalized" format. A normalized frequency is frequency/sample rate. For example, a 7 kHz frequency with a 44100 Hz sample rate has a normalized value 7000/44100 = 0.15873.

This class supports vector optimizations for SSE and Neon 64. In timed simulations, these optimizations provide at least a 3-4x performance increase (and for 4 or 8 channel audio, much higher). These optimizations make use of the matrix precomputation outlined in "Implementation of Recursive Digital Filters into Vector SIMD DSP Architectures".

https://pdfs.semanticscholar.org/d150/a3f75dc033916f14029cd9101a8ea1d050bb.pdf

The algorithm in this paper performs extremely well in our tests, and even out-performs Apple's Acceleration library. However, our implementation is limited to 128-bit words as 256-bit (e.g. AVX) and higher show no significant increase in performance.

For performance reasons, this class does not have a (virtualized) subclass relationship with other IIR or FIR filters. However, the signature of the the calculation and coefficient methods has been standardized so that it can support templated polymorphism.

This class is not thread safe. External locking may be required when the filter is shared between multiple threads (such as between an audio thread and the main thread).

## ◆ TwoZeroFIR() [1/5]

 cugl::dsp::TwoZeroFIR::TwoZeroFIR ( )

Creates a zero-order pass-through filter for a single channel.

## ◆ TwoZeroFIR() [2/5]

 cugl::dsp::TwoZeroFIR::TwoZeroFIR ( unsigned channels )

Creates a zero-order pass-through filter for the given number of channels.

Parameters
 channels The number of channels

## ◆ TwoZeroFIR() [3/5]

 cugl::dsp::TwoZeroFIR::TwoZeroFIR ( unsigned channels, float b0, float b1, float b2 )

Creates a FIR filter with the given coefficients and number of channels.

This filter implements the standard difference equation:

``` y[n] = b[0]*x[n] + b[1]*x[n-1] + b[2]*x[n-2]
```

where y is the output and x in the input.

Parameters
 channels The number of channels b0 The upper zero-order coefficient b1 The upper first-order coefficient b2 The upper second-order coefficient

## ◆ TwoZeroFIR() [4/5]

 cugl::dsp::TwoZeroFIR::TwoZeroFIR ( const TwoZeroFIR & copy )

Creates a copy of the FIR filter.

Parameters
 copy The filter to copy

## ◆ TwoZeroFIR() [5/5]

 cugl::dsp::TwoZeroFIR::TwoZeroFIR ( TwoZeroFIR && filter )

Creates a FIR filter with the resources of the original.

Parameters
 filter The filter to acquire

## ◆ ~TwoZeroFIR()

 cugl::dsp::TwoZeroFIR::~TwoZeroFIR ( )

Destroys the filter, releasing all resources.

## ◆ calculate()

 void cugl::dsp::TwoZeroFIR::calculate ( float gain, float * input, float * output, size_t size )

Performs a filter of interleaved input data.

The output is written to the given output array, which should be the same size as the input array. The size is the number of frames, not samples. Hence the arrays must be size times the number of channels in size.

To provide real time processing, the output is delayed by the number of a-coefficients. Delayed results are buffered to be used the next time the filter is used (though they may be extracted with the `flush` method). The gain parameter is applied at the filter input, but does not affect the filter coefficients.

Parameters
 gain The input gain factor input The array of input samples output The array to write the sample output size The input size in frames

## ◆ clear()

 void cugl::dsp::TwoZeroFIR::clear ( )

Clears the filter buffer of any delayed outputs or cached inputs

## ◆ flush()

 size_t cugl::dsp::TwoZeroFIR::flush ( float * output )

Flushes any delayed outputs to the provided array

As this filter has no delayed terms, this method will write nothing. It is only here to standardize the filter signature.

Returns
The number of frames (not samples) written

## ◆ getACoeff()

 const std::vector< float > cugl::dsp::TwoZeroFIR::getACoeff ( ) const

Returns the lower coefficients for this IIR filter.

This filter implements the standard difference equation:

a[0]*y[n] = b[0]*x[n]+...+b[nb]*x[n-nb]-a[1]*y[n-1]-...-a[na]*y[n-na]

where y is the output and x in the input.

Returns
The lower coefficients

## ◆ getBCoeff()

 const std::vector< float > cugl::dsp::TwoZeroFIR::getBCoeff ( ) const

Returns the upper coefficients for this IIR filter.

This filter implements the standard difference equation:

a[0]*y[n] = b[0]*x[n]+...+b[nb]*x[n-nb]-a[1]*y[n-1]-...-a[na]*y[n-na]

where y is the output and x in the input.

Returns
The upper coefficients

## ◆ getChannels()

 unsigned cugl::dsp::TwoZeroFIR::getChannels ( ) const
inline

Returns the number of channels for this filter

The data buffers depend on the number of channels. Changing this value will reset the data buffers to 0.

Returns
the number of channels for this filter

## ◆ setBCoeff()

 void cugl::dsp::TwoZeroFIR::setBCoeff ( float b0, float b1, float b2 )

Sets the coefficients for this IIR filter.

This filter implements the standard difference equation:

``` y[n] = b[0]*x[n] + b[1]*x[n-1] + b[2]*x[n-2]
```

where y is the output and x in the input.

Parameters
 b0 The upper zero-order coefficient b1 The upper first-order coefficient b2 The upper second-order coefficient

## ◆ setChannels()

 void cugl::dsp::TwoZeroFIR::setChannels ( unsigned channels )

Sets the number of channels for this filter

The data buffers depend on the number of channels. Changing this value will reset the data buffers to 0.

Parameters
 channels The number of channels for this filter

## ◆ setCoeff()

 void cugl::dsp::TwoZeroFIR::setCoeff ( const std::vector< float > & bvals, const std::vector< float > & avals )

Sets the coefficients for this IIR filter.

This filter implements the standard difference equation:

a[0]*y[n] = b[0]*x[n] + ... + b[nb]*x[n-nb]

where y is the output and x in the input. If a[0] is not equal to 1, the filter coeffcients are normalized by a[0]. All other a-coefficients are ignored (they are only present for signature standardization). Similarly, all b-coefficients after the third are ignored. If any coefficients are missing, they are replaced with 1 for b[0] and a[0], and 0 otherwise.

Parameters
 bvals The upper coefficients avals The lower coefficients

## ◆ setNotch()

 void cugl::dsp::TwoZeroFIR::setNotch ( float frequency, float radius )

Sets the coefficients for a "notch" at at the (normalized) frequency.

A normalized frequency is defined as frequency/sample rate. For example, a 7 kHz frequency with a 44100 Hz sample rate has a normalized value of 7000/44100 = 0.15873.

This method determines the filter coefficients corresponding to two complex-conjugate zeros with the given frequency and the radius from the z-plane origin. The coefficients are then normalized to produce a maximum filter gain of one (independent of the filter gain parameter).

The resulting filter frequency response has a "notch" or anti-resonance at the given frequency. The closer the zeros are to the unit-circle (e.g. radius close to or equal to one), the narrower the resulting notch width. The frequency value should be between zero and 0.5 (half the sample rate. The radius value should be positive.

This filter is not intended to be a model class. Neither the frequency nor the radius is retained. Instead, this method computes the relative coefficients and forgets the frequence and radius values.

For a better notch filter, {

Parameters

## ◆ setZeroes()

 void cugl::dsp::TwoZeroFIR::setZeroes ( float zero1, float zero2 )

Sets this filter to have the specified zeroes.

Parameters
 zero1 The first filter zero zero2 The second filter zero

## ◆ step()

 void cugl::dsp::TwoZeroFIR::step ( float gain, float * input, float * output )

Performs a filter of single frame of data.

The output is written to the given output array, which should be the same size as the input array. The size should be the number of channels.

To provide real time processing, the output is delayed by the number of a-coefficients. Delayed results are buffered to be used the next time the filter is used (though they may be extracted with the `flush` method). The gain parameter is applied at the filter input, but does not affect the filter coefficients.

Parameters
 gain The input gain factor input The input frame output The frame to receive the output

## ◆ VECTORIZE

 bool cugl::dsp::TwoZeroFIR::VECTORIZE
static

Whether to use a vectorization algorithm (Access not thread safe)

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