# Class for parser of cross-correlation obtainer

• ### Вопрос

• Class for parser of cross-correlation obtainer

//correlation.h

#include <stdio.h>  //cstdio.h
#include <stdlib.h> //cstdlib.h
//#include <iostream>
#include <math.h> //cmath.h

class CCFParser_tag
{
private:

public:

double getCCF ( double a,double b,  double tau  , double (*x1)(double ), double (*x2)(double ), double eps) ;
double getCCF2 ( double a,double b,  double tau  , double (*x1)(double ), double (*x2)(double ), double eps) ;

CCFParser_tag();
~CCFParser_tag();

};

double CCFParser_tag::getCCF (
double a,double b,
double tau  , double (*x1)(double ), double (*x2)(double ),
double eps
)

{
double h1,s,s0,s1,sn, arg;
int i,n;
s=1;
sn=101;
n=4;
arg=((a+b)/2);

//ACF Bu(tau)=integr(-inf,+inf, u(t)*u(t-tau), d t)
//CCF ВКФ Bf1f2(tau)=integr(-inf,+inf, f1(t)*f2(t-tau), d t)   ;
//CCF ВКФ Bf1f2(tau)=integr(-inf,+inf, f1(t+tau)*f2(t), d t)   ;

s0=((x1(a)*x2(a-tau) )+(x1(b)*x2(b-tau) ))/2;
s1=x1(arg)*x2(arg-tau) ;
// s0=((x1(a+tau)*x2(a) )+(x1(b+tau)*x2(b) ))/2;
// s1=x1(arg+tau)*x2(arg) ;

while (fabs(s-sn)>eps){
sn=s;
h1=(b-a)/n;
for (i=0; i<n/2; i++)
{
arg=(a+(2*i+1)*h1);

s1+=x1(arg)*x2(arg-tau);
//s1+=x1(arg+tau)*x2(arg);
}
s=h1*(s0+s1);
n*=2;
}
return s;

}
//Buv(tau)=Bvu(-tau)
double CCFParser_tag::getCCF2 (
double a,double b,
double tau  , double (*x1)(double ), double (*x2)(double ),
double eps
)

{
double h1,s,s0,s1,sn, arg;
int i,n;
s=1;
sn=101;
n=4;
arg=((a+b)/2);

//ACF Bu(tau)=integr(-inf,+inf, u(t)*u(t-tau), d t)
//CCF ВКФ Bf1f2(tau)=integr(-inf,+inf, f1(t)*f2(t-tau), d t)   ;
//CCF ВКФ Bf1f2(tau)=integr(-inf,+inf, f1(t+tau)*f2(t), d t)   ;

// s0=((x1(a)*x2(a-tau) )+(x1(b)*x2(b-tau) ))/2;
// s1=x1(arg)*x2(arg-tau) ;
s0=((x1(a+tau)*x2(a) )+(x1(b+tau)*x2(b) ))/2;
s1=x1(arg+tau)*x2(arg) ;

while (fabs(s-sn)>eps){
sn=s;
h1=(b-a)/n;
for (i=0; i<n/2; i++)
{
arg=(a+(2*i+1)*h1);

//s1+=x1(arg)*x2(arg-tau);
s1+=x1(arg+tau)*x2(arg);
}
s=h1*(s0+s1);
n*=2;
}
return s;

}

// +1 +1 +1 -1 +1

• Изменено 7 августа 2016 г. 17:53 name of file
• Перемещено 6 сентября 2016 г. 17:21
7 августа 2016 г. 17:52

### Все ответы

• //getsignal.h

#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <math.h>

// +1 +1 +1 -1 +1  Barker 5

double t1=0;
double t2=5;
double Um=1;

double s1(double t )
{

if (t<=(0.2*(t2-t1)) ) {  return 1*Um ; }
if ((t>(0.2*(t2-t1)) )&&(t<=(0.4*(t2-t1)))) {   return 1*Um ; }
if ((t>(0.4*(t2-t1)) )&&(t<=(0.6*(t2-t1)))) {   return 1*Um ; }
if ((t>(0.6*(t2-t1)) )&&(t<=(0.8*(t2-t1)))) {  return -1*Um ; }
if ((t>(0.8*(t2-t1)) )&&(t<=(1*(t2-t1)))) {  return 1*Um ; }

return 1;
}

double s2(double t )
{

if (t<=(0.2*(t2-t1)) ) {  return 1*Um ; }
if ((t>(0.2*(t2-t1)) )&&(t<=(0.4*(t2-t1)))) {   return 1*Um ; }
if ((t>(0.4*(t2-t1)) )&&(t<=(0.6*(t2-t1)))) {   return 1*Um ; }
if ((t>(0.6*(t2-t1)) )&&(t<=(0.8*(t2-t1)))) {  return -1*Um ; }
if ((t>(0.8*(t2-t1)) )&&(t<=(1*(t2-t1)))) {  return 1*Um ; }

return 1;
}

//mainunit.cpp

#include <stdio.h>
#include <stdlib.h>

#include <math.h>
#include  "getsignal.h"
#include  "correlation.h"

int main()
{
char key;
label1:

CCFParser_tag  *CCF;

double t=t1;
double s;
while (t<t2)
{
s=s1( t );
printf("\nt=%le, s1(t)= %le ", t, s);

t+=0.1;
}

printf("\n Enter 'y' to next \n");
scanf("%s",&key);
if(key!='y') goto label1;

t=0;

while (t<t2)
{
s=s2( t );
printf("\nt=%le, s2(t)= %le ", t, s);

t+=0.1;
}

printf("\n Enter 'y' to next \n");
scanf("%s",&key);
if(key!='y') goto label1;

double tau=0.0;

double s1(double t );
double s2(double t );

tau=-t2;

while (tau<t2)
{
s=CCF->getCCF2(t1,t2 ,tau , s1,s2, 0.00001);
printf("\nt=%le, B(tau)= %le ", tau, s);

tau+=0.1;
}

printf("\n Enter 'y' to exit \n");
scanf("%s",&key);
if(key!='y') goto label1;
return 0;
}

7 августа 2016 г. 17:55
• //y(t )=integral(  t0;t1 ; x1(t)*x2(t-tau ) ;d tau)
//func(tau,t)=x1(t)*x2(t-tau)

//x1(t)*x2(t-tau )=f(difarg, params), difarg=tau, param=t

class Parser1_tag

{

private:
double func(  double t, double tau, double (*x1)(double ), double (*x2)(double )  );
double getIntegral(double a,double b,double eps, double(*func) (double , double )) ;
public:
double GetCorrelation(double (*s1)(double ), double (*s2)(double  ));

Parser1_tag();
~ Parser1_tag();

};

double Parser1_tag::func(  double difarg, double param, double (*x1)(double ), double (*x2)(double )  )
{
//difarg=tau
//param=t

return  x1(param)*x2(param-difarg);
}

double Parser1_tag::getIntegral(
double a,double b,
double(*func) (double  , double  , double (*x1)(double ), double (*x2)(double )  ),
double param, double eps
)

{
double h1,s,s0,s1,sn, t, arg;
int i,n;
s=1;
sn=101;
n=4;
arg=((a+b)/2);

s0=(func(a,t,x1,x2)+func(b,t, x1,x2 ))/2;
s1=f(arg,t, x1,x2);

while (fabs(s-sn)>eps){
sn=s;
h1=(b-a)/n;
for (i=0; i<n/2; i++)
{
arg=(a+(2*i+1)*h1);

s1+=func(arg,t, x1,x2);
}
s=h1*(s0+s1);
n*=2;
}
return s;

}

double Parser1_tag::GetCorrelation(double (*s1)(double ), double (*s2)(double ) , double t1, double t2, double t  )
{
//t1=0
//t2=10 ms
//tau=100 us
//B(t )=integral(  t0;t1 ; (x1(t)*x2(t-tau )), t ;d tau)

return getIntegral(t1,t2,, Parser1_tag::func (tau , t, s1,s2   ), t , 0.00001);

}

//s1(t)=
//s2(t)=

//GetCorrelation(s1(t), s2(t),  t1, t2  )

How to use double(*func) (double  , double  , double (*x1)(double ), double (*x2)(double )  ) in GetIntegral to inject functions double (*x1)(double ), double (*x2)(double ) into integral in getIntegral  ?

7 августа 2016 г. 17:57
• How to use this->func(  double difarg, double param, double (*x1)(double ), double (*x2)(double )  ) in this program for alternative method of parsing of double CCFParser_tag::getCCF ?

7 августа 2016 г. 18:00
• How to create array of classes CCFParser_tag *CCF with same signal x1(t)   and array of modifyed with array of methods of another class signal x2[i](t)  , created from x2(t)    for example, using array  of FIR filters  -denoisers     ?
7 августа 2016 г. 18:05