赞
踩
功率谱和功率谱密度是信号处理中常见的两个概念,而且很容易混淆,因此在学习之余总结一下,与君共勉。
功率谱是用来描述功率信号的,表示信号在每个频率分量上的功率,单位是w(或dB)。 根据维纳—辛钦定理可知:一段信号的功率谱等于其自相关函数的傅里叶变换。
因此计算功率谱有两种方法:
1)直接法:信号傅里叶变换的平方/区间长度;
2)相关函数法:信号自相关函数的傅里叶变换。
功率谱密度和功率谱是不同的概念。功率谱密度表征的是单位频带内的信号功率,单位是w/Hz(或dB/Hz)。
功率谱和功率谱密度都与傅里叶变换有着紧密的联系,本文主要针对频率成分不随时间变化的平稳信号,采用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)")
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)")
为了验证上述方法的计算结果是否正确,接下来使用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)")
二者的曲线重合,再来看一下最大误差:
maxerr = max(psdx' - periodogram(x,win,N,fs));
<< maxerr = -3.6629e-12
显然,对比结果验证了上述方法计算PS、PSD的正确性。
需要注意的部分主要是窗函数修正系数,以及总功率乘以因子,感兴趣的可以继续深入了解,也欢迎与我私信交流。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。