fast_fourier_transform.t 795 B

1234567891011121314151617181920212223242526272829303132333435363738
  1. #!perl -T
  2. use utf8;
  3. use 5.006;
  4. use strict;
  5. use warnings;
  6. use Test::More;
  7. plan tests => 1;
  8. use Sidef;
  9. my $code = <<'EOT';
  10. func fft(arr) {
  11. arr.len == 1 && return arr
  12. var evn = fft([arr[^arr -> grep { .is_even }]])
  13. var odd = fft([arr[^arr -> grep { .is_odd }]])
  14. var twd = (Num.tau.i / arr.len)
  15. ^odd -> map {|n| odd[n] *= ::exp(twd * n)}
  16. (evn »+« odd) + (evn »-« odd)
  17. }
  18. var cycles = 3
  19. var sequence = 0..15
  20. var wave = sequence.map {|n| ::sin(n * Num.tau / sequence.len * cycles) }
  21. fft(wave).map { '%6.3f' % .abs }.join(' ')
  22. EOT
  23. my $sidef = Sidef->new(name => 'fast_fourier_transform');
  24. my $result = $sidef->execute_code($code);
  25. is("$result", ' 0.000 0.000 0.000 8.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 8.000 0.000 0.000');