Biquad filter library in C++ template form. On mbed LPC1768, can run about 100K operations per second with double precision float, or about 200K with single precision float.

Dependents:   EMG_Wiesje

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers biquad.h Source File

biquad.h

00001 /*
00002  *  biquad.h
00003  *
00004  *  Original source material from Robert Bristow-Johnson at 
00005  *  http://www.musicdsp.org/files/Audio-EQ-Cookbook.txt
00006  *  and Nigel Redmon at http://www.earlevel.com/ 
00007  *  
00008  *  Derived from public domain C implementation by Tom St. Denis
00009  *
00010  *  Thanks gents!
00011  *
00012  *  C++-ification by Mark J. Howell
00013  *
00014  */
00015 
00016 #ifndef __BIQUAD_H_
00017 #define __BIQUAD_H_
00018 
00019 #include <math.h>
00020 
00021 #ifndef M_LN2
00022 #define M_LN2       0.69314718055994530942
00023 #endif
00024 
00025 #ifndef M_PI
00026 #define M_PI        3.14159265358979323846
00027 #endif
00028 
00029 /* formulation types */
00030 typedef enum {
00031     DIRECT_FORM_I = 0,
00032     TRANSPOSED_DIRECT_FORM_II
00033 } BIQUAD_FORMULATION_TYPE;
00034 
00035 /* filter types */
00036 typedef enum {
00037     LPF, /* low pass filter */
00038     HPF, /* High pass filter */
00039     BPF, /* band pass filter */
00040     NOTCH, /* Notch Filter */
00041     PEQ, /* Peaking band EQ filter */
00042     LSH, /* Low shelf filter */
00043     HSH /* High shelf filter */
00044 } BIQUAD_FILTER_TYPE;
00045 
00046 template <typename T>
00047 class Biquad {
00048 
00049 public:
00050     Biquad(BIQUAD_FILTER_TYPE type, 
00051         T dbGain,  /* peak gain of filter */
00052         T freq,  /* center frequency */
00053         T srate,  /* sampling rate */
00054         T Q, /* Q */
00055         BIQUAD_FORMULATION_TYPE form = DIRECT_FORM_I);                       
00056         
00057     void Reset(BIQUAD_FILTER_TYPE type, T dbGain, T freq, T srate, T Q, bool clearHistory = false, BIQUAD_FORMULATION_TYPE form = DIRECT_FORM_I);
00058     
00059     void CalcCoefficientsDirectI(BIQUAD_FILTER_TYPE type, T dbGain, T freq, T srate, T Q);
00060     
00061     void CalcCoefficientsTransposedDirectII(BIQUAD_FILTER_TYPE type, T dbGain, T freq, T srate, T Q);
00062     
00063     T Calculate(T sample);
00064     
00065     BIQUAD_FORMULATION_TYPE form;    
00066     
00067     // used for DIRECT_FORM_1
00068     T a0_I, a1_I, a2_I, a3_I, a4_I; 
00069     T x1, x2, y1, y2;
00070     
00071     // used for TRANSPOSED_DIRECT_FORM_II
00072     T a0_II, a1_II, a2_II, b1_II, b2_II;    
00073     T z1, z2;        
00074 
00075 };
00076 
00077 #endif
00078