Пример #1
0
        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]);
                }
            }
        }
Пример #2
0
        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);
            }
        }
Пример #3
0
 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);
     }
 }
Пример #4
0
 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);
     }
 }
Пример #5
0
 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);
     }
 }
Пример #6
0
        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);
        }
Пример #7
0
        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;
        }
Пример #9
0
        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);
                    }
                }
            }
        }
Пример #10
0
        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);
                }
            }
        }