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.
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
Generated on Tue Jul 19 2022 00:25:10 by
1.7.2