MATLAB功率谱函数psd与pwelch等价问题

 
再附上一篇讨论psd和pwelch区别的帖子https://www.ilovematlab.cn/thread-339674-1-1.html
 
psd与pwelch均为求功率谱的函数,但是psd求得的功率谱不可直接使用还需要进行一定的变换。
现给出二者的等价关系:
[px,fx]=psd(x,nfft,fs,Windows,noverlap);
 px=px/fs*2;%---自谱
px([1,end])=px([1,end])/2; %---直流分量
 
与之等价的pwelch函数表达为:
[px,fx]=pwelch(x,Windows,noverlap,nfft,fs);
 
其中,
x --------- 时程信号;
nfft--------傅里叶变换(fft)点数;
Windows--窗函数,通常设为hanning(nfft)
nooverlap-重叠的点数,通常为nfft/2;
px---------求得的信号x的功率谱密度;
fx----------对应px的频率序列。
需要说明的是,若中间有个变量不知如何设定(如noverlap),却仍然想设定该变量后面的值,
可采用中括号[]代替,[]则表示该变量并未设定具体值,而是采用函数默认值来取。
 
下面以一具体算例给大家做演示:
clear
x=randn(10000,1);%生成随机信号
fs=10;  %---------采样频率
nfft=1024;%-------fft点数
%---psd求谱
[px,fx]=psd(x,nfft,fs,hanning(nfft),nfft/2);
px=px/fs*2;
px([1,end])=px([1,end])/2; 
%---pwelch求谱
[px2,fx2]=pwelch(x,hanning(nfft),nfft/2,nfft,fs);
%---绘图
figure
semilogy(fx,px);hold on
semilogy(fx2,px2,'r')
legend('psd','pwelch')
title('psd与pwelch方法求谱结果比较')
 
运行以上程序得到下图,由图可见psd曲线与pwelch曲线完全重合
MATLAB功率谱函数psd与pwelch等价问题
注意:由于以上代码中给的是随机信号,所以不同的人得到的功率谱曲线可能不一样,但是psd结果与pwelch结果一定是重合的。