我一直在努力更好地理解MATLAB的spectrogram()
的以下用法:
[S,F,T,P] = spectrogram(x,window,noverlap,f,fs)
假设
x
是实数。据我了解,P
是x
的PSD估计值(相当于使用pwelch()
?),而S
的列是沿着x
的汉明窗口的STFT。 P
似乎与S
的幅度的平方根成比例关系。这个比例因子从哪里来?
P
和S
的“单位”分别是什么?我一直在努力更好地理解MATLAB的spectrogram()
的以下用法:
[S,F,T,P] = spectrogram(x,window,noverlap,f,fs)
x
是实数。据我了解,P
是x
的PSD估计值(相当于使用pwelch()
?),而S
的列是沿着x
的汉明窗口的STFT。 P
似乎与S
的幅度的平方根成比例关系。P
和S
的“单位”分别是什么?我查看了MATLAB文档中的spectrogram
。
但是,Spectrograms是二维函数,包括时间和频率。
S
代表时间向量T
的样本的DFT,相对于频率向量W
上的频率。
由于使用了窗口,结果是窗口化时间样本。
P
向量用于在相同的窗口化样本和频率上计算PSD(S
的平方绝对值)。
正如您所提到的,S是窗口化x的STFT,而P是PSD。
P可以通过S计算得出。
您可以在这里找到计算背景。这里
下面的示例展示了如何从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)')
spectrogram()
特定形式,文档没有说明为什么P
向量通常只与S
的平方绝对值成比例而不是相等。 - Hackiisan[___,ps] = spectrogram(___)
也会返回一个矩阵ps
,其中包含每个小节的功率谱密度 (PSD) 或功率谱的估计。因为 PSD 需要整个信号 $ \left( - \infty, \infty \right) $,所以它是一种估计。 - Royi