MATLAB功率谱函数psd与pwelch的使用
目錄
?
一、遇到的問題
二、功率譜函數psd與pwelch的用法與區別
一、遇到的問題
在網上看到這樣一個問題,然后搬過來記一下。
大家好,我用matlab的psd函數和pwelch函數求功率譜密度,但是得到的結果為什么下差大約30db,這個是怎么回事?
摘自:https://www.ilovematlab.cn/thread-339674-1-1.html
clear; Fs=1000; n=0:1/Fs:1; y=cos(2*pi*40*n)+3*cos(2*pi*100*n)+randn(size(n)); Nfft=1000; window=hanning(100); noverlap=20; dflag='none'; [Pxx,f]=psd(y,Nfft,Fs,window,noverlap); figure plot(f,10*log10(Pxx)); xlabel('frequency/Hz');ylabel('PSD/dB'); title('PSD-Welch method') hold on; [Pxx1,f1]=pwelch(y,window,noverlap,Nfft,Fs); plot(f1,10*log10(Pxx1),'r');針對這個問題的答案是:
| 程序中用PSD的用法是較早版本中的函數用法,在現在的新版本中已不這樣用了,是結合了spectrum函數一起使用。在較早版本中PSD函數得到的是功率譜,不是功率譜密度,所以與pwelch的結果(計算功率譜密度)會有30db的差別。 |
?怎么解決這個問題呢?
| [Pxx1,f1]=pwelch(y,window,noverlap,Nfft,Fs);? %加入下面一段 Pxx1=Pxx1*Fs/2.0 Pxx1(1)=Pxx1(1)*2; Pxx1(length(Pxx1))=Pxx1(length(Pxx1))*2; 結果完全一樣 |
二、功率譜函數psd與pwelch的用法與區別
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曲線完全重合。
..
摘自:http://blog.sina.com.cn/s/blog_68e67e250102ycou.html
總結
以上是生活随笔為你收集整理的MATLAB功率谱函数psd与pwelch的使用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 骨干云池存储方式_你好,我存个对象(大误
- 下一篇: struct lnode是什么结构类型_