绘制频谱图时的性能问题

时间:2015-04-16 12:21:25

标签: performance matlab plot gnuplot matlab-figure

我正在尝试绘制一个频谱图 - 为了这个问题的目的,它可以被重新描述为我试图绘制一个大矩阵(约40 000x3000 double,reals)。图形输出(根据我的经验)是matlab spectrogram函数的最大问题,当然我在设计自己的谱图脚本时遇到了同样的问题。使用surface我有时会受到挤压,需要重新启动计算机。

我尝试过:

  • 'LineStyle', 'None'添加到surface,实际上它确实有所帮助,但还不够。
  • 将整个问题转移到Octave和GNUplot,我认为它更加轻量化。没有任何特别的成功,但我不是使用gnuplot的专家 - 可能有一些我忽略的东西。我只尝试了surface
  • 没有经过测试的想法:如果不让matlab / gnuplot绘制具有挑战性的大小的图形但是将其保存为疯狂分辨率的图像以便在某些图像查看器中进行研究(因此绕过重绘图,这是问题的核心)?如果您这么认为,可以共享代码吗?

如果您有任何提示,我将不胜感激。我们的目标是获得具有良好分辨率的数字,仍然可以作为频谱图读取(所以请不要mesh等。)

注意:我知道有可能按部分绘制矩阵,这当然会有所帮助。 我正在尝试寻找另一种解决方案,可能更适合功能,程序等。

更新:要复制,粘贴,更正等的代码:

data=rand(48000,2000)
surface(data,'LineStyle','None','Visible','off')
xlabel('time');
ylabel('frequency');
colorbar('eastoutside');
set(gcf, 'renderer', 'painters');
saveas(gcf,'specgram.pdf');

2 个答案:

答案 0 :(得分:2)

通过对显示的数据进行下采样,可以实现最大的性能提升。毕竟,屏幕上没有足够的像素来显示所有数据。可以通过各种方式进行下采样。如果您不需要担心放大/缩小,那么您可以简单地修改输入数据(例如,通过块平均或通过选择每个第N个数据元素)。但是,如果你放大绘制的数据,你将看不到所有的数据。

如果您需要在仍然显示下采样数据的同时支持缩放/平移,那么一个好的起点就是Matlab文件交换中的reduce_plot function。你应该能够相对容易地使它适应你的情节类型(我认为它目前只适用于简单的线条图)。可以在the blog post that highlighted reduce_plot中找到reduce_plot(以及一般下采样)的好处的可视化文件交换“每周选择”。

reduce_plot以及许多其他Matlab性能提示在我最近的书“ Accelerating MATLAB Performance ”(CRC Press 2014)中进行了描述。

答案 1 :(得分:0)

好的,让我总结先前评论所做的实验并回答关闭此问题。

保存为矢量图形(thewaywewalked)

即。不要让MATLAB查看图表,但保存为矢量图形,以便在MATLAB外部查看。

set(gcf, 'renderer', 'painters');
saveas(gcf,'spectgr.pdf');

优点

您只绘制一次数据,但仍然可以使用。

缺点

制作的文件仍然很大,与它们合作效率不高。

这不是一个好方法。



使用imagesc(A. Donda)

不要让MATLAB在surf中计算3-D元素,而是使用imagesc

优点

surf相比,效率非常高,速度令人难以置信。

缺点

您需要花费更多时间使其看起来像频谱图(例如,轴被反转)。

这对我来说是最好的解决方案,非常感谢你!结合保存为矢量图形,它可以生成相当小的文件,但仍能很好地进行缩放。



下采样(Luis Mendo& Yair Altman)

这是我一般不想做的事情,因为我需要良好的数据分辨率。我可以想象写一些类似缩放算法的东西,根据要显示的区域选择块的大小,但它似乎是过度思考。
但是,reduce_plot函数很有意思,也许它会有一个合适的位置。未来。不管怎样,谢谢!