/***************************************** EQ10 library version 1.0 Copyright (C)2002 4Front Technologies Written by George Yohng http://www.opensound.com Proprietary software. *****************************************/ #ifndef EQ10DSP_H_INCLUDED #define EQ10DSP_H_INCLUDED #ifdef __cplusplus extern "C" { #endif /* used for volume detectors. for instance, if you want to plot frequency response, you can use "detect" variable of needed subband to query level of that frequency band. release time - is the time in seconds in which detector falls back to zero, if no peaks detected */ // #define EQ10_DETECTOR_CODE /* uncomment this to */ // #define EQ10_DETECTOR_RELEASE 1.0f /* enable band detector */ /* Dynamic limiter, which prevents EQ from distortion. In no case you can overflow EQ and cause it to clip */ #define EQ10_TRIM_CODE 0.930 /* trim at -0.6dB */ #define EQ10_TRIM_RELEASE 0.700 /* trim release, in seconds */ #define EQ10_NOFBANDS 10 /* want more bands? not a problem */ #define EQ10_Q 1.41 /* global `Q' factor */ /* if you want separate Q per each band, comment global Q and uncomment the following array */ //#define EQ10_DQ {1.4,1.4,1.4,1.4,1.4,1.4,1.4,1.4,1.4,1.4} /* frequency table compatible to Q10 standard */ typedef struct eq10band_s { double gain; /* gain of current band. Do not use this value, use eq10_setgain instead */ #ifdef EQ10_DETECTOR_CODE double detect; /* band detector value, do not use. use eq10_detect to read detector value in dB */ double detectdecay; /* internal - do not use */ #endif double ua0,ub1,ub2; /* internal - do not use */ double da0,db1,db2; /* internal - do not use */ double x1,x2,y1,y2; /* internal - do not use */ } eq10band_t; typedef struct eq10_s { double rate; /* sample rate; do not modify */ /* use eq10_setup to change */ eq10band_t band[EQ10_NOFBANDS]; /* bands of equalizer */ double detect; /* global detector value. do not use */ double detectdecay; /* internal - do not use */ } eq10_t; double eq10_db2gain(double gain_dB); /* converts decibels to internal gain value*/ double eq10_gain2db(double gain); /* converts internal gain value to decibels*/ /* prepare eq array for processing, eq - pointer to array, eqs - number of elements in array (number of audio channels) rate - sample rate WARNING! this function resets all data in eq and sets all gains to 0dB */ void eq10_setup(eq10_t *eq, int eqs, double rate); /* set band gain */ /* eq - pointer to array, eqs - number of elements in array (number of audio channels) bandnr - # of band (0...EQ_NOFBANDS-1) */ void eq10_setgain(eq10_t *eq,int eqs,int bandnr,double gain_dB); /* get current band gain */ /* eq - pointer to element, possible to read gain on each channel separately */ double eq10_getgain(eq10_t *eq,int bandnr); /* get detector value */ /* eq - pointer to element, possible to read detector value on each channel separately */ double eq10_detect(eq10_t *eq,int bandnr); /* process function eq - pointer to eq structure, corresponding to wanted channel buf - input buffer (interleaved multichannel) outbuf - output buffer sz - number of samples in input buffer idx - index of processed channel (0...N-1) step - total number of channels in interleaved stream (N) */ void eq10_processf(eq10_t *eq,float *buf,float *outbuf,int sz,int idx,int step); /* Example: #define NCHAN 6 ... eq10_t eq[NCHAN]; // we process 5.1 data, thus 6 channels int t; eq10_t *peq; ... eq10_setup(eq,NCHAN,44100); // initialize ... eq10_setgain(eq,NCHAN, 5, -10.0f ); // set -10dB for gain6 (nr's from zero) ... while (bla bla bla) // inner loop { for(t=0, peq=eq; t