【发布时间】:2020-07-13 17:21:58
【问题描述】:
基本上,CPP_FFTW(N, signal, backwards) = NP_IFFT(N, signal) * N 其中CPP_FFTW 是 C++ 中 FFTW 库的(浮动版本),NP_IFFT 是 Python 中的 numpy.fft.ifft。
这里的问题是CPP_FFTW(N, CPP_FFTW(N, signal, forwards), backwards) 等于N * signal,而不是人们可能期望的signal。
我可以除以N,但我的问题是我的N 非常大,所以我失去了浮点精度。它基本上破坏了我的程序;我在 C++ 和 Python 应用程序中有几乎相同的复数系数。但是,我失去了所有的精确度,因为我在执行反向变换后基本上使用了(c*N)/N。
是否有可能阻止这种乘法的发生?
直到IFFT,系数几乎相同。这是IFFT之后的:
【问题讨论】:
-
你确定是这个问题吗? fp 乘法即使乘以非常大的数也不会对相对精度产生很大影响。
-
@PaulPanzer 我不明白为什么结果首先会相乘?我在文档中没有找到任何内容
-
从技术上讲,它不会成倍增加。它只是没有标准化。如何规范化 FFT/IFFT 是一个因实现而异的约定问题。
-
@PaulPanzer
CPP_FFTW(N, CPP_FFTW(N, signal, forwards), backwards)应该等于signal是否有标准化。除非,两个方向之间的规范化不一致? -
在规范化之后,我的浮点精度从 ~6 变为只有 3。然而,numpy 以某种方式能够保持正常的精度 - 诚然它的速度较慢