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