void ComputeFFT()
        {
            if (FftQueue.Count > 0)
            {
                System.Numerics.Complex[] samples = new System.Numerics.Complex[NumberOfSamples];

                int index = 0;
                if (LeftOver != null)
                {
                    int count = Math.Min(LeftOver.Length, NumberOfSamples);
                    for (; count > index; index++)
                    {
                        samples[index] = new System.Numerics.Complex(LeftOver[index], 0);
                    }

                    if (index + 1 == LeftOver.Length)
                    {
                        LeftOver = null;
                    }
                    else
                    {
                        LeftOver = LeftOver.Skip(index + 1).ToArray();
                    }
                }

                if (index + 1 < NumberOfSamples)
                {
                    while (index + 1 < NumberOfSamples)
                    {
                        if (FftQueue.Count == 0)
                        {
                            break;
                        }
                        float[]  array   = FftQueue.Dequeue();
                        double[] hamming = Window.Hamming(array.Length);

                        array = array.Select((f, i) => (float)(hamming[i] * f)).ToArray();

                        int count = Math.Min(array.Length, NumberOfSamples - index);
                        for (int i = 0; count > i; i++)
                        {
                            samples[index] = new System.Numerics.Complex(array[i], 0);
                            index++;
                        }

                        if (array.Length > count)
                        {
                            int diff = array.Length - count;
                            LeftOver = array.Skip(count).ToArray();
                        }
                    }
                }

                FourierOptions options = FourierOptions.Matlab;
                Fourier.Forward(samples, options);
                FftFinished?.Invoke(this, new FourierEventArgs(samples, options));
            }
        }
        public int Read(float[] buffer, int offset, int count)
        {
            lock (FftQueue)
            {
                float[] buf = new float[count];
                Array.Copy(buffer, offset, buf, 0, count);
                FftQueue.Enqueue(buf);
            }

            return(sampleProvider.Read(buffer, offset, count));
        }
        public int Read(float[] buffer, int offset, int count)
        {
            int read = prov.Read(buffer, offset, count);
            int fftc = 0;

            foreach (var fft in FftQueue)
            {
                fftc += fft.Length;
            }

            fftc += count;
            FftQueue.Enqueue(buffer.Take(read).ToArray());

            int len = LeftOver == null ? 0 : LeftOver.Length;

            if (fftc + len >= NumberOfSamples)
            {
                ComputeFFT();
            }

            return(read);
        }