/** * Applies a forward space-to-frequency transform of a 3D array. * @param f the array to be transformed, a sampled function of space. * @return the transformed array, a sampled function of frequency. */ public float[][][] applyForward(float[][][] f) { ensureSamplingX3(f); float[][][] fpad = pad(f); int nx2 = _sx2.getCount(); int nx3 = _sx3.getCount(); if (_complex) { _fft1c.complexToComplex1(_sign1,nx2,nx3,fpad,fpad); _fft2.complexToComplex2(_sign2,_nfft1,nx3,fpad,fpad); _fft3.complexToComplex3(_sign3,_nfft1,_nfft2,fpad,fpad); } else { _fft1r.realToComplex1(_sign1,nx2,nx3,fpad,fpad); _fft2.complexToComplex2(_sign2,_nfft1/2+1,nx3,fpad,fpad); _fft3.complexToComplex3(_sign3,_nfft1/2+1,_nfft2,fpad,fpad); } phase(fpad); center(fpad); return fpad; }
_fft1.realToComplex1(-1,_nfft2,_nfft3,xfft,xfft); _fft2.complexToComplex2(-1,_nfft1/2+1,_nfft3,xfft,xfft); _fft3.complexToComplex3(-1,_nfft1/2+1,_nfft2,xfft,xfft); int nk1 = _nfft1/2+1; int nk2 = _nfft2; _fft3.complexToComplex3(1,_nfft1/2+1,_nfft2,xfft,xfft); _fft2.complexToComplex2(1,_nfft1/2+1,_nfft3,xfft,xfft); _fft1.complexToReal1(1,_nfft2,_nfft3,xfft,xfft);
_fft3.complexToComplex3(-1,_nfft1/2+1,_nfft2,_h3fft,_h3fft);
unphase(gpad); if (_complex) { _fft3.complexToComplex3(-_sign3,_nfft1,_nfft2,gpad,gpad); _fft3.scale(_nfft1,_nfft2,nx3,gpad); _fft2.complexToComplex2(-_sign2,_nfft1,nx3,gpad,gpad); return ccopy(nx1,nx2,nx3,gpad); } else { _fft3.complexToComplex3(-_sign3,_nfft1/2+1,_nfft2,gpad,gpad); _fft3.scale(_nfft1/2+1,_nfft2,nx3,gpad); _fft2.complexToComplex2(-_sign2,_nfft1/2+1,nx3,gpad,gpad);
fft2 = new FftComplex(nf2); fft3 = new FftComplex(nf3); fft3.complexToComplex3(-1,nf1c,nf2,cf,cf); flipSign(3, cf); fft3.scale(nf1c,nf2,nf3,cf);
public void test3Random() { int n1 = 11; int n2 = 12; int n3 = 13; int n1fft = FftComplex.nfftSmall(n1); int n2fft = FftComplex.nfftSmall(n2); int n3fft = FftComplex.nfftSmall(n3); FftComplex fft1 = new FftComplex(n1fft); FftComplex fft2 = new FftComplex(n2fft); FftComplex fft3 = new FftComplex(n3fft); float[][][] cr = crandfloat(n1fft,n2fft,n3fft); float[][][] cx = ccopy(cr); fft1.complexToComplex1( 1,n2fft,n3fft,cx,cx); fft2.complexToComplex2( 1,n1fft,n3fft,cx,cx); fft3.complexToComplex3( 1,n1fft,n2fft,cx,cx); fft1.complexToComplex1(-1,n2fft,n3fft,cx,cx); fft2.complexToComplex2(-1,n1fft,n3fft,cx,cx); fft3.complexToComplex3(-1,n1fft,n2fft,cx,cx); fft1.scale(n1fft,n2fft,n3fft,cx); fft2.scale(n1fft,n2fft,n3fft,cx); fft3.scale(n1fft,n2fft,n3fft,cx); assertEqual(cr,cx); }
fft2.complexToComplex2(1,nf1c,nf3,cx,cx); flipSign(3, cx); fft3.complexToComplex3(1,nf1c,nf2,cx,cx); return cx;