/* * Module: windowing * * Routines for reading/writing and convolving. * * * Author: * Stuart Inglis (singlis@internz.co.nz) * (c) 1998 * */ #include #include #include #include "windowing.h" #include "utils.h" #include double window_rectangular_1D(int i, int N) { i=i; /* to quieten compilers */ N=N; return 1.0; } double window_circular_1D(int i, int N) { if((i>=0) && (i<=N)) return 1.0; else return 0.0; } double window_bartlett_1D(int i, int N) { if((i>=0) && (i<=N)){ if(N==0) return 1.0; else return 1.0-i/(double)N; } else return 0.0; } double window_hanning_1D(int i, int N) { if((i>=0) && (i<=N)){ if(N==0) return 1.0; else return (1.0-cos(PI*(1.0+i/(double)(N))))/2.0; } else return 0.0; } double window_hamming_1D(int i, int N) { if((i>=0) && (i<=N)){ if(N==0) return 1.0; else return (0.54-0.46*cos(PI*(1.0+i/(double)(N)))); } else return 0.08; } double window_blackman_1D(int i, int N) { if((i>=0) && (i0); if((width%2)==0) fprintf(stderr,"comment: usually recommended to have an 'odd' size window width\n"); for(r=0;r=L); if((!filename) || (strcmp(filename,"-")==0)){ fp=(stdout); } else{ fp=fopen(filename,"wb"); if(!fp) { fprintf(stderr,"write_window: can't create file '%s'\n",filename); return ; } open=1; } for(i=L;i<=H;i++) fprintf(fp,"%d %g\n",i,window[i]); fflush(fp); if(open) fclose(fp); } void write_window_labelled( char *filename, double *window, int L, int H, double lowrange, double highrange, double bin ) { int i; double r; FILE *fp; int open=0; assert(window); assert(H>=L); highrange=highrange; /* to quieten compilers */ if(bin<=0){ fprintf(stderr,"write_window_labelled: warning, binsize<=0\n"); } if((!filename) || (strcmp(filename,"-")==0)) fp=(stdout); else{ fp=fopen(filename,"wb"); if(!fp) { fprintf(stderr,"write_window: can't create file '%s'\n",filename); return; } open=1; } r=lowrange; for(i=L ;i<=H; i++, r+=bin){ /* r=lowrange+(i-L)*(highrange-lowrange)/(H-L); */ if(bin<0.01) fprintf(fp,"%.3f %g\n",r,window[i]); else if(bin<0.1) fprintf(fp,"%.2f %g\n",r,window[i]); else if(bin<1) fprintf(fp,"%.1f %g\n",r,window[i]); else fprintf(fp,"%g %g\n",r,window[i]); } fflush(fp); if(open) fclose(fp); } void write_window_2D( char *filename, double **window, int Ly, int Hy, int Lx, int Hx ) { int i,j; FILE *fp; int open=0; if((!filename) || (strcmp(filename,"-")==0)) fp=(stdout); else{ fp=fopen(filename,"wb"); if(!fp) { fprintf(stderr,"write_window: can't create file '%s'\n",filename); return; } open=1; } for(j=Ly;j<=Hy;j++) for(i=Lx;i<=Hx;i++) fprintf(fp,"%d\t%d\t%f\n",i,j,window[j][i]); fflush(fp); if(open) fclose(fp); } void write_window_2D_pgm_P2( char *filename, double **window, int Ly, int Hy, int Lx, int Hx, int maxval, char *commentstring ) { double **copy; int j,i; int open=0; FILE *fp; CALLOC_2D(copy,Hy-Ly+1,Hx-Lx+1,double); for(j=Ly;j<=Hy;j++) for(i=Lx;i<=Hx;i++) copy[j-Ly][i-Lx]=window[j][i]; normalise_window_2D(copy,Ly,Hy,Lx,Hx); if((!filename) || (strcmp(filename,"-")==0)){ fp=(stdout); } else{ fp=fopen(filename,"wb"); if(!fp) { fprintf(stderr,"write_window_2D_pgm: can't create file '%s'\n",filename); return; } open=1; } if(commentstring){ if(commentstring[strlen(commentstring)-1]=='\n') commentstring[strlen(commentstring)-1]=0; } if(maxval<=255){ fprintf(fp,"P5\n"); if(commentstring){ fprintf(fp,"# %s\n",commentstring); } fprintf(fp,"%d %d\n",Hx-Lx+1,Hy-Ly+1); fprintf(fp,"%d\n",maxval); } else { fprintf(fp,"P2\n"); if(commentstring){ fprintf(fp,"# %s\n",commentstring); } fprintf(fp,"%d %d\n",Hx-Lx+1,Hy-Ly+1); fprintf(fp,"%d\n",maxval); } for(j=Ly;j<=Hy;j++){ for(i=Lx;i<=Hx;i++){ if((int)(copy[j-Ly][i-Lx]*maxval)<0) fprintf(stderr,"warning - file '%s' has negative values!!!\n",filename); if(maxval<=255){ fputc((int)(copy[j-Ly][i-Lx]*maxval),fp); } else { fprintf(fp,"%d ",(int)(copy[j-Ly][i-Lx]*maxval)); } } if(maxval>255){ fprintf(fp,"\n"); } } fflush(fp); if(open) fclose(fp); FREE_2D(copy,Hy-Ly+1); } void write_window_2D_pgm_P2_float( char *filename, float **window, int Ly, int Hy, int Lx, int Hx, int maxval ) { double **copy; int j,i; int open=0; FILE *fp; CALLOC_2D(copy,Hy-Ly+1,Hx-Lx+1,double); for(j=Ly;j<=Hy;j++) for(i=Lx;i<=Hx;i++) copy[j-Ly][i-Lx]=window[j][i]; normalise_window_2D(copy,Ly,Hy,Lx,Hx); if((!filename) || (strcmp(filename,"-")==0)) fp=(stdout); else{ fp=fopen(filename,"wb"); if(!fp) { fprintf(stderr,"write_window_2D_pgm: can't create file '%s'\n",filename); return; } open=1; } fprintf(fp,"P2\n"); fprintf(fp,"%d %d\n",Hx-Lx+1,Hy-Ly+1); fprintf(fp,"%d\n",maxval); for(j=Ly;j<=Hy;j++){ for(i=Lx;i<=Hx;i++){ if((int)(copy[j-Ly][i-Lx]*maxval)<0) fprintf(stderr,"warning - file '%s' has negative values!!!\n",filename); fprintf(fp,"%d ",(int)(copy[j-Ly][i-Lx]*maxval)); } fprintf(fp,"\n"); } fflush(fp); if(open) fclose(fp); FREE_2D(copy,Hy-Ly+1); } void write_window_2D_pgm_P5_float( char *filename, float **window, int Ly, int Hy, int Lx, int Hx, int maxval ) { double **copy; int j,i; int open=0; FILE *fp; CALLOC_2D(copy,Hy-Ly+1,Hx-Lx+1,double); for(j=Ly;j<=Hy;j++) for(i=Lx;i<=Hx;i++) copy[j-Ly][i-Lx]=window[j][i]; normalise_window_2D(copy,Ly,Hy,Lx,Hx); if((!filename) || (strcmp(filename,"-")==0)) fp=(stdout); else{ fp=fopen(filename,"wb"); if(!fp) { fprintf(stderr,"write_window_2D_pgm: can't create file '%s'\n",filename); return; } open=1; } fprintf(fp,"P5\n"); fprintf(fp,"%d %d\n",Hx-Lx+1,Hy-Ly+1); fprintf(fp,"%d\n",maxval); for(j=Ly;j<=Hy;j++){ for(i=Lx;i<=Hx;i++){ if((int)(copy[j-Ly][i-Lx]*maxval)<0) fprintf(stderr,"warning - file '%s' has negative values!!!\n",filename); fputc((char)(copy[j-Ly][i-Lx]*maxval),fp); } } fflush(fp); if(open) fclose(fp); FREE_2D(copy,Hy-Ly+1); } void normalise_window( double *window, int L, int H ) { int i; double maxval,minval; double gap; minval=maxval=window[L]; for(i=L; i<=H; i++){ if(window[i]>maxval) maxval=window[i]; if(window[i]maxval) maxval=window[j][i]; if(window[j][i]H) b-=(H-L+1); x=data[b]; } else { if((n+kH)) x=0.0; else x=data[n+k]; } h=window[k+origin]; sum+=x*h; } result[n]=sum; } } void convolve_2D( double **data, int Ly, int Hy, int Lx, int Hx, double **window, int width, int originy, int originx, double **result, int OPTIONS ) { int i,j; int lx,ly; double x; double sum; int bx,by; for(j=Ly;j<=Hy;j++) for(i=Lx; i<=Hx ;i++){ sum=0; for(ly=-originy;lyHx) bx-=(Hx-Lx+1); by=j+ly; while(byHy) by-=(Hy-Ly+1); x=data[by][bx]* window[ly+originy][lx+originx]; } else { if((j+lyHy) || (i+lxHx)) x=0; else x=data[j+ly][i+lx] * window[ly+originy][lx+originx]; } sum+=x; } } result[j][i]=sum; } }