使用FFT估计信号功率谱、功率谱密度

前言

       功率谱和功率谱密度是信号处理中常见的两个概念,而且很容易混淆,因此在学习之余总结一下,与君共勉。

功率谱(Power Spectrum,PS)

        功率谱是用来描述功率信号的,表示信号在每个频率分量上的功率,单位是w(或dB)。 根据维纳—辛钦定理可知:一段信号的功率谱等于其自相关函数的傅里叶变换。

        因此计算功率谱有两种方法:

1)直接法:信号傅里叶变换的平方/区间长度;

2)相关函数法:信号自相关函数的傅里叶变换。

功率谱密度(Power Spectrum Density,PSD)

       功率谱密度和功率谱是不同的概念。功率谱密度表征的是单位频带内的信号功率,单位是w/Hz(或dB/Hz)。

FFT方法估计PS、PSD

       功率谱和功率谱密度都与傅里叶变换有着紧密的联系,本文主要针对频率成分不随时间变化的平稳信号,采用FFT方法获取PS、PSD估计,以下代码仅供学习参考。

1)首先仿真生成一段信号

fs = 32000;
N = 1024;
t = 0:1/fs:(N-1)/fs;
freq = 8000;
x = cos(2*pi*freq*t) + randn(size(t))/sqrt(2);

2)加窗(是否加窗取决于实际情况),进行傅里叶变换

win = hamming(N);
xw = 1.586*x.*win.'; % 海明窗修正系数
xdft = fft(xw);
xdft = xdft(1:N/2+1);

由于这里添加了海明窗,为了使加窗后信号能量保证不变,因此需要加入一个能量修正系数。

3)计算功率谱

psx = (1/N) * abs(xdft).^2;
psx(2:end-1) = 2*psx(2:end-1);

由于信号是实数值信号,只需要对正负频率之一进行功率估计,并且零频率 (DC) 和奈奎斯特频率不会出现两次。为了保持总功率不变,同时在两组(正频率和负频率)中出现的所有频率乘以2。

4)绘图

fb = 0:fs/N:fs/2;
figure
plot(fb/1e3,10*log10(psx))
grid on
grid minor
title("Power Spectrum Using FFT")
xlabel("Frequency (kHz)")
ylabel("Power (dB)")

使用FFT估计信号功率谱、功率谱密度_第1张图片

 5)计算功率谱密度,绘图

psdx = (1/(fs*N)) * abs(xdft).^2;
psdx(2:end-1) = 2*psdx(2:end-1);
figure
plot(fb/1e3,10*log10(psdx))
grid on
grid minor
title("Power Spectrum Density Using FFT")
xlabel("Frequency (kHz)")
ylabel("Power/Frequency (dB/Hz)")

使用FFT估计信号功率谱、功率谱密度_第2张图片

对比验证

       为了验证上述方法的计算结果是否正确,接下来使用MATLAB的periodogram函数绘制周期图进行对比。

figure
plot(fb/1e3,10*log10(psdx),'r-.'), hold on
periodogram(x,win,N,fs)  
grid on
grid minor
title("Power Spectrum Density")
legend('FFT','Periodogram')
xlabel("Frequency (kHz)")
ylabel("Power/Frequency (dB/Hz)")

使用FFT估计信号功率谱、功率谱密度_第3张图片

 二者的曲线重合,再来看一下最大误差:

maxerr = max(psdx' - periodogram(x,win,N,fs));

<< maxerr = -3.6629e-12

显然,对比结果验证了上述方法计算PS、PSD的正确性。

结语

       需要注意的部分主要是窗函数修正系数,以及总功率乘以因子,感兴趣的可以继续深入了解,也欢迎与我私信交流。

总结不易,点个赞吧(●'◡'●)

你可能感兴趣的:(信号处理,功率谱,matlab)