我知道大多数FFT/IFFT例程都有误差。我期望NumPy的FFT的误差范围与FFTW相同(例如
考虑计算一个矩形函数的IDFT。众所周知,结果是类似于sinc的Dirichlet核函数。但这不是我从
看起来错误是正弦波形式的:
有人遇到过同样的问题吗?我是否对NumPy的FFT包有什么误解,或者它只是不准确的?
在Octave中,
1e-15
),但以下实验显示误差的数量级为1e-5
。考虑计算一个矩形函数的IDFT。众所周知,结果是类似于sinc的Dirichlet核函数。但这不是我从
numpy.fft.irfft
得到的结果。事实上,第一个样本应该只等于盒子宽度除以FFT点数,但下面的示例显示偏差约为4e-5
。import numpy as np
import matplotlib.pyplot as plt
from scipy.special import diric
N = 40960
K = 513
X = np.ones(K, dtype=np.complex)
x = np.fft.irfft(X, N)
print("x[0] = %g: expected %g - error = %g" % (x[0], (2*K+1)/N, x[0]-(2*K+1)/N))
# expected IDFT of a box is Dirichlet function (see
# https://en.wikipedia.org/wiki/Discrete_Fourier_transform#Some_discrete_Fourier_transform_pairs)
y = diric(2*np.pi*np.arange(N)/N, 2*K+1) * (2*K+1) / N
plt.figure()
plt.plot(x[:1024] - y[:1024])
plt.title('error')
plt.show(block=True)
看起来错误是正弦波形式的:
![enter image description here](https://istack.dev59.com/J8FKE.webp)
更新
以下是Octave脚本的一部分等效内容:
N = 40960;
K = 513;
X = zeros(1, N);
X(1:K) = 1;
X(N-K:N) = 1;
x = ifft(X);
fprintf("x[0] = %g, expected = %g - error = %g\n", x(1), (2*K+1)/N, x(1)-(2*K+1)/N);
在Octave中,
x [0]
的误差几乎为零。(我没有检查其他样本,因为我不知道Octave中diric
函数的等效物。)
X
数组似乎不相等;NumPy数组中没有类似于Octave中的X(N-K:N) = 1;
。 - user2357112X = np.ones(K+1, dtype=np.complex)
吗?(或者等价地,在期望结果中将2*K + 1
替换为2*K-1
。) - Mark Dickinson