public static float[,] GetDiscreteSpectre(float[,] data) { int w = data.GetLength(0); int h = data.GetLength(1); int lenX = (int)Math.Pow(2, Math.Ceiling(Math.Log(w, 2))); int lenY = (int)Math.Pow(2, Math.Ceiling(Math.Log(h, 2))); var compData = new Exocortex.DSP.Complex[lenX * lenY]; for (int i = 0; i < w; i++) { for (int j = 0; j < h; j++) { compData[i * h + j].Re = data[i, j]; } } Exocortex.DSP.Fourier.FFT2(compData, lenX, lenY, Exocortex.DSP.FourierDirection.Forward); var res = new float[w, h]; for (int i = 0; i < w; i++) { for (int j = 0; j < h; j++) { res[i, j] = (float)Math.Sqrt(Math.Pow(compData[i * h + j].Re, 2) + Math.Pow(compData[i * h + j].Im, 2)); } } return(res); }
/// <summary> /// находим приблизительную частоту пульса /// (как основную частоту периодического сигнала ФПГ) /// </summary> /// <param name="data"></param> /// <returns></returns> public double find_main_frequency(double[] data) { { int N; for (N = 2; N * 2 < data.Length && N *2 <= 4096; N *= 2) { ; } Exocortex.DSP.Complex[] fdata = new Exocortex.DSP.Complex[N]; for (int ii = 0; ii < N; ++ii) { fdata[ii] = new Exocortex.DSP.Complex(data[ii], 0); } Exocortex.DSP.Fourier.FFT(fdata, N, Exocortex.DSP.FourierDirection.Forward); double max = System.Double.MinValue; int i_max = -1; double modulus; for (int i = 0; i < N; i += 2) { modulus = fdata[i].GetModulusSquared(); if (modulus > max) { i_max = i; max = modulus; } } return(((double)fdata.Length) / ((double)i_max)); } }
public static float[] GetDiscreteSpectre(float[] data) { var compData = new Exocortex.DSP.Complex[4096]; for (int i = 0; i < Math.Min(data.Length, compData.Length); i++) { compData[i].Re = data[i]; } Exocortex.DSP.Fourier.FFT(compData, compData.Length, Exocortex.DSP.FourierDirection.Forward); return(GetDiscrete(compData)); }
/// <summary> /// return a in complex power b /// </summary> /// <param name="b"></param> /// <returns></returns> static Exocortex.DSP.Complex pow(Exocortex.DSP.Complex a, Exocortex.DSP.Complex b) { double r = a.GetModulus(); double teta = a.GetArgument(); double c = b.Re; double d = b.Im; Exocortex.DSP.Complex r1 = new Exocortex.DSP.Complex(Math.Pow(r, c) * Math.Exp(-d * teta), 0); Exocortex.DSP.Complex r2 = new Exocortex.DSP.Complex(Math.Cos(d * Math.Log(r) + c * teta), Math.Sin(d * Math.Log(r) + c * teta)); return(r1 * r2); }
/// <summary> /// вычисляет спектр сигнала /// </summary> /// <param name="spectrum"></param> /// <returns></returns> public static Spectrum CalculateSpectrum(int[] signal, double SamplingRate) { if (signal.Length < 1) { throw new ArgumentException(); } //signal = DownsampleSignal(signal); //signal = ResampleSignalToPowerOf2(signal, ref SamplingRate); //signal = GenerateSinus(signal, SamplingRate); //signal = GenerateMeander(signal, SamplingRate); int length = 1; while (((length * 2) < signal.Length) && ((2 * length) < (512 * 1024))) { length *= 2; } // remove constant signal = CenterSignal(signal, length); Exocortex.DSP.Complex[] complex_data = new Exocortex.DSP.Complex[length]; for (int i = 0; i < length; ++i) { complex_data[i].Re = signal[i]; complex_data[i].Im = 0; } Exocortex.DSP.Fourier.FFT(complex_data, length, Exocortex.DSP.FourierDirection.Forward); // calculate power Spectrum result = new Spectrum(); result.FreqResolution = SamplingRate / 2 / (((double)length) / 2); result.SpectrumLow = 0; result.SpectrumHigh = SamplingRate / 2; for (int k = 0; k < (length / 2); ++k) { result.SpectrumBins.Add( System.Math.Sqrt( complex_data[k].Re * complex_data[k].Re + complex_data[k].Im * complex_data[k].Im ) ); } return(result); }
static public EDSPComplex[] AM2EDSP(AMComplex[,] Source) { int Height = Source.GetLength(0), Width = Source.GetLength(1); EDSPComplex[] Result = new EDSPComplex[Width * Height]; int Y, X, T = 0; for (Y = 0; Y < Height; ++Y) { for (X = 0; X < Width; ++X) { Result[T] = new EDSPComplex(Source[Y, X].Re, Source[Y, X].Im); ++T; } } return(Result); }