fast_fourier_transform.sf 509 B

12345678910111213141516171819
  1. #!/usr/bin/ruby
  2. func fft(arr) {
  3. arr.len == 1 && return arr
  4. var evn = fft([arr[^arr -> grep { .is_even }]])
  5. var odd = fft([arr[^arr -> grep { .is_odd }]])
  6. var twd = (Num.tau.i / arr.len)
  7. ^odd -> map {|n| odd[n] *= exp(twd * n) }
  8. (evn »+« odd) + (evn »-« odd)
  9. }
  10. var cycles = 3
  11. var sequence = 0..15
  12. var wave = sequence.map {|n| sin(n * Num.tau / sequence.len * cycles) }
  13. say "wave:#{wave.map{|w| '%6.3f' % w }.join(' ')}"
  14. say "fft: #{fft(wave).map { '%6.3f' % .abs }.join(' ')}"