public override void Process() { var fftsToRead = Math.Min(_portInp.BufferCapacity / FFTSize, _portInp.Available / FFTSize); var outputFramesFree = _portOut.Free; if (outputFramesFree == 0) { return; } var inputBuffer = _portInp.Read(Math.Min(outputFramesFree, fftsToRead) * FFTSize); var inputSamples = inputBuffer.Data; for (int i = 0; i < inputBuffer.Available; i++) { _frameBuffer[inputSampleCount++] = inputSamples[i]; if (inputSampleCount == _fft.Size) { _fft.UseData(_frameBuffer, 0, _fft.Size); var result = _fft.Transform(); _portOut.WriteFrame(result, 0); inputSampleCount = 0; } } }
public IEnumerable <double[]> Iterate(long at, long count, long step) { var buffer = new double[FftSize]; for (var i = 0; i < count; i++) { var remaining = _cb.FillBuffer(at + i * step, FftSize, 1, buffer); if (remaining == FftSize) { yield return(new double[0]); } else { _trans.UseData(buffer, 0, buffer.Length); yield return(_trans.Transform()); } } }
protected override void DataAvailable(DataInputPort port) { while (_portInp.Queue.Length > _bufIn.Length) { var samples = _bufOut.GetSamples(); var k = 0; _portInp.Queue.Dequeue(_bufIn); for (int i = 0; i < _bufIn.Length; i += _fft.Size) { _fft.UseData(_bufIn.GetSamples(), i, _fft.Size); var result = _fft.Transform(); for (int j = 0; j < result.Length; j++) { samples[k++] = result[j]; } } _bufOut.SetWritten(k); _portOut.SendData(_bufOut); } }