Mixxx

/home/maxime/Projets/Mixxx/1.10/mixxx/src/engine/enginefilter.cpp

Go to the documentation of this file.
00001 /***************************************************************************
00002  *      enginefilter.cpp - Wrapper for FidLib Filter Library               *
00003  *                      ----------------------                             *
00004  *   copyright      : (C) 2007 by John Sully                               *
00005  *   email          : jsully@scs.ryerson.ca                                *
00006  *                                                                         *
00007  **************************************************************************/
00008 
00009 /***************************************************************************
00010 *                                                                         *
00011 *   This program is free software; you can redistribute it and/or modify  *
00012 *   it under the terms of the GNU General Public License as published by  *
00013 *   the Free Software Foundation; either version 2 of the License, or     *
00014 *   (at your option) any later version.                                   *
00015 *                                                                         *
00016 ***************************************************************************/
00017 
00018 #include "engine/enginefilter.h"
00019 #include <QDebug>
00020 
00021 
00022 EngineFilter::EngineFilter(char * conf, int predefinedType)
00023 {
00024         switch(predefinedType)
00025         {
00026         case PREDEF_BP:
00027                 processSample = &processSampleBp;
00028                 fbuf1 = buf1;
00029                 fbuf2 = buf2;
00030                 break;
00031         case PREDEF_HP:
00032                 processSample = &processSampleHp;
00033                 fbuf1 = buf1;
00034                 fbuf2 = buf2;
00035                 break;
00036         case PREDEF_LP:
00037                 processSample = &processSampleLp;
00038                 fbuf1 = buf1;
00039                 fbuf2 = buf2;
00040                 break;
00041         default:
00042                 ff = fid_design(conf, 44100., -1., -1., 1, NULL);
00043                 qDebug() << "Filter " << conf << " Setup: 0x" << ff;
00044                 run = fid_run_new(ff, &funcp);
00045                 fbuf1 = fid_run_newbuf(run);
00046                 fbuf2 = fid_run_newbuf(run);
00047                 processSample = funcp;
00048         }
00049         int i;
00050         for(i=0; i < FILTER_BUF_SIZE; i++)
00051             buf1[i] = buf2[i] = 0;
00052 }
00053 
00054 EngineFilter::~EngineFilter()
00055 {
00056         if(processSample == funcp) //if we used fidlib
00057         {
00058                 fid_run_freebuf(fbuf2);
00059                 fid_run_freebuf(fbuf1);
00060                 fid_run_free(run);
00061                 free(ff);
00062         }
00063 }
00064 
00065 
00066 
00067 void EngineFilter::process(const CSAMPLE * pIn, const CSAMPLE * ppOut, const int iBufferSize)
00068 {
00069     CSAMPLE * pOut = (CSAMPLE *) ppOut;   //overrides the const, I don't like it but the parent class
00070                                           //forced this on us
00071     int i;
00072     for(i=0; i < iBufferSize; i+=2)
00073     {
00074         pOut[i] = (CSAMPLE) processSample(fbuf1, (double) pIn[i]);
00075         pOut[i+1] = (CSAMPLE) processSample(fbuf2, (double) pIn[i+1]);
00076     }
00077 }
00078 
00079 
00080 //250Hz-3Khz Butterworth
00081 double processSampleBp(void *bufIn, const double sample)
00082 {
00083         double *buf = (double*) bufIn;
00084         register double val = sample;
00085    register double tmp, fir, iir;
00086    tmp= buf[0]; memmove(buf, buf+1, 15*sizeof(double));
00087    // use 8.73843261546594e-007 below for unity gain at 100% level
00088    iir= val * 8.738432615466217e-007;
00089    iir -= 0.8716357571117795*tmp; fir= tmp;
00090    iir -= -1.704721971813985*buf[0]; fir += -buf[0]-buf[0];
00091    fir += iir;
00092    tmp= buf[1]; buf[1]= iir; val= fir;
00093    iir= val;
00094    iir -= 0.9881828644977958*tmp; fir= tmp;
00095    iir -= -1.986910175866046*buf[2]; fir += -buf[2]-buf[2];
00096    fir += iir;
00097    tmp= buf[3]; buf[3]= iir; val= fir;
00098    iir= val;
00099    iir -= 0.6739219969192579*tmp; fir= tmp;
00100    iir -= -1.534687501075499*buf[4]; fir += -buf[4]-buf[4];
00101    fir += iir;
00102    tmp= buf[5]; buf[5]= iir; val= fir;
00103    iir= val;
00104    iir -= 0.9644444065027918*tmp; fir= tmp;
00105    iir -= -1.963091971649609*buf[6]; fir += -buf[6]-buf[6];
00106    fir += iir;
00107    tmp= buf[7]; buf[7]= iir; val= fir;
00108    iir= val;
00109    iir -= 0.5508744524070673*tmp; fir= tmp;
00110    iir -= -1.437951258090782*buf[8]; fir += buf[8]+buf[8];
00111    fir += iir;
00112    tmp= buf[9]; buf[9]= iir; val= fir;
00113    iir= val;
00114    iir -= 0.940359918647641*tmp; fir= tmp;
00115    iir -= -1.938825711089784*buf[10]; fir += buf[10]+buf[10];
00116    fir += iir;
00117    tmp= buf[11]; buf[11]= iir; val= fir;
00118    iir= val;
00119    iir -= 0.494560064204263*tmp; fir= tmp;
00120    iir -= -1.400685123336887*buf[12]; fir += buf[12]+buf[12];
00121    fir += iir;
00122    tmp= buf[13]; buf[13]= iir; val= fir;
00123    iir= val;
00124    iir -= 0.9201106143536053*tmp; fir= tmp;
00125    iir -= -1.918341654664469*buf[14]; fir += buf[14]+buf[14];
00126    fir += iir;
00127    buf[15]= iir; val= fir;
00128    return val;
00129 }
00130 
00131 //3Khz butterworth
00132 double processSampleHp(void *bufIn, const double sample)
00133 {
00134         double *buf = (double*) bufIn;
00135         register double val = sample;
00136    register double tmp, fir, iir;
00137    tmp= buf[0]; memmove(buf, buf+1, 7*sizeof(double));
00138    // use 0.3307380993576275 below for unity gain at 100% level
00139    iir= val * 0.3307380993576274;
00140    iir -= 0.8503595356078639*tmp; fir= tmp;
00141    iir -= -1.683892145680763*buf[0]; fir += -buf[0]-buf[0];
00142    fir += iir;
00143    tmp= buf[1]; buf[1]= iir; val= fir;
00144    iir= val;
00145    iir -= 0.6256182051727028*tmp; fir= tmp;
00146    iir -= -1.479369644054996*buf[2]; fir += -buf[2]-buf[2];
00147    fir += iir;
00148    tmp= buf[3]; buf[3]= iir; val= fir;
00149    iir= val;
00150    iir -= 0.4873536896159359*tmp; fir= tmp;
00151    iir -= -1.35354408027022*buf[4]; fir += -buf[4]-buf[4];
00152    fir += iir;
00153    tmp= buf[5]; buf[5]= iir; val= fir;
00154    iir= val;
00155    iir -= 0.4219026276867782*tmp; fir= tmp;
00156    iir -= -1.2939813158517*buf[6]; fir += -buf[6]-buf[6];
00157    fir += iir;
00158    buf[7]= iir; val= fir;
00159    return val;
00160 }
00161 double processSampleLp(void *bufIn, const double sample)
00162 {
00163         double *buf = (double*) bufIn;
00164         register double val = sample;
00165        register double tmp, fir, iir;
00166    tmp= buf[0]; memmove(buf, buf+1, 7*sizeof(double));
00167    iir= val * 9.245468558718278e-015;
00168    iir -= 0.9862009760667707*tmp; fir= tmp;
00169    iir -= -1.984941152135637*buf[0]; fir += buf[0]+buf[0];
00170    fir += iir;
00171    tmp= buf[1]; buf[1]= iir; val= fir;
00172    iir= val;
00173    iir -= 0.9611983723246083*tmp; fir= tmp;
00174    iir -= -1.95995440725112*buf[2]; fir += buf[2]+buf[2];
00175    fir += iir;
00176    tmp= buf[3]; buf[3]= iir; val= fir;
00177    iir= val;
00178    iir -= 0.9424834072512262*tmp; fir= tmp;
00179    iir -= -1.941251312860088*buf[4]; fir += buf[4]+buf[4];
00180    fir += iir;
00181    tmp= buf[5]; buf[5]= iir; val= fir;
00182    iir= val;
00183    iir -= 0.9325031355986387*tmp; fir= tmp;
00184    iir -= -1.93127737157649*buf[6]; fir += buf[6]+buf[6];
00185    fir += iir;
00186    buf[7]= iir; val= fir;
00187    return val;
00188 }
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Defines