如何在python中实现FFT算法?

时间:2017-06-08 04:36:15

标签: python algorithm

我正在尝试在python3中实现一个函数,但是我无法弄清楚参数中的错误。以下是我的代码和错误:

def FFT1(A,n,w):

    if n==1:
        return A
    AEven=[]
    for k in range(0,n,2):
        key1= A[k]
        AEven.append(key1)
    AOdd=[]
    for l in range(1,n,2):
        key2=A[l]
        AOdd.append(key2)
    VE=FFT1(AEven, n/2, w**2)
    VO=FFT1(AOdd, n/2, w**2)
    mult= complex(-1,1)
    V=[]*n
    for i in range(0,(n-2)/2):
        V[i]=VE[i]+(w**mult)*VO[i]
        V[n/2+i]=VE[i]-(w**mult)*VO[i]
    return V

FFT1(coeff, degree, rootunit)

导致:

Traceback (most recent call last):
  File "<pyshell#45>", line 1, in <module>
    FFT1(coeff, degree, rootunit)
  File "<pyshell#44>", line 12, in FFT1
    VE=FFT1(AEven, n/2, w**2)
  File "<pyshell#44>", line 5, in FFT1
    for k in range(0,n,2):
TypeError: 'float' object cannot be interpreted as an integer

3 个答案:

答案 0 :(得分:0)

如果n必须保持浮动,则int(n)内的range更改为n。如果n可以是int,请使用n//2而不是n/2来调用递归函数

答案 1 :(得分:0)

Python range()函数不接受浮动值作为步骤。尝试使用int()函数将所有浮点数转换为整数。基本上你可能传递像n / k这样的东西用int(n / k)代替它当然会产生一些意想不到的结果。

答案 2 :(得分:0)

由于FFT例程的各个方面都要求n为整数,因此您应该声明它是一个整数,或者将它强制转换为整数。我的建议是强制改为int:

def FFT1(A,n,w):
    n = int(n)

    if n==1:
    ....