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

📄 cwt1d.c

📁 LastWave
💻 C
字号:
/*..........................................................................*//*                                                                          *//*      L a s t W a v e    P a c k a g e 'wtrans1d' 2.1                     *//*                                                                          *//*      Copyright (C) 1999 B.Audit, E.Bacry, N.Decoster.                    *//*      emails : audit@crpp.u-bordeaux.fr                                   *//*               lastwave@cmap.polytechnique.fr                             *//*               decoster@crpp.u-bordeaux.fr                                *//*                                                                          *//*..........................................................................*//*                                                                          *//*      This program is a free software, you can redistribute it and/or     *//*      modify it under the terms of the GNU General Public License as      *//*      published by the Free Software Foundation; either version 2 of the  *//*      License, or (at your option) any later version                      *//*                                                                          *//*      This program is distributed in the hope that it will be useful,     *//*      but WITHOUT ANY WARRANTY; without even the implied warranty of      *//*      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the       *//*      GNU General Public License for more details.                        *//*                                                                          *//*      You should have received a copy of the GNU General Public License   *//*      along with this program (in a file named COPYRIGHT);                *//*      if not, write to the Free Software Foundation, Inc.,                *//*      59 Temple Place, Suite 330, Boston, MA  02111-1307  USA             *//*                                                                          *//*..........................................................................*//****************************************************************************//*                                                                          *//*  cwt1d.c    compute the wavelet decomposition using fft              *//*                                                                          *//****************************************************************************/#include <time.h>#include "lastwave.h"#include "wtrans1d.h"#include "extrema1d.h"/* Computes the continuous wavelet transform using wavelets defined in the physical space */void CWtd(WTRANS wtrans,LWFLOAT aMin,int nOct,int nVoi,Wavelet *wavelet,                  int borderType,int flagMemoryOptimized,int flagCausal,                  LWFLOAT expo){  double a,factor;  LWFLOAT mult;  LWFLOAT threshold;  int size;  int o,v,i;  int nb,nb1;  int firstp,lastp;  LWFLOAT ro, phase;  SIGNAL filter = TNewSignal();  int type;  int sizeG,sizeD,sizeTot;  LWFLOAT d_x_min,d_x_max;  double (*d_r_fct_ptr)(double,double);  double (*d_i_fct_ptr)(double,double);  wt1d_get_wavelet_attributes(wavelet,&type,&d_r_fct_ptr,&d_i_fct_ptr,NULL,NULL,                              &d_x_min,&d_x_max,NULL,NULL,NULL,NULL);  /* Some init */  wtrans->nOct = nOct;  wtrans->nVoice = nVoi;  wtrans->aMin = aMin;   wtrans->exponent = expo;  wtrans->x0 = wtrans->A[0][0]->x0;  wtrans->dx = wtrans->A[0][0]->dx;  wtrans->size = wtrans->A[0][0]->size;  wtrans->type = W_CONT;  if (flagMemoryOptimized == YES) {    InitExtrep(wtrans,wtrans->extrep);    nb = 0;  }     size = wtrans->A[0][0]->size;  SizeSignal(filter,size,YSIG);  factor = pow(2.,1./nVoi);  for (o = 1, a = (double) aMin ; o <= nOct ; o++)       for(v=0;v<nVoi;v++)      {           if (v == 0 && o == 1) Printf("Start octave %d",o);        else if (v == 0 && o != 1) Printf("\nStart octave %d",o);        else Printf(".");        Flush();                SizeSignal(wtrans->D[o][v],size,YSIG);        sizeD = (int) (a*d_x_max);        sizeG = (int) (-a*d_x_min);        sizeTot = sizeD + sizeG + 1;        if(sizeTot>size) Errorf("CWtd(): sizeTot>size!!!!!!");                for(i=0;i<sizeTot;i++)           filter->Y[sizeTot-i-1] = (LWFLOAT) (*d_r_fct_ptr)((double) (i-sizeG),a);                          cv_sig_init(CV_RC_FORM,wtrans->A[0][0]->Y,NULL,size);        cv_flt_init_n(CV_RC_FORM,sizeTot,sizeD,0,0,filter->Y,NULL);        cv_set_method(CV_UNDEFINED);        cv_compute(borderType,wtrans->D[o][v]->Y,&firstp,&lastp);        wtrans->D[o][v]->dx  = wtrans->A[0][0]->dx;        wtrans->D[o][v]->x0  = wtrans->A[0][0]->x0;        wtrans->D[o][v]->firstp  = wtrans->A[0][0]->firstp+firstp;        wtrans->D[o][v]->lastp  = wtrans->A[0][0]->lastp + lastp - size + 1;        mult = pow(a,expo);        for(i=0;i<size;i++) wtrans->D[o][v]->Y[i] *= mult;                        /*         * Case of complex wavelets          */        if (type == WAVE_CPLX_REAL || type == WAVE_CPLX_CPLX) {          if (d_i_fct_ptr == NULL) Errorf("CWtd() : Weird error");          SizeSignal(wtrans->A[o][v],size,YSIG);                   for(i=0;i<sizeTot;i++)             filter->Y[sizeTot-i-1] = (LWFLOAT) (*d_i_fct_ptr)((double) (i-sizeG),a);                            cv_sig_init(CV_RC_FORM,wtrans->A[0][0]->Y,NULL,size);          cv_flt_init_n(CV_RC_FORM,sizeTot,sizeD,0,0,filter->Y,NULL);          cv_set_method(CV_UNDEFINED);          cv_compute(borderType,wtrans->A[o][v]->Y,&firstp,&lastp);          wtrans->A[o][v]->dx  = wtrans->A[0][0]->dx;          wtrans->A[o][v]->x0  = wtrans->A[0][0]->x0;          wtrans->A[o][v]->firstp  = wtrans->A[0][0]->firstp+firstp;          wtrans->A[o][v]->lastp  = wtrans->A[0][0]->lastp + lastp - size + 1;                 mult = pow(a,expo);          for(i=0;i<size;i++) wtrans->A[o][v]->Y[i] *= mult;                /* Compute the phase in A and the module in D */          for (i=0;i<size;i++) {            ro = sqrt(wtrans->A[o][v]->Y[i]*wtrans->A[o][v]->Y[i] + wtrans->D[o][v]->Y[i]*wtrans->D[o][v]->Y[i]);            if (ro == 0) phase = 0;            else {              phase = acos(wtrans->D[o][v]->Y[i]/ro);              if (wtrans->A[o][v]->Y[i] < 0) phase += M_PI;            }            wtrans->D[o][v]->Y[i] = ro;            wtrans->A[o][v]->Y[i] = phase;          }        }                        /*         * Then we go on         */                              a *= factor;        if (flagMemoryOptimized == YES)           {            nb1 = ComputeExtOctVoice(wtrans,wtrans->extrep,flagCausal,NO,1e-5,o,v,&threshold);            nb += nb1;            ClearSignal(wtrans->D[o][v]);            if (type == WAVE_CPLX_REAL || type == WAVE_CPLX_CPLX) ClearSignal(wtrans->A[o][v]);          }      }  Printf("\n");    if (flagMemoryOptimized == YES)    {      Printf("nb of extrema : %d\n",nb);      wtrans->nOct = 0;      wtrans->nVoice = 0;    }}/* The corresponding command */void C_CWtd(char **argv){  LWFLOAT aMin,aMinTest,aMaxTest;  int nOct,nVoi;  int flagMemoryOptimized,flagCausal;  int border;  char *borderName;  char opt;  WTRANS wtrans;  char  *waveName;  Wavelet *wavelet;  LWFLOAT expo;  LWFLOAT time;  argv = ParseArgv(argv,tWTRANS_,NULL,&wtrans,tFLOAT,&aMin,tINT,&nOct,                   tINT,&nVoi,tSTR_,"g2",&waveName,-1);    if (wtrans == NULL) wtrans = GetWtransCur();  /*  if (waveName == NULL) wavelet = wt1d_d2_gaussian_ptr;  else*/  if (!strcmp(waveName,"g0")) wavelet = wt1d_gaussian_ptr;  else if (!strcmp(waveName,"g1")) wavelet = wt1d_d1_gaussian_ptr;  else if (!strcmp(waveName,"g2")) wavelet = wt1d_d2_gaussian_ptr;  else if (!strcmp(waveName,"g3")) wavelet = wt1d_d3_gaussian_ptr;  else if (!strcmp(waveName,"g4")) wavelet = wt1d_d4_gaussian_ptr;  else if (!strcmp(waveName,"morlet")) wavelet = wt1d_morlet_ptr;  else Errorf("%s is not an implemented wavelet",waveName);  if (wtrans->A[0][0]->size == 0) Errorf("No signal to analyze");    if (!INRANGE(1,nOct,NOCT-1)) Errorf("Bad range for <noct>");  if (!INRANGE(1,nVoi,NVOICE)) Errorf("Bad range for <nvoice> \n");    wt1d_wavelet_scale_limits(wavelet,wtrans->A[0][0]->size,&aMinTest,&aMaxTest);  aMinTest = 1.0;  if (aMin<aMinTest)    Warningf("I think amin is too small, it should be bigger than %g.",             aMinTest);  if ((pow(2.0,nOct - 1.0/((double) nVoi))*aMin)>aMaxTest)     Errorf("Sorry, the maximum scale is too big, it should be smaller than %g.",aMaxTest);  /***************/  /* The Options */  /***************/  flagCausal = NO;  flagMemoryOptimized = NO;  expo = -1.;  border = BorderMirror;  while(opt = ParseOption(&argv))    {      switch(opt)         {        case 'm':           flagMemoryOptimized = YES;          break;        case 'c':           flagCausal = YES;          break;        case 'e':          argv = ParseArgv(argv,tFLOAT,&expo,-1);          break;        case 'b':          argv = ParseArgv(argv,tSTR,&borderName,-1);          if(!strcmp(borderName,"pad"))            border =  BorderPad;          else if(!strcmp(borderName,"mir"))            border = BorderMirror;          else if(!strcmp(borderName,"pad0"))            border = BorderPad0;          else if(!strcmp(borderName,"per"))            border = BorderPeriodic;          else             Errorf("Undefined border effect: %s",borderName);          break;        default:           ErrorOption(opt);        }    }      NoMoreArgs(argv);      if (wtrans->wName != NULL) Free(wtrans->wName);  wtrans->wName = CopyStr(waveName);    time = MyTime();  CWtd(wtrans,aMin,nOct,nVoi,wavelet,border,flagMemoryOptimized,                 flagCausal,expo);  SetResultFloat(MyTime()-time);                 }void C_Wt1dNoctMax(char **argv){  LWFLOAT aMin,aMinWavelet,aMaxWavelet;  int signalSize,nvoice;  Wavelet *wavelet;  char *waveName;  argv = ParseArgv(argv,tINT,&signalSize,tFLOAT,&aMin,tINT,&nvoice,                   tSTR,&waveName,0);    if (!strcmp(waveName,"g0")) wavelet = wt1d_gaussian_ptr;  else if (!strcmp(waveName,"g1")) wavelet = wt1d_d1_gaussian_ptr;  else if (!strcmp(waveName,"g2")) wavelet = wt1d_d2_gaussian_ptr;  else if (!strcmp(waveName,"g3")) wavelet = wt1d_d3_gaussian_ptr;  else if (!strcmp(waveName,"g4")) wavelet = wt1d_d4_gaussian_ptr;  else if (!strcmp(waveName,"morlet")) wavelet = wt1d_morlet_ptr;  else Errorf("%s is not an implemented wavelet",waveName);    wt1d_wavelet_scale_limits(wavelet,signalSize,&aMinWavelet,&aMaxWavelet);  aMinWavelet = 1.0;  SetResultInt((int) floor(log(aMaxWavelet/aMin)/log(2.)+1./nvoice) );  return;}

⌨️ 快捷键说明

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