Пример #1
0
            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);
            }
Пример #3
0
            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);
            }
Пример #4
0
            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));
            }