Beispiel #1
0
        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);
        }
Beispiel #2
0
        /// <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));
            }
        }
Beispiel #3
0
        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);
        }
Beispiel #6
0
        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);
        }