private void extrapolate(float[][] xfft) { if (_extrapolation==Extrapolation.ZERO_SLOPE) { for (int i2=0; i2<_nx2; ++i2) extrapolate(xfft[i2]); int mr2 = _nx2+_kh2; float[] xr2 = xfft[_nx2-1]; for (int i2=_nx2; i2<mr2; ++i2) copy(xr2,xfft[i2]); int ml2 = _nfft2+_kh2-_nh2+1; float[] xl2 = xfft[0]; for (int i2=ml2; i2<_nfft2; ++i2) copy(xl2,xfft[i2]); } }
private void extrapolate(float[][][] xfft) { if (_extrapolation==Extrapolation.ZERO_SLOPE) { for (int i3=0; i3<_nx3; ++i3) extrapolate(xfft[i3]); int mr3 = _nx3+_kh3; float[][] xr3 = xfft[_nx3-1]; for (int i3=_nx3; i3<mr3; ++i3) copy(xr3,xfft[i3]); int ml3 = _nfft3+_kh3-_nh3+1; float[][] xl3 = xfft[0]; for (int i3=ml3; i3<_nfft3; ++i3) copy(xl3,xfft[i3]); } } }
/** * Applies this filter. * Input and output arrays may be the same array. * @param x input array. * @param y output array. */ public void apply(float[] x, float[] y) { Check.state(_h1!=null,"1D filter is available"); int nx1 = x.length; updateFfts(nx1); float[] xfft = new float[_nfft1+2]; copy(nx1,x,xfft); extrapolate(xfft); _fft1.realToComplex(-1,xfft,xfft); int nk1 = _nfft1/2+1; for (int ik1=0,k1r=0,k1i=1; ik1<nk1; ++ik1,k1r+=2,k1i+=2) { float xr = xfft[k1r]; float xi = xfft[k1i]; float hr = _h1fft[k1r]; float hi = _h1fft[k1i]; xfft[k1r] = xr*hr-xi*hi; xfft[k1i] = xr*hi+xi*hr; } if (!_filterCaching) _h1fft = null; _fft1.complexToReal(1,xfft,xfft); copy(nx1,xfft,y); }
float[][] xfft = new float[_nfft2][_nfft1+2]; copy(nx1,nx2,x,xfft); extrapolate(xfft); _fft1.realToComplex1(-1,_nfft2,xfft,xfft); _fft2.complexToComplex2(-1,_nfft1/2+1,xfft,xfft);
float[][][] xfft = new float[_nfft3][_nfft2][_nfft1+2]; copy(nx1,nx2,nx3,x,xfft); extrapolate(xfft); _fft1.realToComplex1(-1,_nfft2,_nfft3,xfft,xfft); _fft2.complexToComplex2(-1,_nfft1/2+1,_nfft3,xfft,xfft);