コード例 #1
0
ファイル: stft.cs プロジェクト: Lanlanlan233/mdsplib
        public static List <Complex[]> Direct(double[] wavein, DSP.Window.Type wnd = DSP.Window.Type.Hann, UInt32 wlength = 1024, UInt32 fftPad = 0)
        {
            var              wlength2  = wlength / 2;
            double           numWindow = (wavein.Length / (wlength / 2)) - 1;
            List <Complex[]> result    = new List <Complex[]>();

            // ciclo su array di campioni lunghi wlength e sovrapposti al 50% tra loro
            for (uint i = 0; i < numWindow; i++)
            {
                result.Add(wavein.Slice(i * wlength2, wlength).Window(Window.Type.Hann).FFT(fftPad));
            }

            return(result);
        }
コード例 #2
0
ファイル: Form1.cs プロジェクト: wwkkww1983/COMplot
        private void SpectrumPrepare(int chanel, Chart PlotChart)
        {
            uint N = Convert.ToUInt32(saveDataTable.Rows.Count);

            double[] orignalData    = new double[N];
            double   samplingRateHz = 1000;
            string   windowFFT      = "Hamming";

            DSP.Window.Type windowToApply     = (DSP.Window.Type)Enum.Parse(typeof(DSP.Window.Type), windowFFT);
            double[]        wc                = DSP.Window.Coefficients(windowToApply, N);
            double          windowScaleFactor = DSP.Window.ScaleFactor.Signal(wc);
            // the sum of N and zeros must be power of 2.
            int pow2 = 1;

            while (N > Math.Pow(2, pow2))
            {
                pow2++;
            }
            uint zeros = Convert.ToUInt32(Math.Pow(2, pow2)) - N;
            // Instantiate & Initialize the FFT class
            FFT fft = new FFT();

            fft.Initialize(N, zeros);
            foreach (DataRow dr in saveDataTable.Rows)
            {
                // copy saveDataTable to array "orignailData"
                orignalData[saveDataTable.Rows.IndexOf(dr)] = Convert.ToDouble(dr[chanel]);
            }
            // remove the mean
            orignalData = DSP.Math.RemoveMean(orignalData);
            // Calculate the frequency span
            double[] fSpan = fft.FrequencySpan(samplingRateHz);
            // Convert and Plot Log Magnitude
            Complex[] cpxResult = fft.Execute(orignalData);

            double[] magResult = DSP.ConvertComplex.ToMagnitude(cpxResult);
            magResult = DSP.Math.Multiply(magResult, windowScaleFactor);
            double[] magLog = DSP.ConvertMagnitude.ToMagnitudeDBV(magResult);

            PlotChart.Series["Series1"].Points.Clear();
            PlotChart.Series["Series1"].Points.DataBindXY(fSpan, magResult);
        }
コード例 #3
0
    public override float[] doFFT(float[] samples, WINDOW_TYPE window)
    {
        double[] dSamples = new double[samples.Length];
        for (int i = 0; i < samples.Length; i++)
        {
            dSamples[i] = (double)samples[i];
        }

        //Code from DSPLib documentation
        DSP.Window.Type dspWindow         = getWindowType(window);
        double[]        windowCoefs       = DSP.Window.Coefficients(dspWindow, (UInt32)this.binSize);
        double[]        windowInputData   = DSP.Math.Multiply(dSamples, windowCoefs);
        double          windowScaleFactor = DSP.Window.ScaleFactor.Signal(windowCoefs);

        System.Numerics.Complex[] complexSpectrum = fft.Execute(windowInputData);
        //Convert to magnitude and multiply by the window scale factor to get our binned array
        double[] fftSpectrum  = DSP.Math.Multiply(DSPLib.DSP.ConvertComplex.ToMagnitude(complexSpectrum), windowScaleFactor);
        float[]  fFFTSpectrum = new float[fftSpectrum.Length];
        for (int i = 0; i < fFFTSpectrum.Length; i++)
        {
            fFFTSpectrum[i] = (float)fftSpectrum[i];
        }
        return(fFFTSpectrum);
    }
コード例 #4
0
ファイル: stft.cs プロジェクト: Lanlanlan233/mdsplib
 public static List <Complex[]> STFT(this double[] wavein, DSP.Window.Type wnd = DSP.Window.Type.Hann, UInt32 wlength = 1024, UInt32 fftpad = 0)
 {
     return(mdsplib.FT.STFT.Direct(wavein, wnd, wlength, fftpad));
 }