private static void Controller_SamplesAvailable(object sender, SamplesAvailableEventArgs samps) { // IF RX Mode if (iqStream == null) { iqStream = new ComplexFifoStream(BlockMode.None); } if (iqStream.Length < SampleRate) { iqStream.Write(samps.Buffer, samps.Length); } else { _droppedBuffers++; } if (iqStream != null) { iqStream.Read(_rxBufferPtr, (int)SampleRate); for (int i = 0; i < SampleRate; i++) { Console.WriteLine(String.Format("{0:0.000000}\t{1:0.000000}", _rxBufferPtr[i].Real, _rxBufferPtr[i].Imag)); //Console.WriteLine($"{_bufferPtr[i].Imag} {_bufferPtr[i].Real}"); } } // TO DO if TX Mode //if (TXmode) //{ // samps.Buffer = //} }
private void ProcessFFT(object parameter) { while (_control.IsPlaying && _fftThreadRunning) { #region Configure if (_sampleRate == 0.0) { // WTF??? Thread.Sleep(1); continue; } var fftRate = _fftBins / (_fftTimer.Interval * 0.001); _fftOverlapRatio = _sampleRate / fftRate; var samplesToConsume = (int)(_fftBins * _fftOverlapRatio); _fftSamplesPerFrame = Math.Min(samplesToConsume, _fftBins); var excessSamples = samplesToConsume - _fftSamplesPerFrame; _maxIQSamples = (int)(samplesToConsume / (double)_fftTimer.Interval * 100 * /*_streamControl.BufferSizeInMs **/ 1.5); #endregion #region Shift data for overlapped mode) if (_fftSamplesPerFrame < _fftBins) { Utils.Memcpy(_iqPtr, _iqPtr + _fftSamplesPerFrame, (_fftBins - _fftSamplesPerFrame) * sizeof(Complex)); } #endregion #region Read IQ data var targetLength = _fftSamplesPerFrame; var total = 0; while (_control.IsPlaying && total < targetLength && _fftThreadRunning) { var len = targetLength - total; total += _iqStream.Read(_iqPtr, _fftBins - targetLength + total, len); } _iqStream.Advance(excessSamples); #endregion if (!_fftSpectrumAvailable) { #region Process FFT gain // http://www.designnews.com/author.asp?section_id=1419&doc_id=236273&piddl_msgid=522392 var fftGain = (float)(10.0 * Math.Log10((double)_fftBins / 2)); var compensation = 24.0f - fftGain + _fftOffset; #endregion #region Calculate FFT Utils.Memcpy(_fftPtr, _iqPtr, _fftBins * sizeof(Complex)); Fourier.ApplyFFTWindow(_fftPtr, _fftWindowPtr, _fftBins); Fourier.ForwardTransform(_fftPtr, _fftBins); Fourier.SpectrumPower((Complex *)_fftPtr, (float *)_fftSpectrumPtr, (int)_fftBins, (float)compensation); #endregion _fftSpectrumAvailable = true; } if (_iqStream.Length <= _maxIQSamples) { _fftBufferIsWaiting = true; _fftEvent.WaitOne(); } } _iqStream.Flush(); }