/* apply filter to an array of values, adding result to output array */ public void Apply( float[] XinVector, int XinVectorOffset, float[] YoutVector, int YoutVectorOffset, int VectorLength, float OutputScaling, SynthParamRec SynthParams) { SecondOrderZeroRec Filter = this; float Xm1 = Filter.Xm1; float Xm2 = Filter.Xm2; float A0 = Filter.A0; float A1 = Filter.A1; float A2 = Filter.A2; for (int i = 0; i < VectorLength; i += 1) { float Xin = XinVector[i + XinVectorOffset]; float OrigYOut = YoutVector[i + YoutVectorOffset]; float Y = A0 * Xin + A1 * Xm1 + A2 * Xm2; Xm2 = Xm1; Xm1 = Xin; YoutVector[i + YoutVectorOffset] = OrigYOut + Y * OutputScaling; } Filter.Xm1 = Xm1; Filter.Xm2 = Xm2; }
public static void SetSecondOrderZeroCoefficients( SecondOrderZeroRec Filter, double Cutoff, double Bandwidth, FilterScalings Scaling, double SamplingRate) { double C2; double C1; double D; double HalfSamplingRateMinusEpsilon; double OneOverD; double OneOverSamplingRate; HalfSamplingRateMinusEpsilon = SamplingRate * 0.5 - FILTER_FREQ_EPSILON; OneOverSamplingRate = 1.0 / SamplingRate; 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; } C2 = Math.Exp(NEGTWOPI * Bandwidth * OneOverSamplingRate); C1 = (-4 * C2 / (1 + C2)) * Math.Cos(TWOPI * Cutoff * OneOverSamplingRate); switch (Scaling) { default: Debug.Assert(false); throw new ArgumentException(); case FilterScalings.eFilterDefaultScaling: D = 1; break; case FilterScalings.eFilterZeroGain1: D = 1 + C1 + C2; break; } OneOverD = 1 / D; Filter.A0 = (float)OneOverD; Filter.A1 = (float)(C1 * OneOverD); Filter.A2 = (float)(C2 * OneOverD); }