public void SaveToFile(string filePath, SampledSignal signal) { using (BinaryWriter writer = new BinaryWriter(File.Create(filePath))) { writer.Write(signal.StartTime); writer.Write(signal.Frequency); writer.Write(signal.Type); writer.Write(signal.PointsY.Count); foreach (double sample in signal.PointsY) { writer.Write(sample); } } string newPath = Path.ChangeExtension(filePath, ".txt"); using (StreamWriter writer = new StreamWriter(newPath)) { writer.WriteLine("Start Time: " + signal.StartTime); writer.WriteLine("Frequency: " + signal.Frequency); writer.WriteLine("Type: " + signal.Type); writer.WriteLine("Number of samples: " + signal.PointsY.Count); writer.WriteLine("Rational:"); for (int i = 0; i < signal.PointsY.Count; i++) { writer.WriteLine(i + 1 + ". " + signal.PointsY[i]); } } }
private void TransformMethod() { if (SelectedSignal != null) { SampledSignal signal = new SampledSignal(); signal.PointsY = SelectedSignal.PointsY; signal.Name = $"{SelectedSignal.Name} {SelectedTransform}"; Stopwatch timer = new Stopwatch(); timer.Start(); switch (SelectedTransform.Substring(1, 4)) { case "F1.1": signal.ComplexPoints = FourierTransform.Transform(signal.PointsY); break; case "F1.2": FastFourierTransform fourierTransform = new FastFourierTransform(); signal.ComplexPoints = fourierTransform.Transform(signal.PointsY); break; case "F1.3": signal.ComplexPoints = WaveletTransform.Transform(signal.PointsY); break; } timer.Stop(); Time = timer.ElapsedMilliseconds; SignalCreator.AddSignal(signal); } }
public void Correlate() { if (SelectedSignalCorrelate1 != null && SelectedSignalCorrelate1.HasData() && SelectedSignalCorrelate2 != null && SelectedSignalCorrelate2.HasData()) { SampledSignal signal = new SampledSignal(); signal.PointsY = Correlation.ComputeSignal(SelectedSignalCorrelate1.PointsY, SelectedSignalCorrelate2.PointsY); signal.Name = $"({SelectedSignalCorrelate1.Name})C({SelectedSignalCorrelate2.Name})"; SignalCreator.AddSignal(signal); } }
public void FilterMethod() { if (SelectedSignalFilter1 != null && SelectedSignalFilter1.HasData() && SelectedSignalFilter2 != null && SelectedSignalFilter2.HasData()) { SampledSignal signal = new SampledSignal(); signal.PointsY = Convolution.ComputeSignal(SelectedSignalFilter1.PointsY, SelectedSignalFilter2.PointsY).Skip((SelectedSignalFilter2.PointsY.Count - 1) / 2).Take(SelectedSignalFilter1.PointsY.Count).ToList(); signal.Name = $"({SelectedSignalFilter1.Name})*({SelectedSignalFilter2.Name})"; SignalCreator.AddSignal(signal); } }
public void Quant() { if (SelectedSampledSignal != null && SelectedSampledSignal.HasData()) { var sampledSignal = (SampledSignal)SelectedSampledSignal; SampledSignal signal = new SampledSignal(); signal.PointsX = sampledSignal.PointsX; signal.StartTime = sampledSignal.StartTime; signal.Frequency = sampledSignal.Frequency; signal.PointsY = Quantization.Quantize(sampledSignal.PointsY, QuantCount); signal.Name = QuantSignalName + " - Q"; SignalCreator.AddSignal(signal); } }
public void CreateFilter() { Func <int, double, List <double> > filterFunction = null; Func <List <double>, int, List <double> > windowFunction = null; switch (SelectedFilter.Substring(1, 2)) { case "F0": filterFunction = Filter.LowPassFilter; break; case "F1": filterFunction = Filter.MidPassFilter; break; case "F2": filterFunction = Filter.HighPassFilter; break; } switch (SelectedWindow.Substring(1, 2)) { case "O0": windowFunction = Filter.RectangularWindow; break; case "O1": windowFunction = Filter.HammingWindow; break; case "O2": windowFunction = Filter.HanningWindow; break; case "O3": windowFunction = Filter.BlackmanWindow; break; } SampledSignal signal = new SampledSignal(); signal.PointsY = Filter.CreateFilterSignal(M, K, filterFunction, windowFunction); signal.Name = FilterName + " - F"; SignalCreator.AddSignal(signal); }
public SampledSignal LoadFromFile(string filePath) { using (BinaryReader reader = new BinaryReader(File.OpenRead(filePath))) { SampledSignal signal = new SampledSignal(); signal.PointsY = new List <double>(); signal.StartTime = reader.ReadDouble(); signal.Frequency = reader.ReadDouble(); signal.Type = reader.ReadByte(); int length = reader.ReadInt32(); for (int i = 0; i < length; i++) { signal.PointsY.Add(reader.ReadDouble()); } signal.CalculateSamplesX(); return(signal); } }
private void Timer_Elapsed(object sender, ElapsedEventArgs e) { S += ObjectV * T; SampledSignal signal = (SampledSignal)SelectedSignal; int samplesToMove = (int)(S / V * signal.Frequency * 2); int samplesLeft = signal.PointsY.Count - samplesToMove; List <double> pointsLeft = signal.PointsY.Take(samplesLeft).ToList(); List <double> receivedSignal = signal.PointsY.Skip(samplesLeft).ToList(); receivedSignal.AddRange(pointsLeft); List <double> correlateSignal = Correlation.ComputeSignal(SelectedSignal.PointsY, receivedSignal); DrawReceived(receivedSignal); DrawCorrelate(correlateSignal); List <double> rightHalf = correlateSignal.Skip((correlateSignal.Count - 1) / 2).ToList(); int maximum = rightHalf.FindIndex(c => c == rightHalf.Max()); CalculatedS = V * (maximum / signal.Frequency) / 2; }
public void AddSignal() { SignalGenerator generator = new SignalGenerator() { Amplitude = A, FillFactor = Kw, Period = T, StartTime = T1, JumpTime = Ts, JumpN = Ns, Probability = P }; List <double> pointsX = new List <double>(); List <double> pointsY = new List <double>(); List <double> samples = new List <double>(); Func <double, double> func = null; switch (SelectedSignalType.Substring(1, 3)) { case "S00": func = generator.GenerateSignalForTransform; break; case "S01": func = generator.GenerateUniformDistributionNoise; break; case "S02": func = generator.GenerateGaussianNoise; break; case "S03": func = generator.GenerateSinusoidalSignal; break; case "S04": func = generator.GenerateSinusoidal1PSignal; break; case "S05": func = generator.GenerateSinusoidal2PSignal; break; case "S06": func = generator.GenerateRectangularSignal; break; case "S07": func = generator.GenerateRectangularSymmetricalSignal; break; case "S08": func = generator.GenerateTriangularSignal; break; case "S09": func = generator.GenerateUnitJump; break; case "S10": func = generator.GenerateUnitPulse; break; case "S11": func = generator.GenerateImpulseNoise; break; } if (func != null) { generator.Func = func; if (func.Method.Name.Contains("GenerateUnitPulse")) { for (double i = N1 * F; i <= (D + N1) * F; i++) { pointsX.Add(i / F); pointsY.Add(func(i / F)); } SampledSignal signal = new SampledSignal(); signal.Frequency = F; signal.StartTime = N1; signal.PointsY = pointsY; signal.PointsX = pointsX; signal.Name = SignalName + " - S"; AddSignal(signal); } else if (func.Method.Name.Contains("GenerateImpulseNoise")) { for (double i = N1; i <= D + N1; i += 1 / F) { pointsX.Add(i); pointsY.Add(func(0)); } SampledSignal signal = new SampledSignal(); signal.Frequency = F; signal.StartTime = N1; signal.PointsY = pointsY; signal.PointsX = pointsX; signal.Name = SignalName + " - S"; AddSignal(signal); } else { if (IsContinuous) { for (double i = T1; i < T1 + D; i += D / 5000) { pointsX.Add(i); pointsY.Add(func(i)); } ContinuousSignal signal = new ContinuousSignal(); signal.PointsY = pointsY; signal.PointsX = pointsX; signal.Name = SignalName + " - C"; AddSignal(signal); } if (IsSampled) { for (double i = T1; i < T1 + D; i += 1 / Fp) { samples.Add(func(i)); } SampledSignal signal = new SampledSignal(); signal.Frequency = Fp; signal.StartTime = T1; signal.PointsY = samples; signal.Name = SignalName + " - S"; signal.CalculateSamplesX(); AddSignal(signal); } } } }
public void ComputeSignals() { if (SelectedSignal1 != null && SelectedSignal2 != null) { if (IsComplex) { SampledSignal signal = new SampledSignal(); List <Complex> points = new List <Complex>(); switch (SelectedOperation.Substring(1, 2)) { case "D1": points = SignalOperations.AddComplexSignals(SelectedSignal1.ComplexPoints, SelectedSignal2.ComplexPoints); break; case "D2": points = SignalOperations.SubtractComplexSignals(SelectedSignal1.ComplexPoints, SelectedSignal2.ComplexPoints); break; case "D3": points = SignalOperations.MultiplyComplexSignals(SelectedSignal1.ComplexPoints, SelectedSignal2.ComplexPoints); break; case "D4": points = SignalOperations.DivideComplexSignals(SelectedSignal1.ComplexPoints, SelectedSignal2.ComplexPoints); break; } signal.ComplexPoints = points; signal.Name = ResultSignalName + " - S [Complex]"; SignalCreator.Signals.Add(signal); SignalCreator.SampledSignals.Add(signal); } else { if (!SelectedSignal2.IsValid(SelectedSignal2)) { MessageBox.Show("Given signals are not valid", "Error", MessageBoxButton.OK, MessageBoxImage.Error); return; } SampledSignal signal = new SampledSignal(); List <double> pointsY = new List <double>(); switch (SelectedOperation.Substring(1, 2)) { case "D1": pointsY = SignalOperations.AddSignals(SelectedSignal1.PointsY, SelectedSignal2.PointsY); break; case "D2": pointsY = SignalOperations.SubtractSignals(SelectedSignal1.PointsY, SelectedSignal2.PointsY); break; case "D3": pointsY = SignalOperations.MultiplySignals(SelectedSignal1.PointsY, SelectedSignal2.PointsY); break; case "D4": pointsY = SignalOperations.DivideSignals(SelectedSignal1.PointsY, SelectedSignal2.PointsY); break; } signal.PointsY = pointsY; signal.StartTime = SelectedSignal1.StartTime; signal.Frequency = SelectedSignal1.Frequency; signal.CalculateSamplesX(); signal.Name = ResultSignalName + " - S"; SignalCreator.Signals.Add(signal); SignalCreator.SampledSignals.Add(signal); } } }