http://www.ilovematlab.cn/thread-218001-1-1.html
http://www.ilovematlab.cn/thread-52799-1-1.html
http://www.ilovematlab.cn/thread-327632-1-1.html
你的版本是什么?从R2013a开始,建议用pwelch,在那之前,建议用spectrum.welch
形状上没啥差异,无非是缺省用的窗不一样,但是这个pwelch的结果没有除采样率
fs = 1000;
t=0:1/fs:1;
y=cos(2*pi*40*t)+3*cos(2*pi*100*t)+randn(size(t));
nfft = 2^nextpow2(length(y));
subplot(3, 1, 1);
Hs=spectrum.welch;
hpsd = psd(Hs, y,'NFFT',nfft,'Fs',fs);
Pw = hpsd.Data;
Fw = hpsd.Frequencies;
plot(Fw, Pw)
grid;axis([0 500 0 max(Pw)]);title('psd');
subplot(3, 1, 2);
[Pxx,fxx]=pwelch(y,[],[],[],fs,'twosided');
plot(fxx, Pxx);
grid;axis([0 500 0 max(Pxx)]);title('pwelch');
subplot(3, 1, 3);
n = 0 : nfft/2;
f = n * fs / nfft;
Y = fft(y, nfft) / nfft;
plot_Y = 2 * abs(Y(1:nfft/2+1));
plot(f, plot_Y);
grid;axis([0 500 0 max(plot_Y)]);title('fft');
在第8行后面加Hs.SegmentLength =
222;然后在第9行后面加twosided(hpsd);最后在pwelch里第四个输入用nfft这样前两个图应该基本上就一样了。至于fft,那个不是功率谱,而是频谱,所以没有可比性。而且就算你把它除采样频率,换成功率谱,它也是和周期图对应,和welch还是不一样的。
我认为在这两命令中window的含义是不一样的,在[Pxx,f]=pwelch(x,window,noverlap,nfft,fs)中window是一个具体的窗函数,例如window=hanning(256)而在h
=
spectrum.welch('Hann',window,100*noverlap/window);中window只是窗的长度,例如256。我做了一个试验得到的结果两命令完全一样:x=load('hdata.txt');fs=8000;nfft=256;noverlap=128;window=hanning(nfft);[Pxx,f]=pwelch(x,window,noverlap,nfft,fs);subplot
211;
plot(f,Pxx);title('pwelch');window=256;h
=
spectrum.welch('Hann',window,100*noverlap/window);hpsd
=
psd(h,x,'NFFT',nfft,'Fs',fs);P=hpsd.Data;ff=hpsd.Frequencies;subplot
212;
plot(ff,P);title('spectrum.welch');得的图如下: