绘制频谱图时的性能问题

3
我正在尝试绘制一个频谱图 - 对于这个问题,它可以被重新表述为我正在尝试绘制一个大矩阵(约40,000 x 3000个双精度实数)。根据我的经验,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');

在哪个特定的点上,你遇到了性能问题?是在图形窗口中显示还是保存到文件中? - Robert Seifert
1
你尝试过将其保存为矢量图形('renderer','painters'),而不显示它('Visible','off')吗?你能提供一个最小的示例,包括随机数据,以便复制和粘贴吗? - Robert Seifert
1
将矩阵分块平均,并显示结果较小的矩阵?40000x3000像素在屏幕上也无法显示。 - Luis Mendo
2
一个表面很昂贵,因为它由许多3D对象组成(即使它们恰好位于一个平面上)。如果你只想要一个热力图,使用imagesc会更加高效。还有Luis Mendo所说的:将你的频谱图缩小到适合屏幕显示的尺寸。 - A. Donda
1
@VictorPira,您可以像自定义surf图一样自定义imagesc图。 - A. Donda
显示剩余2条评论
2个回答

2
最大的性能提升将通过降采样显示的数据来实现。毕竟,屏幕上的像素并不足以显示所有数据。有多种方法可以进行这种降采样。如果您不需要担心缩放,则可以简单地修改输入数据(例如,通过块平均或选择每N个数据元素)。但是,如果您放大绘制的数据,则看不到所有数据。
如果您需要支持缩放/平移,同时仍然显示降采样的数据,那么一个好的起点是Matlab文件交换中心上的reduce_plot函数。您应该能够相对容易地使其适应您的绘图类型(我认为它目前只适用于简单的线型图)。关于reduce_plot(和通常的降采样)的好处的可视化可以在突出显示reduce_plot的博客文章中找到,该文章被评为文件交换中心的“本周之选”。
reduce_plot以及其他许多Matlab性能技巧在我的最近一本书《加速MATLAB性能》(CRC Press 2014)中有详细描述。

1

好的,让我总结一下之前评论中进行的实验并回答以结束这个问题。

保存为矢量图形(thewaywewalked)

即不要让MATLAB查看绘图,而是将其保存为矢量图形以在MATLAB外查看。

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

优点

您只需绘制一次数据,然后仍然可用。

缺点

生成的文件仍然非常大,并且使用它们不太高效。

这不是一个好的选择。



使用 imagesc(A.Donda)

不要让 MATLAB 在 surf 中计算 3D 元素,改用 imagesc

优点

非常高效,与 surf 相比速度惊人地快。

缺点

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

对我来说这是最佳方案,非常感谢!与保存为矢量图相结合,它产生的文件大小合理,仍然可以很好地进行缩放。



下采样 (Luis Mendo & Yair Altman)

一般情况下我不太愿意这样做,因为我需要数据的高分辨率。我可以想象写一个缩放算法,根据要显示的区域选择块的大小,但这似乎有些过于复杂。
然而,reduce_plot函数很有趣,也许将来会有适合它的地方。无论如何,感谢您的帮助!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接