public static void GenerateSignal(FunctionData data) { data.Points.Clear(); var interval = data.Duration.Value / (data.Samples.Value - 1); for (var i = 0; i < data.Samples.Value; i++) { var x = i * interval; try { var y = data.Function(data, x); if (Math.Abs(y) < 10E-10) { y = 0d; } data.Points.Add(new Point(x, y)); } catch (DivideByZeroException) { // Everything is fine, we just don't add this point } } data.Points.Sort(); // No idea why I put it here, seems not to have any influence, but better don't remove. data.CalculateParameters(); data.PointsUpdate(); Histogram.GetHistogram(data); }
public static void Quantization(FunctionData first, FunctionData second, double quantizationLevels) { var levels = new List <double>(); var step = first.Amplitude.Value * 2.0d / (quantizationLevels - 1); for (var i = 0; i <= quantizationLevels - 1; i++) { levels.Add(-first.Amplitude.Value + i * step); } second.AssignSignal(first); foreach (var point in second.Points) { point.Y = levels.OrderBy(l => Math.Abs(point.Y - l)).First(); } second.PointsUpdate(); }
public static void Compose(FunctionData first, FunctionData second, Operation operation) { if (operation == Operation.Divide && second.Points.Any(p => Math.Abs(p.Y) < double.Epsilon)) { first.Continuous.Value = false; } if (first.Type != Signal.Composite) { first.Function = AvailableFunctions.GetFunction(first.Type); } if (second.Type != Signal.Composite) { second.Function = AvailableFunctions.GetFunction(second.Type); } first.Type = Signal.Composite; if (second.Function != null && first.Function != null) { // TODO Think about a proper way of implementing this feature first.Continuous.Value = first.Continuous.Value && second.Continuous.Value; first.Function = FunctionComposer.ComposeFunction( first.Function, second.Function, second, operation); Generator.GenerateSignal(first); } else { SimpleCompose(first, second, operation); first.PointsUpdate(); Histogram.GetHistogram(first); } }