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