
要使用的函数是pwelch,形式是
[pxx,f] = pwelch(x,window,noverlap,NFFT,fs)
x 是一维的信号数据;
window 是计算功率谱每个窗口的信号长度,关于窗函数的长度选择可以参考公式x_length/fren;谱分析中窗的选取
noverlap 是每个窗口之间重叠的长度,通常取33%~50%。窗口之间重叠得越多,图像越平滑(blurred);反之则更粗糙(blocky);
NFFT,即FFT数据点的个数,可以变化。但是最大长度不能超过每一段的点数。当然,通常设置NFFT为大于每一段的点数的最小2次幂,这样可以得到最高的频域分辨率。NFFT越小,最终会越粗糙;
fs是采样频率,最终的结果,横坐标的最大值为采样频率的一半;
pxx 为计算得到的功率谱数值;
f 为功率谱数值对于频率的位置;
--
pwelch的方法概括步骤如下
- 将信号分为多段,每段之间可以有overlapping,也可以没有。
- 每一段加窗
- 每一段做谱分析
- 求平均。
下面来看一个例子,首先准备一个余弦函数,周期为1,以10hz采样
n = 0:0.1:20;
x = cos(2*pi*n);
plot(n,x,'.-');
fs=10;

现在用pwelch画一下,功率谱
n = 0:0.1:20;
x = cos(2*pi*n);%+randn(size(n));
%plot(n,x,'.-');
fs=10;
NFFT=50;
window=50;
noverlap=30;
[pxx,f] = pwelch(x,window,noverlap,NFFT,fs);
plot(f,10*log10(pxx))
xlabel('Frequency (Hz)')
ylabel('PSD (dB/Hz)')
结果如下图,

现在来考察不同参数变化的影响,保持其他参数不变
(1) 不同NFFT

(2)不同window大小

(3)不同overlap,差别不大,可能是因为这里我们没有加噪音

(4)不同fs,只会影响横坐标的位置

参考链接:
Matlab谱分析的pwelch方法www.jianshu.com