35 static void sortm (
float ia[],
int ib[],
int n);
36 static void quicksort (
float x[],
int point[],
int l,
int nfilt);
70 extern void bfilt (
float **xbuf,
int nx,
int ny) {
75 ybuf = (
float *) malloc(MAX(nx,ny) *
sizeof(float));
76 save = (
float *) malloc((nx+1) * ny *
sizeof(float));
80 for(k = 0; k < ny; k++) {
81 for(j = 0; j < nx; j++) {
82 save[(nx+1)*k+j] = xbuf[k][j];
85 filt1d(ybuf, nx, mfilt);
86 for(j = 0; j < nx; j++) xbuf[k][j] = ybuf[j];
90 for(k = 0; k < nx; k++) {
91 for(j = 0; j < ny; j++) ybuf[j] = xbuf[j][k];
92 filt1d(ybuf, ny, mfilt);
93 for(j = 0; j < ny; j++)
95 if(save[(nx+1)*j+k] > -1000.0)
96 xbuf[j][k] = MIN(save[(nx+1)*j+k], ybuf[j]);
100 for(k = 0; k < ny; k++) {
101 for(j = 0; j < nx; j++) ybuf[j] = xbuf[k][j];
103 for(j = 0; j < nx; j++) xbuf[k][j] = ybuf[j];
107 for(k = 0; k < nx; k++) {
108 for(j = 0; j < ny; j++) ybuf[j] = xbuf[j][k];
110 for(j = 0; j < ny; j++) xbuf[j][k] = ybuf[j];
122 void filt1d (
float ybuf[],
int mpt,
int mfilt) {
126 wbuf = (
float *) malloc(mpt *
sizeof(
float));
130 for(i = 0; i < mpt; i++){
131 if(ybuf[i] > -1000.0){
140 median(wbuf, irc, mfilt);
142 for(i = 0; i < mpt; i++){
143 if(ybuf[i] > -1000.0){
156 void padext (
float x[],
int n) {
157 int i, j, ilow, ihih=0, ic;
158 float xlow, xhih, slope, t1 ,t2;
161 while(x[i] <= -1000.0) i++;
163 for(i = ilow+1; i < n; i++){
164 if(x[i] <= -1000.0) {
167 while(x[i+ic] <= -1000.0) {
176 for(j = 0; j < ic; j++){
177 t2 = ((float) j+1)/((float) ic+1);
179 x[i+j] = t1*xlow+t2*xhih;
188 slope = x[ilow+1]-x[ilow];
189 for(i = 0; i < ilow; i++) x[i] = x[ilow]-slope*(ilow-i);
192 slope = x[ihih]-x[ihih-1];
193 for(i = ihih+1; i < n; i++) x[i] = x[ihih]+slope*(i-ihih);
199 void hanning (
float xbuf[],
int npt) {
201 float sum = 0.0, xmns, xmnf;
202 int nfilt = 3, i, il, ilow, nelem;
209 ilow = MAX(3,nfilt/4);
210 ilow = (ilow/2)*2 + 1;
212 for(i = 0; i < ilow; i++)
215 xmns = sum/((float) ilow);
218 for(i = 0; i < ilow; i++)
219 sum += xbuf[npt-1-i];
221 xmnf = sum/((float) ilow);
226 ybuf = (
float *) malloc(nelem *
sizeof(
float));
231 for(i = 0; i < il; i++) {
232 ybuf[i] = 2.0 * xmns - xbuf[il+ilow-1-i];
233 ybuf[npt+i+il] = 2.0 * xmnf - xbuf[npt-i-ilow-1];
236 for(i = 0; i < npt; i++)
237 ybuf[i+il] = xbuf[i];
240 for(i = 0; i < npt; i++)
241 xbuf[i] = 0.25 * (ybuf[i] + 2.0 * ybuf[i+1] + ybuf[i+2]);
248 void median (
float xbuf[],
int npt,
int nfilt) {
252 int nfo2p1, i, il, ilow, j, jl, jh, nelem, l=0;
254 if((nfilt/2)*2 == nfilt) nfilt++;
255 if(npt <= nfilt)
return;
260 ybuf = (
float *) malloc(nelem *
sizeof(
float));
263 array = (
float *) malloc(nfilt *
sizeof(
float));
264 point = (
int *) malloc(nfilt *
sizeof(
int));
270 ilow = MAX(3, nfilt/4);
271 ilow = (ilow/2)*2 + 1;
273 for(i = 0; i < ilow; i++) array[i] = xbuf[i];
274 sortm(array, point, ilow);
275 xmns = array[ilow/2];
277 for(i = 0; i < ilow; i++) array[i] = xbuf[npt-1-i];
278 sortm(array, point, ilow);
279 xmnf = array[ilow/2];
282 for(i = 0; i < il; i++) {
283 ybuf[i] = 2.0 * xmns - xbuf[il+ilow-1-i];
284 ybuf[npt+i+il] = 2.0 * xmnf - xbuf[npt-i-ilow-1];
286 for(i = 0; i < npt; i++) ybuf[i+il] = xbuf[i];
289 for(i = 0; i < nfilt; i++) {
294 sortm(array, point, nfilt);
296 xbuf[0] = array[nfo2p1];
299 for(j = jl; j < jh; j++) {
301 for(i = 0; i < nfilt; i++) {
310 quicksort(array, point, l, nfilt);
311 xbuf[j-jl+1] = array[nfo2p1];
315 free((
void *) point);
316 free((
void *) array);
320 static void sortm (
float ia[],
int ib[],
int n) {
321 int i,j, ii, jj, ifin, iu;
325 while(jj < n) jj = 2 * jj;
326 jj = MIN(n,(3 * jj)/4 - 1);
330 for(ii = 0; ii < ifin; ii++) {
333 if(ia[i] <= ia[j])
continue;
349 static void quicksort (
float x[],
int point[],
int l,
int nfilt) {
351 int i, it, j, npt, ii;
355 for(i = 0; i < nfilt; i++) {
356 if(i != l && test <= x[i]) {
361 if(j - 1 == l)
return;
367 for(i = 0; i < npt; i++) {
370 point[ii+1] = point[ii];
381 for(i = 0; i < npt; i++) {
384 point[ii-1] = point[ii];