最近有活,以前总是对一个较好的信号进行分析,这次遇到了实际信号不知道怎么分析,被老师教育了,所以记录一下。
首先我们的信号是一个间隔0.1s的一个离散信号,总共信号长度是100,只有十秒的时间。
主要采用的分析工具是matlab自带的spectrogram函数和stft函数,这两个函数的使用可以参考链接Matlab中短时傅里叶变换 spectrogram和stft的用法 - 知乎 (zhihu.com),讲的很清楚,我主要记录一下自己没有注意到的。
首先对采样频率,因为原始信号较短,所以采样频率应该直接设置为我们的信号本身的采样率,即10Hz,这样最后spectrogram返回的f值即是本身信号的频率值。如果信号较长,可以设置为更高的采样率,因为采样率越高,频域分辨率更高。本次我们的信号无法用到这个方法。如果对信号进行补零对于频域分辨率是没有增益的。插值补零对信号的频率分析会有影响。比如我设置三倍插零,频率显示出来应该是原始信号频率的1/3。
再就是窗的长度选择,窗越长,频率分辨率越高,所以直接FFT得到的分辨率是最高的。但是考虑到不同时间的频率变化,短时傅里叶变换(STFT)需要设置不同的窗长度来判断。一定要注意,如果Fs不是按照本来数据的采样率设置,那么返回的f并不是实际频率(就是因为这个没考虑清除被教育了),
代码如下:i就是窗长。
window = i;
noverlap = window/2;
nfft = window;
[ss, f, t] = spectrogram(s_repay,hanning(window), noverlap, nfft, Fs);
figure;
imagesc(t, f, abs(ss));xlabel('t'); ylabel('Freqency');
title('使用spectrogram画出的短时傅里叶变换图形',i);
colorbar;
end