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

简单python脚本中的Cooley Tukey旋转因子,python,math,discrete-mathematics,fft,dft,Python,Math,Discrete Mathematics,Fft,Dft,我正在阅读如何使用,但我对以下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 pas

我正在阅读如何使用,但我对以下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
这是什么意思 旋转=[math.e**(inv*2j*math.pi*k/N)表示x范围内的k(M)]+[N] 线路是什么?看起来像一个数组,但为什么是+[N]

那么为什么要访问twidles[-1]值呢


我无法理解这一点

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

+[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参数的一部分传递给函数,而不是作为单独的变量传递。

当提问者的专业水平未知时,试图解释代码是很困难的。这里说的是:

  • python对序列nl有一个连接运算符<代码>+因此
    twidles=
    行创建了一个某种类型的序列,并将数字N附加到该序列中
  • twidles[-1]
    访问序列中的最后一个元素,如注释所示,编号为
    N
  • twidles
    序列表达式使用复数生成一个序列,该序列由单位圆上的
    N个
    点组成,将其划分为
    N个
    相等的切片

  • 谢谢你,你知道为什么代码会旋转[(k-M)*旋转[-1]//N],然后乘以并除以N吗?这太愚蠢了。这似乎很奇怪。我不知道你所说的“乘N除N”指的是什么。难道(k-M)*旋转[-1]//N实际上是(k-M)*N/N吗?这有什么意义?我同意这似乎是错误的。我刚刚验证了运行python脚本,“(k-M)”而不使用“*twidles[-1]//N”会产生相同的结果,所以我认为这是一个错误。谢谢你的回答!