/// <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); }
/// <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)); }
/// <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); }
/// <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)); } }
/// <summary> /// Реальная часть БПФ(не нормировано на кол-во) /// </summary> /// <param name="cInp">Комплексный вектор</param> public Vector RealIFFT2(ComplexVector cInp) { return(IFFT(cInp).RealToVector()); }
/// <summary> /// ОБПФ /// </summary> /// <param name="A">Входной вектор</param> public static ComplexVector ifft(Vector A) { ComplexVector C = ifft1(A); return(C / C.N); }
private static ComplexVector ifft1(Vector inp) { ComplexVector cv = new ComplexVector(inp); return(ifft(cv)); }
/// <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))); }
/// <summary> /// Быстрое преобразование Фурье(БПФ) /// </summary> /// <param name="inp">Входной вектор</param> public static ComplexVector fft(Vector inp) { ComplexVector cv = new ComplexVector(inp); return(fft(cv)); }
/// <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))); }
/// <summary> /// Возвращает спектр сигнала /// </summary> /// <param name="inp">Массив значений сигнала. Количество значений должно быть степенью 2</param> /// <returns>Массив со значениями спектра сигнала</returns> public static Complex[] ifft(Complex[] inp) { ComplexVector cV = !new ComplexVector(inp); // Комплексно-сопряженный вектор return(fft(cV.DataInVector)); }
/// <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)); }