Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
pyFFTW的功能与MATLAB的FFT结果完全相同_Matlab_Python 3.x_Fft_Fftw_Pyfftw - Fatal编程技术网

pyFFTW的功能与MATLAB的FFT结果完全相同

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:

我正在寻找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:

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可能不是。通常,如果您的结果与机器精度匹配,则它们足够接近:if
all(abs)(Python(:)-Matlab(:)/abs(Matlab(:)
,那么您可以说两者之间的相对误差在机器精度的100倍以内,这对于工程工作来说已经足够了。@AhmedFasih感谢您的回复。你帮了大忙。在第一种情况下,你正在计划一个
complex128
转换。
FFTW
对象将强制您的
float32
进入该数组(您可以对其进行更精确的控制,但随后需要手动调用转换-读取API)。第二种情况计划使用
float32
,因此与第一种情况不同。在调用FFTW之前,我不知道Matlab在幕后做什么。一般来说,获得最快的转换比仅仅计划和调用对齐要复杂得多,例如,对齐可以产生巨大的差异。如果您想要像Matlab一样工作的东西,请尝试使用
pyfftw.interfaces
api。
fft(x)