MobinMQL/Scripts/Examples/OpenCL/Double/Kernels/wavelet.cl
2025-07-22 14:48:34 +03:00

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;
};
//+------------------------------------------------------------------+