首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何获得非平稳信号的正确谱图?

如何获得非平稳信号的正确谱图?
EN

Stack Overflow用户
提问于 2015-01-03 10:14:08
回答 1查看 618关注 0票数 1

在下面的代码中,我试图获得非平稳信号的spectrogram,在运行代码后,我希望看到一些类似于张贴的词"image_2“,频率与时间的表示。但是发布的代码的结果是image_1

有谁能引导我找到正确的spectrogram吗?

代码语言:javascript
复制
% 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);

 %get a full-length example of each signal component
 x1 = (10)*sin(2*pi*100*t);
 x2 = (10)*sin(2*pi*200*t);
 x3 = (10)*sin(2*pi*300*t);
 x4 = (10)*sin(2*pi*400*t);

  %construct a composite signal
  x = zeros(size(t));
  I = find((t >= t1(1)) & (t <= t1(end)));
  x(I) = x1(I);
  I = find((t >= t2(1)) & (t <= t2(end)));
  x(I) = x2(I);
  I = find((t >= t3(1)) & (t <= t3(end)));
  x(I) = x3(I);
  I = find((t >= t4(1)) & (t <= t4(end)));
  x(I) = x4(I);

  NFFT = 2 ^ nextpow2(length(t));     % Next power of 2 from length of y
   Y    = fft(x, 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(x,10,9);
   ylabel('Frequency');
    axis(get(gcf,'children'), [0, 1, 1, 100]);

发布代码的结果: Spectrogram_Image_1

我想要得到的: Image_2:

Update_1,图像代码

代码语言:javascript
复制
%now call the spectrogram
spectrogram(x, window, noverlap, Nfft, Fs);
ylabel('Frequency');
axis(get(gcf,'children'), [0, 1]);

EN

回答 1

Stack Overflow用户

发布于 2015-01-03 13:17:53

首先,和您第一次问这个问题一样,您是否在时域(即plot(t, x))绘制了数据,并放大了转换以确保您的信号是您所认为的?它是否有四个不同的周期,与你意愿的频率不同?

假设确实如此,我很肯定您的问题是您的spectrogram调用没有做您想做的事情。我认为你只有一个NFFT 10,这意味着你的垃圾箱是800赫兹宽,这不足以解决你的频率,只有100赫兹的间隔。

在我看来,您应该指定更多的参数,以便您知道它正在做什么。您将指定一个Nfft,它将给出所需的频率分辨率。分辨率大于100赫兹的东西(让我们尝试25赫兹),但不需要太多的点,它比你有稳定频率的持续时间长(所以,小于0.25秒,这意味着少于2000点)。

为了了解如何指定FFT的长度,我查看了文档:http://www.mathworks.com/help/signal/ref/spectrogram.html

根据文档,我将尝试五个参数版本:spectrogram(x,window,noverlap,nfft,fs)

对于您已经定义了Fsx的代码,谱图调用如下所示:

代码语言:javascript
复制
%define FFT parameters
des_df_Hz = 25;  %desired frequency resolution for the display, Hz
Nfft = round(FS / des_df_Hz);  %general rule for FFT resolution
Nfft = 2*Nfft;  %double the bins to account for spreading due to windowing
Nfft = 2*round(0.5*Nfft);  %make Nfft an even number
window = Nfft;  %make your window the same length as your FFT
noverlap = round(0.95);  %overlap a lot to make the plot pretty

%now call the spectrogram
spectrogram(x, window, noverlap, Nfft, Fs,'yaxis');
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27753757

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档