Exemplo n.º 1
0
        public override void ProcessSignal(float[] signal, float freqSampling)
        {
            var coeff = new BandPassButtersworthCoefficients(FilterOrder, freqSampling, MinCornerFrequency,
                                                             MaxCornerFrequency);
            var chain = coeff.Calculate();

            // in place filtering
            if (ZeroPhase)
            {
                chain.Filter(signal, 0, signal, 0, signal.Length);
            }
            else
            {
                chain.FilterOnce(signal, 0, signal, 0, signal.Length);
            }
        }
        public void TestBandPassSinusoid()
        {
            const int    order           = 16;
            const int    fs              = 44100;
            const int    targetFrequency = 3;
            const double br              = 5;
            const int    cycles          = 10;

            double[] frequencies =
            { 65.406, 130.81, 261.63, 523.25, 1046.5, 2093.0, 4186.0, 8372.0 };

            var signal = new double[cycles * fs];

            foreach (var frequency in frequencies)
            {
                Helpers.GenerateSinusoid(frequency, fs, signal);
            }
            var im = new double[signal.Length];

            var coeff = new BandPassButtersworthCoefficients(order, fs, frequencies[targetFrequency] - br, frequencies[targetFrequency] + br);
            var chain = coeff.Calculate();

            chain.Filter(signal, 0, signal, 0, signal.Length);

            var count = signal.Length / 2;

            FourierTransform2.FFT(signal, im, FourierTransform.Direction.Forward);
            Helpers.CalculateEnergy(signal, im, count);

            var maxEnergy = signal.Take(count).Max();
            var step      = fs / (2d * count);

            for (int i = 1; i < count - 1; i++)
            {
                var freq = i * step;
                if (signal[i] > signal[i - 1] && signal[i] > signal[i + 1] && signal[i] >= 0.05 * maxEnergy)
                {
                    var peak = frequencies.FirstOrDefault(x => Math.Abs(freq - x) <= 1);
                    Assert.AreEqual(frequencies[targetFrequency], peak);
                }
            }
        }
        public void TestBandPass16()
        {
            const int    order           = 16;
            const double fs              = 31250d;
            const double cutoffFrequency = 60;
            const double br              = 1;
            const double error           = 1e-3;

            var coeff = new BandPassButtersworthCoefficients(order, fs, cutoffFrequency - br, cutoffFrequency + br);
            var chain = coeff.Calculate();

            var expected     = Helpers.LoadScript(Resources.BandPass16).Reverse().ToList();
            var expectedGain = 7.114329431453330e-60;

            Assert.AreEqual(expectedGain, chain.Gain, error);
            Assert.AreEqual(expected.Count, chain.Count);
            for (int i = 0; i < expected.Count; i++)
            {
                Helpers.ValidateBiquad(expected[i], chain[i], error);
            }
        }
        public void TestBandPass12()
        {
            const int    order           = 12;
            const double fs              = 32000d;
            const double cutoffFrequency = 1000d;
            const double br              = 10;
            const double error           = 1e-2;

            var coeff = new BandPassButtersworthCoefficients(order, fs, cutoffFrequency - br, cutoffFrequency + br);
            var chain = coeff.Calculate();

            var expected     = Helpers.LoadScript(Resources.BandPass12).Reverse().ToList();
            var expectedGain = 2.883388964711794e-33;

            Assert.AreEqual(expectedGain, chain.Gain, error);
            Assert.AreEqual(expected.Count, chain.Count);
            for (int i = 0; i < expected.Count; i++)
            {
                Helpers.ValidateBiquad(expected[i], chain[i], error);
            }
        }
        public void TestBandPass08()
        {
            const int    order           = 8;
            const double fs              = 44100d;
            const double cutoffFrequency = 500d;
            const double br              = 5;
            const double error           = 1e-3;

            var coeff = new BandPassButtersworthCoefficients(order, fs, cutoffFrequency - br, cutoffFrequency + br);
            var chain = coeff.Calculate();

            var expected     = Helpers.LoadScript(Resources.BandPass08).Reverse().ToList();
            var expectedGain = 6.541867072214145e-26;

            Assert.AreEqual(expectedGain, chain.Gain, error);
            Assert.AreEqual(expected.Count, chain.Count);
            for (int i = 0; i < expected.Count; i++)
            {
                Helpers.ValidateBiquad(expected[i], chain[i], error);
            }
        }