public void Init(IirFilterType filterType, double frequency, double sampleRate, int qualityFactor) { var w0 = 2.0 * Math.PI * frequency / sampleRate; var alpha = Math.Sin(w0) / (2.0 * qualityFactor); switch (filterType) { case IirFilterType.LowPass: _b0 = (float)((1.0 - Math.Cos(w0)) / 2.0); _b1 = (float)(1.0 - Math.Cos(w0)); _b2 = (float)((1.0 - Math.Cos(w0)) / 2.0); _a0 = (float)(1.0 + alpha); _a1 = (float)(-2.0 * Math.Cos(w0)); _a2 = (float)(1.0 - alpha); break; case IirFilterType.HighPass: _b0 = (float)((1.0 + Math.Cos(w0)) / 2.0); _b1 = (float)(-(1.0 + Math.Cos(w0))); _b2 = (float)((1.0 + Math.Cos(w0)) / 2.0); _a0 = (float)(1.0 + alpha); _a1 = (float)(-2.0 * Math.Cos(w0)); _a2 = (float)(1.0 - alpha); break; //case IirFilterType.BandPass: default: _b0 = (float)(alpha); _b1 = 0.0f; _b2 = (float)(-alpha); _a0 = (float)(1.0 + alpha); _a1 = (float)(-2.0 * Math.Cos(w0)); _a2 = (float)(1.0 - alpha); break; case IirFilterType.Notch: _b0 = 1.0f; _b1 = (float)(-2.0 * Math.Cos(w0)); _b2 = 1.0f; _a0 = (float)(1.0 + alpha); _a1 = (float)(-2.0 * Math.Cos(w0)); _a2 = (float)(1.0 - alpha); break; } _b0 /= _a0; _b1 /= _a0; _b2 /= _a0; _a1 /= _a0; _a2 /= _a0; _x1 = 0; _x2 = 0; _y1 = 0; _y2 = 0; }
public void Init(IirFilterType filterType, double frequency, double sampleRate, int qualityFactor) { var w0 = 2.0 * Math.PI * frequency / sampleRate; var alpha = Math.Sin(w0) / (2.0 * qualityFactor); switch (filterType) { case IirFilterType.LowPass: _b0 = (float) ((1.0 - Math.Cos(w0)) / 2.0); _b1 = (float) ( 1.0 - Math.Cos(w0)); _b2 = (float) ((1.0 - Math.Cos(w0)) / 2.0); _a0 = (float) ( 1.0 + alpha); _a1 = (float) (-2.0 * Math.Cos(w0)); _a2 = (float) ( 1.0 - alpha); break; case IirFilterType.HighPass: _b0 = (float) ( (1.0 + Math.Cos(w0)) / 2.0); _b1 = (float) (-(1.0 + Math.Cos(w0))); _b2 = (float) ( (1.0 + Math.Cos(w0)) / 2.0); _a0 = (float) ( 1.0 + alpha); _a1 = (float) ( -2.0 * Math.Cos(w0)); _a2 = (float) ( 1.0 - alpha); break; //case IirFilterType.BandPass: default: _b0 = (float) (alpha); _b1 = 0.0f; _b2 = (float) (-alpha); _a0 = (float) ( 1.0 + alpha); _a1 = (float) (-2.0 * Math.Cos(w0)); _a2 = (float) ( 1.0 - alpha); break; case IirFilterType.Notch: _b0 = 1.0f; _b1 = (float) (-2.0 * Math.Cos(w0)); _b2 = 1.0f; _a0 = (float) ( 1.0 + alpha); _a1 = (float) (-2.0 * Math.Cos(w0)); _a2 = (float) ( 1.0 - alpha); break; } _b0 /= _a0; _b1 /= _a0; _b2 /= _a0; _a1 /= _a0; _a2 /= _a0; _x1 = 0; _x2 = 0; _y1 = 0; _y2 = 0; }
public void Init(IirFilterType filterType, float frequency, float sampleRate, int qualityFactor) { var w0 = 2.0f * MathF.PI * frequency / sampleRate; var alpha = MathF.Sin(w0) / (2.0f * qualityFactor); switch (filterType) { case IirFilterType.LowPass: _b0 = (1.0f - MathF.Cos(w0)) / 2.0f; _b1 = 1.0f - MathF.Cos(w0); _b2 = (1.0f - MathF.Cos(w0)) / 2.0f; _a0 = 1.0f + alpha; _a1 = -2.0f * MathF.Cos(w0); _a2 = 1.0f - alpha; break; case IirFilterType.HighPass: _b0 = (1.0f + MathF.Cos(w0)) / 2.0f; _b1 = -(1.0f + MathF.Cos(w0)); _b2 = (1.0f + MathF.Cos(w0)) / 2.0f; _a0 = 1.0f + alpha; _a1 = -2.0f * MathF.Cos(w0); _a2 = 1.0f - alpha; break; //case IirFilterType.BandPass: default: _b0 = alpha; _b1 = 0.0f; _b2 = -alpha; _a0 = 1.0f + alpha; _a1 = -2.0f * MathF.Cos(w0); _a2 = 1.0f - alpha; break; case IirFilterType.Notch: _b0 = 1.0f; _b1 = -2.0f * MathF.Cos(w0); _b2 = 1.0f; _a0 = 1.0f + alpha; _a1 = -2.0f * MathF.Cos(w0); _a2 = 1.0f - alpha; break; } _b0 /= _a0; _b1 /= _a0; _b2 /= _a0; _a1 /= _a0; _a2 /= _a0; _x1 = 0; _x2 = 0; _y1 = 0; _y2 = 0; }
public void Init(IirFilterType filterType, double frequency, double sampleRate, int qualityFactor) { double num = 6.2831853071795862 * frequency / sampleRate; double num2 = Math.Sin(num) / (2.0 * (double)qualityFactor); switch (filterType) { case IirFilterType.LowPass: this._b0 = (float)((1.0 - Math.Cos(num)) / 2.0); this._b1 = (float)(1.0 - Math.Cos(num)); this._b2 = (float)((1.0 - Math.Cos(num)) / 2.0); this._a0 = (float)(1.0 + num2); this._a1 = (float)(-2.0 * Math.Cos(num)); this._a2 = (float)(1.0 - num2); break; case IirFilterType.HighPass: this._b0 = (float)((1.0 + Math.Cos(num)) / 2.0); this._b1 = (float)(0.0 - (1.0 + Math.Cos(num))); this._b2 = (float)((1.0 + Math.Cos(num)) / 2.0); this._a0 = (float)(1.0 + num2); this._a1 = (float)(-2.0 * Math.Cos(num)); this._a2 = (float)(1.0 - num2); break; default: this._b0 = (float)num2; this._b1 = 0f; this._b2 = (float)(0.0 - num2); this._a0 = (float)(1.0 + num2); this._a1 = (float)(-2.0 * Math.Cos(num)); this._a2 = (float)(1.0 - num2); break; case IirFilterType.Notch: this._b0 = 1f; this._b1 = (float)(-2.0 * Math.Cos(num)); this._b2 = 1f; this._a0 = (float)(1.0 + num2); this._a1 = (float)(-2.0 * Math.Cos(num)); this._a2 = (float)(1.0 - num2); break; } this._b0 /= this._a0; this._b1 /= this._a0; this._b2 /= this._a0; this._a1 /= this._a0; this._a2 /= this._a0; this._x1 = 0f; this._x2 = 0f; this._y1 = 0f; this._y2 = 0f; }
public void Init(IirFilterType filterType, double frequency, double sampleRate, double qualityFactor) { double num1 = 2.0 * Math.PI * frequency / sampleRate; double num2 = Math.Sin(num1) / (2.0 * qualityFactor); switch (filterType) { case IirFilterType.LowPass: this._b0 = (float) ((1.0 - Math.Cos(num1)) / 2.0); this._b1 = (float) (1.0 - Math.Cos(num1)); this._b2 = (float) ((1.0 - Math.Cos(num1)) / 2.0); this._a0 = (float) (1.0 + num2); this._a1 = (float) (-2.0 * Math.Cos(num1)); this._a2 = (float) (1.0 - num2); break; case IirFilterType.HighPass: this._b0 = (float) ((1.0 + Math.Cos(num1)) / 2.0); this._b1 = (float) -(1.0 + Math.Cos(num1)); this._b2 = (float) ((1.0 + Math.Cos(num1)) / 2.0); this._a0 = (float) (1.0 + num2); this._a1 = (float) (-2.0 * Math.Cos(num1)); this._a2 = (float) (1.0 - num2); break; case IirFilterType.Notch: this._b0 = 1f; this._b1 = (float) (-2.0 * Math.Cos(num1)); this._b2 = 1f; this._a0 = (float) (1.0 + num2); this._a1 = (float) (-2.0 * Math.Cos(num1)); this._a2 = (float) (1.0 - num2); break; default: this._b0 = (float) num2; this._b1 = 0.0f; this._b2 = (float) -num2; this._a0 = (float) (1.0 + num2); this._a1 = (float) (-2.0 * Math.Cos(num1)); this._a2 = (float) (1.0 - num2); break; } this._b0 /= this._a0; this._b1 /= this._a0; this._b2 /= this._a0; this._a1 /= this._a0; this._a2 /= this._a0; this._x1 = 0.0f; this._x2 = 0.0f; this._y1 = 0.0f; this._y2 = 0.0f; }
static IirFilter AnalogPrototypeToDigitalFilter(ZeroPoleGain analogPrototype, Pair<double,double> cornerFreqs, BandType bandType, IirFilterType filterType) { // Check that we have valid frequencies bool isError = false; isError |= (cornerFreqs.First < 0 || cornerFreqs.First > Math.PI); if(bandType == BandType.BandPass || bandType == BandType.BandStop) { isError |= (cornerFreqs.Second < 0 || cornerFreqs.Second > Math.PI); } if (isError) throw new Exception("Frequencies must be between 0 and PI inclusive"); //Prewarp the corner frequencies //Assuming sampling frequency of 1/2 so that we don't need to account for sampling frequency when converting from analog to digital. const double samplingFreq = 0.5; Func<double, double> freqWarp = x => 2 * samplingFreq * Math.Tan(x/2); Pair<double, double> warpedCornerFreqs = new Pair<double, double>(); warpedCornerFreqs.First = freqWarp(cornerFreqs.First); warpedCornerFreqs.Second = freqWarp(cornerFreqs.Second); // Set prototype to desired band ZeroPoleGain analogFilter; switch (bandType) { case BandType.LowPass: analogFilter = FilterModifiers.AnalogPrototypeToLowPass(warpedCornerFreqs.First, analogPrototype); break; case BandType.HighPass: analogFilter = FilterModifiers.AnalogPrototypeToHighPass(warpedCornerFreqs.First, analogPrototype); break; case BandType.BandPass: analogFilter = FilterModifiers.AnalogPrototypeToBandPass(warpedCornerFreqs.First, warpedCornerFreqs.Second, analogPrototype); break; case BandType.BandStop: analogFilter = FilterModifiers.AnalogPrototypeToBandStop(warpedCornerFreqs.First, warpedCornerFreqs.Second, analogPrototype); break; default: Debug.Assert(false); throw new Exception(); } //Convert analog (continuous) filter to digital (discrete) filter ZeroPoleGain digitalFilter; digitalFilter = FilterModifiers.ConvertAnalogToDigital(analogFilter); //Convert digital filter into second-order sections SosGain sosGain = FilterModifiers.ConvertZeroPoleToSosFilter(digitalFilter); //Create filter and return it return new IirFilter(sosGain); }
public FloatIirFilter(IirFilterType filterType, float frequency, float sampleRate, int qualityFactor) { Init(filterType, frequency, sampleRate, qualityFactor); }