Mixxx

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

Go to the documentation of this file.
00001 /***************************************************************************
00002                           enginefilteriir.cpp  -  description
00003                              -------------------
00004     copyright            : (C) 2002 by Tue and Ken Haste Andersen
00005     email                :
00006 ***************************************************************************/
00007 
00008 /***************************************************************************
00009 *                                                                         *
00010 *   This program is free software; you can redistribute it and/or modify  *
00011 *   it under the terms of the GNU General Public License as published by  *
00012 *   the Free Software Foundation; either version 2 of the License, or     *
00013 *   (at your option) any later version.                                   *
00014 *                                                                         *
00015 ***************************************************************************/
00016 
00017 #include "engine/enginefilteriir.h"
00018 
00019 EngineFilterIIR::EngineFilterIIR(const double * pCoefs, int iOrder)
00020 {
00021     order = iOrder;
00022     coefs = pCoefs;
00023 
00024 
00025     // Reset the yv's:
00026     memset(yv1, 0, sizeof(yv1));
00027     memset(yv2, 0, sizeof(yv2));
00028     memset(xv1, 0, sizeof(xv1));
00029     memset(xv2, 0, sizeof(xv2));
00030 }
00031 
00032 EngineFilterIIR::~EngineFilterIIR()
00033 {
00034 }
00035 
00036 void EngineFilterIIR::process(const CSAMPLE * pIn, const CSAMPLE * pOut, const int iBufferSize)
00037 {
00038     CSAMPLE * pOutput = (CSAMPLE *)pOut;
00039     double GAIN =  coefs[0];
00040     int i;
00041     for (i=0; i<iBufferSize; i+=2)
00042     {
00043         if (order==8)
00044         {
00045             //8th order:
00046             // Channel 1
00047             xv1[0] = xv1[1]; xv1[1] = xv1[2]; xv1[2] = xv1[3]; xv1[3] = xv1[4];
00048             xv1[4] = xv1[5]; xv1[5] = xv1[6]; xv1[6] = xv1[7]; xv1[7] = xv1[8];
00049             xv1[8] = pIn[i]/GAIN;
00050             yv1[0] = yv1[1]; yv1[1] = yv1[2]; yv1[2] = yv1[3]; yv1[3] = yv1[4];
00051             yv1[4] = yv1[5]; yv1[5] = yv1[6]; yv1[6] = yv1[7]; yv1[7] = yv1[8];
00052             yv1[8] =   (xv1[0] + xv1[8]) + coefs[1] * (xv1[1] + xv1[7]) +
00053                      coefs[2] * (xv1[2] + xv1[6]) +
00054                      coefs[3] * (xv1[3] + xv1[5]) + coefs[4] * xv1[4] +
00055                      (coefs[5] * yv1[0]) + ( coefs[6] * yv1[1]) +
00056                      (coefs[7] * yv1[2]) + ( coefs[8] * yv1[3]) +
00057                      (coefs[9] * yv1[4]) + ( coefs[10] * yv1[5]) +
00058                      (coefs[11] * yv1[6]) + ( coefs[12] * yv1[7]);
00059             Q_ASSERT(yv1[8]<100000 || yv1[8]>-100000);
00060             pOutput[i] = yv1[8];
00061 
00062             // Channel 2
00063             xv2[0] = xv2[1]; xv2[1] = xv2[2]; xv2[2] = xv2[3]; xv2[3] = xv2[4];
00064             xv2[4] = xv2[5]; xv2[5] = xv2[6]; xv2[6] = xv2[7]; xv2[7] = xv2[8];
00065             xv2[8] = pIn[i+1]/GAIN;
00066             yv2[0] = yv2[1]; yv2[1] = yv2[2]; yv2[2] = yv2[3]; yv2[3] = yv2[4];
00067             yv2[4] = yv2[5]; yv2[5] = yv2[6]; yv2[6] = yv2[7]; yv2[7] = yv2[8];
00068             yv2[8] =   (xv2[0] + xv2[8]) + coefs[1] * (xv2[1] + xv2[7]) +
00069                      coefs[2] * (xv2[2] + xv2[6]) +
00070                      coefs[3] * (xv2[3] + xv2[5]) + coefs[4] * xv2[4] +
00071                      (coefs[5] * yv2[0]) + ( coefs[6] * yv2[1]) +
00072                      (coefs[7] * yv2[2]) + ( coefs[8] * yv2[3]) +
00073                      (coefs[9] * yv2[4]) + ( coefs[10] * yv2[5]) +
00074                      (coefs[11] * yv2[6]) + ( coefs[12] * yv2[7]);
00075             Q_ASSERT(yv2[8]<100000 || yv2[8]>-100000);
00076             pOutput[i+1] = yv2[8];
00077         }
00078         else if (order==2)
00079         {
00080             // Second order
00081             xv1[0] = xv1[1]; xv1[1] = xv1[2];
00082             xv1[2] = pIn[i] / GAIN;
00083             yv1[0] = yv1[1]; yv1[1] = yv1[2];
00084             yv1[2] = (xv1[0] + xv1[2]) + coefs[1] * xv1[1] + ( coefs[2] * yv1[0]) + (coefs[3] * yv1[1]);
00085             pOutput[i] = yv1[2];
00086 
00087             xv2[0] = xv2[1]; xv2[1] = xv2[2];
00088             xv2[2] = pIn[i+1] / GAIN;
00089             yv2[0] = yv2[1]; yv2[1] = yv2[2];
00090             yv2[2] = (xv2[0] + xv2[2]) + coefs[1] * xv2[1] + ( coefs[2] * yv2[0]) + (coefs[3] * yv2[1]);
00091             pOutput[i+1] = yv2[2];
00092         }
00093         else
00094         {
00095             // Fourth order
00096             xv1[0] = xv1[1]; xv1[1] = xv1[2]; xv1[2] = xv1[3]; xv1[3] = xv1[4];
00097             xv1[4] = pIn[i] / GAIN;
00098             yv1[0] = yv1[1]; yv1[1] = yv1[2]; yv1[2] = yv1[3]; yv1[3] = yv1[4];
00099             yv1[4] =   (xv1[0] + xv1[4]) + coefs[1]*(xv1[1]+xv1[3]) + coefs[2] * xv1[2]
00100                      + ( coefs[3] * yv1[0]) + (  coefs[4] * yv1[1])
00101                      + ( coefs[5] * yv1[2]) + (  coefs[6] * yv1[3]);
00102             pOutput[i] = yv1[4];
00103 
00104             xv2[0] = xv2[1]; xv2[1] = xv2[2]; xv2[2] = xv2[3]; xv2[3] = xv2[4];
00105             xv2[4] = pIn[i+1] / GAIN;
00106             yv2[0] = yv2[1]; yv2[1] = yv2[2]; yv2[2] = yv2[3]; yv2[3] = yv2[4];
00107             yv2[4] =   (xv2[0] + xv2[4]) + coefs[1]*(xv2[1]+xv2[3]) + coefs[2] * xv2[2]
00108                      + ( coefs[3] * yv2[0]) + (  coefs[4] * yv2[1])
00109                      + ( coefs[5] * yv2[2]) + (  coefs[6] * yv2[3]);
00110             pOutput[i+1] = yv2[4];
00111         }
00112     }
00113 
00114 // Check for denormals
00115     for (i=0; i<=order; ++i)
00116     {
00117         xv1[i] = zap_denormal(xv1[i]);
00118         yv1[i] = zap_denormal(yv1[i]);
00119         xv2[i] = zap_denormal(xv2[i]);
00120         yv2[i] = zap_denormal(yv2[i]);
00121     }
00122 }
00123 
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Defines