周期性功率信号的频谱函数定义

 对于周期性的功率信号的,设一个周期性功率信号x(t)的周期为T0,则将其频谱(frequency spectrum)函数定义为下式积分变换:

Python功率谱 wheel 功率谱函数_Python功率谱 wheel

式中:F0=1/T0;n为整数,-∞<n<+∞,C(nF0)表示C是nf0的函数,并简记为Cn。

一般来说,上式中的频谱函数Cn是一个复数,代表在频率nF0上信号分量的复振幅。|Cn|为频率nF0的信号分量的振幅。

同时,对于周期性功率信号来说,其频谱函数Cn是离散的,只在F0的整数倍上取值。由于n可以取负值,所以在负频率上Cn也有值。通常称Cn为双边(频)谱。双边谱中的负频谱仅在数学上有意义;在物理上,并不存在负频率。但是我们可以找到物理上是信号的频谱和数学上的频谱函数之间的关系。——频谱函数的正品率部分和负频率部分存在复数共轭关系,这就是说,负频率和正频率谱的模式偶对称的,相位是奇对称的。摘自《通信原理 第6版》

周期性功率信号的parseval定理

设x(t)是周期性实功率信号,周期等于T0,基频为F0=1/T0,则其傅里叶级数展开式为

Python功率谱 wheel 功率谱函数_Python功率谱 wheel_02

所以,其平均功率可以写为

Python功率谱 wheel 功率谱函数_matlab_03

Python功率谱 wheel 功率谱函数_通信原理_04

上式就是周期性功率信号的parseval定理。它表示周期性功率信号的平均功率等于其频谱的模的平方和。摘自《通信原理 第6版》

关于求取离散信号功率谱的一点试验,仅供各位读者参考。

Fs=1000;
sec=5;%5秒的数据
t=1/Fs:1/Fs:sec;

x = 5*sin(2*pi*40*t) + 3*sin(2*pi*100*t) + rand(size(t));
x = 4*sin(2*pi*50*t) + 1*sin(2*pi*20*t) + 3*sin(2*pi*80*t);
% x = cos(2*pi*100*t) + randn(size(t));

nfft=1024;
        
[Pxx,f]=periodogram(x(1:nfft),rectwin(nfft),nfft,Fs,'twosided');%矩形窗 双边
[Pxx_2,f_2]=periodogram(x(1:nfft),rectwin(nfft),nfft,Fs,'onesided');%矩形窗  单边

y=fft(x(1:nfft), nfft);
y_2=abs(y).^2/(nfft*nfft);
fxP_2 = y_2(1: nfft/2);
fxP_2(2:end) = 2* fxP_2(2:end);%单边功率谱

freq = 0 : Fs/nfft : Fs-Fs/nfft;
freq_2 = 0 : Fs/nfft : Fs/2-Fs/nfft;

figure(1)
subplot(211)

plot(f, Pxx, 'b');
title('双边谱估计-periodogram');
hold on;
subplot(212)
plot(freq,y_2,'r');
title('双边谱估计-fft');

figure(2)
subplot(211)

plot(f_2, Pxx_2, 'b');
title('单边谱估计-periodogram');
hold on;
subplot(212)
plot(freq_2, fxP_2, 'r');
title('单边谱估计-fft');

由于要对比计算的结果,所以并未进行10*log10()的转换。

代码的运行结果为:

Python功率谱 wheel 功率谱函数_matlab_05

Python功率谱 wheel 功率谱函数_函数定义_06

关于为何matlab函数fft之后要除以N/2的问题,请参考以下二链接的描述:

为什么FFT后幅值要除以N/2 - 知乎

Python功率谱 wheel 功率谱函数_matlab_07