对于具有 FFT 的单面功率谱,我们是否应该将 0Hz 的功率除以 2?

信息处理 fft 功率谱密度
2022-01-31 18:18:18

为了使我的问题尽可能清楚,我将举一个例子。我想绘制信号的一侧功率谱。例如,我的信号是“50Hz 正弦波,幅度为 1V”和“DC 偏移电压为 1V”之和。我创建了这个信号并绘制了它的 FFT,我将功率定义为幅度平方除以 2。

这是我的代码:

import numpy as np
import matplotlib.pyplot as plt
from scipy import signal
import scipy.fftpack

f = 50 #signal freq
D = 1 #duration
fs = 800 #sampling freq
T = 1/f #signal period
N = int((D/(1/fs))+1) #number of smaples
 
t = np.linspace(0, D, num=N, endpoint=True) #time vector
dc = 1
y = np.sin(2*np.pi*f*t) + dc 

plt.plot(t, y,'-b')
plt.plot(t, y,'.r')
plt.title('~ Sinusoid ~')
plt.xlabel('time [s]')
plt.ylabel('Voltage [V]')
plt.grid()
plt.show()

#FFT
plt.figure()
y = y
T = t[2]-t[1]
sampling_rate = 1/T
N = len(y)
yf = scipy.fftpack.fft(y)
xf = np.linspace(0.0, 1.0/(2.0*T), N//2)
amplitude = 2.0/N * np.abs(yf[:N//2])
pow = amplitude*amplitude/2

plt.plot(xf, pow,'b')
plt.grid()
plt.xlabel('Frequency [Hz]')
plt.ylabel('Power [W]')

在此处输入图像描述 在此处输入图像描述

现在正弦分量的 rms 功率可以计算为(幅度平方)/2,即 0.5W,这就是我们在上图中看到的。

对于 1V DC 分量,我会说 rms 功率是(幅度平方),即 1W。但是情节显示了两次,即2W。

我的问题是:我应该在代码中的 FFT 图中以 0Hz 的频率将功率除以二,还是我解释错了?

1个回答

“2”的因子来自负频率的贡献,这不适用于直流。

绘制此图的更好方法是不乘以 2,而是绘制从 -400Hz 到 +400Hz 的整个 FFT 范围。在那里,您将看到三个分量:DC 时为 1 W,-50Hz 和 +50Hz 时各为 0.25W,这正是这里发生的情况。

如果要在一侧绘制功率谱,则需要乘以 2,DC 和 Nyquist 除外,它们没有负频率等效值。