gpt4 book ai didi

python - Python 中的 Parseval 定理

转载 作者:太空狗 更新时间:2023-10-29 17:43:29 27 4
gpt4 key购买 nike

我正试图掌握 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 .

最佳答案

您的归一化因子来自尝试将 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 以达到 4*pi @unutbu 发现的。

在任何情况下,如果 datay 持有你的序列,你可以验证帕塞瓦尔定理如下:

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

关于python - Python 中的 Parseval 定理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14011506/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com