예제 #1
0
        public void TestBandStop12()
        {
            const int    order           = 12;
            const double fs              = 32000d;
            const double cutoffFrequency = 1000d;
            const double br              = 10;
            const double error           = 1e-2;

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

            var expected = Helpers.LoadCsv(
                @"0.991883, -1.945553, 0.991883, 1.000000, -1.959391, 0.997890
1.000000, -1.961674, 1.000000, 1.000000, -1.959624, 0.997896
1.000000, -1.961280, 1.000000, 1.000000, -1.959306, 0.998028
1.000000, -1.961866, 1.000000, 1.000000, -1.959988, 0.998045
1.000000, -1.961105, 1.000000, 1.000000, -1.959375, 0.998302
1.000000, -1.962038, 1.000000, 1.000000, -1.960458, 0.998325
1.000000, -1.960962, 1.000000, 1.000000, -1.959597, 0.998694
1.000000, -1.962177, 1.000000, 1.000000, -1.961001, 0.998717
1.000000, -1.960860, 1.000000, 1.000000, -1.959955, 0.999178
1.000000, -1.962276, 1.000000, 1.000000, -1.961581, 0.999195
1.000000, -1.960807, 1.000000, 1.000000, -1.960426, 0.999719
1.000000, -1.962326, 1.000000, 1.000000, -1.962159, 0.999725").ToList();
            var expectedGain = 0.985211119221826;

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

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

            var expected = Helpers.LoadCsv(
                @"0.996871, -1.988667, 0.996871, 1.000000, -1.993703, 0.998799
1.000000, -1.994948, 1.000000, 1.000000, -1.993761, 0.998805
1.000000, -1.994871, 1.000000, 1.000000, -1.993832, 0.998977
1.000000, -1.994984, 1.000000, 1.000000, -1.993995, 0.998991
1.000000, -1.994843, 1.000000, 1.000000, -1.994131, 0.999314
1.000000, -1.995011, 1.000000, 1.000000, -1.994368, 0.999328
1.000000, -1.994827, 1.000000, 1.000000, -1.994554, 0.999758
1.000000, -1.995026, 1.000000, 1.000000, -1.994822, 0.999765").ToList();
            var expectedGain = 0.996359732766342;

            Assert.AreEqual(expected.Count, chain.Count);
            for (int i = 0; i < expected.Count; i++)
            {
                Helpers.ValidateBiquad(expected[i], chain[i], error);
            }
        }
예제 #3
0
        public void TestBandStopChebyshevIIFiltering()
        {
            const int    order  = 16;
            const int    fs     = 44100;
            const double f1     = 500d;
            const double f2     = 8000d;
            const int    cycles = 10;

            double[] frequencies      = { 330, 770, 1870, 5830, 9790 };
            var      validFrequencies = frequencies.TakeWhile(f => f < f1).Concat(frequencies.SkipWhile(f => f < f2));

            var coeff = new BandStopChebyshevIICoefficients(order, fs, f1, f2, 48);

            TestFilter(order, fs, cycles, coeff, frequencies, validFrequencies);
        }
예제 #4
0
        public void TestBandStopSinusoid()
        {
            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 BandStopChebyshevIICoefficients(order, fs, frequencies[targetFrequency] - br, frequencies[targetFrequency] + br, 48);
            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);
            var peakSet   = new HashSet <double>();

            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.01 * maxEnergy)
                {
                    var peak = frequencies.FirstOrDefault(x => Math.Abs(freq - x) <= 1);
                    Assert.AreNotEqual(0, peak);
                    peakSet.Add(peak);
                }
            }
            Assert.IsTrue(peakSet.SetEquals(frequencies.Except(Enumerable.Repeat(frequencies[targetFrequency], 1))));
        }
예제 #5
0
        public void TestBandStop16()
        {
            const int    order           = 16;
            const double fs              = 31250d;
            const double cutoffFrequency = 60;
            const double br              = 1;
            const double error           = 1e-3;

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

            var expected = Helpers.LoadCsv(
                @"0.999183, -1.998220, 0.999183, 1.000000, -1.999694, 0.999840
1.000000, -1.999855, 1.000000, 1.000000, -1.999696, 0.999841
1.000000, -1.999853, 1.000000, 1.000000, -1.999699, 0.999846
1.000000, -1.999856, 1.000000, 1.000000, -1.999703, 0.999847
1.000000, -1.999852, 1.000000, 1.000000, -1.999710, 0.999857
1.000000, -1.999857, 1.000000, 1.000000, -1.999717, 0.999860
1.000000, -1.999851, 1.000000, 1.000000, -1.999726, 0.999875
1.000000, -1.999858, 1.000000, 1.000000, -1.999735, 0.999878
1.000000, -1.999851, 1.000000, 1.000000, -1.999747, 0.999897
1.000000, -1.999858, 1.000000, 1.000000, -1.999758, 0.999900
1.000000, -1.999850, 1.000000, 1.000000, -1.999773, 0.999923
1.000000, -1.999859, 1.000000, 1.000000, -1.999785, 0.999926
1.000000, -1.999850, 1.000000, 1.000000, -1.999802, 0.999953
1.000000, -1.999859, 1.000000, 1.000000, -1.999814, 0.999954
1.000000, -1.999850, 1.000000, 1.000000, -1.999833, 0.999984
1.000000, -1.999859, 1.000000, 1.000000, -1.999844, 0.999985").ToList();
            var expectedGain = 0.997950883359409;

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