我有音频信号,我用 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 khz 的频率感兴趣,我想仅计算该区域的 PSD,并且还能够调整 PSD 的分辨率!知道如何做到这一点!
计算 PSD 时pwelch
,光谱分辨率、平均值数量和所需数据量之间始终存在权衡。我首选的使用方式是:
[psd_x, freq] = pwelch(x, hann(nfft), nfft/2, nfft, fsample);
与您的代码有一些差异:
我更喜欢使用hann http://www.mathworks.com/help/signal/ref/hann.html窗,因为我对汉明窗有不好的经验,如果你的信号包含例如大的直流分量,它们就不是很好。看这个比较 http://en.wikipedia.org/wiki/Window_function#Comparison_of_windows,这表明滚降hann
好得多,唯一的代价是第一旁瓣稍高。
我使用重叠 50% 的窗口(通过使用noverlap = nfft/2
),这样您就可以“充分利用您的数据”。在您的情况下,窗口之间只有 16/512 = 3% 的重叠,并且由于窗口函数在其边缘接近于零,因此边缘处的数据点的贡献不如窗口中间的点那么多。对于半重叠的窗口,这种影响要小得多。使重叠大于 50% 是没有用的,您将获得更多平均值,但由于您将多次使用相同的点,因此这不会添加任何额外信息。只要坚持50%就可以了。
我通常使 fft 的长度(pwelch 的第四个参数)与窗口长度相同。您希望这种不同的唯一情况是当您使用零填充 https://dsp.stackexchange.com/q/741,其用途有限。
有一些简单的公式,您在使用时应该记住它们pwelch
以及类似的功能:
光谱分辨率仅由窗口长度给出:df = 1 / t_window
单个窗口的长度为t_window = nfft / f_sample
.
对于半重叠窗口,所需数据总量为t_total = t_window * (n_average + 1) / 2
对于单侧光谱,PSD 的光谱箱数为nfft / 2
.
Nyquist http://en.wikipedia.org/wiki/Nyquist_rate: f_max = f_sample / 2
为了获得相当平滑的频谱,我通常会使用 20 个平均值。结合上述方程并填写所需的光谱分辨率,即可得出所需数据的总长度。或者相反,如果您只有有限数量的可用数据,您可以计算可以获得的频率分辨率。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)