Parseval定理不适用于i

2024-03-29 15:59:13 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个时间信号,我计算它的傅里叶变换来得到频率信号。根据Parseval定理,这两个信号具有相同的能量。我用Python成功地演示了它。然而,当我计算频率信号的傅里叶逆变换时,能量不再守恒。这是我的代码:

import numpy as np
import numpy.fft as nf
import matplotlib.pyplot as plt

#create a gaussian as a temporal signal    
x = np.linspace(-10.0,10.0,num=1000)
dx = x[1]-x[0]
sigma = 0.4
gx = (1.0/(2.0*np.pi*sigma**2.0)**0.5)*np.exp(-0.5*(x/sigma)**2.0)

#calculate the spacing of the frequencial signal
f=nf.fftshift(nf.fftfreq(1000,dx))
kk = f*(2.0*np.pi)
dk = kk[1]-kk[0]

#calculate the frequencial signal (FT)
#the convention used here allows to find the same energy
gkk = nf.fftshift(nf.fft(nf.fftshift(gx)))*(dx/(2.0*np.pi)**0.5)

#inverse FT
gx_ = nf.ifft(nf.ifftshift(gkk))*dk/(2 * np.pi)**0.5

#Parseval's theorem
print("Total energy in time domain = "+str(sum(abs(gx)**2.0)*dx))
print("Total energy in freq domain = "+str(sum(abs(gkk)**2.0)*dk))
print("Total energy after iFT = "+str(sum(abs(gx_)**2.0)*dx))

在执行这段代码之后,你可以看到两个第一能量是相同的,而第三个能量比第一个能量小几个数量级,尽管我应该找到相同的能量。这里发生了什么事?在


Tags: theimportsignal信号asnppisigma
1条回答
网友
1楼 · 发布于 2024-03-29 15:59:13

与其他软件相比,numpyFFT程序实际上会调整序列长度,因此您可以得到

nf.ifft(nf.fft(gx)) == gx

直到某个浮点错误。如果您的dxdk是按常规方法计算的,那么{}只适用于未调整的FFT例程。在

您可以使用测试numpy.fft的行为

^{pr2}$

这告诉我们fft是通常的未调整变换,ifft将结果除以序列长度{}。典型的ifft可以通过

^{3}$

那你就明白了

gx == gxx/1000

最多浮点错误。或者您可以使用

#inverse FT
gx_ = nf.ifft(nf.ifftshift(gkk))*(num*dk)/(2 * np.pi)**0.5

相关问题 更多 >