Discrete Fourier transform: Difference between revisions

added Perl programming solution
(added Perl programming solution)
Line 124:
Discrete Fourier transform: 28.00, -3.38+8.78i, -5.62+2.80i, -5.62-2.80i, -3.38-8.78i
Inverse Discrete Fourier Transform: 2.00, 3.00, 5.00, 7.00, 11.00</pre>
 
=={{header|Perl}}==
<lang perl># 20210616 Perl programming solution
 
use strict;
use warnings;
use feature 'say';
 
use Math::Complex;
use constant PI => 4 * atan2(1, 1);
use constant ESP => 1e10;
 
sub dft {
my $n = scalar ( my @in = @_ );
return map {
my $s=0;
for my $k (0 .. $n-1) { $s += $in[$k] * exp(-2*i * PI * $k * $_ / $n) }
$_ = $s;
} (0 .. $n-1);
}
 
sub idft {
my $n = scalar ( my @in = @_ );
return map {
my $s=0;
for my $k (0 .. $n-1) { $s += $in[$k] * exp(2*i * PI * $k * $_ / $n) }
my $t = $s/$n;
if ( abs(Im($t)-int(Im($t))) < ESP ) { $t = Math::Complex->make(Re($t)) } # cleaning
$_ = $t;
} (0 .. $n-1);
}
 
say 'Original sequence : ', join ', ', my @series = ( 2, 3, 5, 7, 11 );
say 'Discrete Fourier transform : ', join ', ', my @dft = dft @series;
say 'Inverse Discrete Fourier Transform : ', join ', ', idft @dft;
</lang>
{{out}}
<pre>
Original sequence : 2, 3, 5, 7, 11
Discrete Fourier transform : 28, -3.38196601125011+8.78402263494617i,-5.6180339887499+2.80016898574947i, -5.61803398874989-2.80016898574948i, -3.3819660112501-8.78402263494618i
Inverse Discrete Fourier Transform : 2, 3, 5, 7, 11
</pre>
 
=={{header|Phix}}==
351

edits