Exemplo n.º 1
0
 /// <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));
     }
 }
Exemplo n.º 2
0
        /// <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);
        }
Exemplo n.º 3
0
        /// <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;
        }