48 lines
1.5 KiB
Common Lisp
48 lines
1.5 KiB
Common Lisp
//+------------------------------------------------------------------+
|
|
//| Morlet wavelet function |
|
|
//+------------------------------------------------------------------+
|
|
float Morlet(const float t)
|
|
{
|
|
return exp(-t*t*0.5)*cos(M_2_PI*t);
|
|
}
|
|
//+------------------------------------------------------------------+
|
|
//| OpenCL kernel function |
|
|
//+------------------------------------------------------------------+
|
|
__kernel void Wavelet_GPU(__global float *data,int datacount,int x_size,int y_size,__global float *result)
|
|
{
|
|
size_t i = get_global_id(0);
|
|
size_t j = get_global_id(1);
|
|
float a1=(float)10e-10;
|
|
float a2=(float)15.0;
|
|
float da=(a2-a1)/(float)y_size;
|
|
float db=((float)datacount-(float)0.0)/x_size;
|
|
float a=a1+j*da;
|
|
float b=0+i*db;
|
|
uint norm=1;
|
|
float B=(float)1.0; //Morlet
|
|
float B_inv=(float)1.0/B;
|
|
float a_inv=(float)1.0/a;
|
|
float dt=(float)1.0;
|
|
float coef=(float)0.0;
|
|
if(norm==0)
|
|
coef=sqrt(a_inv);
|
|
else
|
|
{
|
|
for(int k=0; k<datacount; k++)
|
|
{
|
|
float arg=(dt*k-b)*a_inv;
|
|
arg=-B_inv*arg*arg;
|
|
coef=coef+exp(arg);
|
|
}
|
|
}
|
|
float sum=(float)0.0;
|
|
for(int k=0; k<datacount; k++)
|
|
{
|
|
float arg=(dt*k-b)*a_inv;
|
|
sum+=data[k]*Morlet(arg);
|
|
}
|
|
sum=sum/coef;
|
|
uint pos=(int)(j*x_size+i);
|
|
result[pos]=sum;
|
|
};
|
|
//+------------------------------------------------------------------+
|