Esempio n. 1
0
            /* 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;
            }
Esempio n. 2
0
            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);
            }