void opwd21 (bool der1, bool der2 /* derivative flags */, const omni2 ap /* OPWD object */, float* xx /* input */, float* yy /* output */) /*< plane-wave destruction >*/ { int ix, iy, iw, is, i; for (iy=0; iy < ap->ny; iy++) { for (ix=0; ix < ap->nx; ix++) { i = ix + ap->nx * iy; ap->t1[iy][ix] = 0.0f; ap->t2[iy][ix] = 0.0f; yy[i] = 0.0f; } } for (iy=0; iy < ap->ny-1; iy++) { for (ix = ap->nw; ix < ap->nx-ap->nw; ix++) { i = ix + ap->nx * iy; if (der1) { aderfilter(ap->p1[i], ap->flt); } else { passfilter(ap->p1[i], ap->flt); } for (iw = 0; iw <= 2*ap->nw; iw++) { is = iw-ap->nw; ap->t1[iy][ix] += xx[i-is] * ap->flt[iw]; ap->t2[iy][ix] += xx[i+is] * ap->flt[iw]; } } } for (iy = ap->nw; iy < ap->ny-ap->nw; iy++) { for (ix=0; ix < ap->nx-1; ix++) { i = ix + ap->nx * iy; if (der2) { aderfilter(ap->p2[i], ap->flt); } else { passfilter(ap->p2[i], ap->flt); } for (iw = 0; iw <= 2*ap->nw; iw++) { is = iw-ap->nw; yy[i] += (ap->t2[iy+is][ix] - ap->t1[iy-is][ix]) * ap->flt[iw]; } } } }
void allp_lop (bool adj, bool add, int nx, int ny, float* xx, float* yy) { int i1, i2, iw, is, i; float a[7]; sf_adjnull (adj, add, nx, ny, xx, yy); for (i2=0; i2 < n2-1; i2++) { for (i1 = nw*nj; i1 < n1-nw*nj; i1++) { i = i1 + i2*n1; passfilter(nw, pp[i2][i1], a); for (iw = 0; iw <= 2*nw; iw++) { is = (iw-nw)*nj; if (adj) { xx[i+is+n1] += yy[i] * a[iw]; xx[i-is] -= yy[i] * a[iw]; } else { yy[i] += (xx[i+is+n1] - xx[i-is]) * a[iw]; } } } } }
void allpass1 (bool left /* left or right prediction */, bool der /* derivative flag */, const allpass ap /* PWD object */, float* xx /* input */, float* yy /* output */) /*< in-line plane-wave destruction >*/ { int ix, iy, iz, iw, is, i, nx, ny, nz, i1, i2, ip; nx = ap->nx; ny = ap->ny; nz = ap->nz; if (left) { i1=1; i2=ny; ip=-nx; } else { i1=0; i2=ny-1; ip=nx; } for (iz=0; iz < nz; iz++) { for (iy=0; iy < ny; iy++) { for (ix=0; ix < nx; ix++) { i = ix + nx * (iy + ny * iz); yy[i] = 0.; } } } for (iz=0; iz < nz; iz++) { for (iy=i1; iy < i2; iy++) { for (ix = ap->nw*ap->nj; ix < nx-ap->nw*ap->nj; ix++) { i = ix + nx * (iy + ny * iz); if (der) { aderfilter(ap->pp[i], ap->flt); } else { passfilter(ap->pp[i], ap->flt); } for (iw = 0; iw <= 2*ap->nw; iw++) { is = (iw-ap->nw)*ap->nj; yy[i] += (xx[i+is+ip] - xx[i-is]) * ap->flt[iw]; } } } } }
void allpass3_lop (bool adj, bool add, int n1, int n2, float* xx, float* yy) /*< PWD as linear operator >*/ { int i, ix, iy, iz, iw, is, nx, ny, nz, nw, nj; if (n2 != 2*n1) sf_error("%s: size mismatch: %d != 2*%d",__FILE__,n2,n1); sf_adjnull(adj, add, n1, n2, xx, yy); nx = ap1->nx; ny = ap1->ny; nz = ap1->nz; nw = ap1->nw; nj = ap1->nj; if (nx*ny*nz != n1) sf_error("%s: size mismatch",__FILE__); for (iz=0; iz < nz; iz++) { for (iy=0; iy < ny-1; iy++) { for (ix = nw*nj; ix < nx-nw*nj; ix++) { i = ix + nx*(iy + ny*iz); passfilter(ap1->pp[i], ap1->flt); for (iw = 0; iw <= 2*nw; iw++) { is = (iw-nw)*nj; if (adj) { xx[i+nx+is] += yy[i] * ap1->flt[iw]; xx[i-is] -= yy[i] * ap1->flt[iw]; } else { yy[i] += (xx[i+nx+is] - xx[i-is]) * ap1->flt[iw]; } } } } } nx = ap2->nx; ny = ap2->ny; nz = ap2->nz; nw = ap2->nw; nj = ap2->nj; if (nx*ny*nz != n1) sf_error("%s: size mismatch",__FILE__); for (iz=0; iz < nz-1; iz++) { for (iy=0; iy < ny; iy++) { for (ix = nw*nj; ix < nx-nw*nj; ix++) { i = ix + nx*(iy + ny*iz); passfilter(ap2->pp[i], ap2->flt); for (iw = 0; iw <= 2*nw; iw++) { is = (iw-nw)*nj; if (adj) { xx[i+nx*ny+is] += yy[i+n1] * ap2->flt[iw]; xx[i-is] -= yy[i+n1] * ap2->flt[iw]; } else { yy[i+n1] += (xx[i+nx*ny+is] - xx[i-is]) * ap2->flt[iw]; } } } } } }