我一直在努力更好地理解MATLAB的spectrogram()
:
[S,F,T,P] = spectrogram(x,window,noverlap,f,fs)
假设x
是真实的。根据我的理解,P
是x
的PSD估算值(相当于使用pwelch()
?),而S
的列是{{1}的汉明窗口的STFT }}。 x
似乎与P
的平方根成正比。
这个比例因素来自哪里? S
和P
的“单位”分别是什么?
答案 0 :(得分:0)
我查看了MATLAB文档中的spectrogram
。
但是频谱图是2D功能,时间和频率。
S
代表频率向量T
上频率的时间向量样本W
的DFT。
由于您使用Window,因此结果是窗口时间样本。
P
向量用于相同窗口样本和频率上的PSD(平方绝对值S
)。
答案 1 :(得分:0)
正如你所提到的,S是窗口x的STFT,P是PSD。
P可由S计算。
您可以在此处找到计算背景。 here
以下示例显示如何从S计算P。
t = 0:0.001:2;
x = chirp(t,0,1,150); % 2 second chirp signal
nfft=256;
cFactor=0.3974; % Noise gain of hamming window
[S,F,T,P] = spectrogram(x,nfft,100,nfft,1e3); % S is STFT of hamming windowed signal
fbin=F(2)-F(1); %Frequency resolution
nS=(1/(2*(nfft/2+1)))*S; % normalizing by length of S
Pxx=2*(1/fbin)*(1/cFactor)*nS.*conj(nS); %PSD of AC value
Pxx(1,:)=(1/fbin)*(1/cFactor)*nS(1,:).*conj(nS(1,:)); %PSD of DC value
这里,Pxx变量与P变量相同。
您可以使用下图
查看结果figure(1)
subplot(2,1,1)
waterfall(F,T,P')
xlabel('frequency(Hz)')
ylabel('time(sec)')
figure(1)
subplot(2,1,2)
waterfall(F,T,real(Pxx)')
xlabel('frequency(Hz)')
ylabel('time(sec)')
Pwelch函数也给出PSD和计算方法与谱图相同,除了对所有STFT进行平均。
如果您使用pwelch函数以相同的方式使用上部示例,您将找到所有STFT段的平均图。
请尝试下面带有相同信号的代码,看看pwelch是如何工作的。
t = 0:0.001:2;
x = chirp(t,0,1,150); % 2 second chirp signal
nfft=256;
[P,F] = pwelch(x,nfft,100,nfft,1e3);
figure(2)
plot(F,P)
xlabel('frequency(Hz)')
在图(2)中,您将看到图(1)瀑布图的平均图。
关于S和P的单位,
S没有单位,因为DFT不关心单位。
P是每Hz时间信号的均方根值的平方。
如果时间信号单位为Volt(V),则P的单位为Vrms ^ 2 / Hz。