技术上,对称函数的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. ])
造成这种差异的原因是什么?
答案 0 :(得分:0)
你的期望是正确的。
请参阅 DCT 手册页底部的注释:
“对于真实的,偶对称的输入,类型1 DCT相当于FFT(虽然更快)。输出也是真实的,甚至是对称的。一半的FFT输入用于产生一半的FFT输出”
{{1}}
为什么函数的编写者做出了这个选择?为了避免重复并加快速度。
对称性适用于您在DCT问题中描述的方式。那么如果你有对称函数,为什么要计算两次对称部分呢?此外,由于频谱虚部是零(或者在你的例子中非常接近它,基于有限浮点精度),因此不需要与正频率重复的“负频率”。在更一般的FFT的情况下,“负频率”可以具有相关信息。