在 MATLAB 中将频谱图另存为图像
Posted
技术标签:
【中文标题】在 MATLAB 中将频谱图另存为图像【英文标题】:Save Spectrogram as an Image in MATLAB 【发布时间】:2013-04-08 06:07:00 【问题描述】:我正在使用 MATLAB 中的 spectrogram()
函数分析一些声音片段。我想将频谱图保存为图像(jpg、png 等)。但无论我以何种图像格式保存该图,生成的图像总是与我在图中看到的不同(“参差不齐”)。
以下是频谱图示例:Matlab Figure 与 Saved Image
我想要的只是将我在图中看到的内容保存为图像。我已经尝试将图形保存为所有可能的图像格式,但它们都产生了相同的“斑点”效果。我还尝试了手动保存(单击文件-> 另存为)和以编程方式使用print()
和saveas()
函数。每次结果都一样。
任何帮助将不胜感激!
【问题讨论】:
我在下面发布了一个解决方法,但我没有找到问题的根源。如果有人想试一试,可以在here找到音频样本。 【参考方案1】:您的频谱图的数据范围是多少?
原因之一可能是您的频谱图范围超出了double
图像的 [0,1] 区域或uint*
图像的 [0,255] 区域(您保存的图像上的白点可疑地接近 MatLab 图上的局部最小值)。
另一个猜测可能是您正在使用imwrite
函数,尤其是它的imwrite(X,map,filename,fmt)
语法。 MatLab 文档说明:
imwrite(X,map,filename,fmt) 将 X 中的索引图像及其关联的颜色图映射以 fmt 指定的格式写入文件名。如果 X 属于 uint8 或 uint16 类,则 imwrite 将数组中的实际值写入文件。如果 X 属于 double 类,则 imwrite 在写入之前使用 uint8(X–1) 偏移数组中的值。 map 必须是有效的 MATLAB 颜色图。请注意,大多数图像文件格式不支持超过 256 个条目的颜色图。
所以uint8(X–1)
可能是白点的来源。
虽然不知道为什么它们出现在print()
'ing 之后。
【讨论】:
上图的数据范围被归一化为[0,1]为double。但即使我只是直接绘制了频谱图输出,结果图看起来也完全一样。我没有在任何地方使用imwrite()
函数。 spectrogram()
函数的 documentation 表明 surf()
函数用于绘制图像。我尝试手动绘制图像,但保存后仍然出现“斑点”效果。【参考方案2】:
我通过使用 pcolor()
函数找到了解决此问题的方法,该函数本质上是一个以网格格式 (doc) 绘制的旋转 surf()
函数。在对spectrogram()
函数进行了更多修改之后,我确信这些“发现”工件与数据格式、属性或比例无关。问题似乎在于 MATLAB 绘制和可视化 3D 图的方式。我也尝试使用mesh()
函数进行绘图,它产生了一种不同的“定位”效果。 pcolor()
之所以有效,是因为它是 3D 绘图的 2D 可视化。
这是spectrogram()
使用surf()
绘制图像的方式(改编自doc):
[S,T,F,P] = spectrogram(X,256,250,256,2000);
surf(T,F,abs(S),'EdgeColor','none');
axis tight; view(0,90);
...这就是如何使用pcolor()
绘制便于保存的图像:
[S,T,F,P] = spectrogram(X,256,250,256,2000);
h = pcolor(T,F,abs(S));
set(h,'EdgeColor','none');
【讨论】:
【参考方案3】:白点是 OpenGL 问题,这是 spectrogram()
对 surf()
的内部调用中使用的渲染器。
由于您对绘制 2D 可视化感兴趣,请将当前图形的渲染器更改为 zbuffer:
set(gcf, 'renderer', 'zbuffer');
其中gcf
表示“获取当前数字”。白点现在消失了。
请注意,您也可以在创建图窗时选择 zbuffer 渲染器,然后再调用spectrogram()
:
myNewFig = figure('renderer','zbuffer');
【讨论】:
以上是关于在 MATLAB 中将频谱图另存为图像的主要内容,如果未能解决你的问题,请参考以下文章