#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "BaseConstVariable.h" #include "GPUTool.cuh" #include "GPUBPTool.cuh" #include "BPBasic0_CUDA.cuh" #include "GPUBpSimulation.cuh" #include "GPURFPC.cuh" double* getFreqPoints_mallocHost(double startFreq, double endFreq, long freqpoints) { long double dfreq = (endFreq - startFreq) / (freqpoints - 1); double* freqlist = (double*)mallocCUDAHost(sizeof(double) * freqpoints); for (long i = 0; i < freqpoints; i++) { freqlist[i] = startFreq + dfreq * i; } return freqlist; } cuComplex* createEchoPhase_mallocHost(long Np, long Nf) { cuComplex* phdata = (cuComplex*)mallocCUDAHost(sizeof(cuComplex) * Np * Nf); for (long i = 0; i < Np; i++) { for (long j = 0; j < Nf; j++) { phdata[i * Nf + j] = make_cuComplex(0, 0); } } return phdata; } __global__ void kernel_RFPCProcess( double* Sx,double* Sy,double* Sz, double Tx, double Ty,double Tz, double Tslx,double Tsly,double Tslz, // 目标的坡面向量 double p1,double p2, double p3, double p4, double p5, double p6, long Np,long Nf, double minF,double dFreq,double RefRange, cuComplex* phdata ) { long prfid = blockIdx.x * blockDim.x + threadIdx.x; // 获取当前的线程编码 if (prfid >= Np || prfid < 0) { return; } else {} // 距离 Vector3 S{ Sx[prfid],Sy[prfid],Sz[prfid] }; Vector3 T{ Tx,Ty,Tz }; Vector3 slp{ Tslx,Tsly,Tslz }; //printf("S=(%e,%e,%e)\n", S.x, S.y, S.z); // 入射角 Vector3 TS = vec_sub(S, T);//T-->S double localIncAngle = angleBetweenVectors(TS, slp, false);// 入射角 double sigma0 = GPU_getSigma0dB(p1, p2, p3, p4, p5, p6, localIncAngle);// 后向散射系数 sigma0 = powf(10.0, sigma0 / 10.0); // 距离 double R = sqrt(vec_dot(TS, TS)); // 计算增益 double amp_echo = sigma0 / (powf(4 * LAMP_CUDA_PI, 2) * powf(R, 4)); // 反射强度 double phi = 0; for (long fid = 0; fid < Nf; fid++) { phi = -4.0 * PI / LIGHTSPEED * (minF + dFreq * fid) * (R - RefRange); phdata[prfid * Nf + fid].x += amp_echo * cos(phi); phdata[prfid * Nf + fid].y += amp_echo * sin(phi); //printf("phdata(%d,%d)=complex(%e,%e)\n", prfid, fid, phdata[prfid * Nf + fid].x, phdata[prfid * Nf + fid].y); } //printf("Nf:%d\n", Nf); //printf("amp_echo:%f\n", amp_echo); //printf("sigma0:%f\n", sigma0); //printf("R:%e\n", R); } void RFPCProcess(double Tx, double Ty, double Tz, double Tslx, double Tsly, double Tslz, // 目标的坡面向量 double p1, double p2, double p3, double p4, double p5, double p6, GPUDATA& d_data) { double* AntX = (double*)mallocCUDADevice(sizeof(double) * d_data.Np); double* AntY = (double*)mallocCUDADevice(sizeof(double) * d_data.Np); double* AntZ = (double*)mallocCUDADevice(sizeof(double) * d_data.Np); HostToDevice(d_data.AntX, AntX, sizeof(double) * d_data.Np); printf("antX host to device finished!!\n"); HostToDevice(d_data.AntY, AntY, sizeof(double) * d_data.Np); printf("antY host to device finished!!\n"); HostToDevice(d_data.AntZ, AntZ, sizeof(double) * d_data.Np); printf("antZ host to device finished!!\n"); double minF = d_data.minF[0]; long grid_size = (d_data.Np + BLOCK_SIZE - 1) / BLOCK_SIZE; double dfreq = d_data.deltaF; double R0 = d_data.R0; kernel_RFPCProcess<<>>( AntX, AntY, AntZ, Tx, Ty, Tz, Tslx, Tsly, Tslz, // 目标的坡面向量 p1, p2, p3, p4, p5, p6, d_data.Np, d_data.Nfft, minF, dfreq,R0, d_data.phdata ); PrintLasterError("RFPCProcess"); FreeCUDADevice(AntX); FreeCUDADevice(AntY); FreeCUDADevice(AntZ); return ; }