public void ProcessData(double[] iSamples, double[] qSamples, int spectPart, double baseAmp)
        {
            FpsBlocksReceived++;

            /* TODO: waterfall display sometimes holds "EnoughData" and doesnt reset */
            if (FFTDisplay.EnoughData && WaterfallDisplay.EnoughData)
            {
                return;
            }

            FpsBlocksProcessed++;

            lock (FFTLock)
            {
                int samplePairs = iSamples.Length;

                for (int samplePair = 0; samplePair < samplePairs; samplePair++)
                {
                    double I = iSamples[samplePair];
                    double Q = qSamples[samplePair];

                    FFT.AddSample(I, Q);

                    if (FFT.ResultAvailable)
                    {
                        FFT.GetResultSquared(FFTResult);

                        ReceiverCorrection.ApplyCorrectionTable(FFTResult);
                        FilterCorrection.ApplyCorrectionTable(FFTResult);

                        Remote.ProcessData(FFTResult);

                        if (FitSpectrumEnabled)
                        {
                            CenterCut((int)(FitSpectrumWidth * FFTSize));
                            FFTDisplay.ProcessFFTData(FFTResultPartial, spectPart, baseAmp);
                            WaterfallDisplay.ProcessFFTData(FFTResultPartial, spectPart, baseAmp);
                        }
                        else
                        {
                            FFTDisplay.ProcessFFTData(FFTResult, spectPart, baseAmp);
                            WaterfallDisplay.ProcessFFTData(FFTResult, spectPart, baseAmp);
                        }
                    }
                }
            }
        }
        public void ProcessSample(double I, double Q, int spectPart, int spectParts, double baseAmp)
        {
            lock (FFTLock)
            {
                FFT.AddSample(I, Q);

                if (FFT.ResultAvailable)
                {
                    FFT.GetResultSquared(FFTResult);

                    ReceiverCorrection.ApplyCorrectionTable(FFTResult);
                    FilterCorrection.ApplyCorrectionTable(FFTResult);

                    FFTDisplay.ProcessFFTData(FFTResult, spectPart, baseAmp);
                    WaterfallDisplay.ProcessFFTData(FFTResult, spectPart, baseAmp);
                }
            }
        }