出处:Matlab用pwelch函数计算功率谱 - 知乎 (zhihu.com)
1:函数形式
[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,也可以没有。
- 每一段加窗
- 每一段做谱分析
- 求平均
当不需要确定那么详细的参数而只是需要获得信号的频谱图时,该函数十分好用。
2.例子
可以看到,直接用pwelch画图即可
clc
close all
clear all
Fs = 20e6;
Rb = 1e6;
Fc = 5e6;
t_sim = 1e-3;
data_bit = randi([0 1], 1, t_sim*Rb);
data_map = 1 - 2*data_bit;
data_bx = data_map( floor((0 :t_sim*Fs - 1)*Rb/Fs) + 1 );
carrier = cos(2*pi*Fc/Fs*(0 :t_sim*Fs - 1));
data_bpsk = data_bx.*carrier ;
figure
plot(data_bpsk);
title('信号时域波形');
figure
pwelch(data_bpsk)
title('信号频谱')
图2极为功率谱