pyFFTW的功能与MATLAB的FFT结果完全相同
我正在寻找pyFFTW的函数,它的结果与MATLAB的FFT完全相同 我已经试过pyFFTW的一些功能,比如风箱 x是1D数组,类型:np.32 Python 3.5.2:pyFFTW的功能与MATLAB的FFT结果完全相同,matlab,python-3.x,fft,fftw,pyfftw,Matlab,Python 3.x,Fft,Fftw,Pyfftw,我正在寻找pyFFTW的函数,它的结果与MATLAB的FFT完全相同 我已经试过pyFFTW的一些功能,比如风箱 x是1D数组,类型:np.32 Python 3.5.2: a = fftw.n_byte_align_empty(x.size, 16, 'complex128') b = fftw.n_byte_align_empty(x.size, 16, 'complex128') fft_object = fftw.FFTW(a, b) fft_object(x) 或 MATLAB:
a = fftw.n_byte_align_empty(x.size, 16, 'complex128')
b = fftw.n_byte_align_empty(x.size, 16, 'complex128')
fft_object = fftw.FFTW(a, b)
fft_object(x)
或
MATLAB:
fft(x)
但是,与MATLAB的FFT相比,存在一些差异(约0.000001)
有没有办法得到与MATLAB的FFT完全相同的结果
- python版本:3.5.2
- pyFFTW的版本:0.10.4
- numpy版本:1.12.0
- MATLAB版本:8.3.0.532(R2014a)
谢谢 简短回答:不,可能没有办法。详细回答:(1)Matlab使用一个定制的WITH文件(FFTW使用它来决定如何分解FFT)。您可以尝试在Matlab端使用相同的规划器,并在Python端使用相同的规划器,以使它们匹配,但是(2)Matlab的FFTW是使用Intel MKL编译的,而PyFFTW可能不是。通常,如果您的结果与机器精度匹配,则它们足够接近:if
all(abs)(Python(:)-Matlab(:)/abs(Matlab(:)
,那么您可以说两者之间的相对误差在机器精度的100倍以内,这对于工程工作来说已经足够了。@AhmedFasih感谢您的回复。你帮了大忙。在第一种情况下,你正在计划一个complex128
转换。FFTW
对象将强制您的float32
进入该数组(您可以对其进行更精确的控制,但随后需要手动调用转换-读取API)。第二种情况计划使用float32
,因此与第一种情况不同。在调用FFTW之前,我不知道Matlab在幕后做什么。一般来说,获得最快的转换比仅仅计划和调用对齐要复杂得多,例如,对齐可以产生巨大的差异。如果你想要像Matlab一样工作的东西,试试pyfftw.interfaces
api。简短回答:不,可能没有办法。详细回答:(1)Matlab使用一个定制的WITH文件(FFTW使用它来决定如何分解FFT)。您可以尝试在Matlab端使用相同的规划器,并在Python端使用相同的规划器,以使它们匹配,但是(2)Matlab的FFTW是使用Intel MKL编译的,而PyFFTW可能不是。通常,如果您的结果与机器精度匹配,则它们足够接近:ifall(abs)(Python(:)-Matlab(:)/abs(Matlab(:)
,那么您可以说两者之间的相对误差在机器精度的100倍以内,这对于工程工作来说已经足够了。@AhmedFasih感谢您的回复。你帮了大忙。在第一种情况下,你正在计划一个complex128
转换。FFTW
对象将强制您的float32
进入该数组(您可以对其进行更精确的控制,但随后需要手动调用转换-读取API)。第二种情况计划使用float32
,因此与第一种情况不同。在调用FFTW之前,我不知道Matlab在幕后做什么。一般来说,获得最快的转换比仅仅计划和调用对齐要复杂得多,例如,对齐可以产生巨大的差异。如果您想要像Matlab一样工作的东西,请尝试使用pyfftw.interfaces
api。
fft(x)