コード例 #1
0
        public void CreationTest()
        {
            const double fd = 100;
            const double dt = 1 / fd;
            const double f0 = 10;

            var rc = new HighPassRC(f0, dt);

            var a = rc.A;
            var b = rc.B;

            Assert.AreEqual(2, a.Count);
            Assert.AreEqual(2, b.Count);

            var a0 = a[0];
            var a1 = a[1];
            var b0 = b[0];
            var b1 = b[1];

            var w0 = Tan(PI * f0 * dt);

            Assert.AreEqual(1 / (w0 + 1), b0 / a0);
            Assert.AreEqual(-1 / (w0 + 1), b1 / a0);
            //Assert.AreEqual(1, a0 / a0);
            Assert.AreEqual((w0 - 1) / (w0 + 1), a1 / a0);

            Assert.That.Value(b0).IsEqual(1);
            Assert.That.Value(b1).IsEqual(-1);
            Assert.That.Value(a0).IsEqual(w0 + 1);
            Assert.That.Value(a1).IsEqual(w0 - 1);
        }
コード例 #2
0
        public void SerialConnectionTest()
        {
            const double fd   = 100;
            const double dt   = 1 / fd;
            const double f0RC = 40;
            const double f0CR = 5;

            var RC = new LowPassRC(f0RC, dt);
            var CR = new HighPassRC(f0CR, dt);

            var filter = RC.ConnectionSerialTo(CR);

            var A = filter.A;
            var B = filter.B;

            double[] expected_a =
            {
                1.53476636079571,
                -0.33307051181674,
                -0.568158087680825
            };
            double[] expected_b = { 1, 0, -1 };
            CollectionAssert.AreEqual(expected_b, B);
            CollectionAssert.AreEqual(expected_a, A, GetComparer(1e-15));

            void CheckTransmissionCoefficient(double f)
            {
                var          H     = filter.GetTransmissionCoefficient(f, dt);
                var          HRC   = RC.GetTransmissionCoefficient(f, dt);
                var          HCR   = CR.GetTransmissionCoefficient(f, dt);
                var          delta = HRC * HCR - H;
                const double eps   = 1.25e-15;

                Assert.That.Value(delta.Abs).IsEqual(0, eps);
            }

            CheckTransmissionCoefficient(0);
            CheckTransmissionCoefficient(f0RC);
            CheckTransmissionCoefficient(f0CR);
            CheckTransmissionCoefficient(fd / 2);

            var H0    = filter.GetTransmissionCoefficient(0, dt);
            var Hf0RC = filter.GetTransmissionCoefficient(f0RC, dt);
            var Hf0CR = filter.GetTransmissionCoefficient(f0CR, dt);
            var Hfd05 = filter.GetTransmissionCoefficient(fd / 2, dt);

            Assert.AreEqual(0, H0.Abs);
            Assert.AreEqual(0, Hfd05.Abs, 1.89e-16);
            Assert.AreEqual(0, H0.Arg);
            Assert.AreEqual(-Math.PI / 2, Hfd05.Arg);

            Assert.That.Value(Hf0RC.Abs).IsEqual(Consts.sqrt_2_inv, 9.35e-4);
            Assert.That.Value(Hf0CR.Abs).IsEqual(Consts.sqrt_2_inv, 9.35e-4);
        }
コード例 #3
0
        public void TransmissionCoefficientAtZerroFrequency()
        {
            const double fd = 100;
            const double dt = 1 / fd;
            const double f0 = 10;
            //const double eps = 3.02e-4;
            const double f = 0;

            var rc = new HighPassRC(f0, dt);

            var c = rc.GetTransmissionCoefficient(f, dt);

            Assert.That.Value(c.Abs).IsEqual(0);
        }
コード例 #4
0
        public void TransmissionCoefficientAtCutoffFrequency()
        {
            const double fd = 100;
            const double dt = 1 / fd;
            const double f0 = 10;
            //const double eps = 3.02e-4;
            const double f = f0;

            var rc = new HighPassRC(f0, dt);

            var c = rc.GetTransmissionCoefficient(f, dt);

            Assert.That.Value(c.Abs).IsEqual(Consts.sqrt_2_inv, 1e-14);
            Assert.That.Value(c.Arg * Consts.ToDeg).IsEqual(45);
        }
コード例 #5
0
        public void ParallelConnectionTest()
        {
            const double fd   = 100;
            const double dt   = 1 / fd;
            const double f0RC = 40;
            const double f0CR = 5;

            var RC = new LowPassRC(f0RC, dt);
            var CR = new HighPassRC(f0CR, dt);

            var filter = RC.ConnectionParallelTo(CR);

            var A = filter.A;
            var B = filter.B;

            double[] expected_a =
            {
                1.53476636079571,
                -0.33307051181674,
                -0.568158087680825
            };
            double[] expected_b =
            {
                1.241652068278721,
                -0.16653525590837,
                -0.758347931721279
            };
            CollectionAssert.AreEqual(expected_b, B, GetComparer(1e-15));
            CollectionAssert.AreEqual(expected_a, A, GetComparer(1e-15));

            void CheckTransmissionCoefficient(double f)
            {
                var          H     = filter.GetTransmissionCoefficient(f, dt);
                var          HRC   = RC.GetTransmissionCoefficient(f, dt);
                var          HCR   = CR.GetTransmissionCoefficient(f, dt);
                var          delta = (HRC + HCR) / 2 - H;
                const double eps   = 1.25e-15;

                Assert.That.Value(delta.Abs).IsEqual(0, eps);
            }

            CheckTransmissionCoefficient(0);
            CheckTransmissionCoefficient(f0RC);
            CheckTransmissionCoefficient(f0CR);
            CheckTransmissionCoefficient(fd / 2);
        }
コード例 #6
0
        public void ProcessSignalAtCutOffFrequencyTestTest()
        {
            const double fd  = 100;
            const double dt  = 1 / fd;
            const double f0  = 10;
            const double eps = 3.02e-4;

            const double A0 = Consts.sqrt_2;
            var          x0 = new SamplesDigitalSignal(dt, 1024, t => A0 * Cos(2 * PI * f0 * t));

            var x0_power = x0.Power;

            Assert.AreEqual(1, x0_power, eps);

            var rc = new HighPassRC(f0, dt);

            var y0 = rc.Process(x0);

            var y0_power = y0.Power;

            Assert.AreEqual(x0_power / 2, y0_power, eps);
        }
コード例 #7
0
        public void ImpulseResponseTest()
        {
            const double fd = 100;
            const double dt = 1 / fd;
            const double f0 = 10;

            var rc = new HighPassRC(f0, dt);

            var a = rc.A;
            var b = rc.B;

            var a0 = a[0];
            var a1 = a[1] / a0;
            var b0 = b[0] / a0;
            var b1 = b[1] / a0;

            var expected_impulse_response = new List <double>
            {
                b0,
                b0 * -a1 + b1,
                b0 * -a1 * -a1 + b1 * -a1,
                b0 * -a1 * -a1 * -a1 + b1 * -a1 * -a1,
                b0 * -a1 * -a1 * -a1 * -a1 + b1 * -a1 * -a1 * -a1,
                b0 * -a1 * -a1 * -a1 * -a1 * -a1 + b1 * -a1 * -a1 * -a1 * -a1,
            };

            var delta = new double[expected_impulse_response.Count];

            delta[0] = 1;

            var impulse_response = rc.Process(delta).ToArray();

            const double eps = 1.11023e-16;

            CollectionAssert.AreEqual(expected_impulse_response, impulse_response, GetComparer(eps));
        }