【问题标题】:Matlab : save a spectrogram in a variable and display itMatlab:将频谱图保存在变量中并显示
【发布时间】:2018-02-27 06:33:09
【问题描述】:

我想要的很简单,至少我是这么想的。我有许多要计算和显示的频谱图,计算起来很耗时,所以我想将它们保存在变量中以显示它们而不重做计算。问题是,如果我直接使用函数 spectogram(),我无法找到一种方法来绘制它们的样子。

例子:

sampling_rate = 100;
spectrogram(data,100,20,[],sampling_rate,'yaxis');
caxis([-20 60])

这会完全按照我的要求显示频谱图:

我阅读了文档,我知道我可以通过执行以下操作来保存结果:

[S,F,T] = spectrogram(data,100,20,[],sampling_rate);

另外,我知道函数 spectogram 内部调用了 surf()。

我发现 this post 通过这样做似乎可以解决我的问题:

[S,F,T] = spectrogram(data,100,20,[],sampling_rate);
surf(T,F,abs(S),'EdgeColor','none');
axis tight; view(0,90);

但我得到了这个情节,这与我的预期相差甚远:

轴标签和颜色条消失了,颜色完全没有缩放。如果我像以前一样通过添加colorbar; caxis([-20 60]); 手动执行此操作,我会得到这个东西:

难道没有一个简单的解决方案来保存频谱图并在命令中显示它吗?

喜欢S = spectogram(...) 然后plot(S)

【问题讨论】:

    标签: matlab spectrogram


    【解决方案1】:

    如果OP's answer 或多或少按预期工作,那么以下较短的代码也应该这样做:

    [S,F,T,P] = spectrogram(data(1:3000),100,20,[],sampling_rate);
    h = imagesc(T,F,10*log10(P),[-20,60]);
    xlabel('Time (secs)')
    ylabel('Frequency (Hz)')
    colorbar;
    

    (我没有数据来测试它。)请注意,这里的 x 和 y 刻度是自动设置的。如果你想根据 T 的大小选择秒、分、小时,你可以这样做:

    lab = 'Time (secs)';
    if T(end) > 60*60*3
       T = T/(60*60);
       lab = 'Time (hours)';
    elseif T(end) > 60*3
       T = T/60;
       lab = 'Time (mins)'
    end
    h = imagesc(T,F,10*log10(P),[-20,60]);
    xlabel(lab)
    ylabel('Frequency (Hz)')
    colorbar;
    

    【讨论】:

    • 这正是我想要的!非常感谢,这很好用,我喜欢它!
    【解决方案2】:

    我找到了解决方案的开始。

    如果我写:

    [S,F,T,P] = spectrogram(data(1:3000),100,20,[],sampling_rate);

    P将谱功率密度保存在一个矩阵中,绘制起来相当方便不用忘记加上10*log10(P)

    h = pcolor(10*log10(P));
    colorbar;
    caxis([-20 60]);
    set(h,'EdgeColor','none')
    

    我得到这个更好:

    但我仍然缺少时间和频率轴,因为它当前显示矩阵 P 的维度。

    编辑

    我终于找到了一种可以手动处理轴的解决方案。时间显示仍然很糟糕,我确信有更好的方法,但我们开始吧:

    [S,F,T,P] = spectrogram(data(1001:3000),100,50,[],sampling_rate);
    h = pcolor(10*log10(P));
    cb = colorbar;
    caxis([-20 60]);
    ylabel(cb, 'Power/frequency (dB/Hz')
    set(h,'EdgeColor','none')
    
    xticks(0:round(size(P,2)/6):size(P,2)) 
    xt = xticks;
    xticklabels([T(xt(2)) T(xt(2:end))]);
    xlabel('Time (secs)');
    
    yticks([0:13:size(P,1) size(P,1)])
    yt = yticks;
    yticklabels(0:5:50);
    ylabel('Frequency (Hz)')
    

    时间保存在向量 T 中,这非常方便,以便将其应用于 x 标签。频率存储为 F,但在我的情况下,它总是在 0-50Hz 之间,所以我手动编写了它。

    我希望它会帮助一些人,并且如果你知道如何正确设置时间轴自动标记(秒,分钟,小时根据持续时间自动设置),无论如何我很想知道。

    【讨论】:

      猜你喜欢
      • 2013-09-19
      • 1970-01-01
      • 2012-04-01
      • 2017-09-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-20
      • 2011-03-18
      相关资源
      最近更新 更多