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); }
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); }
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); }
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)); }