N-order IIR filters open source library

I just finished up an alpha rewrite of “A Collection of Useful C++ Classes for Digital Signal Processing”. You can download full sources, including a demo application that should work on almost all platforms, it even has sound! This new version is many times better than the original.

Here it is:


Bug reports and feedback is welcome. Elliptics are turned off since I haven’t finished porting them to the new framework

[size=150]“A Collection of Useful C++ Classes for Digital Signal Processing”[/size]

By Vincent Falco

“Techniques for digital signal processing are well guarded and held close to the chest, as they have valuable applications for multimedia content. The black art of Infinite Impulse Response (“IIR”) filtering has remained shrouded in secrecy with little publicly available source code…until now.”

Building on the work of cherished luminaries such as Sophocles Orfanidis, Andreas Antoniou, Martin Holters, and Udo Zolzer, this library harnesses the power of C++ templates to solve a useful problem in digital signal processing: the realization of multichannel IIR filters of arbitrary order and prescribed specifications with various properties such as Butterworth, Chebyshev, and Elliptic responses. The library is provided under the MIT license and is therefore fully compatible with proprietary usage.

Classes are designed as independent re-usable building blocks. Use some or all of the provided features, or extend the functionality by writing your own objects that plug into the robust framework. Only the code that you need will get linked into your application. Here’s a list of features:

* Exclusive focus on IIR filters instead of boring FIR filters
* Complete implementation of all "RBJ Biquad" Cookbook filter formulas
* Butterworth, Chebyshev, Elliptic, Bessel designs
* Low Pass, High Pass, Band Pass, Band Stop transformations
* Low, High, and Band Shelf filter implementations for all types
* Smooth interpolation of filter settings, pole/zeros, and biquad coefficients to achieve seamless parameter changes
* Representation of digital filters using poles and zeros
* Realization using Direct Form I, Direct Form II, or user provided class
* Fully factored to minimize template instantiations
* "Design" layer provides runtime introspection into a filter
* Utility template functions for manipulating buffers of sample data
* No calls to malloc or new, great for embedded systems
* No external dependencies, just the standard C++ library! 

An accompanying demonstration application, which works on most popular platforms by using the separately licensed Juce source library (included), exercises all the functionality of the library, including these features:

* Dynamic interface creates itself using filter introspection capabilities
* Audio playback with real time application of a selected filter
* Live time stretching and amplitude modulation without clicks or popping
* Charts to show magnitude, phase response and pole/zero placement
* Thread safety "best practices" for audio applications 

Using these filters is easy:

    // Create a Chebyshev type I Band Stop filter of order 3
    // with state for processing 2 channels of audio.
    Dsp::SimpleFilter <Dsp::ChebyshevI::BandStop <3>, 2> f;
    f.setup (3,    // order
             44100,// sample rate
             4000, // center frequency
             880,  // band width
             1);   // ripple dB
    f.process (numSamples, arrayOfChannels);

If you’ve been searching in futility on the Internet for some source code for implementing high order filters, then look no further because this is it! Whether you are a student of C++ or digital signal processing, a writer of audio plugins, or even a VST synthesizer coder, “A Collection of Useful C++ Classes for Digital Signal Processing” might have something for you!

1 Like

I updated this library. The new version is still alpha but it is many times better than before. And the demo app uses Juce to play sounds, loops and other goodies. I changed the original post to reflect the new version.



Yeah - nice job man!

Uploaded version 0.9.2a which includes elliptic curves, bug fixes, and tremendous increases in the speed of filtering and applying parameter changes - this one is like lightning. Also added a “Custom” option that lets you set the poles and zeros directly of a one or two-pole.