use strict;
use PDL;
use PDL::Image2D;
use PDL::FFT;
use Test;
BEGIN { plan tests => 17; }
sub tapprox {
my($a,$b) = @_;
my ($c) = abs($a-$b);
my $d = max($c);
$d < 0.01;
}
my ( $a, $b, $c, $i, $k, $kk );
foreach my $type(double,float){
$a = pdl($type,1,-1,1,-1);
$b = zeroes($type,$a->dims);
fft($a,$b);
ok(all($a==pdl($type,0,0,4,0))); #1,3
ifft($a,$b);
ok(all($a==pdl($type,1,-1,1,-1))); #2,4
}
$k = ones(5,5);
$a = rfits("m51.fits");
$b = $a->copy;
$c = $b->zeroes;
fft($b,$c);
ifft($b,$c);
ok (tapprox($c,0)); #5
#print "\n",$c->info("Type: %T Dim: %-15D State: %S"),"\n";
#print "Max: ",$c->max,"\n";
#print "Min: ",$c->min,"\n";
ok (tapprox($a,$b)); #6
$b = $a->copy;
$c = $b->zeroes; fftnd($b,$c); ifftnd($b,$c);
ok ( tapprox($c,0) ); #7
ok ( tapprox($a,$b) );#8
$b = $a->slice("1:35,1:69");
$c = $b->copy; fftnd($b,$c); ifftnd($b,$c);
ok ( tapprox($c,$b) );#9
ok ( tapprox($a->slice("1:35,1:69"),$b) );#10
# Now compare fft convolutions with direct method
$b = conv2d($a,$k);
$kk = kernctr($a,$k);
fftconvolve( $i=$a->copy, $kk );
ok ( tapprox($kk,0) );#11
ok ( tapprox($i,$b) );#12
$k = pdl[
[ 0.51385498, 0.17572021, 0.30862427],
[ 0.53451538, 0.94760132, 0.17172241],
[ 0.70220947, 0.22640991, 0.49475098],
[ 0.12469482, 0.083892822, 0.38961792],
[ 0.27722168, 0.36804199, 0.98342896],
[ 0.53536987, 0.76565552, 0.64645386],
[ 0.76712036, 0.7802124, 0.82293701]
];
$b = conv2d($a,$k);
$kk = kernctr($a,$k);
fftconvolve( $i=$a->copy, $kk );
ok ( tapprox($kk,0) );#13
ok ( tapprox($i,$b) );#14
$b = $a->copy;
# Test real ffts
realfft($b);
realifft($b);
ok( tapprox($a,$b) );#15
# Test that errors are properly caught
eval {fft(sequence(10))};
ok( $@, qr/Did you forget/, 'fft offers helpful message when only one argument is supplied'); #16
$@ = '';
eval {ifft(sequence(10))};
ok( $@, qr/Did you forget/, 'ifft offers helpful message when only one argument is supplied'); #17
$@ = '';
# End