Beispiel #1
0
        /// <summary>
        /// Характеристическая функция
        /// </summary>
        /// <returns>Возвращает вектор отсчетов</returns>
        public Statistic CharacteristicFunc()
        {
            double[] img = new double[_n];

            ComplexVector fnc = new ComplexVector(_vector.DataInVector, img);

            return(new Statistic(Furie.fft(fnc).MagnitudeToVector()));
        }
        /// <summary>
        /// Вычисляет i-ю производную по dx
        /// </summary>
        /// <param name="A">Входной вектор</param>
        /// <param name="i">Порядок производной 1, 2, 3 ....</param>
        /// <returns>Комплексный вектор</returns>
        public static ComplexVector Diff(ComplexVector A, int i)
        {
            ComplexVector B = A.Copy();

            for (int j = 0; j < i; j++)
            {
                B = Diff(B);
            }

            return(B);
        }
        /// <summary>
        /// Вычисляет кратный интеграл по dx
        /// </summary>
        /// <param name="A">Входной вектор</param>
        /// <param name="k">Кратность 1, 2, 3 ....</param>
        /// <returns>Комплексный вектор</returns>
        public static ComplexVector Integral(ComplexVector A, int k)
        {
            ComplexVector B = A.Copy();

            for (int i = 0; i < k; i++)
            {
                B = Integral(B);
            }

            return(B);
        }
        /// <summary>
        /// Вычисляет интегральную функцию комплексный вектор
        /// </summary>
        /// <returns></returns>
        public static ComplexVector Integral(ComplexVector A)
        {
            int           kRasshR = 2;
            ComplexVector B = new ComplexVector(A.N), C, D = A.InterpolayrZero(kRasshR);

            for (int i = 0; i < A.N; i++)
            {
                C = A.CutAndZero(i);
                B.DataInVector[i] = Summ(C);
            }

            return(B);
        }
        /// <summary>
        /// Вычисляет диференциальную функцию комплексный вектор
        /// </summary>
        /// <param name="A">Входной вектор</param>
        public static ComplexVector Diff(ComplexVector A)
        {
            ComplexVector B = new ComplexVector(A.N);

            B.DataInVector[0] = A.DataInVector[0];

            for (int i = 1; i < B.N; i++)
            {
                B.DataInVector[i] = A.DataInVector[i] - A.DataInVector[i - 1];
            }

            return(B);
        }
        /// <summary>
        /// Взаимокорелляция двух действительных векторов
        /// </summary>
        /// <param name="A">Первый вектор</param>
        /// <param name="B">Второй вектор</param>
        /// <returns>Возвращает отсчеты ВКФ</returns>
        public static Vector CrossCorrelationF(Vector A, Vector B)
        {
            int    N = (A.N > B.N) ? Functions.NextPow2(2 * A.N) : Functions.NextPow2(2 * B.N);
            Vector newA, newB;

            newA = A.CutAndZero(N);
            newB = B.CutAndZero(N);

            ComplexVector SwA = Furie.fft(newA);
            ComplexVector SwB = Furie.fft(newB);

            return(Furie.ifft(SwA * SwB).RealToVector() / Math.Sqrt(Statistic.Dispers(newA) * Statistic.Dispers(newB)) / newA.N / 2);
        }
        /// <summary>
        /// Суммирование всех элементов комплексного вектора
        /// </summary>
        public static Complex Summ(ComplexVector vect)
        {
            int     n    = vect.N;
            Complex summ = 0;


            for (int i = 0; i < n; i++)
            {
                summ += vect.DataInVector[i];
            }

            return(summ);
        }
        /// <summary>
        /// Взаимокорелляция двух комплексных векторов
        /// </summary>
        /// <param name="A">Первый вектор</param>
        /// <param name="B">Второй вектор</param>
        /// <returns>Возвращает отсчеты ВКФ</returns>
        public static ComplexVector CrossCorrelation(ComplexVector A, ComplexVector B)
        {
            int N = A.N + B.N - 1, k = A.N - 1;

            ComplexVector C = new ComplexVector(N), st, s2t;

            for (int n = 0; n < k; n++)
            {
                st  = (!A).CutAndZero(N);
                s2t = B.Shift(n);
                s2t = s2t.CutAndZero(N);
                C.DataInVector[n] = Functions.Summ(st * s2t);
            }

            return(C);
        }
Beispiel #9
0
        /// <summary>
        /// Прямая свертка комплексный вектор
        /// </summary>
        public static ComplexVector DirectConvolution(ComplexVector A, ComplexVector B)
        {
            int           nMax = A.N + B.N - 1;
            ComplexVector st, ht;

            Complex[] convolut = new Complex[nMax];


            for (int n = 0; n < nMax; n++)
            {
                st          = A.CutAndZero(n);
                ht          = B.CutAndZero(n);
                ht          = ht.Revers();
                convolut[n] = Functions.Summ(st * ht);
            }
            return(new ComplexVector(convolut));
        }
