public void Reconstruct() { SignalData signalData = SelectedTab.SignalData; Generator generator = new Generator() { T1 = signalData.StartTime }; double step = 2 * A_Amplitude / (Math.Pow(2, QuantizationThresholds) - 1); List <double> steps = new List <double> { -A_Amplitude }; for (int i = 1; i < Math.Pow(2, QuantizationThresholds); i++) { steps.Add(steps[i - 1] + step); } if (Frequency % SamplingFrequency == 0) { // dla sygnałów generowanych losowo -> dzięki temu próbki są identyczne for (int i = 0; i < signalData.SamplesX.Count; i += Frequency / SamplingFrequency) { double diff = Math.Abs(signalData.SamplesY[i] - steps[0]); int iterator = 0; for (int j = 0; j < Math.Pow(2, QuantizationThresholds); j++) { if (Math.Abs(signalData.SamplesY[i] - steps[j]) <= diff) { diff = Math.Abs(signalData.SamplesY[i] - steps[j]); iterator = j; } } signalData.QuantizationSamplesY.Add(steps[iterator]); } } else { for (int i = 0; i < signalData.ConversionSamplesX.Count; i++) { double diff = signalData.SamplesX.LastOrDefault(); int iterator = 0; for (int j = 0; j < Math.Pow(2, QuantizationThresholds); j++) { if (Math.Abs(signalData.ConversionSamplesY[i] - steps[j]) <= diff) { diff = Math.Abs(signalData.ConversionSamplesY[i] - steps[j]); iterator = j; } } signalData.QuantizationSamplesY.Add(steps[iterator]); } } for (decimal i = (decimal)T1_StartTime; i < (decimal)(T1_StartTime + D_DurationOfTheSignal); i += 1 / (decimal)ReconstructionFrequency) { signalData.ReconstructionSamplesX.Add((double)i); signalData.ReconstructionSamplesY.Add(generator.SincReconstruction(signalData.ConversionSamplesX, signalData.QuantizationSamplesY, (double)i, SamplingFrequency, ReconstructionSamples)); } SelectedTab.SignalData = signalData; SelectedTab.IsScattered = SelectedSignal.IsGenerationScattered(); SelectedTab.CalculateSignalInfo(T1_StartTime, T1_StartTime + D_DurationOfTheSignal); SelectedTab.CalculateReconstructionInfo(); SelectedTab.ReconstructCharts(); }
public void Generate() { Generator generator = new Generator() { A = A_Amplitude, T1 = T1_StartTime, T = T_BasicPeriod, Kw = Kw_DutyCycle, Ts = Ts_TimeStep, P = P_Probability }; Func <double, double> selectedGeneration = generator.SelectGenerator(SelectedSignal); if (selectedGeneration == generator.CustomSinusoidalSignal) { List <double> x = new List <double>(); List <double> y1 = new List <double>(); List <double> y2 = new List <double>(); generator = new Generator() { A = 2, T = 2 }; selectedGeneration = generator.SelectGenerator(SelectedSignal); for (decimal i = (decimal)T1_StartTime; i < (decimal)(T1_StartTime + D_DurationOfTheSignal); i += 1 / (decimal)SamplingFrequency) { x.Add((double)i); y1.Add(generator.CustomSinusoidalSignal((double)i)); } generator = new Generator() { A = 5, T = 0.5 }; selectedGeneration = generator.SelectGenerator(SelectedSignal); for (decimal i = (decimal)T1_StartTime; i < (decimal)(T1_StartTime + D_DurationOfTheSignal); i += 1 / (decimal)SamplingFrequency) { y2.Add(selectedGeneration((double)i)); } SelectedTab.SignalData = new SignalData(T1_StartTime, Frequency, SamplingFrequency) { ConversionSamplesX = x, ConversionSamplesY = Operations.AddSignals(y1, y2) }; SelectedTab.IsScattered = true; SelectedTab.CalculateSignalInfo(T1_StartTime, T1_StartTime + D_DurationOfTheSignal); SelectedTab.DrawCharts(); } else if (selectedGeneration != null) { SignalData signalData = new SignalData(T1_StartTime, Frequency, SamplingFrequency); for (decimal i = (decimal)T1_StartTime; i < (decimal)(T1_StartTime + D_DurationOfTheSignal); i += 1 / (decimal)Frequency) { signalData.SamplesX.Add((double)i); signalData.SamplesY.Add(selectedGeneration((double)i)); } if (Frequency % SamplingFrequency == 0) { // dla sygnałów generowanych losowo -> dzięki temu próbki są identyczne for (int i = 0; i < signalData.SamplesX.Count; i += Frequency / SamplingFrequency) { signalData.ConversionSamplesX.Add(signalData.SamplesX[i]); signalData.ConversionSamplesY.Add(signalData.SamplesY[i]); } } else { for (decimal i = (decimal)T1_StartTime; i < (decimal)(T1_StartTime + D_DurationOfTheSignal); i += 1 / (decimal)SamplingFrequency) { signalData.ConversionSamplesX.Add((double)i); signalData.ConversionSamplesY.Add(selectedGeneration((double)i)); } } SelectedTab.SignalData = signalData; SelectedTab.IsScattered = SelectedSignal.IsGenerationScattered(); SelectedTab.CalculateSignalInfo(T1_StartTime, T1_StartTime + D_DurationOfTheSignal); SelectedTab.DrawCharts(); } }