Eng*_*ine 2 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);
Run Code Online (Sandbox Code Playgroud)
因为FS=96000我只对5赫兹的频率感兴趣,我想仅为该区域计算PSD,并且还能够调整PSD的分辨率!任何想法要做到这一点!
在计算PSD时pwelch,总是需要在光谱分辨率,平均数和所需数据量之间进行权衡.我首选使用它的方法是:
[psd_x, freq] = pwelch(x, hann(nfft), nfft/2, nfft, fsample);
Run Code Online (Sandbox Code Playgroud)
与您的代码有一些区别:
我更喜欢使用hann windows,因为我对汉明窗户有不好的经验,如果你的信号包含例如一个大的DC组件,它们就不是很好.看到这个比较,这表明滚降hann更好,只需稍微高一点的旁瓣.
我使用重叠50%的窗口(通过使用noverlap = nfft/2),这样你就可以"充分利用数据".在您的情况下,窗口之间只有16/512 = 3%的重叠,并且由于窗口函数在其边缘处接近于零,因此边缘处的数据点的贡献不会与窗口中间的点相同.对于半重叠的窗口,这种效果要小得多.使重叠大于50%是没用的,你将得到更多的平均值,但由于你将多次使用相同的点,这不会添加任何额外的信息.坚持50%.
我通常将fft的长度(pwelch的第四个参数)与窗口长度相同.你想要有这种不同的唯一情况是你使用零填充,这是有限的使用.
有几个简单的公式,你在处理pwelch和类似的功能时应该记住:
光谱分辨率仅由窗口长度给出: df = 1 / t_window
单个窗口的长度是t_window = nfft / f_sample.
使用半重叠窗口,所需数据的总量为 t_total = t_window * (n_average + 1) / 2
对于单侧光谱,PSD的光谱区数是nfft / 2.
奈奎斯特:f_max = f_sample / 2
为了获得相当平滑的频谱,我通常会使用大约20个平均值.结合上述方程式并填写所需的光谱分辨率,可以得到所需数据的总长度.或者反过来说,如果您只有有限的可用数据,您可以计算您可以获得的频率分辨率.