Results 1 to 4 of 4

Thread: Qwt spectrogram value() method vs setValueMatrix

  1. #1
    Join Date
    Feb 2015
    Posts
    4
    Qt products
    Qt4 Qt5 Qt/Embedded
    Platforms
    Unix/X11 Windows

    Default Qwt spectrogram value() method vs setValueMatrix

    Im trying to implement a waterfall plot using qwt spectrogram, i can already plot instantaneous data on the spectrogram using QwtMatrixRasterData::setValueMatrix and am wondering if i should be implementing the value() method instead. Why would someone use value method over setvaluematrix? I have seen it done both ways.

  2. #2
    Join Date
    Feb 2006
    Location
    Munich, Germany
    Posts
    3,325
    Thanked 879 Times in 827 Posts
    Qt products
    Qt3 Qt4 Qt/Embedded
    Platforms
    MacOS X Unix/X11 Windows

    Default Re: Qwt spectrogram value() method vs setValueMatrix

    Quote Originally Posted by earless View Post
    Why would someone use value method over setvaluematrix?
    All spectrograms use QwtRasterData::value() method only !

    QwtMatrixRasterData is convenience for use cases, where you have a value matrix ( pixelHint and resampling can be implemented from the matrix ). But often the data is no matrix ( f.e. something irregular ), or you don't want to waste memory for creating a copy, or your data is huge and you need to use the initRaster/discardRaster scope to load values from somewhere according to the current plot scales.

    In general you can say that using QwtMatrixRasterData might be easier to use - when your data is a matrix - but deriving from QwtRasterData allows more flexibility and individual optimizations.

    Note that I recently did a couple of performance optimizations for spectrograms in trunk. Depending on the refresh rate you need, those might be of interest for your. For testing you could enable DEBUG_RENDER in qwt_plot_spectrogram.cpp to see what performance you can expect for the image composition on your box.

    Uwe

    PS: a waterfall plot example is on my TODO list since quite some time. The special thing about this is, that the spectrogram could simply shift the image of the previous content down calculating the new values of the top rows only. Performance can be improved significantly this way.

  3. #3
    Join Date
    Feb 2015
    Posts
    4
    Qt products
    Qt4 Qt5 Qt/Embedded
    Platforms
    Unix/X11 Windows

    Default Re: Qwt spectrogram value() method vs setValueMatrix

    Thanks for the reply Uwe. I got the waterfall working using the value method. What im doing is add my data to a buffer and shift out the old data with the new samples, this gets the waterfall scrolling nicely. The only problem is it slows down my system quite a bit, the gui becomes less responsive. I think its because the entire waterfall is being redrawn from scratch every time the value method is called. Is there a way i can shift the current waterfall by one pixel and only draw the last line? The buffer is about lengthXheightXsizeof(double)=1024x200x8=1.6MB big. Is this too much data?

    This is my QwtRasterData::value() method implementation.

    Qt Code:
    1. double WaterfallData::value(double x, double y) const
    2. {
    3. double returnValue = -90.0;
    4.  
    5.  
    6. double height = interval(Qt::YAxis).maxValue();
    7. double left = interval(Qt::XAxis).minValue();
    8. double right = interval(Qt::XAxis).maxValue();
    9. double ylen = static_cast<double>(_historyLength-1);
    10. double xlen = static_cast<double>(_dataPoints-1);
    11. const unsigned int intY = static_cast<unsigned int>((1.0 - y/height) * ylen);
    12. const unsigned int intX = static_cast<unsigned int>((((x - left) / (right-left)) * xlen) + 0.5);
    13.  
    14. const int location = (intY * _dataPoints) + intX;
    15. //ensure location is valid
    16. if((location > -1) && (location < WATERFALL_AREA)){
    17. returnValue = _waterfallDataBuffer[location];
    18. }
    19.  
    20. return returnValue;
    21. }
    To copy to clipboard, switch view to plain text mode 
    Last edited by earless; 12th February 2015 at 21:25.

  4. #4
    Join Date
    Feb 2006
    Location
    Munich, Germany
    Posts
    3,325
    Thanked 879 Times in 827 Posts
    Qt products
    Qt3 Qt4 Qt/Embedded
    Platforms
    MacOS X Unix/X11 Windows

    Default Re: Qwt spectrogram value() method vs setValueMatrix

    The buffer is about lengthXheightXsizeof(double)=1024x200x8=1.6MB big. Is this too much data?
    For the image composition the size/resolution of the target paint device ( in your case the size of the plot canvas ) is a maximum. Guess in your case the resolution of your data is way below that and you should implement the QwtRasterData::pixelHint() method.
    Considering a canvas of 1200x1200 pixels the loop ( calling value() in each iteration ) would be reduced from 1444000 to 204800 for your data. How much effect you will have of course depends on the geometry of your canvas, but in this example only 15% of the loop would be left ( In case of using QwtMatrixRasterData the pixelHint method is provided automatically ).

    Is there a way i can shift the current waterfall by one pixel and only draw the last line?
    Sure by overloading renderImage(). But I don't have the details before having tried this myself - that's why I will implement such an example some day.

    Uwe

Similar Threads

  1. QWT Spectrogram
    By iamzen in forum Qwt
    Replies: 2
    Last Post: 29th March 2012, 20:31
  2. Calling a method from a non-member method
    By AndresBarbaRoja in forum Newbie
    Replies: 5
    Last Post: 19th March 2011, 10:38
  3. Replies: 1
    Last Post: 25th November 2010, 11:37
  4. get min and max value from spectrogram
    By rambo83 in forum Qwt
    Replies: 1
    Last Post: 2nd December 2009, 14:25
  5. qwt spectrogram example
    By rambo83 in forum Qwt
    Replies: 2
    Last Post: 17th November 2009, 21:13

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •  
Qt is a trademark of The Qt Company.