private static void ComputeButterworthHighpassCoefficients( ref IIR2DirectIRec Coeff, double Cutoff, double SamplingRate) { double C; double A0; double HalfSamplingRate; double HalfSamplingRateMinusEpsilon; HalfSamplingRate = SamplingRate * 0.5; HalfSamplingRateMinusEpsilon = HalfSamplingRate - FILTER_FREQ_EPSILON; if (Cutoff < FILTER_FREQ_EPSILON) { Cutoff = FILTER_FREQ_EPSILON; } if (Cutoff > HalfSamplingRateMinusEpsilon) { Cutoff = HalfSamplingRateMinusEpsilon; } C = Math.Tan(Math.PI * Cutoff / SamplingRate); A0 = 1 / (1 + SQRT2 * C + C * C); Coeff.A0 = (float)A0; Coeff.A1 = (float)(-2 * A0); Coeff.A2 = (float)A0; Coeff.B1 = (float)(2 * (C * C - 1) * A0); Coeff.B2 = (float)((1 - SQRT2 * C + C * C) * A0); }
public static void ComputeButterworthBandpassCoefficients( ref IIR2DirectIRec Coeff, double Cutoff, double Bandwidth, double SamplingRate) { double C; double D; double A0; double HalfSamplingRate; double OneOverSamplingRateTimesPi; double HalfSamplingRateMinusEpsilon; double BandwidthTan; double CutoffCos; HalfSamplingRate = SamplingRate * 0.5; OneOverSamplingRateTimesPi = Math.PI / SamplingRate; HalfSamplingRateMinusEpsilon = HalfSamplingRate - FILTER_FREQ_EPSILON; if (Bandwidth < FILTER_FREQ_EPSILON) { Bandwidth = FILTER_FREQ_EPSILON; } if (Bandwidth > HalfSamplingRateMinusEpsilon) { Bandwidth = HalfSamplingRateMinusEpsilon; } if (Cutoff < FILTER_FREQ_EPSILON) { Cutoff = FILTER_FREQ_EPSILON; } if (Cutoff > HalfSamplingRateMinusEpsilon) { Cutoff = HalfSamplingRateMinusEpsilon; } BandwidthTan = Bandwidth * OneOverSamplingRateTimesPi; CutoffCos = Cutoff * OneOverSamplingRateTimesPi; BandwidthTan = Math.Tan(BandwidthTan); CutoffCos = Math.Cos(CutoffCos + CutoffCos); /* 2 * CutoffCos */ C = 1 / BandwidthTan; D = CutoffCos + CutoffCos; /* 2 * CutoffCos */ A0 = 1 / (1 + C); Coeff.A0 = (float)A0; Coeff.A1 = 0; Coeff.A2 = (float)(-A0); Coeff.B1 = (float)(-C * D * A0); Coeff.B2 = (float)((C - 1) * A0); }
private static void ComputeParametricEqualizer2Coefficients( ref IIR2DirectIRec Coeff, double Cutoff, double Bandwidth, double Gain, double SamplingRate) { double Gamma; double SqrtK; double HalfSamplingRate; double OneOverHalfSamplingRateTimesPi; double OneOverBigGammaSqrtKThing; double CutoffCos; HalfSamplingRate = SamplingRate * 0.5; OneOverHalfSamplingRateTimesPi = Math.PI / HalfSamplingRate; if (Bandwidth < FILTER_FREQ_EPSILON) { Bandwidth = FILTER_FREQ_EPSILON; } if (Bandwidth > HalfSamplingRate - FILTER_FREQ_EPSILON) { Bandwidth = HalfSamplingRate - FILTER_FREQ_EPSILON; } if (Cutoff < FILTER_FREQ_EPSILON) { Cutoff = FILTER_FREQ_EPSILON; } if (Cutoff > HalfSamplingRate - FILTER_FREQ_EPSILON) { Cutoff = HalfSamplingRate - FILTER_FREQ_EPSILON; } Cutoff = Cutoff * OneOverHalfSamplingRateTimesPi; Bandwidth = Bandwidth * OneOverHalfSamplingRateTimesPi * 0.5; Gamma = Math.Tan(Bandwidth); SqrtK = Math.Sqrt(Gain); CutoffCos = Math.Cos(Cutoff); OneOverBigGammaSqrtKThing = 1 / (1 + Gamma / SqrtK); Coeff.A1 = (float)((-2 * CutoffCos) * OneOverBigGammaSqrtKThing); Coeff.A0 = (float)((1 + Gamma * SqrtK) * OneOverBigGammaSqrtKThing); Coeff.A2 = (float)((1 - Gamma * SqrtK) * OneOverBigGammaSqrtKThing); Coeff.B1 = Coeff.A1; Coeff.B2 = (float)((1 - Gamma / SqrtK) * OneOverBigGammaSqrtKThing); }
private static void ComputeButterworthBandrejectCoefficients( ref IIR2DirectIRec Coeff, double Cutoff, double Bandwidth, double SamplingRate) { double C; double D; double A0; double HalfSamplingRate; double OneOverSamplingRate; double HalfSamplingRateMinusEpsilon; HalfSamplingRate = SamplingRate * 0.5; OneOverSamplingRate = 1.0 / SamplingRate; HalfSamplingRateMinusEpsilon = HalfSamplingRate - FILTER_FREQ_EPSILON; if (Bandwidth < FILTER_FREQ_EPSILON) { Bandwidth = FILTER_FREQ_EPSILON; } if (Bandwidth > HalfSamplingRateMinusEpsilon) { Bandwidth = HalfSamplingRateMinusEpsilon; } if (Cutoff < FILTER_FREQ_EPSILON) { Cutoff = FILTER_FREQ_EPSILON; } if (Cutoff > HalfSamplingRateMinusEpsilon) { Cutoff = HalfSamplingRateMinusEpsilon; } C = Math.Tan(Math.PI * Bandwidth * OneOverSamplingRate); D = 2 * Math.Cos(TWOPI * Cutoff * OneOverSamplingRate); A0 = 1 / (1 + C); Coeff.A0 = (float)A0; Coeff.A1 = (float)(-D * A0); Coeff.A2 = (float)A0; Coeff.B1 = (float)(-D * A0); Coeff.B2 = (float)((1 - C) * A0); }
private static void ComputeHighShelfEqualizerCoefficients( ref IIR2DirectIRec Coeff, double Cutoff, double Slope, double Gain, double SamplingRate) { double HalfSamplingRate; double A; double Omega; double CS; double SN; double Beta; double OneOverB0; HalfSamplingRate = SamplingRate * 0.5; if (Cutoff < FILTER_FREQ_EPSILON) { Cutoff = FILTER_FREQ_EPSILON; } if (Cutoff > HalfSamplingRate - FILTER_FREQ_EPSILON) { Cutoff = HalfSamplingRate - FILTER_FREQ_EPSILON; } A = Math.Sqrt(Gain); Omega = TWOPI * Cutoff / SamplingRate; CS = Math.Cos(Omega); SN = Math.Sin(Omega); Beta = Math.Sqrt((A * A + 1) / Slope - ((A - 1) * (A - 1))); OneOverB0 = 1 / ((A + 1) - (A - 1) * CS + Beta * SN); Coeff.A0 = (float)(OneOverB0 * A * ((A + 1) + (A - 1) * CS + Beta * SN)); Coeff.A1 = (float)(OneOverB0 * -2 * A * ((A - 1) + (A + 1) * CS)); Coeff.A2 = (float)(OneOverB0 * A * ((A + 1) + (A - 1) * CS - Beta * SN)); Coeff.B1 = (float)(OneOverB0 * 2 * ((A - 1) - (A + 1) * CS)); Coeff.B2 = (float)(OneOverB0 * ((A + 1) - (A - 1) * CS - Beta * SN)); }