• API Main Page
  • Documentation
  • Modules
  • Data Structures
  • Files
  • File List
  • Globals

src/mathadd.c

Go to the documentation of this file.
00001 /***************************************************************************
00002  *   Copyright (C) 2008 by Matthias Ihrke   *
00003  *   mihrke@uni-goettingen.de   *
00004  *                                                                         *
00005  *   This program is free software; you can redistribute it and/or modify  *
00006  *   it under the terms of the GNU General Public License as published by  *
00007  *   the Free Software Foundation; either version 2 of the License, or     *
00008  *   (at your option) any later version.                                   *
00009  *                                                                         *
00010  *   This program is distributed in the hope that it will be useful,       *
00011  *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
00012  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
00013  *   GNU General Public License for more details.                          *
00014  *                                                                         *
00015  *   You should have received a copy of the GNU General Public License     *
00016  *   along with this program; if not, write to the                         *
00017  *   Free Software Foundation, Inc.,                                       *
00018  *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
00019  ***************************************************************************/
00020 #include "mathadd.h"
00021 #include <stdlib.h>
00022 #include <math.h>
00023 #include <time.h>
00024 #include <gsl/gsl_sort.h>
00025 #include <gsl/gsl_statistics.h>
00026 
00033 double weighted_median_from_unsorted(const double *d, const double *w, int n){
00034   size_t *permut; 
00035   double ref=0.0, refh;
00036   int k;
00037   int i, h, idx;
00038 
00039   permut=(size_t*)malloc(n*sizeof(size_t));
00040   gsl_sort_index(permut, d, 1, n);  
00041 /*   dprintf("i\tperm[i]\td[i]\td[permut[i]]\n"); */
00042 /*   for(i=0; i<n; i++){ */
00043 /*   dprintf("%i\t%i\t%.2f\t%.2f\n", i, permut[i], d[i], d[permut[i]]); */
00044 /*   } */
00045 
00046   for(i=0; i<n; i++)
00047     ref+=w[i];
00048   ref /= 2.0;
00049   
00050   k=0;
00051   for(h=n-1; h>0; h--){
00052     refh = 0.0;
00053     for(i=h; i<n; i++){ /* works because w_i>=0 */
00054       refh += w[permut[i]];
00055     }
00056     if(refh>=ref){
00057       k=h;
00058       break;
00059     }
00060   }
00061   idx = permut[k];
00062   free(permut);
00063   return d[idx];
00064 }
00065 
00066 /* ---------------------------------------------------------------------------- 
00067    -- Merit Measures                                                         -- 
00068    ---------------------------------------------------------------------------- */
00069 
00074 double rmse(const double *r, const double *d, int n){
00075   int i;
00076   double res=0.0;
00077   for(i=0; i<n; i++)
00078     res = res + pow(r[i]-d[i], 2);
00079   return sqrt(res*1/n);
00080 }
00081 
00085 double snr (const double *r, const double *d, int n){
00086   int i;
00087   double res, tmp;
00088   res = 0.0; tmp = 0.0;
00089   for(i=0; i<n; i++){
00090     res = res+pow(r[i], 2);
00091     tmp = tmp+pow(r[i]-d[i], 2);
00092   }
00093   return 10*(glog(res/tmp, 10));
00094 }
00095 
00105 int cmpdouble(double d1, double d2, int precision){
00106   double epsilon;
00107   epsilon = pow(10, -1*precision);
00108   if(fabs(d1 - d2) < epsilon*fabs(d1) ){
00109     return 0;
00110   } else if(d1<d2){
00111      return -1;
00112   } else {
00113      return 1;
00114   }
00115 }
00116 double glog(double v, int b){
00117   /* compute log_b(v) using ansi-C log */
00118   return (double)((double)log((double)v)/(double)log((double)b));
00119 }
00120 
00121 double mad(const double *data, int n){
00122   /* For a univariate data set X = X_1, X_2, ..., X_n, the MAD is defined as 
00123     MAD = median(|X_i - median(X)|)
00124     (this function has been validated against Matlab's routine, i.e. it works)
00125   */
00126     double *tmp;
00127     double med;
00128     int i;
00129     tmp = (double*)malloc(n*sizeof(double));
00130     tmp = (double*)memcpy((void*)tmp, (const void*)data, sizeof(double)*n);
00131 
00132     gsl_sort(tmp, 1, n);
00133     med = gsl_stats_median_from_sorted_data(tmp, 1, n);
00134     for(i=0; i<n; i++)
00135         tmp[i] = fabs(data[i]-med);
00136     gsl_sort(tmp, 1, n);
00137     med = gsl_stats_median_from_sorted_data(tmp, 1, n);
00138   
00139     free(tmp);
00140     return med;
00141 }
00142 
00143 
00144 int    abscmp(const void *p1, const void *p2){
00145     if(fabs(*(double*)p1)<fabs(*(double*)p2))
00146         return -1;
00147     else if(fabs(*(double*)p1)>fabs(*(double*)p2))
00148         return 1;
00149     else 
00150         return 0;
00151 }
00152 
00153 double vnorm(const double *v, int n, int p){
00154     /* vector norm (p) */
00155     int i;
00156     double norm = 0;
00157     for(i=0; i<n; i++)
00158         norm = norm + pow(fabs(v[i]), p);
00159     return pow(norm, 1/(double)p);
00160 }
00161 
00162 
00163 double maxel(double *v, int n){
00164   int i;
00165   double m=DBL_MIN;
00166   for(i=0; i<n; i++)
00167     if(v[i]>m) m=v[i];
00168   return m;
00169 }
00170 
00171 int maxeli(int *v, int n){
00172   int i;
00173   int m=INT_MIN;
00174   for(i=0; i<n; i++)
00175     if(v[i]<m) m=v[i];
00176   return m;
00177 }
00178 
00185 int closest_index(const double *v, int n, double c){
00186   int i, index=-1;
00187   double tmp=DBL_MAX;
00188   /* dprintf( " v[%i] = %f, n=%i\n", i, v[i], n );   */
00189   for(i=0; i<n; i++){
00190     if(fabs(v[i]-c) < tmp){
00191       index=i;
00192       tmp = fabs(v[i]-c);
00193     }
00194   }
00195   return index;
00196 }
00197 
00198 double* sampled_line(double *ntimes, int n, double start, double end){
00199   /* return pointer to *ntimes with n equally spaced doubles, where
00200      ntimes[0]=start and ntimes[n-1]=end */
00201   double step;
00202   int i;
00203 
00204   step=(end-start)/(double)(n-1);
00205   for(i=0; i<n; i++)
00206     ntimes[i]=start+(i*step);
00207 
00208   return ntimes;
00209 }
00218 double* linspace_dbl(double first, double last, double step, double *v, int *n){
00219   int i;
00220     massert(first>last, "first>last: %f>%f", first, last);
00221     *n = (int) round(((last-first)/step)+1);
00222     if( v==ALLOC_IN_FCT ){
00223       v=(double*)malloc((*n)*sizeof(double));
00224     }
00225     for( i=0; i<*n; i++ ){
00226       v[i] = first+i*step;
00227     }
00228 
00229     return v;
00230 }
00231 
00236 int* linspace(int first, int last){
00237     int i;
00238     int *s;
00239     massert(first>last, "first>last: %i>%i", first, last);
00240     s=(int*)malloc((last-first+1)*sizeof(int));
00241     int j=0;
00242     for(i=first; i<=last; i++){
00243         s[j]=i;
00244         j++;
00245     }
00246     return s;
00247 }
00248 
00254 double* lininterp(const double *x1, const double *y1, int n1, 
00255           const double *x2,       double *y2, int n2){
00256   int i, j;
00257   double m, n;
00258 
00259   massert(x2[0]<x1[0], "x2[0]<x1[0]: %f < %f", x2[0], x1[0]);
00260   massert(x2[n2-1]>x1[n1-1], "x2[n2-1]>x1[n1-1]: %f > %f", x2[n2-1], x1[n1-1]);
00261 /*   fprintf(stderr, "n1=%i, n2=%i\n", n1, n2); */
00262 /*   vprint_vector("x1", x1, n1); */
00263 /*   vprint_vector("y1", y1, n1); */
00264 /*   vprint_vector("x2", x2, n2); */
00265   for(i=0; i<n2; i++){
00266     j=0; while(j<n1 && x2[i]>x1[j]) j++; /* set j */
00267 /*     printf("i=%i (%2.2f), j=%i (%2.2f)\n",i, x2[i], j, x1[j]); */
00268     if(j==n1) n--;
00269     m = (y1[j]-y1[j-1])/(x1[j]-x1[j-1]);
00270     n = y1[j]-m*x1[j];
00271     y2[i] = m*x2[i]+n;
00272   }
00273   return y2;
00274 }
00275 
00276 /* ---------------------------------------------------------------------------- 
00277    -- vector ops                                                             -- 
00278    ---------------------------------------------------------------------------- */
00279 
00280 void    dblp_print( double *v, int n ){
00281   int i;
00282   for( i=0; i<n; i++ ){
00283      fprintf( stderr, "%f\n", v[i] );
00284   }
00285 }
00286 
00287 double  dblp_mean( double *v, int n ){
00288   int i;
00289   double r=0.0;
00290   for( i=0; i<n; i++ ){
00291      r+=v[i];
00292   }
00293   return r/(double)n;
00294 }
00295 
00296 void    dblp_print_int( int *v, int n ){
00297   int i;
00298   fprintf( stderr, "[  ");
00299   for( i=0; i<n; i++ ){
00300      fprintf( stderr, "%i  ", v[i] );
00301   }
00302   fprintf( stderr, "]\n");
00303 
00304 }
00305 
00311 double dblp_min( double *v, int n, int *idx ){
00312   int i;
00313   double min=DBL_MAX;
00314   *idx=-1;
00315 
00316   for( i=0; i<n; i++ ){
00317      if( v[i] < min ){
00318         min = v[i];
00319         *idx = i;
00320      }
00321   }
00322 
00323   return min;
00324 }
00325 
00331 double dblp_max( double *v, int n, int *idx ){
00332   int i;
00333   double max=DBL_MIN;
00334   if( idx )
00335      *idx=-1;
00336 
00337   for( i=0; i<n; i++ ){
00338      if( v[i] > max ){
00339         max = v[i];
00340         if( idx )
00341           *idx = i;
00342      }
00343   }
00344 
00345   return max;
00346 }
00347 
00351 void dblp_shuffle_int( int *permut, int n ){
00352   int i1,i2, i;
00353 
00354   for( i=0; i<n; i++){
00355      i1 = (random() / (RAND_MAX / n+1));
00356      i2 = (random() / (RAND_MAX / n+1));
00357      swap2i( &(permut[i1]), &(permut[i2]));
00358   }
00359 }
00360 
00361 
00364 void  dblp_minus_scalar( double *v, int n, double val ){
00365   int i;
00366   for( i=0; i<n; i++ ){
00367      v[i] = v[i]-val;
00368   }
00369 }
00370 
00376 double* dblp_init( double *v, int n, double val ){
00377   int i;
00378   if( v==NULL){
00379      v = (double*)malloc( n*sizeof(double) );
00380   }
00381   for(i=0; i<n; i++){
00382      v[i] = val;
00383   }
00384 
00385   return v;
00386 }
00387 
00390 double dblp_euclidean_distance( const double *v1, const double *v2, int n ){
00391   int i;
00392   double r=0;
00393   for( i=0; i<n; i++ ){
00394      r += SQR( v1[i]-v2[i] );
00395   }
00396   return sqrt(r);
00397 }
00398 
00399 /* ---------------------------------------------------------------------------- 
00400    -- Matrix ops                                                             -- 
00401    ---------------------------------------------------------------------------- */
00402 
00405 double** dblpp_rand( double **m, int N, int M, double lower, double upper ){
00406   int i,j;
00407   
00408   srand((long)time(NULL));
00409   if( !m ){
00410      m = dblpp_init( N, M );
00411   }
00412   for( i=0; i<N; i++ ){
00413      for( j=0; j<M; j++ ){
00414         m[i][j] = ( (((double)rand()) / RAND_MAX)*(upper-lower))+lower;
00415      }
00416   }
00417 
00418   return m;
00419 }
00425 void     dblpp_normalize_by_max( double **m, int M, int N ){
00426   double max; 
00427 
00428   max = dblpp_max( (const double**) m, M, N, NULL, NULL );
00429   dblpp_divide_scalar( m, M, N, max);
00430 }
00431 
00439 double** dblpp_delrow(double **m, int N, int n, int row){
00440   double *tmp;
00441   int i;
00442   massert(row>N-1, "cannot delete row %i because only %i rows\n", row, N);
00443   tmp = m[row];
00444   for(i=row; i<N-1; i++){
00445     m[i]=m[i+1];
00446   }
00447   m[N-1] = tmp;
00448   return m;
00449 }
00450 
00453 double** dblpp_init(int N, int M){
00454   int i,j;
00455   double **d;
00456   d = (double**) malloc( N*sizeof(double*) );
00457   for( i=0; i<N; i++){
00458      d[i] = (double*) malloc( M*sizeof(double) );
00459      for( j=0; j<M; j++ ){
00460         d[i][j]=0.0;
00461      }
00462   }
00463   
00464   return d;
00465 }
00468 int** dblpp_init_int(int N, int M){
00469   int i,j;
00470   int **d;
00471   /* dprintf("N,M=(%i,%i)\n", N, M); */
00472   d = (int**) malloc( N*sizeof(int*) );
00473   for( i=0; i<N; i++){
00474      /* dprintf(" i=%i\n", i ); */
00475      d[i] = (int*) malloc( M*sizeof(int) );
00476      for( j=0; j<M; j++ ){
00477         d[i][j]=0;
00478      }
00479   }
00480   
00481   return d;
00482 }
00483 
00484 
00492 double** dblpp_delcol(double **m, int N, int n, int col){
00493   int i, j;
00494   double tmp;
00495   massert(col>n-1, "cannot delete col %i because only %i cols\n", col, n);
00496   for(i=0; i<N; i++){
00497     tmp = m[i][col];
00498     for(j=col; j<n-1; j++){
00499       m[i][j]=m[i][j+1];
00500     }
00501     m[i][n-1]=tmp;
00502   }
00503   return m;
00504 }
00505 
00510 double dblpp_min(const double **m, int N, int n, int *i1, int *i2){
00511   int i,j;
00512   double minel=DBL_MAX;
00513   for(i=0; i<N; i++){
00514     for(j=0; j<n; j++){
00515       if(m[i][j]<minel){
00516           minel = m[i][j];
00517           if(i1 && i2){
00518              *i1 = i;
00519              *i2 = j;
00520           }
00521       }
00522     }
00523   } 
00524 
00525   if(i1 && i2){
00526      dprintf("dblpp_min: m(%i,%i)=%f (%f)\n", *i1, *i2, m[*i1][*i2], minel);
00527   } else {
00528      dprintf("dblpp_min: m=%f\n",  minel);
00529   }
00530   return minel;
00531 }
00536 double dblpp_max(const double **m, int N, int n, int *i1, int *i2){
00537   int i,j;
00538   double maxel=DBL_MIN;
00539   for(i=0; i<N; i++){
00540     for(j=0; j<n; j++){
00541       if(m[i][j]>maxel){
00542           maxel = m[i][j];
00543           if(i1 && i2){
00544              *i1 = i;
00545              *i2 = j;
00546           }
00547       }
00548     }
00549   }
00550   if(i1 && i2){
00551      dprintf("dblpp_max: m(%i,%i)=%f (%f)\n", *i1, *i2, m[*i1][*i2], maxel);
00552   } else {
00553      dprintf("dblpp_max: %f\n", maxel);
00554   }
00555   return maxel;
00556 }
00557 
00558 
00561 void dblpp_print(const double **m, int N, int n){
00562   int i,j;
00563 
00564   for(i=0; i<N; i++){
00565      printf("[ ");
00566      for(j=0; j<n; j++){
00567         if(m[i][j]>1000000)
00568           printf("<max> ");
00569         else
00570           printf("%2.2f ", m[i][j]);
00571      }
00572      printf(" ]\n");
00573   }
00574 }
00577 void dblpp_add_dblpp(double **m1, const double **m2, int N, int n){
00578   int i, j;
00579 
00580   for( i=0; i<N; i++){
00581      for( j=0; j<n; j++ ){
00582         m1[i][j]+=m2[i][j];
00583      }
00584   }
00585 }
00586 
00590 void dblpp_sub_dblpp(double **dest, const double **src, int N, int n){
00591   int i, j;
00592 
00593   for( i=0; i<N; i++){
00594      for( j=0; j<n; j++ ){
00595         dest[i][j]-=src[i][j];
00596      }
00597   }
00598 }
00599 
00600 
00607 void     dblpp_dottimes_dblpp( double **m1, const double **m2, int N, int M ){
00608   int i,j;
00609 
00610   for( i=0; i<N; i++){
00611      for( j=0; j<M; j++ ){
00612         m1[i][j] = m1[i][j]*m2[i][j];
00613      }
00614   }
00615 }
00616 
00619 void     dblpp_copy( const double **src, double **dest, int N, int M ){
00620   int i,j;
00621 
00622   for( i=0; i<N; i++ ){
00623      for( j=0; j<M; j++ ){
00624         dest[i][j] = src[i][j];
00625      }
00626   }
00627 }
00630 void dblpp_divide_scalar(double **m, int N, int n, double s){
00631   int i, j;
00632 
00633   for( i=0; i<N; i++){
00634      for( j=0; j<n; j++ ){
00635         m[i][j] /= s;
00636      }
00637   }
00638 }
00639 void     dblpp_add_scalar(double **m, int N, int n, double s){
00640   int i, j;
00641 
00642   for( i=0; i<N; i++){
00643      for( j=0; j<n; j++ ){
00644         m[i][j] += s;
00645      }
00646   }
00647 }
00650 void dblpp_mul_scalar(double **m, int N, int n, double s){
00651   int i, j;
00652 
00653   for( i=0; i<N; i++){
00654      for( j=0; j<n; j++ ){
00655         m[i][j] *= s;
00656      }
00657   }
00658 }
00659 
00662 void dblpp_free(double **m, int N){
00663   int i;
00664   if( !m ){
00665      return;
00666   }
00667   for( i=0; i<N; i++){
00668      free(m[i]);
00669   }
00670   free(m);
00671 }
00672 
00675 int sgn(int x){
00676   return (x > 0) ? 1 : (x < 0) ? -1 : 0;
00677 }
00678 
00679 
00680 void    swap2i(int *v1, int *v2){
00681   int tmp;
00682   tmp = *v1;
00683   *v1 = *v2; 
00684   *v2 = tmp;
00685 }
00686 
00687 void    swap2d(double *v1, double *v2){
00688   double tmp;
00689   tmp = *v1;
00690   *v1 = *v2; 
00691   *v2 = tmp;
00692 }
00693 
00694 
00695 
00701 double drawsample_nearest_neighbour( const double *v, int n, double x ){
00702   int x1;
00703   double r;
00704 
00705   x1 = (int)round( x );
00706 
00707   if( x1<0 || x1>=n ){
00708      errprintf( "(x=%f, x1=%i, n=%i)\n", x, x1, n );
00709   }
00710   r = v[x1];
00711   if( isnan( r ) ){
00712      errprintf( "r=%f (x=%f, x1=%i,v[x1]=%f, n=%i)\n", r, x, x1,v[x1],n );
00713   }
00714   return r;
00715 }
00716 
00717 
00728 double* resample_nearest_neighbour( const double *s, int n, int newn, double *news ){
00729   double step;
00730   int i;
00731 
00732   if( news==NULL ){
00733      news = (double*) malloc( newn*sizeof( double ) );
00734   }
00735 
00736   step = (double)n/(double)newn;
00737   for( i=0; i<newn; i++ ){
00738      news[i] = drawsample_nearest_neighbour( s, n, i*step );
00739   }
00740  
00741   return news;
00742 }
00743 
00752 double* resample_linear( const double *s, int n, int newn, double *news ){
00753   return resample_gsl( s, n, newn, news, gsl_interp_linear );
00754 }
00755 
00774 double* resample_gsl( const double *s, int n, int newn, double *news, const gsl_interp_type *method ){
00775   double step;
00776   int i;
00777   double *x;
00778 
00779   x = (double*)malloc( n*sizeof(double) );
00780   for( i=0; i<n; i++ ){
00781      x[i] = (double)i;
00782   }
00783   gsl_interp_accel *acc = gsl_interp_accel_alloc ();
00784   gsl_spline *spline = gsl_spline_alloc (method, n);
00785   gsl_spline_init (spline, x, s, n);
00786 
00787   if( news==NULL ){
00788      news = (double*) malloc( newn*sizeof( double ) );
00789   }
00790 
00791   step = (double)n/(double)newn;
00792   for( i=0; i<newn; i++ ){
00793      news[i] = gsl_spline_eval( spline, i*step, acc );
00794   }
00795 
00796   /* free */
00797   gsl_spline_free (spline);
00798   gsl_interp_accel_free (acc);
00799   free(x);
00800 
00801   return news;
00802 }
00803 
00804 double* flip_array( double *v, int n ){
00805   int i;
00806   double tmp;
00807 
00808   for( i=0; i<n/2; i++){
00809      tmp = v[i];
00810      v[i] = v[n-i-1];
00811      v[n-i-1] = tmp;
00812   }
00813   return v;
00814 }
00815 
00816 
00817 
00818 #define SWAP(a,b) tempr=(a);(a)=(b);(b)=tempr
00819 
00827 void fft(double *data, unsigned long nn, int isign){
00828   unsigned long n,mmax,m,j,istep,i;
00829   double wtemp,wr,wpr,wpi,wi,theta;
00830   float tempr,tempi;
00831   data--; /* because num_rec assumes [1,...n] arrays */
00832   /* dprintf( "nn=%li, isign=%i\n", nn, isign ); */
00833 
00834   n=nn << 1;
00835   j=1;
00836   for (i=1;i<n;i+=2) {
00837      if (j > i) {
00838         SWAP(data[j],data[i]);
00839         SWAP(data[j+1],data[i+1]);
00840      }
00841      m=nn;
00842      while (m >= 2 && j > m) {
00843         j -= m;
00844         m >>= 1;
00845      }
00846      j += m;
00847   }
00848   mmax=2;
00849   while (n > mmax) {
00850      istep=mmax << 1;
00851      theta=isign*(6.28318530717959/mmax);
00852      wtemp=sin(0.5*theta);
00853      wpr = -2.0*wtemp*wtemp;
00854      wpi=sin(theta);
00855      wr=1.0;
00856      wi=0.0;
00857      for (m=1;m<mmax;m+=2) {
00858         for (i=m;i<=n;i+=istep) {
00859           j=i+mmax;
00860           tempr=wr*data[j]-wi*data[j+1];
00861           tempi=wr*data[j+1]+wi*data[j];
00862           data[j]=data[i]-tempr;
00863           data[j+1]=data[i+1]-tempi;
00864           data[i] += tempr;
00865           data[i+1] += tempi;
00866         }
00867         wr=(wtemp=wr)*wpr-wi*wpi+wr;
00868         wi=wi*wpr+wtemp*wpi+wi;
00869      }
00870      mmax=istep;
00871   }
00872 }
00873 #undef SWAP
00874 
00875 /* ---------------------------------------------------------------------------- 
00876    -- Signal extension routines                                              -- 
00877    ---------------------------------------------------------------------------- */
00878 /* the extension functions return a pointer to the former data[0],
00879    because this is where the unextended signal began;
00880    Example:
00881       sigext([1 2 3 - - - -]) -> [0 0 1 2 3 0 0] 
00882                                       ^ ptr
00883    Assumptions (not for full generality!):
00884       1) ns <= n
00885       2) n <= 2*ns
00886 */
00887 
00889 double* sigext_zeros(double *data, int ns, int n){
00890   int offset, i=0; /* for signal */
00891   double *dptr;
00892   dprintf("Db: sigext_zeros\n");
00893 
00894   offset = (n-ns)/2;
00895   dptr = memmove(&(data[offset]), data, ns*sizeof(double));
00896   for(i=1; i<=offset; i++){ /*( ((n-ns)%2==0) ? offset : offset-1); i++){*/
00897     data[offset-i]=0.0; 
00898     data[offset+ns+i-1]=0.0;
00899   }
00900   data[n-1]=0.0;
00901   return dptr;
00902 }
00903 
00904 
00906 double* sigext_zerosr(double *data, int ns, int n){
00907   dprintf("Db: sigext_zerosr\n");
00908   int i; /* for signal */
00909   for(i=ns; i<n; i++) data[i]=0.0; 
00910   return data;
00911 }
00912 
00914 double* sigext_sym(double *data, int ns, int n){
00915   int offset, i=0; 
00916   double *dptr;
00917   dprintf("Db: sigext_sym\n");
00918 
00919   offset = (n-ns)/2;
00920   dptr = memmove(&(data[offset]), data, ns*sizeof(double));
00921   for(i=1; i<=offset; i++){ /*( ((n-ns)%2==0) ? offset : offset-1); i++){*/
00922     data[offset-i]=data[offset+i-1]; 
00923     data[offset+ns+i-1]=data[offset+ns-i];
00924   }
00925   data[n-1]=((ns-n)%2==0 ? data[offset+(n-ns)/2] : data[offset+(n-ns)/2-1]);
00926   return dptr;
00927   
00928 }
00930 double* sigext_smooth(double *data, int ns, int n){
00931   int offset, i=0; /* for signal */
00932   double *dptr;
00933   dprintf("Db: sigext_smooth\n");
00934 
00935   offset = (n-ns)/2;
00936   dptr = memmove(&(data[offset]), data, ns*sizeof(double));
00937   for(i=1; i<=offset; i++){ /*( ((n-ns)%2==0) ? offset : offset-1); i++){*/
00938     data[offset-i]=data[offset]; 
00939     data[offset+ns+i-1]=data[ns-1];
00940   }
00941   data[n-1]=data[n-2];
00942   return dptr;
00943 }
00944 
00947 int next_pow2( int n ){
00948   int p;
00949   p = (int)round(glog((double)n, 2))+1;
00950   return (int)p;//(int)pow(2, p);
00951 }
00952 
00958 int iremainder( double x, double y){
00959   int result;
00960   
00961   if (y != 0) {
00962      result =  x-y* (int)(x/y);
00963   } else  {
00964      result = 0;
00965      errprintf("division by zero!\n");
00966   }
00967 
00968   return result;
00969 }
00970 
00975 double gaussian( double x, double sigma, double mu ){
00976   return  1/(sigma*sqrt(2*PI)) * exp( -1 * ( SQR( (x-mu) ) / 
00977                                                             (2*SQR( sigma )) ) );
00978 }
00979 
00980 
00983 void scalar_minus_dblpp( double scalar, double **m, int N, int M ){
00984   int i,j;
00985 
00986 
00987   for( i=0; i<N; i++ ){
00988      for( j=0; j<M; j++ ){
00989         m[i][j] = scalar-m[i][j];
00990      }
00991   }
00992 }
00993 
00994 
01006 Complex* expand_polynomial_from_roots( const Complex *roots, int n, Complex *coeffs ){
01007   int i, j;
01008   Complex nw;
01009 
01010   if( coeffs==ALLOC_IN_FCT ){
01011      coeffs = (Complex*) malloc( (n+1)*sizeof( Complex ) );
01012   }
01013 
01014   coeffs[0] = complex( 1.0, 0.0 );
01015   for (i=0; i < n; i++){
01016      coeffs[i+1] = complex(0.0,0.0);
01017   }
01018   for (i=0; i < n; i++){
01019      nw = complex_mul_double( roots[i], -1.0 );
01020      for( j=n; j>=1; j-- ){
01021         coeffs[j] = complex_mul( nw, coeffs[j] );
01022         coeffs[j] = complex_add( coeffs[j], coeffs[j-1] );
01023      }
01024      coeffs[0] = complex_mul( nw, coeffs[0] );
01025   }
01026 
01027 
01028   return coeffs;
01029 }
01030 
01031 
01037 double* dblp_complex_to_real( const Complex *vc, double *vr, int n ){
01038   int i;
01039   dprintf("entering\n");
01040   if( vr==ALLOC_IN_FCT ){
01041      warnprintf("allocating in fct\n");
01042      vr = dblp_init( vr, n, 0.0 );
01043   }
01044   for( i=0; i<n; i++ ){
01045      vr[i] = vc[i].re;
01046      if( ABS(vc[i].im)>1e-10 ){
01047         warnprintf("complex number with index '%i' has nonzero imaginary part\n", i);
01048      }
01049   }
01050   return vr;
01051 }

Generated on Fri Jun 25 2010 14:10:19 for libeegtools by  doxygen 1.7.0