LTFAT_EXTERN void LTFAT_NAME(pgauss_cmplx)(const int L, const double w, const double c_t, const double c_f, LTFAT_COMPLEX *g) { int lr,k,nk; double tmp,sqrtl, safe, gnorm; sqrtl=sqrt((double)L); safe=4; gnorm=0; /* Outside the interval [-safe,safe] then exp(-pi*x.^2) is numerically zero. */ nk=(int)ceil(safe/sqrt((double)L/sqrt(w))); for ( lr=0; lr<L; lr++) { //g[lr][0]=0.0; //g[lr][1]=0.0; g[lr] = (LTFAT_COMPLEX) 0.0; for (k=-nk;k<=nk; k++) { /* Use a tmp variable to calculate squaring */ tmp = ((double)lr+c_t)/sqrtl-(double)k*sqrtl; tmp = exp(-PI*tmp*tmp/w); g[lr]+=tmp*LTFAT_COMPLEXH_NAME(cexp)(I*2*PI*c_f*((double)lr/L-(double)k)); //g[lr][0]+=tmp*cos(2*PI*c_f*((double)lr/L-(double)k)); //g[lr][1]+=tmp*sin(2*PI*c_f*((double)lr/L-(double)k)); } double gReal = LTFAT_COMPLEXH_NAME(creal)(g[lr]); double gImag = LTFAT_COMPLEXH_NAME(cimag)(g[lr]); gnorm += (gReal*gReal+gImag*gImag); //gnorm +=g[lr][0]*g[lr][0]+g[lr][1]*g[lr][1]; } /* Normalize it exactly. */ gnorm=sqrt(gnorm); for ( lr=0; lr<L; lr++) { g[lr] /= gnorm; //g[lr][0] /= gnorm; //g[lr][1] /= gnorm; } }
LTFAT_EXTERN void LTFAT_NAME(conjugate_array)(LTFAT_TYPE *in, LTFAT_TYPE *out,const size_t L) { #ifdef LTFAT_COMPLEXTYPE for(size_t ii=0;ii<L;ii++) { out[ii] = LTFAT_COMPLEXH_NAME(conj)(in[ii]); } #else if(in==out) { return; } else { memcpy(out,in,L*sizeof(LTFAT_TYPE)); } #endif }