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); } }