| 1 | #include "math.h"
 | 
|---|
| 2 | 
 | 
|---|
| 3 | #define SWAP(a,b) tempr=(a);(a)=(b);(b)=tempr
 | 
|---|
| 4 | 
 | 
|---|
| 5 | void four1(float *data,int nn,int isign);
 | 
|---|
| 6 | 
 | 
|---|
| 7 | double souslin(double *y,int n);                /* soustrait la droite de y[0] à y[n-1]  */
 | 
|---|
| 8 | void filtre(double *y,int n,double f);
 | 
|---|
| 9 | void spectre(double *y,int n);
 | 
|---|
| 10 | void spectreRMS(double *y,int n);
 | 
|---|
| 11 | 
 | 
|---|
| 12 | 
 | 
|---|
| 13 | /*  --------  filtre passe - bas du tableau double y[] -----------*/
 | 
|---|
| 14 | 
 | 
|---|
| 15 | /*double souslin(double *y,int n)               /* soustrait la droite de y[0] à y[n-1]  
 | 
|---|
| 16 | {double pas;int i;
 | 
|---|
| 17 | pas=(y[n-1]-y[0])/(double)(n-1);
 | 
|---|
| 18 | for (i=0;i<n;i++) y[i]=y[i]-y[0]-pas*(double)i;
 | 
|---|
| 19 | return(pas);
 | 
|---|
| 20 | }
 | 
|---|
| 21 | */
 | 
|---|
| 22 | 
 | 
|---|
| 23 | double souslin(double *y,int n)         /* soustrait la pente et la moyenne     */
 | 
|---|
| 24 | {double pas,mm=0;int i;
 | 
|---|
| 25 | pas=(y[n-1]-y[0])/(double)(n-1);
 | 
|---|
| 26 | for (i=0;i<n;i++) {y[i]=y[i]-pas*(double)i;mm+=y[i];}
 | 
|---|
| 27 | mm/=(double)n;
 | 
|---|
| 28 | for (i=0;i<n;i++) y[i]=y[i]-mm;
 | 
|---|
| 29 | return(pas);
 | 
|---|
| 30 | }
 | 
|---|
| 31 | 
 | 
|---|
| 32 | void filtre(double *y,int n,double f)
 | 
|---|
| 33 | {
 | 
|---|
| 34 | float *v,u;int i;double pas;
 | 
|---|
| 35 | v=(float *)y;
 | 
|---|
| 36 | pas=souslin(y,n);
 | 
|---|
| 37 | /*
 | 
|---|
| 38 | printf("y0 ... = %g %g %g %g %g\n",y[0],y[1],y[2],y[3],y[4]);
 | 
|---|
| 39 | printf("filtre avec bande=%g  : pente=%g \n",f,pas);
 | 
|---|
| 40 | */
 | 
|---|
| 41 | for (i=0;i<n;i++)               v[i]=(float)y[i];
 | 
|---|
| 42 | for (i=n-1;i>=0;i--)    {v[2*i+1]=v[i]/(float)n;v[2*i+2]=0;}
 | 
|---|
| 43 | 
 | 
|---|
| 44 | four1(v,n,1);
 | 
|---|
| 45 | for (i=(int)f;i<n/2;i++)                        
 | 
|---|
| 46 |                 {u=((double)i-f)/f;
 | 
|---|
| 47 |                 u=1/(1+2*u*u);
 | 
|---|
| 48 |                 v[2*i+1]=v[2*i+1]*u;
 | 
|---|
| 49 |                 v[2*i+2]=v[2*i+2]*u;
 | 
|---|
| 50 |                 v[2*n-2*i-1]=v[2*i+1]*u;
 | 
|---|
| 51 |                 v[2*n-2*i]=v[2*i+2]*u;
 | 
|---|
| 52 |                 }
 | 
|---|
| 53 | four1(v,n,-1);
 | 
|---|
| 54 | for (i=0;i<n;i++)               v[i]=v[2*i+1];
 | 
|---|
| 55 | for (i=n-1;i>=0;i--)    y[i]= (double)v[i];
 | 
|---|
| 56 | for (i=0;i<n;i++)       y[i]=y[i] + pas * (double)(i-n/2);
 | 
|---|
| 57 | }
 | 
|---|
| 58 | 
 | 
|---|
| 59 | 
 | 
|---|
| 60 | 
 | 
|---|
| 61 | /* -------spectre de fréquence du tableau double y[]-----------*/
 | 
|---|
| 62 | 
 | 
|---|
| 63 | void spectreRMS(double *y,int n)
 | 
|---|
| 64 | {float *v;int i;float ym=0;
 | 
|---|
| 65 | v=(float *)y;
 | 
|---|
| 66 | // souslin(y,n);
 | 
|---|
| 67 | for (i=0;i<n;i++)               {v[i]=(float)y[i];ym=ym+v[i];}
 | 
|---|
| 68 | ym=ym/(float)n;
 | 
|---|
| 69 | for (i=n-1;i>=0;i--)            {v[2*i+1]=(v[i]-ym)/(float)n;v[2*i+2]=0;}
 | 
|---|
| 70 | four1(v,n,1);
 | 
|---|
| 71 | for (i=0;i<n;i++)               v[i]=sqrt(2*(v[2*i+1]*v[2*i+1]+v[2*i+2]*v[2*i+2]));
 | 
|---|
| 72 | for (i=n-1;i>=0;i--)    y[i]=(double)v[i];
 | 
|---|
| 73 | }
 | 
