离散傅立叶变换给出“正确”答案的复共轭

Posted

技术标签:

【中文标题】离散傅立叶变换给出“正确”答案的复共轭【英文标题】:Discrete fourier transform giving complex conjugate of "right" answer 【发布时间】:2016-04-05 16:45:47 【问题描述】:

我正在尝试在 python 中实现离散傅立叶变换的简单版本。 我的代码如下:

#!/usr/bin/env python
import cmath
def dft_simple(sequence):
# dft of seq defined as
# sigma from n=0 to N-1 of x(n) *exp(-2*pi*j*k*n/N)
  seqLenth = len(sequence)
  complexSequence = []
  for k in range(seqLenth):
    sigma = 0 - 0j
    print("k = ".format(k))
    for n in range(seqLenth):
      print("n = ".format(n))
      print("value = ".format(sequence[n] * cmath.exp(-2*1j * cmath.pi * float(k) \
                                    * float(n)  / float(seqLenth))))
      sigma = sigma + (sequence[n] * cmath.exp(-2*1j * cmath.pi * float(k) \
                                    * float(n)  / float(seqLenth)))
      print("exp = 0".format(-2*1j * cmath.pi * float(k) \
                                    * float(n)  / float(seqLenth)))
    complexSequence.append(sigma)

    print("sum = ".format(sigma))
    print("")
  return(complexSequence)
seq4 = [1,1,1,1,0,0,0,0]
print(dft_simple(seq4))

我收到以下结果:

[(4+0j), (1-2.414213562373095j), (-1.8369701987210297e-16-2.220446049250313e-16j), (1-0.4142135623730949j), -2.449293598294706e-16j, (0.9999999999999992+0.4142135623730959j), (3.2904645469127765e-16-3.3306690738754696e-16j), (0.9999999999999997+2.4142135623730954j)]

这与我在以两种方式计算同一序列here, 的 DFT 时在 wolfram alpha 上得到的答案不同。首先,wolfram alpha 除以 sqrt(N),其中 N 是序列的长度,这只是正向和逆变换的不同对称定义。 其次,更令人困惑的是,我的实现给了我 wolfram alpha 给我的结果的复共轭——否则数值大致相同。这是我的代码的实现问题(例如语法错误),还是只是使用离散傅立叶变换的不同定义的 wolfram?

【问题讨论】:

Wolfram uses a different definition of the discrete fourier transform @SleuthEye 修复了您的链接:Wolfram uses a different definition of DFT 啊,好吧,这更有意义 - 我以前使用 wolfram math world 作为参考,感谢您清除它。您能否将其保留为答案,以便我将此问题标记为已解决? 【参考方案1】:

在这两种情况下(对于缩放和复共轭结果),根本原因是用于离散傅里叶变换 (DFT) 的定义不同。

default definition of the DFT from Wolfram 使用公式:

或等效地使用从零开始的索引、时间索引n、频率索引kj=sqrt(-1) 与您的实现进行比较:

您的实现使用 Wolfram 所说的“信号处理”约定:

又相当于:

对于实值输入序列,在复指数项中使用负号会产生一个结果,该结果是在复指数项中使用正号的类似表达式的复共轭(反之亦然):

【讨论】:

以上是关于离散傅立叶变换给出“正确”答案的复共轭的主要内容,如果未能解决你的问题,请参考以下文章

维纳一辛钦的定理内容:

关于离散余弦变换(DCT)

matlab或mathematica怎样实现对离散点的傅立叶变换和逆变换

Discrete Cosine Transform

python 图像的离散傅立叶变换

离散傅立叶变换,快速傅立叶变换和傅里叶级数