Guest User

Untitled

a guest
Oct 23rd, 2017
98
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.61 KB | None | 0 0
  1. """DFT and FFT"""
  2. import math
  3.  
  4. def iexp(n):
  5. return complex(math.cos(n), math.sin(n))
  6.  
  7. def is_pow2(n):
  8. return False if n == 0 else (n == 1 or is_pow2(n >> 1))
  9.  
  10. def dft(xs):
  11. "naive dft"
  12. n = len(xs)
  13. return [sum((xs[k] * iexp(-2 * math.pi * i * k / n) for k in range(n)))
  14. for i in range(n)]
  15.  
  16. def dftinv(xs):
  17. "naive dft"
  18. n = len(xs)
  19. return [sum((xs[k] * iexp(2 * math.pi * i * k / n) for k in range(n))) / n
  20. for i in range(n)]
  21.  
  22. def fft_(xs, n, start=0, stride=1):
  23. "cooley-turkey fft"
  24. if n == 1: return [xs[start]]
  25. hn, sd = n // 2, stride * 2
  26. rs = fft_(xs, hn, start, sd) + fft_(xs, hn, start + stride, sd)
  27. for i in range(hn):
  28. e = iexp(-2 * math.pi * i / n)
  29. rs[i], rs[i + hn] = rs[i] + e * rs[i + hn], rs[i] - e * rs[i + hn]
  30. pass
  31. return rs
  32.  
  33. def fft(xs):
  34. assert is_pow2(len(xs))
  35. return fft_(xs, len(xs))
  36.  
  37. def fftinv_(xs, n, start=0, stride=1):
  38. "cooley-turkey fft"
  39. if n == 1: return [xs[start]]
  40. hn, sd = n // 2, stride * 2
  41. rs = fftinv_(xs, hn, start, sd) + fftinv_(xs, hn, start + stride, sd)
  42. for i in range(hn):
  43. e = iexp(2 * math.pi * i / n)
  44. rs[i], rs[i + hn] = rs[i] + e * rs[i + hn], rs[i] - e * rs[i + hn]
  45. pass
  46. return rs
  47.  
  48. def fftinv(xs):
  49. assert is_pow2(len(xs))
  50. n = len(xs)
  51. return [v / n for v in fftinv_(xs, n)]
  52.  
  53. if __name__ == "__main__":
  54. wave = [0, 1, 2, 3, 3, 2, 1, 0]
  55. dfreq = dft(wave)
  56. ffreq = fft(wave)
  57. dwave = dftinv(dfreq)
  58. fwave= fftinv(ffreq)
  59. print(dfreq)
  60. print(ffreq)
  61. print([v.real for v in dwave])
  62. print([v.real for v in fwave])
  63. pass
Add Comment
Please, Sign In to add comment