Ejemplo n.º 1
0
        public void SpectrumTest()
        {
            const double fd = 100;
            const double dt = 1 / fd;
            const double f0 = 10;
            //const double eps = 1e-14;
            //const double f = f0;
            const int samples_count = 100;
            //const double total_time = dt * samples_count;
            //const double df = 1 / total_time;

            var rc = new LowPassRC(f0, dt);

            const double A1   = 1;
            const double f1   = 3;
            const double phi1 = 30 * ToRad;
            var          s1   = new SamplesDigitalSignal(dt, samples_count, t => A1 * Cos(2 * PI * f1 * t + phi1));

            const double A2   = 8;
            const double f2   = 10;
            const double phi2 = 0 * ToRad;
            var          s2   = new SamplesDigitalSignal(dt, samples_count, t => A2 * Cos(2 * PI * f2 * t + phi2));

            const double A3   = 4;
            const double f3   = 15;
            const double phi3 = 60 * ToRad;
            var          s3   = new SamplesDigitalSignal(dt, samples_count, t => A3 * Cos(2 * PI * f3 * t + phi3));

            //var s = s1 + s2 + s3;
        }
Ejemplo n.º 2
0
        public void SignalProcessing()
        {
            const double fp = 0.1;    // Гц // Граничная частота полосы пропускания
            const double fs = 0.3;    // Гц // Граничная частота полосы запирания
            const double fd = 1;      // Гц // Частота дискретизации
            const double dt = 1 / fd; // 2с // Период дискретизации
            const double Rp = 1;      // Неравномерность в полосе пропускания (дБ)
            const double Rs = 30;     // Неравномерность в полосе пропускания (дБ)
            var          Gp = (-Rp).From_dB();
            var          Gs = (-Rs).From_dB();

            var filter = new DSP.Filters.ButterworthLowPass(dt, fp, fs, Gp, Gs);

            const int samples_count = 1024;
            // Сигнал s0(t) = 1
            var s_0 = new SamplesDigitalSignal(dt, Repeat(1d, samples_count));

            // Гармонические сигналы разной частоты и амплитудой = √2
            const double a0 = Consts.sqrt_2;
            // Сигнал с частотой равной частоте пропускания (граничной частоте фильтра)
            var s_fp = MathSamplesSignal.Cos(a0, fp, 0, dt, samples_count);
            // Сигнал с частотой равной частоте заграждения
            var s_fs = MathSamplesSignal.Cos(a0, fs, 0, dt, samples_count);
            // Сигнал с частотой равной половине частоты дискретизации
            var s_fd05 = MathSamplesSignal.Cos(a0, fd / 2, 0, dt, samples_count);

            var y_0    = filter.ProcessIndividual(s_0);
            var y_fp   = filter.ProcessIndividual(s_fp);
            var y_fs   = filter.ProcessIndividual(s_fs);
            var y_fd05 = filter.ProcessIndividual(s_fd05);

            // Постоянный сигнал не должен измениться своей мощности
            Assert.That.Value(y_0.Power).IsEqual(s_0.Power, 2.81e-3);
            // На граничной частоте сигнал должен быть ослаблен на коэффициент Gp (на Gp^2 по мощности)
            Assert.That.Value(y_fp.Power).IsEqual(s_0.Power * Gp * Gp, 3.2e-3);
            // На частоте заграждения сигнал должен быть ослаблен на коэффициент Gs (на Gs^2 по мощности)
            Assert.That.Value(y_fs.Power).IsEqual(s_fs.Power * Gs * Gs, 1.84e-4);
            // На частоте в половину частоты дискретизации сигнал должен быть подавлен
            Assert.That.Value(y_fd05.Power).IsEqual(0, 1.33e-4);
        }
Ejemplo n.º 3
0
        public void ProcessSignalAtCutOffFrequencyTestTest()
        {
            const double fd  = 100;
            const double dt  = 1 / fd;
            const double f0  = 10;
            const double eps = 3e-3;

            const double A0 = 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 LowPassRC(f0, dt);

            var y0 = rc.Process(x0);

            var y0_power = y0.Power;

            Assert.AreEqual(x0_power / 2, y0_power, eps);
        }
Ejemplo n.º 4
0
        public void ProcessSignalAtHighFrequencyTestTest()
        {
            const double fd      = 1000;
            const double dt      = 1 / fd;
            const double f0      = 30;
            const double delta_f = 10;
            const double eps     = 2.31e-5;

            var x0 = new SamplesDigitalSignal(dt, 1024, t => 1 * Cos(2 * PI * fd / 2 * t));

            var x0_power = x0.Power;

            Assert.AreEqual(1, x0_power, eps);

            var rlc = new BandStopRLC(f0, delta_f, dt);

            var y0 = rlc.Process(x0);

            var y0_power = y0.Power;

            Assert.AreEqual(x0_power, y0_power, eps, $"delta:{Abs(x0_power - y0_power):e2}");
        }
