Example #1
0
        private void FilterWithFiniteImpluseResponseInTheTimeDomain(object o)
        {
            Stopwatch sw = new Stopwatch();

            sw.Start();

            try
            {
                int L  = int.Parse(this.FilterLength);
                int Fc = int.Parse(this.CutoffFrequency);
                int Fs = this.SampleRate;

                double[] filter   = FilterWithFiniteImpulseResponse.GetFilterValues(Fc, Fs, L);
                double[] filtered = FourierWindows.MultiplyByWindowFunction(filter, this.SelectedWindowType);
                double[] result   = FilterWithFiniteImpulseResponse.FilterInTheTimeDomain(this.SignalData.Samples, filtered, L);

                this.FilterResultInTheTimeDomain = result;
            }
            catch (Exception e)
            {
                Notify.Error(e.Message);
            }

            sw.Stop();
            this.FilterTimeInTheTimeDomain = sw.ElapsedMilliseconds.ToString();
        }
Example #2
0
        private void Autocorrelation(object o)
        {
            double[] autocorrelation = Models.Autocorrelation.CalculateAutocorrelation(this.Channel);

            List <DataPoint> signal = new List <DataPoint>();

            for (int i = 0; i < autocorrelation.Length; i++)
            {
                signal.Add(new DataPoint(i, autocorrelation[i]));
            }
            this.AutocorrelationData = signal;

            double[][] data = FourierWindows.SplitData(this.Channel, 2048);
            this.AutocorrelationFreq = Models.Autocorrelation.CalculateFrequencies(data, this.SampleRate);
        }
Example #3
0
        private void FilterWithFiniteImpluseResponseInTheFrequencyDomain(object o)
        {
            Stopwatch sw = new Stopwatch();

            sw.Start();

            try
            {
                int      L      = int.Parse(this.FilterLength);
                int      Fc     = int.Parse(this.CutoffFrequency);
                int      Fs     = this.SampleRate;
                int      R      = int.Parse(this.HopSize);
                int      M      = int.Parse(this.WindowSize);
                int      n      = GetExpandedPow2(M + L - 1);
                int      size   = this.SignalData.Samples.Length + n - L;
                double[] result = new double[size];

                double[][]  windows        = new double[size / R][];
                Complex[][] windowsComplex = new Complex[size / R][];

                for (int i = 0; i < windows.Length; i++)
                {
                    windows[i]        = new double[n];
                    windowsComplex[i] = new Complex[n];
                }

                double[] windowFactors = FourierWindows.GetWindowFactors(M, this.SelectedWindowType);
                for (int i = 0; i < windows.Length; i++)
                {
                    for (int j = 0; j < M; j++)
                    {
                        if (i * R + j < this.SignalData.Samples.Length)
                        {
                            windows[i][j] = windowFactors[j] * this.SignalData.Samples[i * R + j];
                        }
                        else
                        {
                            windows[i][j] = 0;
                        }
                    }
                    for (int j = M; j < n; j++)
                    {
                        windows[i][j] = 0;
                    }
                }

                double[] windowFilterFactors = FourierWindows.GetWindowFactors(L, this.SelectedWindowType);
                double[] filterFactors       = FilterWithFiniteImpulseResponse.GetFilterValues(Fc, Fs, L);
                double[] filtered            = new double[n];
                for (int i = 0; i < L; i++)
                {
                    filtered[i] = windowFilterFactors[i] * filterFactors[i];
                }

                for (int i = L; i < n; i++)
                {
                    filtered[i] = 0;
                }

                if (this.SelectedZeroFillingMethod == ZeroFillingMethod.CauselessFilter)
                {
                    int shiftNumberFilter = (L - 1) / 2;

                    IEnumerable <double> shiftedFilter = filtered.Take(shiftNumberFilter);
                    List <double>        filteredTemp  = filtered.Skip(shiftNumberFilter).ToList();
                    filteredTemp.AddRange(shiftedFilter);
                    filtered = filteredTemp.ToArray();
                }

                Complex[] filteredComplex = FourierTransform.FFT(filtered);

                for (int i = 0; i < windows.Length; i++)
                {
                    windowsComplex[i] = FourierTransform.FFT(windows[i]);
                    for (int j = 0; j < windowsComplex[i].Length; j++)
                    {
                        windowsComplex[i][j] *= filteredComplex[j];
                    }
                    windows[i] = FourierTransform.IFFT(windowsComplex[i]);
                }

                for (int i = 0; i < windows.Length; i++)
                {
                    for (int j = 0; j < windows[i].Length; j++)
                    {
                        if (i * R + j < this.SignalData.Samples.Length)
                        {
                            result[i * R + j] += windows[i][j];
                        }
                    }
                }

                this.FilterResultInTheFrequencyDomain = result;
            }
            catch (Exception e)
            {
                Notify.Error(e.Message);
            }

            sw.Stop();
            this.FilterTimeInTheFrequencyDomain = sw.ElapsedMilliseconds.ToString();
        }
