Cooley Tukey旋转因子在一个简单的python脚本中

时间:2011-05-15 19:29:34

标签: python math discrete-mathematics fft dft

我正在阅读cooley tukey method works的方式,但是我对以下python脚本有一些问题:

def fft_CT_twiddles(x, inverse = False, verbose = False, twiddles = None) :
    """
    Computes the DFT of x using Cooley-Tukey's FFT algorithm. Twiddle factors
    are precalculated in the first function call, then passed down recursively.
    """
    t = time.clock()
    N = len(x)
    inv = -1 if not inverse else 1
    if N % 2 :
        return dft(x, inverse, False)
    M = N // 2
    if not twiddles :
        twiddles = [math.e**(inv*2j*math.pi*k/N) for k in xrange(M)]+[N]
    x_e = x[::2]
    x_o  = x[1::2]
    X_e = fft_CT_twiddles(x_e, inverse, False, twiddles)
    X_o  = fft_CT_twiddles(x_o, inverse, False, twiddles)
    X = []
    for k in range(M) :
        X += [X_e[k] + X_o[k] * twiddles[k * twiddles[-1] // N]]
    for k in range(M,N) :
        X += [X_e[k-M] - X_o[k-M] * twiddles[(k - M) * twiddles[-1] // N]]
    if inverse :
        X = [j/2 for j in X]
    t = time.clock() - t
    if verbose :
        print "Computed","an inverse" if inverse else "a","CT FFT of size",N,
        print "in",t,"sec."
    return X

是什么?         twiddles = [math.e **(inv * 2j * math.pi * k / N)for x in xrange(M)] + [N] 行吗?看起来像一个数组,但为什么+ [N]?

为什么要访问twiddles [-1]值呢?

我无法弄明白

2 个答案:

答案 0 :(得分:2)

您询问的代码正在执行以下操作:

+[N] # appends N to the end of the array


twiddles[-1] # is the last element of the array ( the N in this case ).

为了方便起见,代码似乎将'N'添加到twiddles数组的末尾,以便以后可以使用它,以便它可以很容易地作为twiddles参数的一部分传递给函数而不是将其作为单独的变量传递。

答案 1 :(得分:2)

当提出问题的人的专业知识水平未知时,试图解释代码是困难的。这就是说:

  1. python具有序列nl的串联运算符。 +所以twiddles =行创建了某种排序并将数字N附加到它。
  2. twiddles[-1]按照评论建议访问序列中的最后一个元素N
  3. twiddles序列表达式使用复数来生成由单位圆上的N点组成的序列,方法是将其划分为N个相等的切片。