Doxygen Source Code Documentation
plug_delay_V2.h File Reference
Go to the source code of this file.
Defines | |
| #define | NOWAYXCORCOEF 0 |
| #define | METH_SECONDS 0 |
| #define | METH_DEGREES 1 |
| #define | METH_RADIANS 2 |
Functions | |
| int | Read_file (float *x, char *f_name, int n_points) |
| void | linear_reg (float *x, float *y, int size, float *a, float *b, int *err) |
| int | equal_strings (char *s1, char *s2) |
| int | float_file_size (char *f_name) |
| void | error_message (char *origin, char *cause, int ext) |
| char ** | allocate2D (int rows, int cols, int element_size) |
| void | free2D (char **a, int rows) |
| void | linear_interp (float *x1, float *y1, float *x2, float *y2, float *x, float *y, int ln) |
| void | float_to_complex (float *x, COMPLEX *xc, int ln) |
| void | c_conj (COMPLEX *x, COMPLEX *y, int ln) |
| void | c_get (COMPLEX *x, float *y, int p, int ln) |
| void | c_scale (COMPLEX *x, COMPLEX *y, float scl, int ln) |
| void | c_padd (COMPLEX *x, COMPLEX *y, COMPLEX pad_val, int ix, int lnx, int lny) |
| void | c_mult (COMPLEX *x, COMPLEX *y, COMPLEX *z, int ln) |
| void | detrend (float *y, float *yd, int lny, float *a, float *b) |
| void | padd (float *x, float *y, float pad_val, int ix, int lnx, int lny) |
| void | hanning (float *x, int l, int opt) |
| float | punwrap (float p, int opt) |
| float | Lagrange_interp (float *x, float *y, float xi, int ln) |
| void | f_mult (float *x, float *y, float *z, int ln) |
| int | hilbertdelay_V2 (float *x, float *y, int lng_full, int Nseg, int Pover,\int opt, int dtrnd, float Dtx, int biasrem,\float *del, float *slp, float *xcor, float *xcorCoef,\float *vx, float *vy) |
| void | hunwrap (float del, float fs, float T, float slp, int wrp, int unt, float *delu) |
| int | isarg (int argc, char *argv[], char *probe) |
| float | mean_array (float *ar, int size) |
| void | zeromean (float *x, float *y, int ln) |
| void | disp_comp_vect (COMPLEX *v, int l) |
| void | disp_vect (float *v, int l) |
| int | is_vect_null (float *v, int npts) |
| int | write_float (float *x, char *f_name, int n_points) |
| void | fft (COMPLEX *x, int m) |
| void | ifft (COMPLEX *x, int m) |
| void | rfft (float *x, COMPLEX *y, int m) |
| int | hilbertdelay_V2 (float *x, float *y, int lng_full, int Nseg, int Pover, int opt, int dtrnd, float Dtx, int biasrem, float *del, float *slp, float *xcor, float *xcorCoef, float *vx, float *vy) |
Define Documentation
|
|
Definition at line 27 of file plug_delay_V2.h. Referenced by hunwrap(). |
|
|
Definition at line 28 of file plug_delay_V2.h. Referenced by hunwrap(). |
|
|
Definition at line 26 of file plug_delay_V2.h. |
|
|
Definition at line 22 of file plug_delay_V2.h. Referenced by hilbertdelay_V2(). |
Function Documentation
|
||||||||||||||||
|
Definition at line 132 of file plug_delay_V2.h. References calloc, cols, i, and rows. Referenced by hilbertdelay_V2().
00134 {
00135 int i;
00136 char **A;
00137
00138 /* try to allocate the request */
00139 switch(element_size) {
00140 case sizeof(short): { /* integer matrix */
00141 short **int_matrix;
00142 int_matrix = (short **)calloc(rows,sizeof(short *));
00143 if(!int_matrix) {
00144 printf("\nError making pointers in %dx%d int matrix\n"
00145 ,rows,cols);
00146 exit(1);
00147 }
00148 for(i = 0 ; i < rows ; i++) {
00149 int_matrix[i] = (short *)calloc(cols,sizeof(short));
00150 if(!int_matrix[i]) {
00151 printf("\nError making row %d in %dx%d int matrix\n"
00152 ,i,rows,cols);
00153 exit(1);
00154 }
00155 }
00156 A = (char **)int_matrix;
00157 break;
00158 }
00159 case sizeof(float): { /* float matrix */
00160 float **float_matrix;
00161 float_matrix = (float **)calloc(rows,sizeof(float *));
00162 if(!float_matrix) {
00163 printf("\nError making pointers in %dx%d float matrix\n"
00164 ,rows,cols);
00165 exit(1);
00166 }
00167 for(i = 0 ; i < rows ; i++) {
00168 float_matrix[i] = (float *)calloc(cols,sizeof(float));
00169 if(!float_matrix[i]) {
00170 printf("\nError making row %d in %dx%d float matrix\n"
00171 ,i,rows,cols);
00172 exit(1);
00173 }
00174 }
00175 A = (char **)float_matrix;
00176 break;
00177 }
00178 case sizeof(double): { /* double matrix */
00179 double **double_matrix;
00180 double_matrix = (double **)calloc(rows,sizeof(double *));
00181 if(!double_matrix) {
00182 printf("\nError making pointers in %dx%d double matrix\n"
00183 ,rows,cols);
00184 exit(1);
00185 }
00186 for(i = 0 ; i < rows ; i++) {
00187 double_matrix[i] = (double *)calloc(cols,sizeof(double));
00188 if(!double_matrix[i]) {
00189 printf("\nError making row %d in %dx%d double matrix\n"
00190 ,i,rows,cols);
00191 exit(1);
00192 }
00193 }
00194 A = (char **)double_matrix;
00195 break;
00196 }
00197 default:
00198 printf("\nERROR in matrix_allocate: unsupported type\n");
00199 exit(1);
00200 }
00201 return(A);
00202 }
|
|
||||||||||||||||
|
Definition at line 696 of file plug_delay_V2.h. References i. Referenced by hilbertdelay_V2().
|
|
||||||||||||||||||||
|
Definition at line 822 of file plug_delay_V2.h. Referenced by hilbertdelay_V2().
00824 {
00825 int i;
00826 if ((ln-1) == 0)
00827 {
00828 if (p == 0) { (*y) = (*x).real; }
00829 else {(*y) = (*x).imag;}
00830 return;
00831 }
00832 else
00833 {
00834 for (i=0;i<ln;++i)
00835 {
00836 if (p == 0) { y[i] = x[i].real; }
00837 else { y[i] = x[i].imag; }
00838 }
00839 return;
00840 }
00841 }
|
|
||||||||||||||||||||
|
Definition at line 718 of file plug_delay_V2.h. References i, COMPLEX::imag, and COMPLEX::real. Referenced by hilbertdelay_V2().
00719 {
00720 int i;
00721 COMPLEX t;
00722
00723 if ((ln-1) == 0)
00724 {
00725 t.real = ((*x).real * (*y).real - (*x).imag * (*y).imag);
00726 t.imag = ((*x).real * (*y).imag + (*y).real * (*x).imag);
00727 (*z).real = t.real;
00728 (*z).imag = t.imag;
00729 return;
00730 }
00731 else
00732 {
00733 for (i=0;i<ln;++i)
00734 {
00735 t.real = (x[i].real * y[i].real - x[i].imag * y[i].imag);
00736 t.imag = (x[i].real * y[i].imag + y[i].real * x[i].imag);
00737 z[i].real = t.real;
00738 z[i].imag = t.imag;
00739 }
00740 return;
00741 }
00742 }
|
|
||||||||||||||||||||||||||||
|
Definition at line 746 of file plug_delay_V2.h. References calloc, error_message(), free, i, COMPLEX::imag, and COMPLEX::real. Referenced by hilbertdelay_V2().
00747 {
00748 int i,di;
00749 COMPLEX *tmp;
00750
00751 tmp = (COMPLEX *) calloc (lnx+2,sizeof(COMPLEX));
00752
00753 if (tmp == NULL)
00754 {
00755 printf ("\nFatal Error : Failed to Allocate memory\a\n");
00756 printf ("Abandon Lab Immediately !\n\n");
00757 return;
00758 };
00759
00760 di = lny-lnx;
00761 if (lny < lnx)
00762 {
00763 error_message ("c_padd","lny < lnx !",1);
00764 exit(1);
00765 }
00766 if (ix > lnx+1)
00767 {
00768 error_message ("c_padd","ix > lnx+1 !",1);
00769 exit(1);
00770 }
00771
00772 for (i=0;i<lnx;++i)
00773 {
00774 tmp[i].real = x[i].real; /* must do this to be safe when in client program function call is made with input and */
00775 tmp[i].imag = x[i].imag; /* output vectors being the same !!! */
00776 }
00777
00778 for (i=0;i<(ix-1);++i)
00779 {
00780 y[i].real = tmp[i].real;
00781 y[i].imag = tmp[i].imag;
00782 }
00783 for (i=ix-1;i<ix+di-1;++i)
00784 {
00785 y[i].real = pad_val.real;
00786 y[i].imag = pad_val.imag;
00787 }
00788 for (i=ix+di-1;i<lny;++i)
00789 {
00790 y[i].real = tmp[i-di].real;
00791 y[i].imag = tmp[i-di].imag;
00792 }
00793
00794 free (tmp);
00795 return;
00796 }
|
|
||||||||||||||||||||
|
Definition at line 800 of file plug_delay_V2.h. References i. Referenced by hilbertdelay_V2().
00801 {
00802 int i;
00803 if ((ln-1) == 0)
00804 {
00805 (*y).real = (scl) * ((*x).real);
00806 (*y).imag = (scl) * ((*x).imag);
00807 return;
00808 }
00809 else
00810 {
00811 for (i=0;i<ln;++i)
00812 {
00813 y[i].real = (scl) * (x[i].real);
00814 y[i].imag = (scl) * (x[i].imag);
00815 }
00816 return;
00817 }
00818 }
|
|
||||||||||||||||||||||||
|
Definition at line 259 of file plug_delay_V2.h. References a, calloc, free, i, and linear_reg(). Referenced by hilbertdelay_V2(), main(), and normalize().
00261 {
00262 int i;
00263 int err;
00264 float *x;
00265
00266 x = (float *)calloc (lny+1,sizeof(float));
00267 if (x == NULL)
00268 {
00269 printf ("\nFatal Error : Failed to Allocate memory\a\n");
00270 printf ("Abandon Lab Immediately !\n\n");
00271 return;
00272 };
00273
00274 for (i=0;i<lny;++i) /*creating x vector */
00275 x[i] = (float)i;
00276
00277 linear_reg (x,y,lny,a,b,&err);
00278
00279 for (i=0;i<lny;++i)
00280 {
00281 yd[i] = y[i] - (*a * x[i] + *b);
00282 }
00283
00284 free (x);
00285 return;
00286 }
|
|
||||||||||||
|
Definition at line 1630 of file plug_delay_V2.h.
01631 {
01632 int i;
01633
01634 printf ("\n");
01635
01636 if ((l-1) == 0)
01637 {
01638 printf ("V = (%f,%f)\n",(*v).real,(*v).imag);
01639 }
01640 else
01641 {
01642 for (i=0;i<l;++i)
01643 {
01644 printf ("V[%d] = (%f,%f)\t",i,v[i].real,v[i].imag);
01645 }
01646 printf ("\n");
01647 }
01648 return;
01649
01650 }
|
|
||||||||||||
|
Definition at line 1654 of file plug_delay_V2.h.
|
|
||||||||||||
|
Definition at line 875 of file plug_delay_V2.h.
00877 {
00878 int i=0;
00879
00880 if (s1 == NULL && s2 == NULL) return (-2);
00881
00882 if ((s1 == NULL && s2 != NULL) || (s1 != NULL && s2 == NULL)) return (-1);
00883
00884 while (s1[i] == s2[i]
00885 && s1[i] != '\0' && s2[i] != '\0') ++i;
00886
00887 if (s1[i] == '\0' && s2[i] == '\0') return (1);
00888 else return (0);
00889
00890 }
|
|
||||||||||||||||
|
Definition at line 101 of file plug_delay_V2.h. References s2. Referenced by c_padd(), hilbertdelay_V2(), linear_interp(), padd(), and punwrap().
00103 {
00104
00105 printf ("\n\n\a\33[1mError: \33[0m%s\n",s2);
00106 printf ("\33[1mError origin:\33[0m %s\n\n",s1);
00107 if (ext == 1)
00108 {
00109 printf ("Exiting Program ..\n\n");
00110 exit (0);
00111 }
00112 else return;
00113
00114 }
|
|
||||||||||||||||||||
|
Definition at line 1115 of file plug_delay_V2.h. References i. Referenced by hilbertdelay_V2().
|
|
||||||||||||
|
Definition at line 352 of file plug_delay_V2.h. References arg, calloc, free, i, COMPLEX::imag, l, and COMPLEX::real. Referenced by hilbertdelay_V2(), and rfft().
00353 {
00354 static COMPLEX *w; /* used to store the w complex array */
00355 static int mstore = 0; /* stores m for future reference */
00356 static int n = 1; /* length of fft stored for future */
00357
00358 COMPLEX u,temp,tm;
00359 COMPLEX *xi,*xip,*xj,*wptr;
00360
00361 int i,j,k,l,le,windex;
00362
00363 double arg,w_real,w_imag,wrecur_real,wrecur_imag,wtemp_real;
00364
00365 if(m != mstore) {
00366
00367 /* free previously allocated storage and set new m */
00368
00369 if(mstore != 0) free(w);
00370 mstore = m;
00371 if(m == 0) return; /* if m=0 then done */
00372
00373 /* n = 2**m = fft length */
00374
00375 n = 1 << m;
00376 le = n/2;
00377
00378 /* allocate the storage for w */
00379
00380 w = (COMPLEX *) calloc(le-1,sizeof(COMPLEX));
00381 if(!w) {
00382 printf("\nUnable to allocate complex W array\n");
00383 exit(1);
00384 }
00385
00386 /* calculate the w values recursively */
00387
00388 arg = 4.0*atan(1.0)/le; /* PI/le calculation */
00389 wrecur_real = w_real = cos(arg);
00390 wrecur_imag = w_imag = -sin(arg);
00391 xj = w;
00392 for (j = 1 ; j < le ; j++) {
00393 xj->real = (float)wrecur_real;
00394 xj->imag = (float)wrecur_imag;
00395 xj++;
00396 wtemp_real = wrecur_real*w_real - wrecur_imag*w_imag;
00397 wrecur_imag = wrecur_real*w_imag + wrecur_imag*w_real;
00398 wrecur_real = wtemp_real;
00399 }
00400 }
00401
00402 /* start fft */
00403
00404 le = n;
00405 windex = 1;
00406 for (l = 0 ; l < m ; l++) {
00407 le = le/2;
00408
00409 /* first iteration with no multiplies */
00410
00411 for(i = 0 ; i < n ; i = i + 2*le) {
00412 xi = x + i;
00413 xip = xi + le;
00414 temp.real = xi->real + xip->real;
00415 temp.imag = xi->imag + xip->imag;
00416 xip->real = xi->real - xip->real;
00417 xip->imag = xi->imag - xip->imag;
00418 *xi = temp;
00419 }
00420
00421 /* remaining iterations use stored w */
00422
00423 wptr = w + windex - 1;
00424 for (j = 1 ; j < le ; j++) {
00425 u = *wptr;
00426 for (i = j ; i < n ; i = i + 2*le) {
00427 xi = x + i;
00428 xip = xi + le;
00429 temp.real = xi->real + xip->real;
00430 temp.imag = xi->imag + xip->imag;
00431 tm.real = xi->real - xip->real;
00432 tm.imag = xi->imag - xip->imag;
00433 xip->real = tm.real*u.real - tm.imag*u.imag;
00434 xip->imag = tm.real*u.imag + tm.imag*u.real;
00435 *xi = temp;
00436 }
00437 wptr = wptr + windex;
00438 }
00439 windex = 2*windex;
00440 }
00441
00442 /* rearrange data by bit reversing */
00443
00444 j = 0;
00445 for (i = 1 ; i < (n-1) ; i++) {
00446 k = n/2;
00447 while(k <= j) {
00448 j = j - k;
00449 k = k/2;
00450 }
00451 j = j + k;
00452 if (i < j) {
00453 xi = x + i;
00454 xj = x + j;
00455 temp = *xj;
00456 *xj = *xi;
00457 *xi = temp;
00458 }
00459 }
00460 }
|
|
|
Definition at line 894 of file plug_delay_V2.h. Referenced by check_for_valid_inputs().
00896 {
00897
00898
00899 int cnt=0,ex;
00900 float buf;
00901
00902 FILE*internal_file;
00903
00904 internal_file = fopen (f_name,"r");
00905 if (internal_file == NULL) {
00906 printf ("\aCould not open %s \n",f_name);
00907 printf ("Exiting @ float_file_size function\n");
00908 exit (0);
00909 }
00910 ex = fscanf (internal_file,"%f",&buf);
00911 while (ex != EOF)
00912 {
00913 ++cnt;
00914 ex = fscanf (internal_file,"%f",&buf);
00915 }
00916
00917
00918 fclose (internal_file);
00919 return (cnt);
00920 }
|
|
||||||||||||||||
|
Definition at line 673 of file plug_delay_V2.h. Referenced by hilbertdelay_V2().
|
|
||||||||||||
|
Definition at line 222 of file plug_delay_V2.h. References a, free, i, and rows. Referenced by hilbertdelay_V2().
|
|
||||||||||||||||
|
Definition at line 239 of file plug_delay_V2.h.
00240 {
00241 int i;
00242 float arg;
00243
00244 arg = 2.0*3.14159/(l-1);
00245 if (opt == 0)
00246 {
00247 for (i=0;i<l;++i)
00248 x[i]=0.5-0.5*cos(arg*(float)i);
00249 } else if (opt == 1)
00250 {
00251 for (i=0;i<l;++i)
00252 x[i]=x[i] * (0.5-0.5*cos(arg*(float)i));
00253 }
00254 return;
00255 }
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Definition at line 1143 of file plug_delay_V2.h. References a, allocate2D(), c_conj(), c_get(), c_mult(), c_padd(), c_scale(), calloc, cbuf, detrend(), error_message(), f_mult(), fft(), float_to_complex(), free, free2D(), i, ifft(), COMPLEX::imag, Lagrange_interp(), linear_interp(), NOWAYXCORCOEF, padd(), COMPLEX::real, write_float(), and zeromean(). Referenced by calculate_results(), and DELAY_tsfuncV2().
01144 {
01145 static int i_call=0,olng,m,lng_use,lng,strt,nd,sg,cnt,maxdel = 0;
01146 static COMPLEX *fftx,*ffty,*Pxy,*fftyc,*fftxc,*Pxx,*Pyy,*Rxx,*Ryy,**fftyca,**Pxya,**Rxxa,**Ryya;
01147 static float *Px,*Py,*Rxy,*HRxy,*xp,*yp,*xcpy,*ycpy,*tmp_f_vect,*tmp_f_vect2,*ubias,a,\
01148 var_y,varu_y,stdv_y,stdvu_y,var_x,varu_x,stdv_x,stdvu_x;
01149
01150 int i,j,k;
01151 char buf[100];
01152 float *mPxy,tmp,sPx,sPy,alfx,betx,alfy,bety,\
01153 f_i,f_i1,izero,reg_pnt,\
01154 NoWayDelay = -100000.0,\
01155 NoWayxcorCoef = NOWAYXCORCOEF;
01156
01157 COMPLEX tmp_c;
01158 char cbuf[30];
01159
01160 if ((opt == 0) && (i_call == 0))
01161 {
01162 error_message ("hilbertdelay_V2","Nothing to DO !",0);
01163 return (1);
01164 }
01165
01166
01167 *del = NoWayDelay; /* setting the value of delay to an unlikely value ...*/
01168 *xcorCoef = NoWayxcorCoef; /* setting the cross correlation coefficient to an unlikely value ...*/
01169
01170
01171 if (opt > 0) /* Execution mode */
01172 {/* opt >0 */
01173
01174 #ifdef DEBUG_ZEO_2
01175 printf ("\nFunction call #%d\n",i_call);
01176 #endif
01177
01178
01179 /*-----------------------------------------------------------------------------------*/
01180 /* Steps that need to be perfromed the first time the function is called */
01181 /*-----------------------------------------------------------------------------------*/
01182
01183 if (i_call == 0)
01184 {/*i_call == 0*/
01185 if ((Nseg < 1) || (Nseg >= lng_full/5))
01186 {
01187 sprintf (buf,"Number of segments (%d) null or too large, or vector length too small (%d) for %d segments ",Nseg,lng_full,Nseg);
01188 error_message ("hilbertdelay_V2",buf,0);
01189 return (2);
01190 }
01191
01192 lng = (int)((float)lng_full / (float)Nseg); /* calculating individual segment length */
01193
01194 maxdel = lng/2; /* delays should not exceed one third of the segment length (and that's pushing it !)*/
01195
01196 m=0;
01197 while ((int)pow((double)2,(double)m) < lng) ++m; /* find closest power of two to the length of the series */
01198 olng = lng; /* save old length*/
01199 lng = (int)pow((double)2,(double)m); /* set new length as power of two actual padding length will double*/
01200 /* in order to correct for circular convolution effects */
01201 lng_use = lng; /* useful length of spectrum after correction for circular convolution effects */
01202
01203 #ifdef DEBUG_ZEO_2
01204 printf ("selected m=%d for a padded segment length of %d, old segment length was %d\nVector holds %d segments\n",m,lng,olng,Nseg);
01205 #endif
01206
01207 fftx = (COMPLEX *) calloc ((2*lng)+2,sizeof(COMPLEX));
01208 fftxc = (COMPLEX *) calloc ((2*lng)+2,sizeof(COMPLEX));
01209 ffty = (COMPLEX *) calloc ((2*lng)+2,sizeof(COMPLEX));
01210 fftyc = (COMPLEX *) calloc ((2*lng)+2,sizeof(COMPLEX));
01211 Pxy = (COMPLEX *) calloc ((2*lng)+2,sizeof(COMPLEX));
01212 Px = (float *) calloc ((2*lng)+2,sizeof(float));
01213 Pxx = (COMPLEX *) calloc ((2*lng)+2,sizeof(COMPLEX));
01214 Py = (float *) calloc ((2*lng)+2,sizeof(float));
01215 Pyy = (COMPLEX *) calloc ((2*lng)+2,sizeof(COMPLEX));
01216 Rxx = (COMPLEX *) calloc ((2*lng)+2,sizeof(COMPLEX));
01217 Ryy = (COMPLEX *) calloc ((2*lng)+2,sizeof(COMPLEX));
01218 Rxy = (float *) calloc ((2*lng)+2,sizeof(float));
01219 HRxy = (float *) calloc ((2*lng)+2,sizeof(float));
01220 xcpy = (float *) calloc ((2*olng)+2,sizeof(float));
01221 ycpy = (float *) calloc ((2*olng)+2,sizeof(float));
01222 xp = (float *) calloc ((2*lng)+2,sizeof(float));
01223 yp = (float *) calloc ((2*lng)+2,sizeof(float));
01224 ubias = (float *) calloc ((2*lng)+2,sizeof(float));
01225 tmp_f_vect = (float *) calloc ((2*lng)+2,sizeof(float));
01226 tmp_f_vect2 = (float *) calloc ((2*lng)+2,sizeof(float));
01227 fftyca = (COMPLEX **) allocate2D ((2*lng)+2,Nseg,sizeof(COMPLEX));
01228 Pxya = (COMPLEX **) allocate2D ((2*lng)+2,Nseg,sizeof(COMPLEX));
01229 Ryya = (COMPLEX **) allocate2D ((2*lng)+2,Nseg,sizeof(COMPLEX));
01230 Rxxa = (COMPLEX **) allocate2D ((2*lng)+2,Nseg,sizeof(COMPLEX));
01231
01232 if (fftx == NULL || fftxc == NULL || ffty == NULL || fftyc == NULL || \
01233 Pxy == NULL || Px == NULL || Py == NULL || xp == NULL || yp == NULL || \
01234 ubias == NULL || tmp_f_vect == NULL || Pxx == NULL || Pyy == NULL || \
01235 Rxx == NULL || Ryy == NULL || fftyca == NULL || Pxya == NULL || \
01236 Ryya == NULL || Rxxa == NULL || tmp_f_vect2 == NULL)
01237 {
01238 printf ("\nFatal Error : Failed to Allocate memory\a\n");
01239 printf ("Abandon Lab Immediately !\n\n");
01240 return(2);
01241 };
01242
01243 /* creating a vector to remove the bowtie artifact from the auto and cross correlation curves, and set to zero
01244 their irrelevant values */
01245 if (biasrem == 1)
01246 {
01247 for (i=0;i<(2*lng);++i)
01248 {
01249 if (i < olng)
01250 {
01251 ubias[i] = (float)olng / (float)(olng - i);
01252 }
01253 else
01254 {
01255 ubias[i] = 0.0;
01256 }
01257 }
01258 }
01259
01260 a = (float)olng; /* Scaling parameter for spectral estimates */
01261
01262 strt = 0; /* setting up for segments loop */
01263 nd = 0;
01264 for (sg=0;sg<Nseg;++sg) /* segments counter */
01265 {/* for sg */
01266 strt = sg * olng;
01267 nd = strt + olng;
01268
01269 cnt = 0;
01270 for (i=strt;i<nd;++i)
01271 {
01272 tmp_f_vect[cnt] = y[i]; /* copying segment number (sg+1) */
01273 ++cnt;
01274 }
01275
01276 if (dtrnd == 1)
01277 {/*dtrnd == 1*/
01278 detrend (tmp_f_vect,ycpy,olng,&alfy,&bety); /* removing linear trend alf? and bet? are the linear fit coefficients for the reference time course*/
01279 padd (ycpy,yp,0.0,olng+1,olng,2*lng); /* Zero padding of detrended reference time course*/
01280 }/*dtrnd == 1*/
01281 else
01282 {/*dtrnd != 1*/
01283 zeromean (tmp_f_vect,ycpy,olng); /* removing the mean only */
01284 padd (ycpy,yp,0.0,olng+1,olng,2*lng); /* Zero padding of reference time course*/
01285 }/*dtrnd != 1*/
01286
01287 float_to_complex (yp,ffty,2*lng); /* reformatting reference vector into complex vector */
01288
01289 fft (ffty,m+1); /* Radix 2 Butterfly fft computation of reference vector */
01290
01291 c_conj (ffty,fftyc,2*lng); /* Computing the conjugate of ffty */
01292
01293 c_mult (ffty,fftyc,Ryy,2*lng); /* Powerspectrum of y (called Ryy) */
01294
01295 for (i=0;i<2*lng;++i) /* copying Power spectrum of y and conjugate of fft of individual segment into storage matrix */
01296 {
01297 fftyca[i][sg].real = fftyc[i].real;
01298 fftyca[i][sg].imag = fftyc[i].imag;
01299 Ryya[i][sg].real = Ryy[i].real;
01300 Ryya[i][sg].imag = Ryy[i].imag;
01301 }
01302
01303 }/* for sg */
01304
01305 for (sg=0;sg<Nseg;++sg) /* computing sum periodogram of y */
01306 {/* for sg */
01307 for (i=0;i<2*lng;++i)
01308 {/* for i */
01309
01310 if (sg == 0)
01311 {
01312 Ryy[i].real = Ryya[i][sg].real;
01313 Ryy[i].imag = Ryya[i][sg].imag;
01314 }
01315 else
01316 {/* sg > 0 */
01317 Ryy[i].real = Ryy[i].real + Ryya[i][sg].real;
01318 Ryy[i].imag = Ryy[i].imag + Ryya[i][sg].imag;
01319 }/* sg > 0 */
01320
01321 }/* for i */
01322
01323 }/* for sg */
01324
01325 c_scale (Ryy,Ryy,1.0/((float)Nseg * a),2*lng); /* scaling periodogram */
01326
01327 ifft (Ryy,m+1); /* calculating autocorrelation of y*/
01328
01329 }/*i_call == 0*/
01330
01331 /*-----------------------------------------------------------------------------------*/
01332 /* Steps that need to be repeated each time the function is called with a new vector */
01333 /*-----------------------------------------------------------------------------------*/
01334
01335 strt = 0; /* setting up for segments loop */
01336 nd =0;
01337 for (sg=0;sg<Nseg;++sg) /* segments counter */
01338 {/* for sg */
01339 strt = sg * olng;
01340 nd = strt + olng;
01341
01342 cnt = 0;
01343 for (i=strt;i<nd;++i)
01344 {
01345 tmp_f_vect[cnt] = x[i]; /* copying segment number (sg+1) */
01346 ++cnt;
01347 }
01348
01349 if (dtrnd == 1)
01350 {/*dtrnd == 1*/
01351 detrend (tmp_f_vect,xcpy,olng,&alfx,&betx); /* removing linear trend alf? and bet? are the linear fit coefficients*/
01352 padd (xcpy,xp,0.0,olng+1,olng,2*lng); /* Zero padding of detrended time course*/
01353 }/*dtrnd == 1*/
01354 else
01355 {/*dtrnd != 1*/
01356 zeromean (tmp_f_vect,xcpy,olng); /* removing the mean only*/
01357 padd (xcpy,xp,0.0,olng+1,olng,2*lng); /* Zero padding of time course*/
01358 }/*dtrnd != 1*/
01359
01360 float_to_complex (xp,fftx,2*lng); /* reformatting vector into complex vector */
01361
01362 fft (fftx,m+1); /* Radix 2 Butterfly fft computation of vector */
01363
01364 c_conj (fftx,fftxc,2*lng); /* Computing the conjugate of fftx */
01365
01366 c_mult (fftx,fftxc,Rxx,2*lng); /* Powerspectrum of x (called Rxx) */
01367
01368 #ifdef DEBUG_ZEO_2
01369 write_float (xp,"dbg_xdp.txt",2*lng);
01370 write_float (yp,"dbg_ydp.txt",2*lng);
01371 printf ("a = %f\n",a);
01372 #endif
01373
01374 for (i=0;i<2*lng;++i) /* copying fftyc at segment sg from storage array */
01375 {
01376 fftyc[i].real = fftyca[i][sg].real;
01377 fftyc[i].imag = fftyca[i][sg].imag;
01378 }
01379
01380 c_mult (fftx,fftyc,Pxy,2*lng); /* Computing the cross power spectrum */
01381
01382 for (i=0;i<2*lng;++i) /* storing the power spectrum and the cross power spectrum at */
01383 { /*different segments */
01384 Pxya[i][sg].real = Pxy[i].real;
01385 Pxya[i][sg].imag = Pxy[i].imag;
01386 Rxxa[i][sg].real = Rxx[i].real;
01387 Rxxa[i][sg].imag = Rxx[i].imag;
01388 }
01389
01390 }/* for sg */
01391
01392 for (sg=0;sg<Nseg;++sg) /* calculating the sum of the periodograms */
01393 {/* for sg */
01394 for (i=0;i<2*lng;++i)
01395 {/* for i*/
01396 if (sg == 0)
01397 {
01398 Pxy[i].real = Pxya[i][sg].real;
01399 Pxy[i].imag = Pxya[i][sg].imag;
01400 Rxx[i].real = Rxxa[i][sg].real;
01401 Rxx[i].imag = Rxxa[i][sg].imag;
01402 }
01403 else
01404 {
01405 Pxy[i].real = Pxy[i].real + Pxya[i][sg].real;
01406 Pxy[i].imag = Pxy[i].imag + Pxya[i][sg].imag;
01407 Rxx[i].real = Rxx[i].real + Rxxa[i][sg].real;
01408 Rxx[i].imag = Rxx[i].imag + Rxxa[i][sg].imag;
01409 }
01410 }/* for i */
01411 }/* for sg */
01412
01413
01414 c_scale (Rxx,Rxx,1.0/((float)Nseg * a),2*lng); /* calculating average Rxx periodogram */
01415
01416 c_scale (Pxy,Pxy,2.0/((float)Nseg * a),2*lng); /* calculating average Pxy and scaling it by 2 periodogram */
01417
01418 tmp_c.real = 0.0; /*discarding half of the cross power spectrum and padding it back to lng */
01419 tmp_c.imag = 0.0;
01420
01421 c_padd (Pxy,Pxy,tmp_c,lng_use+1,lng_use,2*lng);
01422
01423 ifft (Pxy,m+1); /* inverse FFT of the scaled power spectrum */
01424
01425 ifft (Rxx,m+1); /*calculating autocorrelation of x*/
01426
01427 c_get (Pxy,Rxy,0,2*lng); /* seperation of real and imaginary parts, only extract meaningful segment */
01428 c_get (Pxy,HRxy,1,2*lng);
01429
01430 if (biasrem == 1)
01431 {
01432 f_mult (ubias,Rxy,Rxy,2*lng); /* removing bowtie artifact and setting redundant values to zero */
01433 f_mult (ubias,HRxy,HRxy,2*lng);
01434 }
01435
01436 #ifdef DEBUG_ZEO_2
01437 write_float (Rxy,"dbg_Rxy.txt",2*lng);
01438 write_float (HRxy,"dbg_HRxy.txt",2*lng);
01439 write_float (ubias,"dbg_ubias.txt",2*lng);
01440 #endif
01441
01442 for (i=0;i<lng-1;++i) /* searching for the Zero crossing */
01443 {/* for i */
01444 if (i > maxdel)
01445 {/* i > maxdel */
01446 /*sprintf (buf,"Delay larger than 1/2 segment length (%d)",maxdel);
01447 error_message ("hilbertdelay_V2",buf,0);*/
01448 return (3);
01449 }/* i > maxdel */
01450
01451 if (HRxy[i] == 0.0)
01452 {/* HRxy[i] == 0.0 */
01453
01454 if (Rxy[i] > 0.0)
01455 *slp = 1.0;
01456 else
01457 *slp = -1.0;
01458
01459 izero = (float) i;
01460 *xcor = Rxy[i]; /* storing value of max covariance */
01461 i=lng;
01462 }/* HRxy[i] == 0.0 */
01463 else
01464 {/* HRxy[i] != 0.0 */
01465 if ((HRxy[i] * HRxy[i+1]) < 0.0)
01466 {
01467 /* the sign of slp was used to determine the sign of the cross correlation */
01468 /* the sign of slp should be the same as that of Rxy[i] close to izero */
01469 /* moreover, I think the use of the sign of Rxy[i] is better since with no */
01470 /*subtraction performed, I am less sensitive to high freq. noise */
01471 if (Rxy[i] >= 0.0)
01472 *slp = 1.0;
01473 else
01474 *slp = -1.0;
01475
01476 if ((*slp > 0.0))
01477 {
01478 f_i = (float) (i);
01479 f_i1 = (float) (i+1);
01480 reg_pnt = 0.0;
01481 linear_interp (&HRxy[i],&f_i,&HRxy[i+1],&f_i1,®_pnt,&izero,1);
01482
01483 /* find the peak of the cross correlation curve */
01484 k = 0;
01485 for (j=-3;j<=3;++j)
01486 {
01487 if (((i+j) >= 0) && ((i+j) < lng))
01488 {
01489 tmp_f_vect[k] = (float) (i+j);
01490 tmp_f_vect2[k] = Rxy[i+j];
01491 ++k;
01492 }
01493 }
01494 if (k > 1)
01495 {/* at least a 1st order interpolation must be performed */
01496 *xcor = Lagrange_interp (tmp_f_vect,tmp_f_vect2,izero,k);
01497 }
01498
01499
01500 i = lng;
01501 }
01502 }
01503 }/* HRxy[i] != 0.0 */
01504
01505 }/* for i */
01506
01507 *del = izero + Dtx; /* delay is in sample units corrected by the sampling time difference*/
01508
01509 if (Rxx[0].real && Ryy[0].real)
01510 *xcorCoef = *xcor / sqrt (Rxx[0].real * Ryy[0].real) * *slp; /*correction for sign of cross correlation coefficient (slp = 1.0 or -1.00*/
01511 else
01512 {
01513 #ifdef DEBUG_ZEO_3
01514 printf ("\nZero Variance...\n");
01515 #endif
01516 }
01517
01518 /* set vx and vy */
01519
01520 *vx = Rxx[0].real;
01521 *vy = Ryy[0].real;
01522
01523 ++i_call;
01524 return (0);
01525
01526 }/* opt > 0 */ /* Execution mode */
01527 else if (opt == 0)
01528 {/* opt == 0 */
01529
01530 #ifdef DEBUG_ZEO_3
01531 printf ("\nCleaning Up...\n");
01532 #endif
01533
01534 free (fftx); /*Cleaning up used space*/
01535 free (fftxc);
01536 free (ffty);
01537 free (fftyc);
01538 free (Px);
01539 free (Py);
01540 free (Pxx);
01541 free (Pyy);
01542 free (Pxy);
01543 free (Rxx);
01544 free (Ryy);
01545 free (Rxy);
01546 free (HRxy);
01547 free (xp);
01548 free (yp);
01549 free (ubias);
01550 free (xcpy);
01551 free (ycpy);
01552 free (tmp_f_vect);
01553 free (tmp_f_vect2);
01554
01555 free2D ((char **)fftyca,lng+2);
01556 free2D ((char **)Pxya,lng+2);
01557 free2D ((char **)Rxxa,lng+2);
01558 free2D ((char **)Ryya,lng+2);
01559
01560 i_call = 0;
01561
01562 *del = NoWayDelay; /* setting variables to out of bound values for safety */
01563 *xcorCoef = NoWayxcorCoef;
01564
01565 return (0);
01566 }/* opt == 0 */
01567
01568 return(0) ;
01569 }
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
|
||||||||||||||||||||||||||||||||
|
Definition at line 1574 of file plug_delay_V2.h. References METH_DEGREES, METH_RADIANS, and punwrap(). Referenced by calculate_results(), and DELAY_tsfuncV2().
01575 {/*hunwrap*/
01576
01577 float pi = 3.1416, tmp;
01578
01579
01580 if (fs > 0.0)
01581 { /* delay should be in seconds */
01582 del = del / fs;
01583 }
01584
01585 if (T > 0.0)
01586 {/* Period unwrapping possible */
01587 if (slp < 0.0)
01588 {/* Unwrapping required to determine correct delay */
01589
01590 tmp = del * 360.0 / T; /* from time to polar angle */
01591 tmp = punwrap (tmp,1); /* unwrap */
01592 tmp = tmp + 180.0; /* augment by pi */
01593 del = tmp * T / 360.0; /* from polar to time */
01594 }
01595
01596 /* Now for the case where we get negative delays although no wrapping has been
01597 done, namely because of the sampling time correction. */
01598
01599 if (del < 0.0 || del > T)
01600 {
01601 tmp = del * 360.0 / T; /* from time to polar angle */
01602 if (del < 0.0)
01603 { tmp = tmp + 360.0; }
01604 else
01605 {
01606 if (del > T)
01607 tmp = tmp - 360.0;
01608 }
01609 del = tmp * T / 360.0; /* from polar to time */
01610 }
01611
01612 if (wrp == 1)
01613 {/* map of (0-pi) to (0-pi) and (pi-2pi) to (pi-0) */
01614 tmp = del * 360.0 / T; /* from time to polar angle */
01615 tmp = punwrap (tmp,1); /* unwrap */
01616 del = tmp * T / 360.0; /* from polar to time */
01617 }/* map of (0-pi) to (0-pi) and (pi-2pi) to (pi-0) */
01618
01619 if (unt == METH_DEGREES) del = del * 360.0 / T; /* from time to polar angle in degrees*/
01620 if (unt == METH_RADIANS) del = del * 2 * pi / T; /* from time to polar angle in degrees*/
01621 }/* Period unwrapping possible */
01622
01623 *delu = del;
01624
01625 return;
01626 }/*hunwrap*/
|
|
||||||||||||
|
Definition at line 477 of file plug_delay_V2.h. References arg, calloc, free, i, COMPLEX::imag, l, COMPLEX::real, and scale. Referenced by hilbertdelay_V2().
00478 {
00479 static COMPLEX *w; /* used to store the w complex array */
00480 static int mstore = 0; /* stores m for future reference */
00481 static int n = 1; /* length of ifft stored for future */
00482
00483 COMPLEX u,temp,tm;
00484 COMPLEX *xi,*xip,*xj,*wptr;
00485
00486 int i,j,k,l,le,windex;
00487
00488 double arg,w_real,w_imag,wrecur_real,wrecur_imag,wtemp_real;
00489 float scale;
00490
00491 if(m != mstore) {
00492
00493 /* free previously allocated storage and set new m */
00494
00495 if(mstore != 0) free(w);
00496 mstore = m;
00497 if(m == 0) return; /* if m=0 then done */
00498
00499 /* n = 2**m = inverse fft length */
00500
00501 n = 1 << m;
00502 le = n/2;
00503
00504 /* allocate the storage for w */
00505
00506 w = (COMPLEX *) calloc(le-1,sizeof(COMPLEX));
00507 if(!w) {
00508 printf("\nUnable to allocate complex W array\n");
00509 exit(1);
00510 }
00511
00512 /* calculate the w values recursively */
00513
00514 arg = 4.0*atan(1.0)/le; /* PI/le calculation */
00515 wrecur_real = w_real = cos(arg);
00516 wrecur_imag = w_imag = sin(arg); /* opposite sign from fft */
00517 xj = w;
00518 for (j = 1 ; j < le ; j++) {
00519 xj->real = (float)wrecur_real;
00520 xj->imag = (float)wrecur_imag;
00521 xj++;
00522 wtemp_real = wrecur_real*w_real - wrecur_imag*w_imag;
00523 wrecur_imag = wrecur_real*w_imag + wrecur_imag*w_real;
00524 wrecur_real = wtemp_real;
00525 }
00526 }
00527
00528 /* start inverse fft */
00529
00530 le = n;
00531 windex = 1;
00532 for (l = 0 ; l < m ; l++) {
00533 le = le/2;
00534
00535 /* first iteration with no multiplies */
00536
00537 for(i = 0 ; i < n ; i = i + 2*le) {
00538 xi = x + i;
00539 xip = xi + le;
00540 temp.real = xi->real + xip->real;
00541 temp.imag = xi->imag + xip->imag;
00542 xip->real = xi->real - xip->real;
00543 xip->imag = xi->imag - xip->imag;
00544 *xi = temp;
00545 }
00546
00547 /* remaining iterations use stored w */
00548
00549 wptr = w + windex - 1;
00550 for (j = 1 ; j < le ; j++) {
00551 u = *wptr;
00552 for (i = j ; i < n ; i = i + 2*le) {
00553 xi = x + i;
00554 xip = xi + le;
00555 temp.real = xi->real + xip->real;
00556 temp.imag = xi->imag + xip->imag;
00557 tm.real = xi->real - xip->real;
00558 tm.imag = xi->imag - xip->imag;
00559 xip->real = tm.real*u.real - tm.imag*u.imag;
00560 xip->imag = tm.real*u.imag + tm.imag*u.real;
00561 *xi = temp;
00562 }
00563 wptr = wptr + windex;
00564 }
00565 windex = 2*windex;
00566 }
00567
00568 /* rearrange data by bit reversing */
00569
00570 j = 0;
00571 for (i = 1 ; i < (n-1) ; i++) {
00572 k = n/2;
00573 while(k <= j) {
00574 j = j - k;
00575 k = k/2;
00576 }
00577 j = j + k;
00578 if (i < j) {
00579 xi = x + i;
00580 xj = x + j;
00581 temp = *xj;
00582 *xj = *xi;
00583 *xi = temp;
00584 }
00585 }
00586
00587 /* scale all results by 1/n */
00588 scale = (float)(1.0/n);
00589 for(i = 0 ; i < n ; i++) {
00590 x->real = scale*x->real;
00591 x->imag = scale*x->imag;
00592 x++;
00593 }
00594 }
|
|
||||||||||||
|
Definition at line 1677 of file plug_delay_V2.h. Referenced by DELAY_main(), and DELAY_tsfuncV2().
01678 {/*is_vect_null*/
01679
01680 int i , is_ts_null;
01681
01682 is_ts_null = 1; /* Start loop in bad faith */
01683
01684 for (i=0;i<npts;++i)
01685 {
01686 if (v[i] != 0.0)
01687 {
01688 is_ts_null = 0; /* vector is not null */
01689 break;
01690 }
01691 }
01692
01693 return (is_ts_null);
01694
01695 }/*is_vect_null*/
|
|
||||||||||||||||
|
Definition at line 1060 of file plug_delay_V2.h. References argc, equal_strings(), and i.
|
|
||||||||||||||||||||
|
Definition at line 1036 of file plug_delay_V2.h. Referenced by hilbertdelay_V2().
|
|
||||||||||||||||||||||||||||||||
|
Definition at line 845 of file plug_delay_V2.h. References error_message(), i, x2, and y1. Referenced by hilbertdelay_V2().
00847 {int i;
00848
00849 if ((ln -1) == 0)
00850 {
00851 if ((*x2 - *x1) == 0.0)
00852 {
00853 error_message ("linear_interp","identical X values in interpolation boundaries, causes division by zero !",1);
00854 exit (1);
00855 }
00856 *y = (*x - *x1)/(*x2 - *x1)*(*y2 - *y1) + *y1;
00857 }
00858 else
00859 {
00860 for (i=0;i<ln;++i)
00861 {
00862 if ((x2[i] - x1[i]) == 0.0)
00863 {
00864 error_message ("linear_interp","identical X values in interpolation boundaries, causes division by zero !",1);
00865 exit (1);
00866 }
00867 y[i] = (x[i] - x1[i])/(x2[i] - x1[i])*(y2[i] - y1[i]) + y1[i];
00868 }
00869 }
00870 return;
00871 }
|
|
||||||||||||||||||||||||||||
|
Definition at line 979 of file plug_delay_V2.h. Referenced by detrend().
00981 {/* linear_reg*/
00982 int i;
00983 float n,sum_x,sum_y,sum_x2,sum_xy;
00984
00985 *err = 3;
00986
00987 if (size <= 0) {
00988 *err = 1;
00989 return;
00990 }
00991
00992 sum_x = 0.0;
00993 sum_y = 0.0;
00994 sum_xy = 0.0;
00995 sum_x2 = 0.0;
00996 n = (float)size;
00997
00998 for (i=0;i<size;++i)
00999 {
01000 sum_x = sum_x + x[i];
01001 sum_y = sum_y + y[i];
01002 sum_x2 = sum_x2 + x[i] * x[i];
01003 sum_xy = sum_xy + x[i] * y[i];
01004 }
01005
01006 *a = ( n * sum_xy - sum_x * sum_y) / ( n * sum_x2 - sum_x * sum_x);
01007
01008 *b = (sum_y - *a * sum_x) / n;
01009
01010 *err = 0;
01011 return ;
01012 }/* linear_reg */
|
|
||||||||||||
|
Definition at line 1078 of file plug_delay_V2.h. References i. Referenced by zeromean().
|
|
||||||||||||||||||||||||||||
|
Definition at line 290 of file plug_delay_V2.h. References calloc, error_message(), free, and i. Referenced by hilbertdelay_V2().
00291 {
00292 int i,di;
00293 float *tmp;
00294
00295 tmp = (float *) calloc (lnx+2,sizeof(float));
00296
00297 if (tmp == NULL)
00298 {
00299 printf ("\nFatal Error : Failed to Allocate memory\a\n");
00300 printf ("Abandon Lab Immediately !\n\n");
00301 return;
00302 };
00303
00304
00305 di = lny-lnx;
00306 if (lny < lnx)
00307 {
00308 error_message ("padd","lny < lnx !",1);
00309 exit(1);
00310 }
00311 if (ix > lnx+1)
00312 {
00313 error_message ("padd","ix > lnx+1 !",1);
00314 exit(1);
00315 }
00316
00317 for (i=0;i<lnx;++i)
00318 {
00319 tmp[i] = x[i]; /* must use tmp to be safe when in client program function call is made with input and */
00320 }
00321
00322 for (i=0;i<(ix-1);++i)
00323 {
00324 y[i] = tmp[i];
00325 }
00326 for (i=ix-1;i<ix+di-1;++i)
00327 {
00328 y[i] = pad_val;
00329 }
00330 for (i=ix+di-1;i<lny;++i)
00331 {
00332 y[i] = tmp[i-di];
00333 }
00334
00335 free (tmp);
00336 return;
00337 }
|
|
||||||||||||
|
Definition at line 1016 of file plug_delay_V2.h. References error_message(), and p. Referenced by hunwrap().
01017 {/*punwrap*/
01018 float topi,alf;
01019
01020 if (opt == 0)
01021 topi = 2.*3.14159;
01022 else if (opt == 1) topi = 360.0;
01023 else {
01024 error_message ("punwrap","wrong opt parameter",1);
01025 exit (1);
01026 }
01027 alf = (float) drem ((double)p,(double)topi);
01028
01029 if (alf > topi/2.0) alf = topi/2.0-alf;
01030
01031 return (alf);
01032 }/*punwrap*/
|
|
||||||||||||||||
|
Definition at line 924 of file plug_delay_V2.h.
00926 { /* pass a 0 to n_points if you want to read till EOF */
00927 int cnt=0,ex,dec;
00928
00929 FILE*internal_file;
00930
00931 internal_file = fopen (f_name,"r");
00932 if (internal_file == NULL) {
00933 printf ("\aCould not open %s \n",f_name);
00934 printf ("Exiting @ Read_file function\n");
00935 exit (0);
00936 }
00937 ex = fscanf (internal_file,"%f",&x[cnt]);
00938 while (ex != EOF)
00939 {
00940 ++cnt;
00941 /* NOT WORKING, RETURNS SIZEOF (FLOAT) .....
00942 if (sizeof(x) < cnt)
00943 {
00944 printf ("%d = sizeof(x)\n",sizeof(x));
00945 printf ("\nNot Enough Memory Allocated \n\a");
00946 printf ("Exiting @Read_file function\n");
00947 exit (0);
00948 }
00949 ............................................ */
00950 ex = fscanf (internal_file,"%f",&x[cnt]);
00951
00952 if ((n_points != 0) && (cnt == n_points)) ex = EOF;
00953 }
00954
00955 if (cnt < n_points)
00956 {
00957 printf ("\a\nAttempt to read %d points failed,\n",n_points);
00958 printf (" file contains %d points only.\n",cnt);
00959 do {
00960
00961 printf ("End Execution (Yes (1) No (0) ? : ");
00962 ex=scanf ("%d",&dec);
00963 } while (ex != 1 || (dec != 1 && dec !=0));
00964 if (dec)
00965 {
00966 printf ("Exiting @ Read_file function\n");
00967 exit (0);
00968 }
00969 else printf ("\nContinuing execution with %d points\n",cnt);
00970
00971 }
00972
00973 fclose (internal_file);
00974 return (cnt);
00975 }
|
|
||||||||||||||||
|
Definition at line 610 of file plug_delay_V2.h. References arg, calloc, fft(), free, COMPLEX::imag, p, and COMPLEX::real.
00611 {
00612 static COMPLEX *cf;
00613 static int mstore = 0;
00614 int p,num,k,index;
00615 float Realsum, Realdif, Imagsum, Imagdif;
00616 double factor, arg;
00617 COMPLEX *ck, *xk, *xnk, *cx;
00618
00619 /* First call the fft routine using the x array but with
00620 half the size of the real fft */
00621
00622 p = m - 1;
00623 cx = (COMPLEX *) x;
00624 fft(cx,p);
00625
00626 /* Next create the coefficients for recombination, if required */
00627
00628 num = 1 << p; /* num is half the real sequence length. */
00629
00630 if (m!=mstore){
00631 if (mstore != 0) free(cf);
00632 cf = (COMPLEX *) calloc(num - 1,sizeof(COMPLEX));
00633 if(!cf){
00634 printf("\nUnable to allocate trig recomb coefficients.");
00635 exit(1);
00636 }
00637
00638 factor = 4.0*atan(1.0)/num;
00639 for (k = 1; k < num; k++){
00640 arg = factor*k;
00641 cf[k-1].real = (float)cos(arg);
00642 cf[k-1].imag = (float)sin(arg);
00643 }
00644 }
00645
00646 /* DC component, no multiplies */
00647 y[0].real = cx[0].real + cx[0].imag;
00648 y[0].imag = 0.0;
00649
00650 /* other frequencies by trig recombination */
00651 ck = cf;
00652 xk = cx + 1;
00653 xnk = cx + num - 1;
00654 for (k = 1; k < num; k++){
00655 Realsum = ( xk->real + xnk->real ) / 2;
00656 Imagsum = ( xk->imag + xnk->imag ) / 2;
00657 Realdif = ( xk->real - xnk->real ) / 2;
00658 Imagdif = ( xk->imag - xnk->imag ) / 2;
00659
00660 y[k].real = Realsum + ck->real * Imagsum
00661 - ck->imag * Realdif ;
00662
00663 y[k].imag = Imagdif - ck->imag * Imagsum
00664 - ck->real * Realdif ;
00665 ck++;
00666 xk++;
00667 xnk--;
00668 }
00669 }
|
|
||||||||||||||||
|
Definition at line 1700 of file plug_delay_V2.h. References i. Referenced by hilbertdelay_V2().
01703 { /* */
01704 int i;
01705
01706 FILE*internal_file;
01707
01708 internal_file = fopen (f_name,"w");
01709 if (internal_file == NULL) {
01710 printf ("\aCould not open %s \n",f_name);
01711 printf ("Exiting program\n");
01712 exit (0);
01713 }
01714
01715 for (i=0;i<n_points;++i) fprintf (internal_file,"%f\n",x[i]);
01716 fclose (internal_file);
01717 return (i);
01718 }
|
|
||||||||||||||||
|
Definition at line 1100 of file plug_delay_V2.h. References i, and mean_array(). Referenced by hilbertdelay_V2().
|