matlab求单边功率谱

求功率谱有好几种方法,本文例两种,一种是先求信号频谱,然后取平方后平均;第二种是用welch法(可指定各种窗)。

rng default;
fs = 1000;   % 采样率
t = 0:1/fs:1-1/fs;
% x = cos(2*pi*50*t)+ randn(size(t));
x = cos(2*pi*50*t);
nfft = length(x);  %指定傅里叶变换的点数(点数越大频率分辨率越高)

figure(1);  %画单边频谱图
sig_dft = abs(fft(x, nfft));
sig_dft(2:end-1) = 2*sig_dft(2:end-1);  %因为只显示单边谱,所以需要把数值*2,折起来
sig_amp = mapminmax(sig_dft/nfft);  %归一化
x1 = (0:nfft-1)*fs/nfft; 
plot(x1(1:250),sig_amp(1:250));  
xlabel('Frequency(Hz)');
ylabel('Amplitude');
title('Single sided Amplitude Spectrum');

figure(2);  %常规方法画单边功率谱
xdft = fft(x);
xdft = xdft(1:nfft/2+1);
psdx = (1/(fs*nfft)) * abs(xdft).^2;
psdx(2:end-1) = 2*psdx(2:end-1);
freq = 0:fs/nfft:fs/2;
semilogy(freq,psdx);  %semilogy以对数方式绘制纵轴

figure(3);  %修正周期图功率谱密度估计方法
[p,f]=pwelch(x, hanning(nfft), nfft/2, nfft, fs);  %指定不同的窗会影响功率谱结果
semilogy(f, p);
xlabel('Frequency(Hz)');
ylabel('Power Spectrum Density (dB/Hz)');
title('Single sided Power Spectrum Density');


figure(4);  %反变换,显示原图像
h = ifft(sig_dft, nfft);
plot(real(h));  %指定显示实部

matlab求单边功率谱_第1张图片
matlab求单边功率谱_第2张图片
按道理讲,figure2 和figure3的图像理应一致。但是在figure 3 这里我并不知道在welch法中应该指定什么窗才能得到figure 2一样的结果…有大佬知道的还望赐教
matlab求单边功率谱_第3张图片
matlab求单边功率谱_第4张图片

参考资料

[1]Matlab求功率谱密度(PSD)官方示例 https://ww2.mathworks.cn/help/signal/ug/power-spectral-density-estimates-using-fft.html?w.mathworks.com (无法跳转请将网址粘贴到搜索栏)
[2]MATLAB功率谱函数psd与pwelch等价问题
[3]MATLAB 求功率谱: 功率谱密度的数学定义
[4]频谱纵轴、单边谱部分解释
[5]百度文库:Matlab傅里叶变换傅里叶逆变换-FFT-IFF
[6]知乎:功率谱密度函数

你可能感兴趣的:(matlab求单边功率谱)