public void TestHighPass2()
        {
            const int    order           = 2;
            const double fs              = 44100d;
            const double cutoffFrequency = 2000d;
            const double error           = 1e-4;

            var coeff = new HighPassButterworthCoefficients(order, fs, cutoffFrequency);
            var chain = coeff.Calculate();

            var expected = new[]
            {
                new Biquad(0.817365347198867, -1.63473069439773, 0.817365347198867, 1, -1.60109239418362, 0.668368994611848),
            };

            Assert.AreEqual(1, chain.GetTransitionBands(fs).Count());
            foreach (var f in chain.GetTransitionBands(fs))
            {
                Assert.AreEqual(f, cutoffFrequency, 5.0);
            }

            Assert.AreEqual(expected.Length, chain.Count);
            for (int i = 0; i < expected.Length; i++)
            {
                Helpers.ValidateBiquad(expected[i], chain[i], error);
            }
        }
Ejemplo n.º 2
0
        public void TestHighPassButtersworthFilteringWithDC()
        {
            const int    order           = 16;
            const int    fs              = 44100;
            const double cutoffFrequency = 1000d;
            const int    cycles          = 10;

            double[] frequencies      = { 330, 1870 };
            var      validFrequencies = frequencies.SkipWhile(f => f < cutoffFrequency);

            var coeff = new HighPassButterworthCoefficients(order, fs, cutoffFrequency);

            TestFilterWithDC(order, fs, cycles, coeff, frequencies, validFrequencies, 10.0);
        }
        public void TestHighPass16()
        {
            const int    order           = 16;
            const double fs              = 31250d;
            const double cutoffFrequency = 100d;
            const double error           = 1e-4;

            var coeff = new HighPassButterworthCoefficients(order, fs, cutoffFrequency);
            var chain = coeff.Calculate();

            var expected = Helpers.LoadCsv(Resources.HighPass16).ToList();

            Assert.AreEqual(1, chain.GetTransitionBands(fs).Count());
            foreach (var f in chain.GetTransitionBands(fs))
            {
                Assert.AreEqual(f, cutoffFrequency, 1.0);
            }

            Assert.AreEqual(expected.Count, chain.Count);
            for (int i = 0; i < expected.Count; i++)
            {
                Helpers.ValidateBiquad(expected[i], chain[i], error);
            }
        }
Ejemplo n.º 4
0
        static void Main(string[] args)
        {
            const double noiseAmp = 1e-7d;

            Console.WriteLine("Noise amplitude: {0}.", noiseAmp);
            const double signalAmp = 0;

            Console.WriteLine("Signal amplitude: {0}.", signalAmp);
            const double signalFreq = 150;

            Console.WriteLine("Signal frequency: {0} Hz.", signalFreq);
            const double fs = 31250d;

            Console.WriteLine("Sampling frequency: {0} Hz.", fs);
            const double time = 0.15d;

            Console.WriteLine("Analysis time: {0} s.", time);
            const double lowCut = 5d;

            Console.WriteLine("Filter low cut: {0} Hz.", lowCut);
            const double highCut = 2000d;

            Console.WriteLine("Filter high cut: {0} Hz.", highCut);

            Console.WriteLine("Generating data...");
            var samples = new float[(int)Math.Ceiling(fs * time)];

            if (signalAmp > 0)
            {
                GenerateSinusoid(signalAmp, signalFreq, fs, samples);
            }
            if (noiseAmp > 0)
            {
                GenerateNoise(noiseAmp, samples);
            }

            Console.WriteLine("Designing filters...");
            var lowPass = new LowPassButterworthCoefficients(5, fs, highCut).Calculate();

            Console.WriteLine("Low pass filter:");
            foreach (var biquad in lowPass)
            {
                Console.WriteLine(biquad);
            }
            var highPass = new HighPassButterworthCoefficients(3, fs, highCut).Calculate();

            Console.WriteLine("High pass filter:");
            foreach (var biquad in highPass)
            {
                Console.WriteLine(biquad);
            }

            Console.WriteLine("Processing data...");
            var result = new float[samples.Length];

            Array.Copy(samples, result, samples.Length);
            lowPass.Filter(result, 0, result, 0, result.Length);
            highPass.Filter(result, 0, result, 0, result.Length);

            Console.WriteLine("Result:");
            var min   = double.MaxValue;
            var max   = double.MinValue;
            var sum   = 0d;
            var sqsum = 0d;

            for (int i = 0; i < result.Length; i++)
            {
                var value = result[i];
                min    = Math.Min(min, value);
                max    = Math.Max(max, value);
                sum   += value;
                sqsum += value * value;
            }
            var mean     = sum / result.Length;
            var variance = (sqsum - result.Length * mean * mean) / (result.Length - 1);

            Console.WriteLine("Minimum: {0}.", min);
            Console.WriteLine("Maximum: {0}.", max);
            Console.WriteLine("Mean value: {0}.", mean);
            Console.WriteLine("Variance: {0}.", variance);
            Console.WriteLine("Standard deviation: {0}.", Math.Sqrt(variance));
        }