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

时间:2016-04-05 16:45:48

标签: python fft complex-numbers

我正在尝试在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呢?

1 个答案:

答案 0 :(得分:2)

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

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

\frac{1}{n^{1/2}}\sum_{r=1}^n u_r e^{2\pi i (r-1)(s-1)/n}

或等效地使用基于零的索引,时间索引n,频率索引kj=sqrt(-1)来与您的实现进行比较:

\frac{1}{N^{1/2}}\sum_{n=0}^{N-1} u_n e^{2\pi j k n/N}

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

\sum_{r=1}^n u_r e^{-2\pi i (r-1)(s-1)/n}

再次相当于:

\sum_{n=0}^{N-1} u_n e^{-2\pi j k n/N}

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

\begin{align}\sum_{n=0}^{N-1} u_n e^{-2\pi j k n/N}&= \sum_{n=0}^{N-1} u_n \mbox{conjugate}(e^{2\pi j k n/N}) \   &= \sum_{n=0}^{N-1} \mbox{conjugate}(u_n e^{2\pi j k n/N}) &,\mbox{for real $u_n$}\   &= \mbox{conjugate}\left(\sum_{n=0}^{N-1} u_n e^{2\pi j k n/N}\right) &,\mbox{for real $u_n$}\\end{align}

相关问题