绘制频谱图时的性能问题

Performance problems when plotting spectrogram

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

我试过了:

如果您有任何提示,我将不胜感激。目标是获得具有良好分辨率的图形,仍然可以作为频谱图读取(所以请不要 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');

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

如果您需要在显示缩减采样数据的同时支持 zooming/panning,一个好的起点是 reduce_plot function on the Matlab File Exchange. You should be able to relatively easily adapt it to work with your plot type (I think it currently only works with simple line plots). A visualization of the benefits of reduce_plot (and down-sampling in general) can be found in the blog post that highlighted reduce_plot 作为文件交换 "Pick-of-the-Week"。

reduce_plot,以及许多其他 Matlab 性能技巧,在我最近的书“Accelerating MATLAB Performance[=21 中有所描述=]”(CRC 出版社 2014)。

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

保存为矢量图形 (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 函数很有趣,也许会有一个合适的将来的地方。无论如何谢谢!