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

  1. instead of [signal[k] k in range(0,n,2)] can write signal[0:n:2] using python's slice notation. , similarly, instead of [signal[k] k in range(1,n,2)] can write signal[1:n:2].

  2. in fact, since n length of list signal, can omit since that's default behaviour slices. can write:

    feven = fft(signal[::2]) fodd = fft(signal[1::2]) 
  3. it doesn't make sense have of "else" code inside else: clause , outside. put in 1 or other.

  4. since fodd numbers 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

Popular posts from this blog

php - Why I am getting the Error "Commands out of sync; you can't run this command now" -

linux - Does gcc have any options to add version info in ELF binary file? -

java - Are there any classes that implement javax.persistence.Parameter<T>? -