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