Merge remote branch 'nldudok1/gr-wxgui_emulate_analog' into master
[debian/gnuradio] / gr-qtgui / src / lib / spectrumdisplayform.cc
index d7c593e2f07e8dd48481c8a909fc0577bce5b396..f52a63d1f0a85c0ff555a8036b19fd0530e90567 100644 (file)
@@ -122,7 +122,7 @@ SpectrumDisplayForm::newFrequencyData( const SpectrumUpdateEvent* spectrumUpdate
   const double* realTimeDomainDataPoints = spectrumUpdateEvent->getRealTimeDomainPoints();
   const double* imagTimeDomainDataPoints = spectrumUpdateEvent->getImagTimeDomainPoints();
   const uint64_t numTimeDomainDataPoints = spectrumUpdateEvent->getNumTimeDomainDataPoints();
-  const timespec dataTimestamp = spectrumUpdateEvent->getDataTimestamp();;
+  const timespec dataTimestamp = spectrumUpdateEvent->getDataTimestamp();
   const bool repeatDataFlag = spectrumUpdateEvent->getRepeatDataFlag();
   const bool lastOfMultipleUpdatesFlag = spectrumUpdateEvent->getLastOfMultipleUpdateFlag();
   const timespec generatedTimestamp = spectrumUpdateEvent->getEventGeneratedTimestamp();
@@ -134,18 +134,24 @@ SpectrumDisplayForm::newFrequencyData( const SpectrumUpdateEvent* spectrumUpdate
   const std::complex<float>* complexDataPointsPtr = complexDataPoints+numFFTDataPoints/2;
   double* realFFTDataPointsPtr = _realFFTDataPoints;
 
+  double sumMean, localPeakAmplitude, localPeakFrequency;
+  const double fftBinSize = (_stopFrequency-_startFrequency) /
+    static_cast<double>(numFFTDataPoints);
+  localPeakAmplitude = -HUGE_VAL;
+  sumMean = 0.0;
+
   // Run this twice to perform the fftshift operation on the data here as well
+  std::complex<float> scaleFactor = std::complex<float>((float)numFFTDataPoints);
   for(uint64_t point = 0; point < numFFTDataPoints/2; point++){
-    // Calculate dBm
-    // 50 ohm load assumption
-    // 10 * log10 (v^2 / (2 * 50.0 * .001)) = 10 * log10( v^2 * 10)
-    // 75 ohm load assumption
-    // 10 * log10 (v^2 / (2 * 75.0 * .001)) = 10 * log10( v^2 * 15)
-
-    // perform scaling here
-    std::complex<float> pt = (*complexDataPointsPtr) / std::complex<float>((float)numFFTDataPoints);
+    std::complex<float> pt = (*complexDataPointsPtr) / scaleFactor;
     *realFFTDataPointsPtr = 10.0*log10((pt.real() * pt.real() + pt.imag()*pt.imag()) + 1e-20);
 
+    if(*realFFTDataPointsPtr > localPeakAmplitude) {
+      localPeakFrequency = static_cast<float>(point) * fftBinSize;
+      localPeakAmplitude = *realFFTDataPointsPtr;
+    }
+    sumMean += *realFFTDataPointsPtr;
+    
     complexDataPointsPtr++;
     realFFTDataPointsPtr++;
   }
@@ -154,9 +160,15 @@ SpectrumDisplayForm::newFrequencyData( const SpectrumUpdateEvent* spectrumUpdate
   // second half of the plotted data
   complexDataPointsPtr = complexDataPoints;
   for(uint64_t point = 0; point < numFFTDataPoints/2; point++){
-    std::complex<float> pt = (*complexDataPointsPtr) / std::complex<float>((float)numFFTDataPoints);
+    std::complex<float> pt = (*complexDataPointsPtr) / scaleFactor;
     *realFFTDataPointsPtr = 10.0*log10((pt.real() * pt.real() + pt.imag()*pt.imag()) + 1e-20);
 
+    if(*realFFTDataPointsPtr > localPeakAmplitude) {
+      localPeakFrequency = static_cast<float>(point) * fftBinSize;
+      localPeakAmplitude = *realFFTDataPointsPtr;
+    }
+    sumMean += *realFFTDataPointsPtr;
+
     complexDataPointsPtr++;
     realFFTDataPointsPtr++;
   }
@@ -165,24 +177,9 @@ SpectrumDisplayForm::newFrequencyData( const SpectrumUpdateEvent* spectrumUpdate
   if(!repeatDataFlag){
     _AverageHistory(_realFFTDataPoints);
 
-    double sumMean;
-    const double fft_bin_size = (_stopFrequency-_startFrequency) /
-      static_cast<double>(numFFTDataPoints);
-
-    // find the peak, sum (for mean), etc
-    _peakAmplitude = -HUGE_VAL;
-    sumMean = 0.0;
-    for(uint64_t number = 0; number < numFFTDataPoints; number++){
-      // find peak
-      if(_realFFTDataPoints[number] > _peakAmplitude){
-       // Calculate the frequency relative to the local bw, adjust for _startFrequency later
-        _peakFrequency = (static_cast<float>(number) * fft_bin_size);
-        _peakAmplitude = _realFFTDataPoints[number];
-        // _peakBin = number;
-      }
-      // sum (for mean)
-      sumMean += _realFFTDataPoints[number];
-    }
+    // Only use the local info if we are not repeating data
+    _peakAmplitude = localPeakAmplitude;
+    _peakFrequency = localPeakFrequency;
 
     // calculate the spectral mean
     // +20 because for the comparison below we only want to throw out bins
@@ -232,15 +229,15 @@ SpectrumDisplayForm::newFrequencyData( const SpectrumUpdateEvent* spectrumUpdate
                                           d_update_time, dataTimestamp, 
                                           spectrumUpdateEvent->getDroppedFFTFrames());
       }
+      /*
       if((QGLFormat::hasOpenGL()) && (_useOpenGL)) {
        if( _openGLWaterfall3DFlag == 1 && (tabindex == d_plot_waterfall3d)) {
-         /*
          _waterfall3DDisplayPlot->PlotNewData(_realFFTDataPoints, numFFTDataPoints, 
                                               d_update_time, dataTimestamp, 
                                               spectrumUpdateEvent->getDroppedFFTFrames());
-         */
        }
       }
+      */
     }