- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
据我所知,大多数 FFT/IFFT 例程都有错误层。我原以为 NumPy 的 FFT 与 FFTW 的顺序相同(例如 1e-15
),但下面的实验显示错误的顺序为 1e-5
.
考虑计算一个盒子的 IDFT。是well-known结果是类似 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)
有人遇到同样的问题吗?我是不是对 NumPy 的 FFT 包有什么误解,或者它只是不准确?
以下是 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);
x[0]
上的错误在 Octave 中几乎为零。 (我没有检查其他示例,因为我不知道 Octave 中的 diric
函数的等价物。)
最佳答案
感谢MarkDickinson ,我意识到我的数学是错误的。正确的比较将通过以下方式进行:
import numpy as np
import matplotlib.pyplot as plt
from scipy.special import diric
N = 40960
K = 513
X = np.ones(K+1, 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)
Numpy 是正确的,我的数学不正确。我很抱歉发布这个误导性的问题。我不知道在这些情况下的标准程序是什么。我应该删除我的问题还是将其与此答案一起留在此处?我只是不希望它破坏 NumPy 或挑战其准确性(因为这显然是误报)。
关于python - 为什么 `numpy.fft.irfft` 如此不精确?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58641051/
我正在尝试将最初使用 numpy 编写的算法转换为 JavaScript,但我无法通过反向 FFT 重现结果。 原始算法使用numpy.fft.rfft和numpy.fft.irfft: # Get
据我所知,大多数 FFT/IFFT 例程都有错误层。我原以为 NumPy 的 FFT 与 FFTW 的顺序相同(例如 1e-15),但下面的实验显示错误的顺序为 1e-5 . 考虑计算一个盒子的 ID
所以我试图对一组实值点执行频移。为了实现频移,必须将数据乘以复指数,从而使所得数据变得复杂。如果我只乘以一个余弦,我就会得到和频率和差频率的结果。我只想要总和或差值。 我所做的是将数据乘以复指数,使用
我正在将 python 代码转换为 MATLAB,其中一个代码使用 numpy rfft。在 numpy 的文档中,它说的是真实输入。 Compute the one-dimensional disc
我是一名优秀的程序员,十分优秀!