/// <summary> /// Create a new group of filters. /// </summary> public Filters(FiltersType type, params FormattableString[] filters) { Type = type; foreach (var filter in filters) { this.Add(new Filter(filter)); } }
/// <summary>Set up a BiQuad Filter</summary> /// <param name="type">filter type</param> /// <param name="dbGain">gain of filter</param> /// <param name="freq">center frequency</param> /// <param name="srate">sampling rate</param> /// <param name="bandwidth">bandwidth in octaves</param> /// <returns>BiquadCoefficients pointer</returns> public BiquadCoefficients *BiQuadFilter(FiltersType type, double dbGain, double freq, double srate, double bandwidth) { BiquadCoefficients *pBiquad; double a0, a1, a2, b0, b1, b2; pBiquad = Alloc(sizeof(BiquadCoefficients)); if (pBiquad == null) { return(null); } // setup variables double A = Math.Pow(10, dbGain / 40); double omega = 2 * Math.PI * freq / srate; double sinW0 = Math.Sin(omega); double cosW0 = Math.Cos(omega); double alpha = sinW0 * Math.Sinh(LN2 / 2 * bandwidth * omega / sinW0); double beta = Math.Sqrt(A + A); switch (type) { case FiltersType.LPF: b0 = (1 - cosW0) / 2; b1 = 1 - cosW0; b2 = (1 - cosW0) / 2; a0 = 1 + alpha; a1 = -2 * cosW0; a2 = 1 - alpha; break; case FiltersType.PEQ: b0 = 1 + (alpha * A); b1 = -2 * cosW0; b2 = 1 - (alpha * A); a0 = 1 + (alpha / A); a1 = -2 * cosW0; a2 = 1 - (alpha / A); break; case FiltersType.HSH: b0 = A * ((A + 1) + (A - 1) * cosW0 + beta * sinW0); b1 = -2 * A * ((A - 1) + (A + 1) * cosW0); b2 = A * ((A + 1) + (A - 1) * cosW0 - beta * sinW0); a0 = (A + 1) - (A - 1) * cosW0 + beta * sinW0; a1 = 2 * ((A - 1) - (A + 1) * cosW0); a2 = (A + 1) - (A - 1) * cosW0 - beta * sinW0; break; default: Free(pBiquad); return(null); } // precompute the coefficients pBiquad->a0 = b0 / a0; pBiquad->a1 = b1 / a0; pBiquad->a2 = b2 / a0; pBiquad->a3 = a1 / a0; pBiquad->a4 = a2 / a0; // zero initial samples pBiquad->x1 = pBiquad->x2 = 0; pBiquad->y1 = pBiquad->y2 = 0; return(pBiquad); }
/// <summary>Set up a BiQuad Filter</summary> /// <param name="type">filter type</param> /// <param name="dbGain">gain of filter</param> /// <param name="freq">center frequency</param> /// <param name="srate">sampling rate</param> /// <param name="bandwidth">bandwidth in octaves</param> /// <returns>BiquadCoefficients pointer</returns> public BiquadCoefficients* BiQuadFilter(FiltersType type, double dbGain, double freq, double srate, double bandwidth) { BiquadCoefficients* pBiquad; double a0, a1, a2, b0, b1, b2; pBiquad = Alloc(sizeof(BiquadCoefficients)); if (pBiquad == null) return null; // setup variables double A = Math.Pow(10, dbGain / 40); double omega = 2 * Math.PI * freq / srate; double sinW0 = Math.Sin(omega); double cosW0 = Math.Cos(omega); double alpha = sinW0 * Math.Sinh(LN2 / 2 * bandwidth * omega / sinW0); double beta = Math.Sqrt(A + A); switch (type) { case FiltersType.LPF: b0 = (1 - cosW0) / 2; b1 = 1 - cosW0; b2 = (1 - cosW0) / 2; a0 = 1 + alpha; a1 = -2 * cosW0; a2 = 1 - alpha; break; case FiltersType.PEQ: b0 = 1 + (alpha * A); b1 = -2 * cosW0; b2 = 1 - (alpha * A); a0 = 1 + (alpha / A); a1 = -2 * cosW0; a2 = 1 - (alpha / A); break; case FiltersType.HSH: b0 = A * ((A + 1) + (A - 1) * cosW0 + beta * sinW0); b1 = -2 * A * ((A - 1) + (A + 1) * cosW0); b2 = A * ((A + 1) + (A - 1) * cosW0 - beta * sinW0); a0 = (A + 1) - (A - 1) * cosW0 + beta * sinW0; a1 = 2 * ((A - 1) - (A + 1) * cosW0); a2 = (A + 1) - (A - 1) * cosW0 - beta * sinW0; break; default: Free(pBiquad); return null; } // precompute the coefficients pBiquad->a0 = b0 / a0; pBiquad->a1 = b1 / a0; pBiquad->a2 = b2 / a0; pBiquad->a3 = a1 / a0; pBiquad->a4 = a2 / a0; // zero initial samples pBiquad->x1 = pBiquad->x2 = 0; pBiquad->y1 = pBiquad->y2 = 0; return pBiquad; }