⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 daubechi.c

📁 Dwt离散db小波 daubechi.c daubtst.c
💻 C
字号:
#ifndef MATH_H#include <math.h>#endif#include <malloc.h>/************************************************************************//*	Daubechies smoothing filter H					*//*		   diffentation filter G				*//************************************************************************/void H(double *sig,double *Hsig,double *h,int length_sig,int length_h){int k,l; for(k=0;k<length_sig/2;k++)     {Hsig[k]=0.0;      for(l=0;l<length_h;l++)          Hsig[k]+=h[l]*sig[(l+2*k)%length_sig];      } }void G(double *sig,double *Gsig,double *g,int length_sig,int length_h){int k,l; for(k=0;k<length_sig/2;k++)     {Gsig[k]=0.0;      for(l=0;l<length_h;l++)          Gsig[k]+=g[l]*sig[(l+2*k)%length_sig];      } }/****************************************************************************//*	Daubechies adjoint filters H*, G*				    *//****************************************************************************/void Had(double *sig,double *Hsig,double *h,int length_Hsig,int length_h){int k,l; for(k=0;k<2*length_Hsig;k+=2)   {sig[k]=0.0;    for(l=0;l<length_h;l+=2)      sig[k]+=h[l]*Hsig[((k-l)/2+length_Hsig)%length_Hsig];    }for(k=1;k<2*length_Hsig;k+=2)   {sig[k]=0.0;    for(l=1;l<length_h;l+=2)       sig[k]+=h[l]*Hsig[((k-l)/2+length_Hsig)%length_Hsig];   }             }   void Gad(double *sig,double *Gsig,double *g,int length_Gsig,int length_g){int k,l; for(k=0;k<2*length_Gsig;k+=2)   {sig[k]=0.0;    for(l=0;l<length_g;l+=2)      sig[k]+=g[l]*Gsig[((k-l)/2+length_Gsig)%length_Gsig];    }for(k=1;k<2*length_Gsig;k+=2)   {sig[k]=0.0;    for(l=1;l<length_g;l+=2)       sig[k]+=g[l]*Gsig[((k-l)/2+length_Gsig)%length_Gsig];   }             }    /****************************************************************************//*	Initialization of Daubechies filters h,g			    *//*									    *//*	order		order of the wavelet to be initialized		    *//*	length_filt	length of the corresponding filters		    *//*	h,g		corresponding filter coefficients		    *//*									    *//*	return:	0	O.K.						    *//*		-1	fiters of the desired order not implemented	    */	/****************************************************************************/int daub_init(int order,int *length_filt,double *h,double *g){int i,sig; switch(order)  {case 1 : (*length_filt)=2;            h[0]=1.0/sqrt(2.0); h[1]=h[0];	    break;  case 2: (*length_filt)=4;          h[3]=(1.0-sqrt(3.0))/(4.0*sqrt(2.0));	  h[2]=(3.0-sqrt(3.0))/(4.0*sqrt(2.0));	  h[1]=(3.0+sqrt(3.0))/(4.0*sqrt(2.0));	  h[0]=(1.0+sqrt(3.0))/(4.0*sqrt(2.0));	  break; case 3: (*length_filt)=6;         h[0]=0.3326705529500825;	 h[1]=0.8068915093110924;	 h[2]=0.4598775021184914;	 h[3]=-0.1350110200102546;	 h[4]=-0.0854412738820267;	 h[5]=0.0352262918857095;	 break; case 4: (*length_filt)=8;         h[0]=0.2303778133088964;	 h[1]=0.7148465705529154;	 h[2]=0.6308807679398587;	 h[3]=-0.0279837694168599;	 h[4]=-0.1870348117190931;	 h[5]=0.0308413818355607;         h[6]=0.0328830116668852;	 h[7]=-0.0105974017850690;	 break; default: return(1);  }sig=-1;  for(i=0;i<*length_filt;i++)  	  {sig*=-1;g[i]=sig*h[*length_filt-1-i];}return(0);} 	 	 /****************************************************************************//*	Wavelt decomposition						    *//*									    *//*	sig		signal to be decomposed				    *//*	length_sig	signal length					    *//*	length_filt	filter_length (set by daub_init)		    *//*	h		smoothing filter (set by daub_init)		    *//*	g		differencing filter (set by daub_init)		    *//*									    *//*	output:		sig overwritten by the wavelet spectrum		    *//*			decomp : 0 	OK				    *//*				 1	not enough memory		    *//****************************************************************************/int decomp(double *sig,int length_sig,int length_filt,double *h,double *g){ double *Hsig, *Gsig; int i,j;  /*	allocation of buffer						    */         	           	          	   Hsig=(double *) malloc(length_sig/2*sizeof(double)); Gsig=(double *)malloc(length_sig/2*sizeof(double)); if(Hsig==NULL || Gsig==NULL) return(1);/*	Wavelet decomposition						*/  while(length_sig>=length_filt)  {H(sig,Hsig,h,length_sig,length_filt);   G(sig,Gsig,g,length_sig,length_filt);   for(i=0;i<length_sig/2;i++)     {sig[i]=Hsig[i];sig[length_sig/2+i]=Gsig[i];}   length_sig/=2;  }       /*	release memory							*/  free(Hsig);free(Gsig);return(0);} /*************************************************************************//*	Wavelet reconstruction						 *//*									 *//*	spec		spectrum used for reconstruction		 *//*	length_spec	spectrum length			         	    *//*	length_filt	filter_length (set by daub_init)		    *//*	h		smoothing filter (set by daub_init)		    *//*	g		differencing filter (set by daub_init)		    *//*									    *//*	output:		spec overwritten by the signal			    *//*			reconst: 0 	OK				    *//*				 1	not enough memory		    *//****************************************************************************/int reconst(double *spec,int length_spec,int length_filt,double *h,double *g) {int l,length; double *Hsig,*Gsig,*buff;  Hsig=(double *)malloc(length_spec/2*sizeof(double)); Gsig=(double *)malloc(length_spec/2*sizeof(double)); buff=(double *)malloc(length_spec*sizeof(double));  if(Hsig==NULL || Gsig==NULL || buff==NULL) return(1);   switch(length_filt)   {case 2 : length=1;             break;    case 4 : length=2;	    break;    case 6 : length=4;            break;    case 8 : length=4;           break;	       }	    	    	    	     	     	      while(length<=length_spec/2) {  for(l=0;l<length;l++) {Hsig[l]=spec[l];Gsig[l]=spec[length+l];}  Had(buff,Hsig,h,length,length_filt);  Gad(spec,Gsig,g,length,length_filt);  length*=2;  for(l=0;l<length;l++) spec[l]+=buff[l]; }free(Hsig); free(Gsig); free(buff);return(0);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -