51 lines
1.7 KiB
Common Lisp
51 lines
1.7 KiB
Common Lisp
//--- by default some GPU doesn't support doubles
| |||
//--- cl_khr_fp64 directive is used to enable work with doubles
| |||
#pragma OPENCL EXTENSION cl_khr_fp64 : enable
| |||
//+------------------------------------------------------------------+
| |||
//| Morlet wavelet function |
| |||
//+------------------------------------------------------------------+
| |||
double Morlet(const double t)
| |||
{
| |||
return exp(-t*t*0.5)*cos(M_2_PI*t);
| |||
}
| |||
//+------------------------------------------------------------------+
| |||
//| OpenCL kernel function |
| |||
//+------------------------------------------------------------------+
| |||
__kernel void Wavelet_GPU(__global double *data,int datacount,int x_size,int y_size,__global double *result)
| |||
{
| |||
size_t i = get_global_id(0);
| |||
size_t j = get_global_id(1);
| |||
double a1=(double)10e-10;
| |||
double a2=(double)15.0;
| |||
double da=(a2-a1)/(double)y_size;
| |||
double db=((double)datacount-(double)0.0)/x_size;
| |||
double a=a1+j*da;
| |||
double b=0+i*db;
| |||
uint norm=1;
| |||
double B=(double)1.0; //Morlet
| |||
double B_inv=(double)1.0/B;
| |||
double a_inv=(double)1.0/a;
| |||
double dt=(double)1.0;
| |||
double coef=(double)0.0;
| |||
if(norm==0)
| |||
coef=sqrt(a_inv);
| |||
else
| |||
{
| |||
for(int k=0; k<datacount; k++)
| |||
{
| |||
double arg=(dt*k-b)*a_inv;
| |||
arg=-B_inv*arg*arg;
| |||
coef=coef+exp(arg);
| |||
}
| |||
}
| |||
double sum=(float)0.0;
| |||
for(int k=0; k<datacount; k++)
| |||
{
| |||
double arg=(dt*k-b)*a_inv;
| |||
sum+=data[k]*Morlet(arg);
| |||
}
| |||
sum=sum/coef;
| |||
uint pos=(int)(j*x_size+i);
| |||
result[pos]=sum;
| |||
};
| |||
//+------------------------------------------------------------------+
|