Beispiel #10
0
        /// <summary>
        /// Обратное дискретное преобразование Фурье
        /// </summary>
        /// <param name="x">Входной действительный вектор</param>
        public static ComplexVector ODPF(ComplexVector x)
        {
            int           N   = x.N;
            ComplexVector x1  = new ComplexVector(N);
            ComplexVector Out = new ComplexVector(N);

            Complex i = new Complex(0, 1);


            for (int k = 0; k < N; k++)
            {
                for (int n = 0; n < N; n++)
                {
                    x1.DataInVector[n] = x.DataInVector[n] * Complex.Exp((2 * Math.PI * i * k * n) / N);
                }

                Out.DataInVector[k] = Functions.Summ(x1);
            }

            return(Out / N);
        }
Beispiel #11
0
        /// <summary>
        /// Круговая свертка комплексный вектор
        /// </summary>
        public static ComplexVector СircularConvolution(ComplexVector A, ComplexVector B)
        {
            if (A.N == B.N)
            {
                int           nMax = A.N;
                ComplexVector st, ht;
                Complex[]     convolut = new Complex[nMax];


                for (int n = 0; n < nMax; n++)
                {
                    st          = A.CutAndZero(n);
                    ht          = B.CutAndZero(n);
                    ht          = ht.Revers();
                    convolut[n] = Functions.Summ(st * ht);
                }
                return(new ComplexVector(convolut));
            }

            else
            {
                return(DirectConvolution(A, B));
            }
        }
Beispiel #12
0
 /// <summary>
 /// Реальная часть БПФ(не нормировано на кол-во)
 /// </summary>
 /// <param name="cInp">Комплексный вектор</param>
 public Vector RealIFFT2(ComplexVector cInp)
 {
     return(IFFT(cInp).RealToVector());
 }
Beispiel #13
0
        /// <summary>
        /// ОБПФ
        /// </summary>
        /// <param name="A">Входной вектор</param>
        public static ComplexVector ifft(Vector A)
        {
            ComplexVector C = ifft1(A);

            return(C / C.N);
        }
Beispiel #14
0
        private static ComplexVector ifft1(Vector inp)
        {
            ComplexVector cv = new ComplexVector(inp);

            return(ifft(cv));
        }
Beispiel #15
0
        /// <summary>
        /// Возвращает комплексный вектор спектра сигнала
        /// </summary>
        /// <param name="inp">Массив значений сигнала. Количество значений должно быть степенью 2</param>
        /// <returns>Массив со значениями спектра сигнала</returns>
        private static ComplexVector ifft1(ComplexVector inp)
        {
            ComplexVector inpV = inp.CutAndZero(Functions.NextPow2(inp.N));

            return(new ComplexVector(ifft(inpV.DataInVector)));
        }
Beispiel #16
0
        /// <summary>
        /// Быстрое преобразование Фурье(БПФ)
        /// </summary>
        /// <param name="inp">Входной вектор</param>
        public static ComplexVector fft(Vector inp)
        {
            ComplexVector cv = new ComplexVector(inp);

            return(fft(cv));
        }
Beispiel #17
0
        /// <summary>
        /// Возвращает комплексный вектор спектра сигнала
        /// </summary>
        /// <param name="inp">Массив значений сигнала. Количество значений должно быть степенью 2</param>
        /// <returns>Массив со значениями спектра сигнала</returns>
        public static ComplexVector fft(ComplexVector inp)
        {
            ComplexVector inpV = inp.CutAndZero(Functions.NextPow2(inp.N));

            return(new ComplexVector(fft(inpV.DataInVector)));
        }
Beispiel #18
0
        /// <summary>
        /// Возвращает спектр сигнала
        /// </summary>
        /// <param name="inp">Массив значений сигнала. Количество значений должно быть степенью 2</param>
        /// <returns>Массив со значениями спектра сигнала</returns>
        public static Complex[] ifft(Complex[] inp)
        {
            ComplexVector cV = !new ComplexVector(inp); // Комплексно-сопряженный вектор

            return(fft(cV.DataInVector));
        }
Beispiel #19
0
        /// <summary>
        /// ОБПФ
        /// </summary>
        /// <param name="inp">Вход</param>
        public ComplexVector IFFT(ComplexVector inp)
        {
            ComplexVector cV = !inp.CutAndZero(_n); // Комплексно-сопряженный вектор

            return(new ComplexVector(FFT(cV.DataInVector)));
        }
 /// <summary>
 /// Автокорелляция комплексного векторов
 /// </summary>
 /// <param name="A">Вектор</param>
 /// <returns>Возвращает осчеты АКФ</returns>
 public static ComplexVector AutoCorrelation(ComplexVector A)
 {
     return(CrossCorrelation(A, A));
 }