Python索引E中的CooleyTukey FFT算法

2024-06-16 12:04:41 发布

您现在位置:Python中文网/ 问答频道 /正文

我的任务是使用Cooley Tukey算法对一些信号数据进行傅里叶变换。我不允许使用Numpy模块,所以我必须自己实现算法。但是,通过遵循给出的伪代码,当我试图运行它时,我得到了一个“IndexError:list index out-out-range”错误。信号是512个元素的列表。下面是我的代码。错误发生在“t=sig[k+m]-sig[k+m+r]”

def fft(sig,d):
    N=len(sig)
    theta = (-2*math.pi*d)/N
    r=N//2
    for i in range(1,N):
        omega=math.cos(i*theta)+j*math.sin(i*theta)
        for k in range(0,N):
            u = 1
            for m in range(0,r):
                t=sig[k+m]-sig[k+m+r]
                sig[k+m] = sig[k+m] + sig[k+m+r]
                sig[k+m+r]=t*u
                u=omega*u
            k=k+2*r
        i=2*i
        r=r/2
    for i in range(0,N):
        r=i
        k=0
        for m in range(1,N):
            k=2*k+(r%2)
            r=r/2
            m=2*m
        if k>i:
            t=sig[i]
            sig[i]=sig[k]
            sig[k]=t
    if d<0:
        for i in range(0,N):
            sig[i]=sig[i]/N

我知道k+m最终会大于512(信号的大小),这就是错误所在,但我老实说,我只是遵循伪代码。我知道我在某个地方犯了一个愚蠢的错误。 谢谢你的帮助! 哦,直接从我的源代码中得到的伪代码是

^{pr2}$

我想我应该加上z(伪代码),我的信号是Nx1值向量,N=512


Tags: 代码in算法forif信号错误range
1条回答
网友
1楼 · 发布于 2024-06-16 12:04:41

索引错误的原因是,在for循环中使用k和i,但是算法也在用语句修改这些变量。在

   k=k+2*r
 i=2*i

请注意,pythonforrange语句的工作方式与传统的C风格的for循环不同,它将继续以1的步幅遍历范围,而不管如何在循环中操纵迭代器。在

编辑,这是一个至少运行到完成的版本。 但是注意:我不相信它会产生正确的结果。你可以把它作为一个起点,然后与numpy,octave或者你最喜欢的数学套件的结果进行比较。在

import math 
import cmath

d=1
z=[1,2,1,0,-1,-2,-1,0]
N=len(z)
theta = -2*math.pi*d/N 
r = math.floor(N/2)
i=1

while i < N-1: #2.For i=1 to N-1 do
    omega = math.cos(i*theta)+ cmath.sin(i*theta)
    k=0
    while k < N-1: #For k=0 to N-1 do
        u=1
        m=0
        while m < r-1 :#For m=0 to r-1 do
            t = z[k+m] - z[k+m+r]
            z[k+m] = z[k+m] + z[k+m+r]
            z[k+m+r] = t*u
            u=omega*u
            m=m+1
        k=k+2*r
    i = 2*i 
i=0
while i < N-1:#For i=0 to N-1 do
    r = i 
    k = 0
    m=1
    while m < N-1: # For m=1 to N-1 do
        k=math.floor(2*k+(r%2))
        r=r/2
        m=2*m

    if k > i:
        t=z[i]
        z[i]=z[k]
        z[k] = t

    i=i+1

if d < 0:
    i=0
    while i < N-1: #  for i=0 to N-1:
        z[i]=z[i]/N
        i=i+1
i=0
while i < N-1:   
    print("z[i]",z[i].real, z[i].imag);
    i=i+1;

相关问题 更多 >