예제 #1
0
파일: Program.cs 프로젝트: zillant/RF
        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 =
            //}
        }
예제 #2
0
        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();
        }