如何使用Matlab提高PSD的分辨率

时间:2014-03-26 12:57:48

标签: matlab signal-processing fft

我有和音频信号,我用Matlab读,并使用pwelch获取其PSD,这里是我正在使用的代码

[x,Fs] = audioread('audioFile.wav');
x= x(:,1) %  mono
[xPSD,f] = pwelch(x,hamming(512),16,1024,Fs);
plot(f,xPSD);

因为FS=96000而且我只对5赫兹以下的频率感兴趣,我想仅为该区域计算PSD,并且还能够调整PSD的分辨率!任何想法要做到这一点!

1 个答案:

答案 0 :(得分:5)

使用pwelch计算PSD时,始终需要在光谱分辨率,平均数和所需数据量之间进行权衡。我首选使用它的方法是:

[psd_x, freq] = pwelch(x, hann(nfft), nfft/2, nfft, fsample);

与您的代码存在一些差异:

  1. 我更喜欢使用hann窗口,因为我对汉明窗户有不好的体验,如果你的信号包含例如一个大的直流分量,它们就不是很好。请参阅this comparison,其中显示hann的滚降效果要好得多,只需要略高一点的旁瓣。

  2. 我使用重叠50%的窗口(使用noverlap = nfft/2),这样您就可以“充分利用数据”。在您的情况下,窗口之间只有16/512 = 3%的重叠,并且由于窗口函数在其边缘处接近于零,因此边缘处的数据点的贡献不会与窗口中间的点相同。对于半重叠的窗口,这种效果要小得多。使重叠大于50%是没用的,你将得到更多的平均值,但由于你将多次使用相同的点,这不会添加任何额外的信息。坚持50%。

  3. 我通常将fft的长度(pwelch的第四个参数)与窗口长度相同。您希望使用此唯一案例的唯一情况是使用zero-padding,但使用有限。

  4. 有一些简单的公式,在使用pwelch和类似函数时应该记住这些公式:

    • 光谱分辨率仅由窗口长度给出:df = 1 / t_window

    • 单个窗口的长度为t_window = nfft / f_sample

    • 对于半重叠窗口,所需数据总量为t_total = t_window * (n_average + 1) / 2

    • 对于单侧光谱,PSD的光谱区数为nfft / 2

    • Nyquistf_max = f_sample / 2

    为了获得相当平滑的频谱,我通常会使用大约20个平均值。结合上述方程式并填写所需的光谱分辨率,可以得到所需数据的总长度。或者反过来说,如果您只有有限的可用数据,您可以计算出您可以获得的频率分辨率。