python 手动 fft 失败
python manual fft botched
我正在尝试重新生成 python 中的 fft 函数。我在这里看到了一个类似的问题 Manual fft not giving me same results as fft,但我无法确定我是否犯了相同的错误或不同的错误。
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,:]
值匹配。
有几件事要提。首先,在Python中我们用1j
来表示虚数单位,而不是complex(0, 1)
。如果您想将结果与 numpy 进行比较,则必须检查 numpy 如何实现 fft。有关详细信息,请参阅 Numpy FFT docs。您会发现 numpy 遵循最常见的 fft 定义,该定义使用负指数。此外,float(N+1)
在你的阶段是完全错误的。它必须显示为 N
。
总而言之,你拥有:
# ...
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)
# ...
使用
进行测试
>>> np.isclose(xfft, naive_fft).all()
True
逆变换的工作方式类似,但指数为正。
我正在尝试重新生成 python 中的 fft 函数。我在这里看到了一个类似的问题 Manual fft not giving me same results as fft,但我无法确定我是否犯了相同的错误或不同的错误。
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,:]
值匹配。
有几件事要提。首先,在Python中我们用1j
来表示虚数单位,而不是complex(0, 1)
。如果您想将结果与 numpy 进行比较,则必须检查 numpy 如何实现 fft。有关详细信息,请参阅 Numpy FFT docs。您会发现 numpy 遵循最常见的 fft 定义,该定义使用负指数。此外,float(N+1)
在你的阶段是完全错误的。它必须显示为 N
。
总而言之,你拥有:
# ...
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)
# ...
使用
进行测试>>> np.isclose(xfft, naive_fft).all()
True
逆变换的工作方式类似,但指数为正。