首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >python手动fft错误

python手动fft错误
EN

Stack Overflow用户
提问于 2016-02-01 10:57:29
回答 1查看 121关注 0票数 0

我试图还原python中的fft函数。在这里,我们看到了一个类似的问题,手动fft不能给我与fft相同的结果,但是我很难判断我是在做同样的错误,还是在做不同的错误。

代码语言:javascript
复制
import numpy as np
import numpy.random as npr

N=9 ### 10 -1 
MC=10

###Genrate soem data
data=complex(1,0)*npr.uniform(size=(N,MC))+complex(0,1)*npr.uniform(size=(N,MC))

naive_fft=complex(1,0)*np.zeros((N,MC))
for K in range(N):
    for m in range(N):
        phase=(2*np.pi*K*m)/float(N+1)
        naive_fft[K,:]=naive_fft[K,:]+data[m,:]*np.exp(complex(0,1)*phase)

fft=np.fft.fft(data,axis=0)
ifft=np.fft.ifft(data,axis=0)
print('fft')
print(naive_fft-fft)
print('ifft')
print(naive_fft-ifft*(N+1.0))

将我的结果与numpy fft进行比较,我既不能再现fft,也不能再现ifft (只有naive_fft[0,:]似乎与fft[0,:]值匹配。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-02-01 14:52:44

有几件事要提。首先,在Python中,我们使用1j来表示假想单位,而不是complex(0, 1)。如果您想将您的结果与numpy进行比较,那么您必须检查numpy是如何实现fft的。有关细节,请参阅Numpy FFT文档。您会发现numpy遵循最常见的fft定义,它使用负指数。此外,您的阶段中的float(N+1)是完全错误的。它必须读N。总之,你拥有:

代码语言:javascript
复制
# ...
naive_fft = np.zeros((N,MC), dtype='complex')
for K in range(N):
    for m in range(N):
        phase=(-2*np.pi*K*m) / float(N)
        naive_fft[K] += data[m] * np.exp(phase*1j)

xfft = np.fft.fft(data, axis=0)
# ...

代码语言:javascript
复制
>>> np.isclose(xfft, naive_fft).all()
    True

逆变换工作类似,但有一个正指数。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35128772

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档