2016-05-13 12 views
1

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

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.  ]) 

可能是这种差异的原因是什么?

回答

0

你说得对。

见注意到关于 DCT手册页面的底部:

“类型1 DCT相当于FFT(尽管更快)真实的,偶对称输入输出也是真实和偶数。对称一半的FFT输入用于产生一半的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.]) 

为什么函数的编写者会做出这样的选择?避免重复并更快。

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

+0

谢谢,这对我很有用。 – PythonNoob