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

📄 signal_functions.c

📁 LastWave
💻 C
📖 第 1 页 / 共 3 页
字号:
    flagCentered = NO;    while(opt = ParseOption(&argv)) {       switch(opt) {        case 'a': flagAbs = YES; break;        case 'c': flagCausal = YES; break;        case 'C': flagCentered = YES; break;        default: ErrorOption(opt);      }    }        NoMoreArgs(argv);   if (!flagAbs) {     if (f1 != (int) f1 || f1 < 0) Errorf("<n> should be a positive integer unless you set option '-a'");     m = GetNthMoment(signal,(int) f1,&f,flagCausal,flagCentered);   }   else m = GetAbsMoment(signal,f1,&f,flagCausal,flagCentered);   SetResultFloat(f);  }  /* 'minmax' action */  else if (!strcmp(action,"minmax")) {    argv = ParseArgv(argv,tSIGNALI,&signal,-1);    flagCausal = NO;    while(opt = ParseOption(&argv)) {       switch(opt) {        case 'c': flagCausal = YES; break;        default: ErrorOption(opt);      }    }        NoMoreArgs(argv);    xMin = 1;    xMax = -1;    MinMaxSig(signal,&xMin,&xMax,&yMin,&yMax,&iMin,&iMax,flagCausal);    lv = TNewListv();    AppendInt2Listv(lv,iMin);    AppendInt2Listv(lv,iMax);    SetResultValue(lv);  }  /* 'lp' action */  else if (!strcmp(action,"lp")) {    argv = ParseArgv(argv,tSIGNALI,&signal,tFLOAT,&p,-1);    flagCausal = NO;    while(opt = ParseOption(&argv)) {       switch(opt) {        case 'c': flagCausal = YES; break;        default: ErrorOption(opt);      }    }        NoMoreArgs(argv);    f = GetLpNormSig(signal,p,flagCausal);    SetResultFloat(f);  }  /* 'corr' action */  else if (!strcmp(action,"corr")) {    argv = ParseArgv(argv,tSIGNALI,&signal,tSIGNALI_,NULL,&signal1,-1);    flagCausal = NO;    while(opt = ParseOption(&argv)) {       switch(opt) {        case 'c': flagCausal = YES; break;        default: ErrorOption(opt);      }    }        NoMoreArgs(argv);    f = GetCorrelation(signal,signal1,flagCausal);    SetResultFloat(f);  }  /* 'fit' action */  else if (!strcmp(action,"fit")) {    argv = ParseArgv(argv,tSIGNALI,&signal,-1);    xMax = -1;    xMin = 1;    while(opt = ParseOption(&argv)) {       switch(opt) {        case 'x': argv = ParseArgv(argv,tFLOAT,&xMin,tFLOAT,&xMax,-1); break;        default: ErrorOption(opt);      }    }        NoMoreArgs(argv);      if (xMin >= xMax) {iMin = -1; iMax = -1;}    else {      iMin = ISig(signal,xMin);      iMax = ISig(signal,xMax);    }        LineFitSig(signal,&a,&sigA,&b,&sigB,iMin,iMax);   lv = TNewListv();   AppendFloat2Listv(lv,a);   AppendFloat2Listv(lv,sigA);   AppendFloat2Listv(lv,b);   AppendFloat2Listv(lv,sigB);   AppendFloat2Listv(lv,iMin);   AppendFloat2Listv(lv,iMax);   SetResultValue(lv);  }    /* 'print' action */  else if (!strcmp(action,"print")) {    argv = ParseArgv(argv,tSIGNALI,&signal,-1);    flagCausal = NO;    while(opt = ParseOption(&argv)) {       switch(opt) {        case 'c': flagCausal = YES; break;        default: ErrorOption(opt);      }    }        NoMoreArgs(argv);    m = GetLpNormSig(signal,2,flagCausal);    Printf("L2 norm   : %.8g\n",m);    m = GetNthMoment(signal,2,&f,flagCausal,YES);    Printf("Mean      : %.8g\n",m);    Printf("Variance  : %.8g\n",f);    m = GetNthMoment(signal,3,&f,flagCausal,YES);    Printf("Skewness  : %.8g\n",f);    m = GetNthMoment(signal,4,&f,flagCausal,YES);    m = GetNthMoment(signal,2,&f1,flagCausal,YES);    Printf("Kurtosis  : %.8g\n",f-3*f1*f1);    xMin = 1;    xMax = -1;    MinMaxSig(signal,&xMin,&xMax,&yMin,&yMax,&iMin,&iMax,flagCausal);    Printf("Minimum at x=%.8g (index = %d) is y = %.8g\n",XSig(signal,iMin),iMin,yMin);     Printf("Maximum at x=%.8g (index = %d) is y = %.8g\n",XSig(signal,iMax),iMax,yMax);   }  else Errorf("Unknow action '%s'",action);    	} /**************************************//* Compute the 'n' branches histogram *//* of the signal Y's.                 *//**************************************//* * input    : the signal to make the histogram on  * output   : the signal to put the histogram into * n        : the number of branches of the histogram * ymin,ymax  : the yMin and yMax of the histogram (not used if min > max) * xmin,xmax  : the xMin and xMax between which the histogram is made * weight   : signal of weights (or NULL). It must have the same size as input  */ void HistoSig(SIGNAL input, SIGNAL output, int n,LWFLOAT xmin, LWFLOAT xmax,LWFLOAT ymin, LWFLOAT ymax, SIGNAL weight,int flagCausal){  int i,index;  LWFLOAT min,max;  int iMin,iMax;  LWFLOAT theWeight;    if (output == input)     Errorf("HistoSig() : the output signal must be different from the input signal");  SizeSignal(output,n,YSIG);   ZeroSig(output);    if (ymin >= ymax)    if( xmin >= xmax)       MinMaxSig(input,&xmin,&xmax,&ymin,&ymax,&iMin,&iMax,flagCausal);    else       MinMaxSig(input,&min,&max,&ymin,&ymax,&iMin,&iMax,flagCausal);  else    if( xmin >= xmax)       MinMaxSig(input,&xmin,&xmax,&min,&max,&iMin,&iMax,flagCausal);   if (ymin == ymax) {ymin -= .5;ymax += .5;}  if(flagCausal == YES)    {      iMin = input->firstp;      iMax = input->lastp;    }  else    {      iMin = 0;      iMax = input->size - 1;    }  for (i=iMin;i<=iMax;i++)    {      if(XSig(input,i)>xmax || XSig(input,i) < xmin) 	continue;      index = (int)((input->Y[i]-ymin)*n/(ymax-ymin));      if (index < 0 || index > n) continue;      if (index == n) index = n-1;            if (weight == NULL) theWeight = 1;      else theWeight = weight->Y[i];            output->Y[index] += theWeight;    }    output->x0 = ymin + (ymax-ymin)/(2*n);  output->dx = (ymax-ymin)/n;}/* The corresponding command */void C_Histo (char **argv){  SIGNAL input,output;  int n,flagCausal=NO;  LWFLOAT xmin,xmax;  LWFLOAT ymin,ymax;  SIGNAL weight;  char opt;    argv = ParseArgv(argv,tSIGNALI,&input,tSIGNAL,&output,tINT,&n,-1);  xmin = 1;  xmax = -1;  ymin = 1;  ymax = -1;  weight = NULL;  while(opt = ParseOption(&argv)) {     switch(opt)       {      case 'x':	argv = ParseArgv(argv,tFLOAT,&xmin,tFLOAT,&xmax,-1);	if (xmin >= xmax) Errorf("xmin should be smaller than xmax");	break;      case 'y':	argv = ParseArgv(argv,tFLOAT,&ymin,tFLOAT,&ymax,-1);	if (ymin >= ymax) Errorf("ymin should be smaller than ymax");	break;      case 'w':	argv = ParseArgv(argv,tSIGNAL,&weight,-1);	if (weight->size != input->size) 	  Errorf("The weight signal should be of the same size as the input signal");	break;      case 'c':	flagCausal=YES;	break;      default:	ErrorOption(opt);      }  }      NoMoreArgs(argv);    if (input == output)    Errorf("Input and Output must be different\n");    HistoSig(input, output, n,xmin,xmax,ymin,ymax,weight,flagCausal);  }/********************************************** * * Convolution of a signal with a filter  * **********************************************/void ConvSig(SIGNAL in, SIGNAL filter, SIGNAL out, int borderType,int method){  int firstp, lastp;  int filterOrigin;    if (out == in) Errorf("ConvSig() : The input signal and the output signal must be different");  if (out == filter) Errorf("ConvSig() : The filter signal and the output signal must be different");  SizeSignal(out,in->size,YSIG);  filterOrigin = (int) ((0-filter->x0)/filter->dx+.5);    if (filterOrigin < 0 || filterOrigin > filter->size-1)    Errorf("ConvSig() : The origin of the filter should be represented in the filter signal");   cv_sig_init(CV_RC_FORM,in->Y,NULL,in->size);  cv_flt_init_n(CV_RC_FORM,filter->size,filterOrigin,0,0,filter->Y,NULL);  cv_set_method(method);  cv_compute(borderType,out->Y,&firstp,&lastp);  out->firstp = in->firstp+firstp;  out->lastp = in->lastp - (in->size-1-lastp);    out->dx = in->dx;  out->x0 = in->x0;}  void C_OldConv(char **argv){  SIGNAL in,out,filter;  char *borderName;  int borderType;  char opt;  LWFLOAT time;  int method = CV_UNDEFINED;  argv = ParseArgv(argv,tSIGNALI,&in,tSIGNALI,&filter,tSIGNAL,&out,-1);    borderName = "pad";  if (*argv!=NULL && **argv != '-') argv = ParseArgv(argv,tSTR_,"pad",&borderName,-1);  if(!strcmp(borderName,"pad")) borderType = BorderPad;  else if(!strcmp(borderName,"mir")) borderType = BorderMirror;  else if(!strcmp(borderName,"per")) borderType = BorderPeriodic;  else if(!strcmp(borderName,"pad0")) borderType = BorderPad0;  else Errorf("Undefined border effect: %s",borderName);  while(opt = ParseOption(&argv))    {      switch(opt)         {        case 'd':           method = CV_DI;          break;        case 'm':           method = CV_MP;          break;        case 'f':           method = CV_FT;          break;                  default:          ErrorOption(opt);        }    }  NoMoreArgs(argv);  time = MyTime();    ConvSig(in,filter,out,borderType,method);  SetResultFloat(MyTime()-time);                 }/* A correlation function */void CorrSig(SIGNAL in1, SIGNAL in2, SIGNAL out1, LWFLOAT dxmin, LWFLOAT dxmax, char flagNormalized, char flagCausal){  int imin,imax,i,di;  int jmin,jmax,j;  int first1,last1;  int first2,last2;  int N;  LWFLOAT mean1,mean2,var1,var2;  SIGNAL out;    if (in1->dx != in2->dx) Errorf("CorrSig() : Sorry the signals must have the same dx");  if (out1 == in1 || out1 == in2) out = NewSignal();  else out = out1;  imin = (int) (dxmin/in1->dx);  imax = (int) (dxmax/in1->dx);  di = (int) ((in2->x0-in1->x0)/in1->dx);  SizeSignal(out,imax-imin+1,YSIG);  out->dx = in1->dx;  out->x0 = imin;  ZeroSig(out);    if (imin > imax) {    if (out != out1) DeleteSignal(out);    Errorf("CorrSig() : Sorry, dxmin should be smaller than dxmax");  }      if (flagCausal) {    first1 = in1->firstp;    last1 = in1->lastp;    first2 = in2->firstp;    last2 = in2->lastp;  }  else {    first1 = 0;    last1 = in1->size-1;    first2 = 0;    last2 = in2->size-1;  }  N = MIN(last1-first1+1,last2-first2+1);    mean1 = 0;  var1 = 0;  for (i = first1; i<=last1;i++) {    mean1 += in1->Y[i];        var1 += in1->Y[i]*in1->Y[i];  }  mean1 /= last1-first1+1;  var1 /= last1-first1;  var1 -= mean1*mean1;      mean2 = 0;  var2 = 0;  for (i = first2; i<=last2;i++) {    mean2 += in2->Y[i];        var2 += in2->Y[i]*in2->Y[i];  }  mean2 /= last2-first2+1;  var2 /= last2-first2;  var2 -= mean2*mean2;  if (!flagNormalized) var1 = var2 = 1;    for (i = imin; i<= imax;i++) {        jmin = MAX(first1,first2+i+di);    jmax = MIN(last1,last2+i+di);        for (j=jmin;j<=jmax;j++) out->Y[i-imin] += (in1->Y[j]-mean1)*(in2->Y[j-i-di]-mean2);/* NOT CONSISTENT!    out->Y[i-imin] /= (jmax-jmin+1); */    out->Y[i-imin] /= N;     out->Y[i-imin] /= sqrt(var1*var2);  }            if (out != out1) {    CopySig(out,out1);    DeleteSignal(out);  }}void C_CorrSig(char **argv){  SIGNAL in1,in2,out;  LWFLOAT dxmin, dxmax;  char flagCausal,flagNormalized;  char opt;    argv = ParseArgv(argv,tSIGNALI,&in1,tSIGNALI,&in2,tSIGNAL,&out,tFLOAT,&dxmin,tFLOAT,&dxmax,-1);    if (dxmin >= dxmax) Errorf("Sorry, dxmin should smaller than dxmax");    flagCausal = YES;  flagNormalized = YES;  while(opt = ParseOption(&argv)) {    switch(opt) {    case 'c':      flagCausal = NO;      break;    case 'n':      flagNormalized = NO;      break;    default:       ErrorOption(opt);    }  }      NoMoreArgs(argv);  CorrSig(in1,in2,out,dxmin,dxmax,flagNormalized,flagCausal);}

⌨️ 快捷键说明

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