Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/337.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
Python 对称函数的FT和余弦变换在scipy和numpy之间是不同的_Python_Numpy_Scipy_Fft - Fatal编程技术网

Python 对称函数的FT和余弦变换在scipy和numpy之间是不同的

Python 对称函数的FT和余弦变换在scipy和numpy之间是不同的,python,numpy,scipy,fft,Python,Numpy,Scipy,Fft,从技术上讲,对称函数的傅立叶变换产生所有实数。这意味着函数的cos变换和函数的FT应该给出相同的值。当我测试数组(scipy.fftpack.fft(b))和DCT(scipy.fftpack.DCT(b))的compute FT时,我得到了不同的值。以下是一个例子: b=[4,3,2,1,0,1,2,3] In:scipy.fftpack.fft(b) Out:array([ 16.00000000 +0.00000000e+00j, 6.82842712 +2.22044605e-16

从技术上讲,对称函数的傅立叶变换产生所有实数。这意味着函数的cos变换和函数的FT应该给出相同的值。当我测试数组(scipy.fftpack.fft(b))和DCT(scipy.fftpack.DCT(b))的compute FT时,我得到了不同的值。以下是一个例子:

b=[4,3,2,1,0,1,2,3]
In:scipy.fftpack.fft(b) 
Out:array([ 16.00000000 +0.00000000e+00j,   6.82842712 +2.22044605e-16j,
         0.00000000 -0.00000000e+00j,   1.17157288 +2.22044605e-16j,
         0.00000000 +0.00000000e+00j,   1.17157288 -2.22044605e-16j,
         0.00000000 +0.00000000e+00j,   6.82842712 -2.22044605e-16j])
In:scipy.fftpack.dct(b,1)
Out:array([ 25.        ,   4.49395921,  10.09783468,  -1.60387547,
         0.61595706,   1.10991626,   1.28620826,  -1.        ])

造成这种差异的原因是什么?

您的期望是正确的

请参见手册页面底部的注释:

对于实对称输入,1型DCT与FFT等效(尽管更快)。输出也是实对称的。FFT输入的一半用于生成FFT输出的一半

为什么函数的编写者会做出这样的选择?以避免重复并加快速度

对称性适用于您在DCT问题中描述的方式。如果你有对称函数,为什么要计算对称部分两次?此外,由于频谱虚部为零(或非常接近,如您的示例所示,基于有限浮点精度),因此不需要“负频率”,即正频率的副本。在更一般的FFT情况下,“负频率”可以具有相关信息

fft(array([4., 3., 5., 10., 5., 3.])).real
#array([ 30.,  -8.,   6.,  -2.,   6.,  -8.])
dct(array([4., 3., 5., 10.]), 1)
#array([ 30.,  -8.,   6.,  -2.])