【问题标题】:Parseval's Theorem with Numpy FFT is not fulfilled不满足 Numpy FFT 的 Parseval 定理
【发布时间】:2021-05-03 12:51:31
【问题描述】:

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

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

  • 当我在 np.trapz() 集成期间没有为 x 轴使用正确的单位时,我可以确认该定理。一旦我使用我的实际采样点/频率,结果就会关闭。我不明白为什么会这样,我想知道是否可以应用规范化来解决此错误。
  • 当我对信号应用直流偏移时,我无法确认定理(取消注释 f = np.sin(np.pi**t)* 行)。

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

# 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))

【问题讨论】:

  • trapz 只赋予第一个和最后一个样本一半的权重。使用sum 或将第一个样本附加到末尾,因为频率和信号都应该是循环的。
  • 两种方法都很好用,谢谢!

标签: python signal-processing fft


【解决方案1】:

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

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


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

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

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

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

【讨论】:

  • 是的,sum 完成了这项工作,我得到了正确的结果,谢谢!但是,由于 fft 的总能量是守恒的,为什么时域关于时间的积分和频域关于频率的积分不相等? @克里斯
  • @Alberto:使用trapz 意味着线性插值。我已经在答案中添加了一个讨论,说明为什么这是不合适的。
猜你喜欢
  • 1970-01-01
  • 2012-12-10
  • 2018-09-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-30
  • 1970-01-01
相关资源
最近更新 更多