【信号处理】为什么功率谱不是幅度谱的平方

为什么功率谱不是幅度谱的平方

幅度谱:magnitude=2N⋅∣FFT∣magnitude = \frac{2}{N} \cdot |FFT|magnitude=N2⋅∣FFT∣
功率谱:power_spectrum=2N2⋅∣FFT∣2power\_spectrum = \frac{2}{N^2} \cdot |FFT|^2power_spectrum=N22⋅∣FFT∣2

如果你直接用幅度谱平方,会得到 4N2⋅∣FFT∣2\frac{4}{N^2} \cdot |FFT|^2N24⋅∣FFT∣2,正好是功率谱的 2 倍。

所以,功率谱确实不是幅度谱的简单平方,根源在于"振幅"和"物理功率"之间的关系,以及单边谱的折叠方式。

下面我用最直白的方式把原因拆开。

  1. 一个正弦波的"振幅"和"平均功率"
    假设有一个电压正弦波:
    x(t)=Acos⁡(2πf0t)x(t) = A \cos(2\pi f_0 t)x(t)=Acos(2πf0t)
    它的振幅是 AAA(峰值电压)。

在 1 Ω 电阻上,它的瞬时功率是 x2(t)x^2(t)x2(t),平均功率是:

Pavg=1T∫0TA2cos⁡2(2πf0t) dt=A22P_{\text{avg}} = \frac{1}{T} \int_{0}^{T} A^{2} \cos^{2}(2\pi f_{0} t) \, dt = \frac{A^2}{2}Pavg=T1∫0TA2cos2(2πf0t)dt=2A2

结论:正弦波的平均功率 = 振幅² ÷ 2。

  1. FFT 得到的双边谱是什么样的
    对这个正弦波做 FFT(离散傅里叶变换),会在正频率
    +f0+f_0+f0 和负频率 −f0-f_0−f0 各出现一个峰。
    两个峰的幅度(忽略相位)都是 A/2A/2A/2 的量级(乘以点数 N 等比例,这里先不纠结 N)。

可以理解为:

总信号被"拆成"两半,一半能量在正频率,一半在负频率。

所以正频率分量的振幅是 A/2A/2A/2,负频率也是 A/2A/2A/2。

  1. 单边幅度谱为什么要"乘 2"
    实际频谱图通常只显示正频率(单边谱)。
    为了让它直接显示出原始正弦波的振幅 AAA,我们会把负频率的分量"合并"到正频率上,也就是将正频率的幅度乘以 2:

单边幅度 = 2×A2=A2 \times \frac{A}{2} = A2×2A=A

所以我的代码里:magnitude = (2/N) * |FFT|

得到的峰值就是振幅 1.0 和 0.5,符合直觉。

  1. 单边功率谱为什么要"乘 2"但最后又只有一半
    功率是振幅的平方,所以当我们把负频率的功率合并到正频率时,功率也要加倍(因为负频率的功率和正频率相等)。
    于是正频率的原始功率(基于双边谱)是 (A/2)2=A2/4(A/2)^2 = A^2/4(A/2)2=A2/4,加倍后变成 2×A2/4=A2/22 \times A^2/4 = A^2/22×A2/4=A2/2。

看到了吗?单边功率谱的正频率峰值是 A2/2A^2/2A2/2,恰好等于正弦波的平均功率,而不是 A2A^2A2。

如果用公式表达:

单边功率谱

2×(∣X(f)∣N)2=2N2∣FFT∣22 \times \left( \frac{|X(f)|}{N} \right)^2 = \frac{2}{N^2} |\text{FFT}|^22×(N∣X(f)∣)2=N22∣FFT∣2

如果直接用刚才的单边幅度谱 AAA 平方,会得到 A2A^2A2,这相当于将平均功率乘了 2,物理上不正确。

  1. 直观对比
对象 物理意义 正频率峰值 数值(A=1)
单边幅度谱 振幅 AAA 1
单边幅度谱 振幅 AAA 1
单边幅度谱的平方 (无直接物理意义) A2A^2A2 1
单边功率谱 平均功率 A2/2A^2 / 2A2/2 0.5

所以关系是:

功率谱 =2×= 2 \times=2× 幅度谱2^22

这就是差一个因子 2 的原因。

  1. 代码印证
    你可以在自己代码里加一行,直接验证:

    直接用幅度谱平方,再除以 2

    power_from_magnitude = magnitude**2 / 2

    画出对比

    plt.plot(positive_freqs, power_spectrum, label='直接计算的功率谱')
    plt.plot(positive_freqs, power_from_magnitude, '--', label='幅度谱^2/2')
    plt.legend()

两条线会完全重合。

一句话总结:

幅度谱描述每个频率的"振荡幅度"(峰值);

功率谱描述每个频率贡献的"平均功率";

对于正弦波,平均功率 =A2/2= A^2 / 2=A2/2,而不是 A2A^2A2,所以功率谱天然比幅度谱的平方少一半。单边谱折叠时这个 1/21/21/2 因子被保留了下来。