ridbn.c

来自「Time-Frequency Toolbox,其中包含很常用的MATLAB程序」· C语言 代码 · 共 487 行 · 第 1/2 页

C
487
字号
      /* maximum value of the delay in order to take the edges	 into account */      taumax = MIN((time+half_WindowT_Length),		   (Signal.length-time-1+half_WindowT_Length));      taumax = MIN(taumax,(tfr.N_freq / 2 - 1));      taumax = MIN(taumax, half_WindowF_Length);      /* initialization of the first local autocorrelation function */      if (Signal.is_complex == TRUE)	{	  lacf_real[0] =   Signal.real_part[time] 	                 * Signal.real_part[time]                       +   Signal.imag_part[time]                         * Signal.imag_part[time]                        *   WindowT[half_WindowT_Length];	  /* the imag part is always zero because the imag part	     of any complex 'x * conjugate(x)' is zero */	    	  lacf_imag[0] =  0.0 ;	}      else /* the signal is real-valued */	{	  lacf_real[0] =   Signal.real_part[time]                          * Signal.real_part[time]                       *   WindowT[half_WindowT_Length];	  lacf_imag[0] =   0.0;	}   RIDBNKernel_Length = 1;   RIDBNKernel = (double *) ALLOC( RIDBNKernel_Length,sizeof(double) );   if (RIDBNKernel == NULL ) mexErrMsgTxt("Memory Failure");   RIDBNKernel[0] = 1;      /* The signal is windowed around the current time */   for (tau = 1; tau <= taumax; tau++)	{    R1_real=0.0;	 R2_real=0.0;    R1_imag=0.0;	 R2_imag=0.0;	 /* bound of mu in order to take into account the edges */	 mumin=MIN(tau,half_WindowT_Length);    mumin=MIN(mumin,(Signal.length-time-1-tau));    mumax=MIN(tau,half_WindowT_Length);    mumax=MIN(mumax,time-tau);    normK = 0.0;    RIDBNKernel_Length = RIDBNKernel_Length + 2;    RIDBNKernel = (double *) realloc(RIDBNKernel, RIDBNKernel_Length*sizeof(double));    Binomial_Kernel(RIDBNKernel, RIDBNKernel_Length);   for(mu = -mumin ; mu <= mumax ; mu++)    {        normK=normK+ RIDBNKernel[tau+mu]*WindowT[half_WindowT_Length + mu];    }	  /* when the kernel is nearly null, no normalization */	 if (normK<EPS)            normK=1.0;    for(mu = -mumin ; mu <= mumax ; mu++)	   {	      /* case of complex valued signal */	     if (Signal.is_complex == TRUE)	       {		  R1_real = R1_real +   (Signal.real_part[time+tau-mu]			 	      *  Signal.real_part[time-tau-mu]				     +   Signal.imag_part[time+tau-mu]				      *  Signal.imag_part[time-tau-mu])                  *RIDBNKernel[tau+mu]                  *WindowT[half_WindowT_Length + mu]/ normK;		  R1_imag = R1_imag +   (Signal.imag_part[time+tau-mu]				       * Signal.real_part[time-tau-mu]				     -   Signal.real_part[time+tau-mu]				       * Signal.imag_part[time-tau-mu])                   *RIDBNKernel[tau+mu]                   *WindowT[half_WindowT_Length + mu]/ normK;		  R2_real = R2_real +   (Signal.real_part[time-tau-mu]				       * Signal.real_part[time+tau-mu]				     +   Signal.imag_part[time-tau-mu]				       * Signal.imag_part[time+tau-mu])                   *RIDBNKernel[tau+mu]                   *WindowT[half_WindowT_Length + mu]/ normK;		  R2_imag = R2_imag +   (Signal.imag_part[time-tau-mu]				       * Signal.real_part[time+tau-mu]                   -   Signal.real_part[time-tau-mu]				       * Signal.imag_part[time+tau-mu])                   *RIDBNKernel[tau+mu]                   *WindowT[half_WindowT_Length + mu]/ normK;	       }	     else	       {		 R1_real = R1_real +    (Signal.real_part[time+tau-mu]			  	       * Signal.real_part[time-tau-mu])		                    *RIDBNKernel[tau+mu]                          *WindowT[half_WindowT_Length + mu]/ normK;		 R1_imag = 0.0;		 R2_real = R2_real +   (Signal.real_part[time-tau-mu]				      * Signal.real_part[time+tau-mu])		                   *RIDBNKernel[tau+mu]                         *WindowT[half_WindowT_Length + mu]/ normK;		 R2_imag = 0.0;	       }    }	  lacf_real[tau] = R1_real * WindowF[half_WindowF_Length+tau];	  lacf_imag[tau] = R1_imag * WindowF[half_WindowF_Length+tau];	  lacf_real[tfr.N_freq-tau] = R2_real	                            * WindowF[half_WindowF_Length-tau];	  lacf_imag[tfr.N_freq-tau] = R2_imag	                            * WindowF[half_WindowF_Length-tau];    }    FREE(RIDBNKernel);     tau=floor(tfr.N_freq/2);     RIDBNKernel = (double *) ALLOC ( (2*tau+1) , sizeof(double) );     if ((time<=Signal.length-tau-1)&(time>=tau)&(tau<=half_WindowF_Length))       {         R1_real=0.0;	      R2_real=0.0;         R1_imag=0.0;         R2_imag=0.0;	      mumin=MIN(tau,half_WindowT_Length);         mumin=MIN(mumin,(Signal.length-time-1-tau));         mumax=MIN(tau,half_WindowT_Length);         mumax=MIN(mumax,time-tau);         RIDBNKernel[0]=1;         normK = 0.0;         for( p=0; p<(2*tau) ; p++ )            {              RIDBNKernel[p+1] = RIDBNKernel[p]*(2*tau-(p+1)+1)/(p+1);              normK = normK + RIDBNKernel[p+1];            }         normK = normK +1;         for( p=0; p<(2*tau+1) ; p++ )            RIDBNKernel[p] = RIDBNKernel[p]/normK;         normK = 0.0;         for(mu = -mumin ; mu <= mumax ; mu++)         {          normK=normK+ RIDBNKernel[tau+mu]*WindowT[half_WindowT_Length + mu];         }	  /* when the kernel is nearly null, no normalization */	 if (normK<EPS)            normK=1.0;    for(mu = -mumin ; mu <= mumax ; mu++)	   {	      /* case of complex valued signal */	     if (Signal.is_complex == TRUE)	       {		  R1_real = R1_real +   (Signal.real_part[time+tau-mu]			 	      *  Signal.real_part[time-tau-mu]				     +   Signal.imag_part[time+tau-mu]				      *  Signal.imag_part[time-tau-mu])                  *RIDBNKernel[tau+mu]                  *WindowT[half_WindowT_Length + mu]/ normK;		  R1_imag = R1_imag +   (Signal.imag_part[time+tau-mu]				       * Signal.real_part[time-tau-mu]				     -   Signal.real_part[time+tau-mu]				       * Signal.imag_part[time-tau-mu])                   *RIDBNKernel[tau+mu]                   *WindowT[half_WindowT_Length + mu]/ normK;		  R2_real = R2_real +   (Signal.real_part[time-tau-mu]				       * Signal.real_part[time+tau-mu]				     +   Signal.imag_part[time-tau-mu]				       * Signal.imag_part[time+tau-mu])                   *RIDBNKernel[tau+mu]                   *WindowT[half_WindowT_Length + mu]/ normK;		  R2_imag = R2_imag +   (Signal.imag_part[time-tau-mu]				       * Signal.real_part[time+tau-mu]                   -   Signal.real_part[time-tau-mu]				       * Signal.imag_part[time+tau-mu])                   *RIDBNKernel[tau+mu]                   *WindowT[half_WindowT_Length + mu]/ normK;	       }	     else	       {		 R1_real = R1_real +    (Signal.real_part[time+tau-mu]			  	       * Signal.real_part[time-tau-mu])		                    *RIDBNKernel[tau+mu]                          *WindowT[half_WindowT_Length + mu]/ normK;		 R1_imag = 0.0;		 R2_real = R2_real +   (Signal.real_part[time-tau-mu]				      * Signal.real_part[time+tau-mu])		                   *RIDBNKernel[tau+mu]                         *WindowT[half_WindowT_Length + mu]/ normK;		 R2_imag = 0.0;	       }    }	  lacf_real[tau] = 0.5*( R1_real * WindowF[half_WindowF_Length+tau]                         +  R2_real * WindowF[half_WindowF_Length-tau]);	  lacf_imag[tau] = 0.5*( R1_imag * WindowF[half_WindowF_Length+tau]                         +  R2_imag * WindowF[half_WindowF_Length-tau]);    }    FREE(RIDBNKernel);      fft (tfr.N_freq, Nfft, lacf_real, lacf_imag);      /* the fft is put in the tfr matrix  */      for (row = 0; row < tfr.N_freq; row++)	{	  tfr.real_part[idx (row,column,tfr.N_freq)]= lacf_real[row];	  lacf_real[row] = 0.0;	  lacf_imag[row] = 0.0;        }    } /*--------------------------------------------------------------------*/ /*                free the memory used in this program                */ /*--------------------------------------------------------------------*/  FREE (lacf_real);  FREE (lacf_imag);}

⌨️ 快捷键说明

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