Example #4
0
        private void FourierSpectrumAnalysis(object o)
        {
            try
            {
                double[][] data = FourierWindows.Calculate(FourierWindows.SplitData(this.Channel, 2048), this.SelectedWindowType, float.Parse(this.Sigma));
                int[]      freq = new int[data.Length];
                for (int i = 0; i < freq.Length; i++)
                {
                    double[] data2 = new double[data[i].Length];
                    for (int j = 0; j < data[i].Length; j++)
                    {
                        if (j != 0)
                        {
                            data2[j] = data[i][j] - 0.94 * data[i][j - 1];
                        }
                        else
                        {
                            data2[j] = data[i][j];
                        }
                    }

                    List <Complex> signal = new List <Complex>();
                    for (int j = 0; j < data2.Length; j++)
                    {
                        signal.Add(new Complex(data2[j], 0));
                    }
                    List <Complex> dft = AMath.CalculateFastTransform(signal, AMath.CalculateWCoefficients(data2.Length, false), 0);
                    dft.RemoveRange(dft.Count / 2, dft.Count / 2);

                    double[] spectrum = new double[dft.Count];
                    for (int j = 0; j < spectrum.Length; j++)
                    {
                        spectrum[j] = Math.Sqrt((dft[j].Re * dft[j].Re) + (dft[j].Im * dft[j].Im));
                    }

                    List <int> max = new List <int>();
                    for (int j = 1; j < spectrum.Length - 1; j++)
                    {
                        if (spectrum[j - 1] < spectrum[j] && spectrum[j + 1] < spectrum[j])
                        {
                            max.Add(j);
                        }
                    }

                    int    globalMax    = 0;
                    double globalMaxVal = 0;
                    for (int j = 0; j < max.Count; j++)
                    {
                        int    index = max[j];
                        double value = spectrum[index];
                        if (value > globalMaxVal)
                        {
                            globalMax    = index;
                            globalMaxVal = value;
                        }
                    }

                    double     border   = 0.2 * globalMaxVal;
                    List <int> bordered = new List <int>();
                    for (int j = 0; j < max.Count; j++)
                    {
                        if (spectrum[max[j]] >= border)
                        {
                            bordered.Add(max[j]);
                        }
                    }

                    double median;
                    if (bordered.Count > 1)
                    {
                        List <double> differences = new List <double>();
                        for (int j = 0; j < max.Count - 1; j++)
                        {
                            for (int k = j + 1; k < max.Count; k++)
                            {
                                differences.Add(Math.Abs(max[j] - max[k]));
                            }
                        }
                        differences.Sort();

                        if (differences.Count != 1)
                        {
                            if (differences.Count % 2 == 0)
                            {
                                median = differences[differences.Count / 2];
                            }
                            else
                            {
                                int half = (differences.Count - 1) / 2;
                                median = (differences[half] + differences[half + 1]) / 2;
                            }
                        }
                        else
                        {
                            median = differences[0];
                        }
                    }
                    else
                    {
                        median = bordered[0];
                    }

                    freq[i] = Convert.ToInt32((this.SampleRate / data[i].Length) * median);
                }
                this.FourierFreq = freq;
            }
            catch (Exception e)
            {
                Notify.Error(e.Message);
            }
        }