1

在下面的代码中,我试图在运行代码后获取spectrogram非平稳信号x ,我希望看到一些类似发布的 inage“image_2”,频率与时间表示的东西。但发布代码的结果是image_1

有人可以指导我正确spectrogram吗?

代码

% 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: 在此处输入图像描述

更新_1,图像 代码

%now call the spectrogram
spectrogram(x, window, noverlap, Nfft, Fs);
ylabel('Frequency');
axis(get(gcf,'children'), [0, 1]);

在此处输入图像描述

4

1 回答 1

1

首先,就像您第一次提出这个问题一样,您是否在时域(即plot(t, x))中绘制了数据并放大了转换以确保您的信号与您认为的一样?它是否具有您想要的具有不同频率的四个不同时期?

假设确实如此,我很确定你的问题是你的spectrogram电话没有做你想做的事。我认为您仅获得 10 的 NFFT,这意味着您的 bin 宽度为 800 Hz,这不足以解决相隔仅 100 Hz 的频率。

在我看来,您应该指定更多参数,以便您知道它在做什么。您将指定一个 Nfft 来提供您需要的频率分辨率。分辨率超过 100 Hz(让我们尝试 25 Hz),但不需要太多点,以至于它比您具有稳定频率的持续时间更长(因此,小于 0.25 秒,这意味着小于 2000 个点)。

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

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

对于您的代码,您已经定义了它们的位置Fs和位置,频谱图调用将如下所示:x

%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');
于 2015-01-03T13:17:53.987 回答