matlab 中的频谱图 - 时间轴格式

Spectrogram in matlab - time axis format

我有一个从 0.20 毫秒到 0.40 毫秒的猝发信号。从 0 到 0.20ms 以及从 0.40ms 到 3.27ms 为零。我做了 fft,它显示了 25 kHz 左右的频率内容。 fft点数为32768,也是时域信号的长度。

我正在尝试使用以下代码片段在 Matlab 中绘制频谱图

nfft = 32768;
dT = 1e-6;
fs = 1/dT;
window = hamming(nfft)
spectrogram(signal,window,[],nfft,fs)

使用这个我得到了准确的频率描述,但时间轴是个问题。

放大时域信号:

25 kHz 时的频谱图:

无法 获得时域和频域两者 都准确的表示。这就是傅里叶变换的uncertainty principle

可以做的是通过改变window长度权衡时间和频率分辨率。比较下面的两个频谱图,用不同的 window 长度获得。信号(图 1)与您问题中的信号相似。

  • 第一个频谱图(图 2)使用长window,它提供良好的频率分辨率但时间分辨率较差。请注意如何解析 10 Hz 的信号频率,但时间信息非常粗糙。
  • 相反,第二个频谱图(图 3)使用较短的 window,它提供了良好的时间分辨率但频率分辨率较差。可以看出,信号频率无法解析,但其时间位置和形状更准确。

% Define signal
fs = 500; % sampling frequency
t = 0:1/fs:6; % time axis
fm = 10; % signal (carrier) frequency
s = cos(2*pi*fm*t).* exp(-5*(t-2).^2);
figure
plot(t,s)

% Spectrogram with long window
figure
nfft = 500;
window = hamming(nfft);
spectrogram(s,window,[],nfft,fs), view([90 -90])

% Spectrogram with short window
figure
nfft = 50;
window = hamming(nfft);
spectrogram(s,window,[],nfft,fs), view([90 -90])