|---|
| 74 | 
 | 
|---|
| 75 | 
 | 
|---|
| 76 | 
 | 
|---|
| 77 | 
 | 
|---|
| 78 | void spectre(double *y,int n)
 | 
|---|
| 79 | {float *v;int i;float ym=0;
 | 
|---|
| 80 | v=(float *)y;
 | 
|---|
| 81 |  souslin(y,n);
 | 
|---|
| 82 | for (i=0;i<n;i++)               {v[i]=(float)y[i];ym=ym+v[i];}
 | 
|---|
| 83 | ym=ym/(float)n;
 | 
|---|
| 84 | for (i=n-1;i>=0;i--)            {v[2*i+1]=(v[i]-ym)/(float)n;v[2*i+2]=0;}
 | 
|---|
| 85 | four1(v,n,1);
 | 
|---|
| 86 | for (i=0;i<n;i++)               v[i]=v[2*i+1]*v[2*i+1]+v[2*i+2]*v[2*i+2];
 | 
|---|
| 87 | for (i=n-1;i>=0;i--)    y[i]=(double)v[i];
 | 
|---|
| 88 | }
 | 
|---|
| 89 | 
 | 
|---|
| 90 | 
 | 
|---|
| 91 | 
 | 
|---|
| 92 | /* ----------------- transformée de Fourier complexe ---------*/
 | 
|---|
| 93 | 
 | 
|---|
| 94 | void four1(float *data,int nn,int isign)   /* data tableau de 1 à 2*nn  */
 | 
|---|
| 95 | /* isign=1 --> Tf directe   data = real-imag-real-imag ........ */
 | 
|---|
| 96 | 
 | 
|---|
| 97 |                 /* isign=-1 --> Tf inverse    */
 | 
|---|
| 98 | {
 | 
|---|
| 99 |         int n,mmax,m,j,istep,i;
 | 
|---|
| 100 |         double wtemp,wr,wpr,wpi,wi,theta;
 | 
|---|
| 101 |         float tempr,tempi;
 | 
|---|
| 102 | 
 | 
|---|
| 103 |         n=nn << 1;
 | 
|---|
| 104 |         j=1;
 | 
|---|
| 105 |         for (i=1;i<n;i+=2) {
 | 
|---|
| 106 |         
 | 
|---|
| 107 |                 if (j > i) {
 | 
|---|
| 108 |                         SWAP(data[j],data[i]);
 | 
|---|
| 109 |                         SWAP(data[j+1],data[i+1]);
 | 
|---|
| 110 |                 }
 | 
|---|
| 111 |                 m=n >> 1;
 | 
|---|
| 112 |                 while (m >= 2 && j > m) {
 | 
|---|
| 113 |                         j -= m;
 | 
|---|
| 114 |                         m >>= 1;
 | 
|---|
| 115 |                 }
 | 
|---|
| 116 |                 j += m;
 | 
|---|
| 117 |         }
 | 
|---|
| 118 |         mmax=2;
 | 
|---|
| 119 |         while (n > mmax) {
 | 
|---|
| 120 |                 istep=2*mmax;
 | 
|---|
| 121 |                 theta=6.28318530717959/(isign*mmax);
 | 
|---|
| 122 |                 wtemp=sin(0.5*theta);
 | 
|---|
| 123 |                 wpr = -2.0*wtemp*wtemp;
 | 
|---|
| 124 |                 wpi=sin(theta);
 | 
|---|
| 125 |                 wr=1.0;
 | 
|---|
| 126 |                 wi=0.0;
 | 
|---|
| 127 |                 for (m=1;m<mmax;m+=2) {
 | 
|---|
| 128 |                         for (i=m;i<=n;i+=istep) {
 | 
|---|
| 129 |                                 j=i+mmax;
 | 
|---|
| 130 |                                 tempr=wr*data[j]-wi*data[j+1];
 | 
|---|
| 131 |                                 tempi=wr*data[j+1]+wi*data[j];
 | 
|---|
| 132 |                                 data[j]=data[i]-tempr;
 | 
|---|
| 133 |                                 data[j+1]=data[i+1]-tempi;
 | 
|---|
| 134 |                                 data[i] += tempr;
 | 
|---|
| 135 |                                 data[i+1] += tempi;
 | 
|---|
| 136 |                         }
 | 
|---|
| 137 |                         wr=(wtemp=wr)*wpr-wi*wpi+wr;
 | 
|---|
| 138 |                         wi=wi*wpr+wtemp*wpi+wi;
 | 
|---|
| 139 |                 }
 | 
|---|
| 140 |                 mmax=istep;
 | 
|---|
| 141 |         }
 | 
|---|
| 142 | }
 | 
|---|
| 143 | 
 | 
|---|
| 144 | #undef SWAP
 | 
|---|
| 145 | 
 | 
|---|