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

时间:2016-05-13 00:41:06

标签: python numpy scipy fft

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

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 个答案:

答案 0 :(得分:0)

你的期望是正确的。

请参阅 DCT 手册页底部的注释:

“对于真实的,偶对称的输入,类型1 DCT相当于FFT(虽然更快)。输出也是真实的,甚至是对称的。一半的FFT输入用于产生一半的FFT输出”

{{1}}

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

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