MATLAB中两种频谱图存mat文件的矩阵尺寸差异及正确保存咨询
频谱图保存为MAT文件的尺寸差异问题解析
一、造成矩阵尺寸差异的核心原因
这两种保存方式本质上存储的是完全不同类型的数据:
- 第一种方式:你用
getimage(gcf)提取的是spectrogram函数计算出的原始频谱数值矩阵。当spectrogram不带输出参数直接绘图时,它会把计算得到的频谱数据(double类型,维度对应频率分箱数×时间帧数)作为图像的底层数据源,getimage直接抓取了这个原始数值结果,所以得到的是147×257的double矩阵——这个矩阵是可用于后续信号分析的真实频谱数据,不是可视化的图像像素。 - 第二种方式:你先通过
imwrite(f.cdata, ...)把getframe捕获的屏幕渲染后的可视化像素图像存成了jpg。jpg是RGB格式的图像文件,存储的是屏幕上每个像素的颜色信息(3通道,uint8类型),而且jpg的压缩规则和格式转换会自动调整图像尺寸(你设置的figure是205×205,但保存读取后变成256×256,大概率是图像存储时的默认对齐或压缩机制导致)。所以读取回来的是256×256×3的uint8矩阵,这只是一张图片的像素数据,已经丢失了原始频谱的数值信息。
二、正确保存频谱图的两种场景方案
根据你的实际需求,分两种情况处理:
1. 保存原始频谱数值(用于后续信号分析)
如果需要保留频谱的原始计算结果(可重新绘制频谱图、做进一步分析),直接调用spectrogram的输出参数即可,完全不需要绘图后提取:
[x,fs] = audioread('1.wav'); % 获取频谱原始数值:S是复数频谱,P是功率谱,F是频率轴向量,T是时间轴向量 [S,F,T,P] = spectrogram(x, window, L, N, fs); % 保存所有相关数据到mat文件 save(['D:\matlab\speech\', strcat(int2str(i)), '_spectrum.mat'], 'S', 'F', 'T', 'P', '-v6');
2. 保存可视化的频谱图图像(用于展示的像素数据)
如果需要保存和屏幕显示完全一致的可视化图像数据,直接保存getframe捕获的像素矩阵即可,不要经过jpg转存(避免压缩和尺寸变化):
[x,fs] = audioread('1.wav'); spectrogram(x, window, L, N, fs); set(gcf, 'position', [500,500,205,205]); set(gca, 'Position', [0 0 1 1]); % 直接获取屏幕渲染后的RGB像素矩阵 img_data = getframe(gcf).cdata; % 保存图像数据到mat文件 save(['D:\matlab\speech\', strcat(int2str(i)), '_image.mat'], 'img_data', '-v6');
内容的提问来源于stack exchange,提问作者yunyang
相关产品推荐
相关产品推荐

