Python 对称函数的FT和余弦变换在scipy和numpy之间是不同的
从技术上讲,对称函数的傅立叶变换产生所有实数。这意味着函数的cos变换和函数的FT应该给出相同的值。当我测试数组(scipy.fftpack.fft(b))和DCT(scipy.fftpack.DCT(b))的compute FT时,我得到了不同的值。以下是一个例子: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
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.])