python - 'complex' object has no attribute '__getitem__' -
i new python , i'm trying python implementation of fft. have been getting above mentioned error while. do?
import numpy import cmath def twiddle(r,s): x = (cmath.exp((2*cmath.pi*1j*s)/r)) return x def fft(signal): n = len(signal) if n==1: return signal else: feven=fft([signal[k] k in range(0,n,2)]) fodd=fft([signal[k] k in range(1,n,2)]) l in range (n/2): f1 = feven[l] + twiddle(n, -l) * fodd[l] f2 = feven[l] - twiddle(n, -l) * fodd[l] return f1+f2 when add print statements feven , fodd, , feed in this:
print (fft([4.5, 3.4, 4.7, 3.8, 6.7, 8.0, 4.6, 7.8])) i get:
traceback (most recent call last): file "fft.py", line 41, in <module> print (fft([4.5, 3.4, 4.7, 3.8, 6.7, 8.0, 4.6, 7.8])) file "fft.py", line 29, in fft feven=fft([signal[k] k in range(0,n,2)]) file "fft.py", line 34, in fft f1 = feven[l] + twiddler(n, -l) * fodd[l] typeerror: 'complex' object has no attribute '__getitem__'
fixing bug
the problem line
return f1+f2 this causes fft return (with complex number f1 + f2), when in fact should returning list. meant, presume, this:
def fft(signal): n = len(signal) if n==1: return signal else: feven=fft([signal[k] k in range(0,n,2)]) fodd=fft([signal[k] k in range(1,n,2)]) f1 = [feven[l] + twiddle(n, -l) * fodd[l] l in range (n/2)] f2 = [feven[l] - twiddle(n, -l) * fodd[l] l in range (n/2)] return f1+f2 other comments on code
instead of
[signal[k] k in range(0,n,2)]can writesignal[0:n:2]using python's slice notation. , similarly, instead of[signal[k] k in range(1,n,2)]can writesignal[1:n:2].in fact, since
nlength of listsignal, can omit since that's default behaviour slices. can write:feven = fft(signal[::2]) fodd = fft(signal[1::2])it doesn't make sense have of "else" code inside
else:clause , outside. put in 1 or other.since
foddnumbers multiplied twiddle factor, why not once instead of twice? perhaps this:def fft(signal): n = len(signal) if n == 1: return signal feven = fft(signal[::2]) fodd = [twiddle(n, -k) * o k, o in enumerate(fft(signal[1::2]))] f1 = [e + o e, o in zip(feven, fodd)] f2 = [e - o e, o in zip(feven, fodd)] return f1 + f2
Comments
Post a Comment