在信号处理与频谱分析领域,掌握频谱、功率谱的基本概念至关重要。通常,我们通过FFT(快速傅里叶变换)和pwelch(Welch平均周期图法)来计算功率谱密度。本文将用清晰的步骤和代码实例,带你深入理解这两种方法的原理、操作要点及其差异。
一、先搞清楚频谱的对称性
许多从事信号处理的朋友对FFT并不陌生,它是实现傅里叶变换的核心工具。这里不再赘述FFT函数的具体用法,但有一个关键点必须牢记:实信号经FFT变换后的频谱关于0频对称,呈偶函数特性。例如,对于信号st = cos(2*pi*f0*t)+1;,若t的长度为4000,则0频分量位于第一个点。经过fftshift操作后,0频移至第2001个点,此时频谱关于第2001个点对称,而非整个4000个点左右对称。
小提示: 深入理解频谱对称性,对后续功率谱计算中的“乘2”修正操作至关重要,忽略这一点将导致功率谱结果错误。
二、pwelch函数详解
pwelch函数用于计算功率谱密度,它基于Welch平均周期图法对信号进行谱估计。其核心思想是将信号分段,每段加窗后计算周期图,再对所有段的周期图进行平均,从而降低估计方差。pwelch函数的基本调用格式如下:
pxx = pwelch(x,window,noverlap,nfft)
[pxx,f] = pwelch(x,window,noverlap,f,fs)
其中参数含义如下:
- X:输入信号序列;
- window:若为数值,表示窗函数长度(即分段长度L),默认窗函数为汉明窗;若为向量,则直接作为窗函数序列;
- NFFT:FFT计算点数。当X为实数时,若NFFT为偶数,则Pxx长度为(NFFT/2+1);若NFFT为奇数,则Pxx长度为(NFFT+1)/2。当X为复数时,Pxx长度等于NFFT。若未指定NFFT,默认值为256或大于信号长度的下一个2的幂次;
- Fs:采样频率,用于绘制功率谱曲线时的频率轴,默认值为1;
- Pxx:输出功率谱密度估计值;
- F:与Pxx对应的频率向量;
- NOVERLAP:各分段之间的重叠样本数。通常设置NOVERLAP = L/2,即50%重叠,可得到良好平衡的Welch平均周期图。
小提示: 设置noverlap时,通常推荐50%重叠(noverlap = L/2),这样能够在方差与偏差之间取得理想的折中。
三、代码示例:FFT与pwelch对比
以下通过代码示例,分别展示使用FFT和pwelch计算信号功率谱的过程。请留意代码中的注释说明:
clc;close all;clear all;
fs = 10e6;
N = 4000;
t = (0:N-1)/fs;
f0 = 1e5;
st = cos(2*pi*f0*t) + 1;
st_fft = fft(st);
psdx = abs(st_fft(1:end/2+1)).^2/fs/N; %功率谱密度为能量谱密度除以时间,摸值的平方即为能量谱
psdx(2:end) = 2*psdx(2:end); %乘2是因为fft结果是对称的,在计算功率时需要把功率加回来;第一个点是0频,这个点并不对称
freq = linspace(0,fs/2,length(psdx));
[pxx,f] = pwelch(st,rectwin(N),32,N,fs);
figure;
plot(freq,psdx);
title('fft方法求功率谱密度');
grid on
figure;
plot(f,pxx);
title('fwelch方法求功率谱密度');
grid on
四、结果对比
执行上述代码后,将生成两个图形窗口。第一幅图显示的是基于FFT直接计算的功率谱密度,第二幅图则是pwelch方法得到的功率谱密度。


观察可见,两种方法在1e5 Hz频率处均出现峰值,对应于信号中的余弦分量。FFT方法由于仅使用单段数据,谱线更尖锐,频率分辨率更高;而pwelch方法通过分段和平均,谱线更平滑,方差更小,但频率分辨率有所降低。
五、常见问题与解答
- 问:为什么使用FFT计算功率谱时需要乘以2?
答: 因为实信号FFT结果关于0频对称,只有一半的频率点包含独立信息。若不乘2,仅取一半频谱会丢失另一半对称部分的能量。但需注意:0频(直流分量)是对称中心,本身不重复,因此应从第2个点开始乘2,而不是第1个点(0频)。 - 问:pwelch中window参数设为rectwin(N)的含义是什么?
答:rectwin(N)表示采用矩形窗,且窗口长度等于信号总长度N,即不进行分段。实际应用中,通常让窗口长度小于N,并搭配适当重叠,以获取更佳的平均效果。此处使用矩形窗且不分段,仅是为了与FFT方法进行直接对比。 - 问:pwelch输出的频率分辨率如何确定?
答: pwelch的频率分辨率由窗函数长度L决定:频率分辨率 = fs / L。窗长越大,分辨率越高,但平均次数减少,方差增大;反之则分辨率降低,方差减小。实际应用中需根据信号特性进行权衡。 - 问:若信号为复数,pwelch返回的Pxx长度会怎样?
答: 当X为复数时,Pxx长度等于NFFT(若未指定NFFT则取默认值),不再减半,因为复数频谱不具有对称性。
六、总结
通过本文的学习,你已掌握两种功率谱计算方法:直接使用FFT计算时,需注意频谱对称性及乘2修正;而使用pwelch函数,则可灵活调整窗函数、重叠比例和FFT点数,获得更平滑的谱估计结果。在实际工程中,建议根据信号特性与具体需求选择最合适的方法。
