【问题标题】:how to alter the range of values of a plot generated by spectrogram function如何更改由频谱图函数生成的绘图的值范围
【发布时间】:2015-02-26 15:45:33
【问题描述】:

在下面发布的图片中,我尝试使用STFT 获取TFR。在发布的代码中,我指定了参数T = 0:.001:1;,当我将其修改为例如T = 0:.001:2; 时,绘图水平轴上的值范围发生了变化,尽管它被标记为Frequency

现在,我想更改所示图上水平轴和垂直轴的值范围。我该怎么做?

注意:用于生成所示图的代码是:

T = 0:.001:1;
spectrogram(x4,128,50,NFFT);

代码

% Time specifications:
 Fs = 8000;                       % samples per second
 dt = 1/Fs;                       % seconds per sample
 StopTime = 1;                    % seconds
  t = (0:dt:StopTime-dt);             % seconds

  t1 = (0:dt:.25);
   t2 = (.25:dt:.50);
  t3 = (.5:dt:.75);
  t4 = (.75:dt:1);

  %two freqs. = abs(f1 - f2), that's why, x1 is plotted with 2 freqs.
  x1 = (10)*sin(2*pi*30*t1);
  x2 = (10)*sin(2*pi*60*t2) + x1;
  x3 = (10)*sin(2*pi*90*t3) + x2;
  x4 = (10)*sin(2*pi*120*t4) + x3;
  %x5 = (10) * sin(2*pi*5*t5);
  %x6 = x1 + x2 + x3 + x4 + x5;

  NFFT = 2 ^ nextpow2(length(t));     % Next power of 2 from length of y
  Y    = fft(x3, NFFT);
  f    = Fs / 2 * linspace(0, 1, NFFT/2 + 1);
  figure;
  plot(f(1:200), 2 * abs( Y( 1:200) ) );

  T = 0:.001:1;
  spectrogram(x4,10,9,31);
   axis(get(gcf,'children'), [0, 1,0,100]);

% Plot the signal versus time:
figure;
xlabel('time (in seconds)');
ylabel('Amplitude');
title('non-stationary Signal versus Time');

 hold on
 plot(t1,x1,'r');
plot(t2,x2,'g');
plot(t3,x3,'b');
plot(t4,x4,'black');
%plot(t5,x5,'y');
%plot(t, x6,'black');
legend('x1 = (10)*sin(2*pi*15*t1) + (10)*sin(2*pi*8*t1)', 'x2 = (10)*sin(2*pi*25*t2) + x1',   
'x3 = (10)*sin(2*pi*50*t3) + x2', 'x4 = (10)*sin(2*pi*75*t4) + x3', ...
'Location',  'SouthWest');

图片

新结果_1

【问题讨论】:

  • @Schorsch 我发布了代码
  • 如果我复制/粘贴该代码,它会告诉我 T 没有被使用。更改 T 对情节没有影响。请考虑澄清您的问题。
  • 0.9671.0 之间的白色“条纹”背后的问题是因为在您的代码中,您将第四个输入设置为 spectrogram31。但是,文档将其指定为the FFT length - 在您的情况下为8192
  • @Schorsch 好的,在我的代码中我指定了“Y = fft(x4, NFFT);”在阅读了您的建议后,我将频谱图参数更改为“频谱图(x4,10,9,长度(y));”但是现在当我运行 matlab 时不接受这个参数
  • @Schorsch 好的,我解决了这个问题,我只是将没有“长度”的 NFFT 指定为频谱图的第四个参数

标签: matlab signal-processing fft wavelet haar-wavelet


【解决方案1】:

想法:获取axis 用于绘制频谱图并相应地设置其属性。例如,假设您希望将 x 范围限制为 [0, 0.5] 并将 y 范围限制为 [100, 200],那么:

%'old code here'
%' . . . '
spectrogram(x4,128,50,NFFT);

%'new code here'
axis(get(gcf,'children'), [0, 0.5, 100, 200]);

说明:添加的单行gets 是当前图形gcf 的子句柄(假定由spectrogram 创建),然后将其范围设置为@ 987654328@ 通过axis 拨打电话。

Nota Bene: 我假设您只需要 重新缩放 轴,而不是 重新计算 spectrogram数据。

我还假设频谱图不与其他轴共享它的图形。

另外,扩展轴范围而不是限制它可能不会给你预期的结果(一句话:丑陋)。

【讨论】:

  • 感谢您的想法。请在应用您的建议后查看新发布的图片。 1-为什么在 1 之前的水平轴上的间隔是白色的? 2- 我怎样才能读懂这个情节?是 STFT 的正确表示吗?
  • @rmaik 1 - 您介意分享您使用的范围修改代码吗?我不想猜测它,因为它看起来更简单。 2 - 嗯,你读它就像一个频谱图。 :-) 图表上(x,y)“点”的颜色为您提供了 STFT 在特定时刻(y 轴)计算的特定谐波(x 轴)的功率。
  • 关于读取频谱图,从 0-.25 秒我应该有一个具有 30*.25 个峰值的信号,因为它是 30 个周期/秒。但是在频谱图中,水平轴上从 0->.25 的范围在垂直轴上有许多相应的读数,就像从 0->.25 秒一样。有许多频率的信号。还有一件事,在我按照您之前的建议更改了轴的范围之后,现在我想更改垂直轴的名称?请问我该怎么做
  • @rmaik 对于频谱图读取部分:添加x1x2x3x4,而不是连接它们;你的信号只有四分之一秒长而不是一秒。所以你在不同的时间没有不同的光谱(在图中可见)。我认为您最好明确说明代码的目的是什么以及您对发布结果的期望,因此我们避免在 cmets 中进行长时间的 Q/A 会话。
  • @rmaik 对于 y 轴标记:mathworks.com/help/matlab/ref/ylabel.html 并检查 ylabel(ax,___)。检查格式和注释帮助:mathworks.com/help/matlab/formatting-and-annotation.html
猜你喜欢
  • 1970-01-01
  • 2019-11-09
  • 2018-03-20
  • 1970-01-01
  • 1970-01-01
  • 2016-02-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多