RosettaCodeData/Task/Fast-Fourier-transform/Ruby/fast-fourier-transform.rb

11 lines
352 B
Ruby
Raw Permalink Normal View History

2014-01-17 05:32:22 +00:00
def fft(vec)
return vec if vec.size <= 1
evens_odds = vec.partition.with_index{|_,i| i.even?}
evens, odds = evens_odds.map{|even_odd| fft(even_odd)*2}
evens.zip(odds).map.with_index do |(even, odd),i|
2015-02-20 00:35:01 -05:00
even + odd * Math::E ** Complex(0, -2 * Math::PI * i / vec.size)
2014-01-17 05:32:22 +00:00
end
end
2015-02-20 00:35:01 -05:00
fft([1,1,1,1,0,0,0,0]).each{|c| puts "%9.6f %+9.6fi" % c.rect}