![]() |
Mixxx
|
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 }