Numpy FFT 的 Parseval 定理未得到满足

Parseval's Theorem with Numpy FFT is not fulfilled

我试图通过它的光谱来确定探测器在时域中记录的总能量。 使用 Numpy 的 FFT 库执行快速傅里叶变换后的第一步是确认 Parseval's theorem.

根据定理,时域和频域的总能量必须相同。我有两个问题无法解决。

下面是我的代码,带有示例性正弦函数。

# Python code

import matplotlib.pyplot as plt
import numpy as np

# Create a Sine function
dt = 0.001 # Time steps
t = np.arange(0,10,dt) # Time array
f = np.sin(np.pi*t) # Sine function
# f = np.sin(np.pi*t)+1 # Sine function with DC offset
N = len(t) # Number of samples

# Energy of function in time domain
energy_t = np.trapz(abs(f)**2)

# Energy of function in frequency domain
FFT = np.sqrt(2) * np.fft.rfft(f) # only positive frequencies; correct magnitude due to discarding of negative frequencies
FFT[0] /= np.sqrt(2) # DC magnitude does not have to be corrected
FFT[-1] /= np.sqrt(2) # Nyquist frequency does not have to be corrected
frq = np.fft.rfftfreq(N,d=dt) # FFT frequenices

# Energy of function in frequency domain
energy_f = np.trapz(abs(FFT)**2) / N

print('Parsevals theorem fulfilled: ' + str(energy_t - energy_f))

# Parsevals theorem with proper sample points

energy_t = np.trapz(abs(f)**2, x=t)
energy_f = np.trapz(abs(FFT)**2, x=frq) / N

print('Parsevals theorem NOT fulfilled: ' + str(energy_t - energy_f))

FFT 计算离散傅里叶变换 (DFT),它与(连续域)傅里叶变换不同。

对于DFT,Parseval’s theorem表示离散信号的平方幅度之和等于信号DFT的平方幅度之和。不涉及集成,因此您不应使用 trapz。只需使用 sum.


请注意,离散信号是一组样本 x[n] 在 n=0..N-1。离散域的傅里叶分析,以及所有相关操作,只考虑n,不考虑t。采样频率和记录这些样本的实际时间与这些分析无关。同样,DFT 在 k=0..[ 处产生一组样本 X[k] =26=]N-1,不在任何特定的fω与任何采样频率相关。

现在可以将 n 关联到 t 因为我们知道采样频率,并且可以关联 kf 因为我们知道采样频率。但是这些转换不应该让我们认为X[k]是对原始连续域信号进行连续域傅里叶变换的采样.他们尤其不应该让我们认为我们可以插入 X[k].

重构样本 x[n] 是通过添加 N 正弦曲线和参数来完成的由 X[k] 给出。 “介于两者之间”的那些 DFT 组件不应该是任何东西。对它们进行插值意味着我们添加样本中不存在的正弦曲线 x[n].

trapz使用线性插值来获得积分的估计,因此不适合用于离散傅里叶分析。