我的任务是使用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
索引错误的原因是,在for循环中使用k和i,但是算法也在用语句修改这些变量。在
请注意,pythonforrange语句的工作方式与传统的C风格的for循环不同,它将继续以1的步幅遍历范围,而不管如何在循环中操纵迭代器。在
编辑,这是一个至少运行到完成的版本。 但是注意:我不相信它会产生正确的结果。你可以把它作为一个起点,然后与numpy,octave或者你最喜欢的数学套件的结果进行比较。在
相关问题 更多 >
编程相关推荐