【问题标题】:Parseval's theorem in PythonPython 中的 Parseval 定理
【发布时间】:2012-12-10 07:04:48
【问题描述】:

我正在尝试掌握 Python 的 fft 功能,而我偶然发现的一件奇怪的事情是 Parseval's theorem 似乎并不适用,因为它现在给出了大约 50 的差异,而它应该是 0。

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

pi = np.pi

tdata = np.arange(5999.)/300
dt = tdata[1]-tdata[0]

datay = np.sin(pi*tdata)+2*np.sin(pi*2*tdata)
N = len(datay)

fouriery = abs(fftpack.rfft(datay))/N

freqs = fftpack.rfftfreq(len(datay), d=(tdata[1]-tdata[0]))

df = freqs[1] - freqs[0]

parceval = sum(datay**2)*dt - sum(fouriery**2)*df
print parceval

plt.plot(freqs, fouriery, 'b-')
plt.xlim(0,3)
plt.show()

我很确定这是一个标准化因子,但我似乎无法找到它,因为我能找到的关于此函数的所有信息都是 scipy.fftpack.rfft documentation

【问题讨论】:

    标签: python math numpy scipy fft


    【解决方案1】:

    您的归一化因子来自尝试将 Parseval 定理应用于将连续信号傅里叶变换到离散序列的过程。在the wikipedia article on the Discrete Fourier transform的侧板上,与Dirac combs讨论了傅里叶变换、傅里叶级数、离散傅里叶变换和采样的关系。

    长话短说,Parseval's theorem, when applied to DFTs 不需要积分,而是求和:2*pi 是通过将 dtdf 相乘得出的。

    还要注意,因为您使用的是scipy.fftpack.rfft,所以您得到的不是数据的正确 DFT,而只是它的正半部分,因为负部分与它对称。因此,由于您只添加了一半的数据,加上 DC 术语中的 0,因此缺少 2 以获取 @unutbu 找到的 4*pi

    无论如何,如果datay 持有你的序列,你可以验证 Parseval 定理如下:

    fouriery = fftpack.rfft(datay)
    N = len(datay)
    parseval_1 = np.sum(datay**2)
    parseval_2 = (fouriery[0]**2 + 2 * np.sum(fouriery[1:]**2)) / N
    print parseval_1 - parseval_2
    

    使用scipy.fftpack.fftnumpy.fft.fft 的第二个求和不需要采取这种奇怪的形式:

    fouriery_1 = fftpack.fft(datay)
    fouriery_2 = np.fft.fft(datay)
    N = len(datay)
    parseval_1 = np.sum(datay**2)
    parseval_2_1 = np.sum(np.abs(fouriery_1)**2) / N
    parseval_2_2 = np.sum(np.abs(fouriery_2)**2) / N
    print parseval_1 - parseval_2_1
    print parseval_1 - parseval_2_2
    

    【讨论】:

    • 注意:在某种程度上这是浮点数与实数不同的一般问题的一个方面。
    • @Jamie - 很好的解释!附带说明一下,您可以使用 np.allclose 检查浮点数的近似相等性,而不是打印差异。例如。 assert np.allclose(parseval_1, parseval_2_1)allclose 主要用于检查两个数组中的所有项目是否相似,因此得名,但它适用于标量。)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-09
    • 1970-01-01
    • 1970-01-01
    • 2016-04-02
    • 2010-11-30
    相关资源
    最近更新 更多