Ejemplo n.º 5
0
        public void ProcessSignalAtZerroFrequencyTestTest()
        {
            const double fd  = 1000;
            const double dt  = 1 / fd;
            const double f0  = 30;
            const double Df  = 10;
            const double eps = 0.86e-3;

            var x0 = new SamplesDigitalSignal(dt, 1024, t => 1 * Cos(2 * PI * 0 * t));

            var x0_power = x0.Power;

            Assert.AreEqual(1, x0_power, eps);

            var rlc = new BandPassRLC(f0, Df, dt);

            var y0 = rlc.Process(x0);

            var y0_power = y0.Power;

            Assert.AreEqual(0, y0_power, eps, $"delta:{Abs(0 - y0_power)}");
        }
Ejemplo n.º 6
0
        public void ProcessSignalAtCentralFrequencyTestTest()
        {
            const double fd      = 1000;
            const double dt      = 1 / fd;
            const double f0      = 30;
            const double delta_f = 10;
            const double eps     = 0.048;

            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 rlc = new BandStopRLC(f0, delta_f, dt);

            var y0 = rlc.Process(x0);

            var y0_power = y0.Power;

            Assert.AreEqual(0, y0_power, eps, $"delta:{Abs(0 - y0_power)}");
        }
Ejemplo n.º 7
0
        public void SpectrumPassTest()
        {
            const double fd = 1000;
            const double dt = 1 / fd;
            const double f0 = 30;
            const double Df = 10;

            var rlc = new BandPassRLC(f0, Df, dt);

            const int samples_count = 1000;
            var       s0            = new SamplesDigitalSignal(dt, Enumerable.Repeat(1, samples_count));
            var       s1            = new SamplesDigitalSignal(dt, samples_count, t => 1 * Cos(2 * PI * (f0 - Df / 2) * t));
            var       s2            = new SamplesDigitalSignal(dt, samples_count, t => 1 * Cos(2 * PI * f0 * t));
            var       s3            = new SamplesDigitalSignal(dt, samples_count, t => 1 * Cos(2 * PI * (f0 + Df / 2) * t));

            var s = s0 + s1 + s2 + s3;

            s.FourierTransform().ToAbsArg(out var abs_S, out var arg_S);
            var abs_S_25 = abs_S[25];
            var abs_S_30 = abs_S[30];
            var abs_S_35 = abs_S[35];

            var arg_S_25 = arg_S[25];
            var arg_S_30 = arg_S[30];
            var arg_S_35 = arg_S[35];

            var y = rlc.ProcessIndividual(s);

            y.FourierTransform().ToAbsArg(out var abs_Y, out var arg_Y);
            Assert.That.Value(abs_Y[0]).IsEqual(0, 1.68e-3);
            var abs_Y_25 = abs_Y[25];
            var abs_Y_30 = abs_Y[30];
            var abs_Y_35 = abs_Y[35];

            var H_25 = rlc.GetTransmissionCoefficient(f0 - Df / 2, dt);
            var H_30 = rlc.GetTransmissionCoefficient(f0, dt);
            var H_35 = rlc.GetTransmissionCoefficient(f0 + Df / 2, dt);

            var H_25_abs = H_25.Abs;
            var H_30_abs = H_30.Abs;
            var H_35_abs = H_35.Abs;

            var K25 = abs_Y_25 / abs_S_25;
            var K30 = abs_Y_30 / abs_S_30;
            var K35 = abs_Y_35 / abs_S_35;

            Assert.That.Value(K25).IsEqual(H_25_abs, 0.042);
            Assert.That.Value(K30).IsEqual(H_30_abs, 0.062);
            Assert.That.Value(K35).IsEqual(H_35_abs, 0.045);

            var arg_Y_25 = arg_Y[25];
            var arg_Y_30 = arg_Y[30];
            var arg_Y_35 = arg_Y[35];

            var H_25_arg = H_25.Arg;
            var H_30_arg = H_30.Arg;
            var H_35_arg = H_35.Arg;

            var Arg25 = arg_S_25 - arg_Y_25;
            var Arg30 = arg_S_30 - arg_Y_30;
            var Arg35 = arg_S_35 - arg_Y_35;

            Assert.That.Value(Arg25).IsEqual(H_25_arg, 1.82e-2);
            Assert.That.Value(Arg30).IsEqual(H_30_arg, 1.71e-2);
            Assert.That.Value(Arg35).IsEqual(H_35_arg, 1.66e-2);
        }