#include "stdafx.h" #include "RFPCProcessCls.h" #include "BaseConstVariable.h" #include "SARSatelliteSimulationAbstractCls.h" #include "SARSimulationTaskSetting.h" #include "SatelliteOribtModel.h" #include #include "ImageOperatorBase.h" #include "GeoOperator.h" #include "EchoDataFormat.h" #include #include #include #include #include #ifdef DEBUGSHOWDIALOG #include "ImageShowDialogClass.h" #endif #ifdef __CUDANVCC___ #include "GPUTool.cuh" #include "GPURFPC.cuh" #include #include #endif // __CUDANVCC___ #include RFPCProcessCls::RFPCProcessCls() { this->PluseCount = 0; this->PlusePoint = 0; this->TaskSetting = nullptr; this->EchoSimulationData = nullptr; this->LandCoverPath = ""; this->OutEchoPath = ""; this->LandCoverPath.clear(); this->OutEchoPath.clear(); this->SigmaDatabasePtr = std::shared_ptr(new SigmaDatabase); } RFPCProcessCls::~RFPCProcessCls() { } void RFPCProcessCls::setTaskSetting(std::shared_ptr < AbstractSARSatelliteModel> TaskSetting) { this->TaskSetting = std::shared_ptr < AbstractSARSatelliteModel>(TaskSetting); qDebug() << "RFPCProcessCls::setTaskSetting"; } void RFPCProcessCls::setEchoSimulationDataSetting(std::shared_ptr EchoSimulationData) { this->EchoSimulationData = std::shared_ptr(EchoSimulationData); qDebug() << "RFPCProcessCls::setEchoSimulationDataSetting"; } void RFPCProcessCls::setTaskFileName(QString EchoFileName) { this->TaskFileName = EchoFileName; } void RFPCProcessCls::setDEMTiffPath(QString DEMTiffPath) { this->demxyzPath = DEMTiffPath; } void RFPCProcessCls::setSloperPath(QString InSloperPath) { this->demsloperPath = InSloperPath; } void RFPCProcessCls::setLandCoverPath(QString LandCoverPath) { this->LandCoverPath = LandCoverPath; } void RFPCProcessCls::setOutEchoPath(QString OutEchoPath) { this->OutEchoPath = OutEchoPath; } ErrorCode RFPCProcessCls::Process(long num_thread) { // RFPC 算法 qDebug() << u8"params init ...."; ErrorCode stateCode = this->InitParams(); if (stateCode != ErrorCode::SUCCESS) { return stateCode; } else {} qDebug() << "RFPCMainProcess"; stateCode = this->InitEchoMaskArray(); if (stateCode != ErrorCode::SUCCESS) { return stateCode; } else {} qDebug() << "InitEchoMaskArray"; //stateCode = this->RFPCMainProcess(num_thread); // 初始化回波 this->EchoSimulationData->initEchoArr(std::complex(0, 0)); stateCode = this->RFPCMainProcess_GPU(); if (stateCode != ErrorCode::SUCCESS) { return stateCode; } else {} return ErrorCode::SUCCESS; } ErrorCode RFPCProcessCls::InitParams() { if (nullptr == this->TaskSetting || this->demxyzPath.isEmpty() || this->LandCoverPath.isEmpty() || this->demsloperPath.isEmpty()) { return ErrorCode::RFPC_PARAMSISEMPTY; } else { } // 归一化绝对路径 this->OutEchoPath = QDir(this->OutEchoPath).absolutePath(); // 回波大小 double imgStart_end = this->TaskSetting->getSARImageEndTime() - this->TaskSetting->getSARImageStartTime(); this->PluseCount = ceil(imgStart_end * this->TaskSetting->getPRF()); double rangeTimeSample = (this->TaskSetting->getFarRange() - this->TaskSetting->getNearRange()) * 2.0 / LIGHTSPEED; this->PlusePoint = ceil(rangeTimeSample * this->TaskSetting->getFs()); // 初始化回波存放位置 qDebug() << "--------------Echo Data Setting ---------------------------------------"; this->EchoSimulationData = std::shared_ptr(new EchoL0Dataset); this->EchoSimulationData->setCenterFreq(this->TaskSetting->getCenterFreq()); this->EchoSimulationData->setNearRange(this->TaskSetting->getNearRange()); this->EchoSimulationData->setFarRange(this->TaskSetting->getFarRange()); this->EchoSimulationData->setFs(this->TaskSetting->getFs()); this->EchoSimulationData->setBandwidth(this->TaskSetting->getBandWidth()); this->EchoSimulationData->setCenterAngle(this->TaskSetting->getCenterLookAngle()); this->EchoSimulationData->setLookSide(this->TaskSetting->getIsRightLook() ? "R" : "L"); this->EchoSimulationData->OpenOrNew(OutEchoPath, TaskFileName, PluseCount, PlusePoint); QString tmpfolderPath = QDir(OutEchoPath).filePath("tmp"); if (QDir(tmpfolderPath).exists() == false) { QDir(OutEchoPath).mkpath(tmpfolderPath); } this->tmpfolderPath = tmpfolderPath; return ErrorCode::SUCCESS; } ErrorCode RFPCProcessCls::InitEchoMaskArray() { QString name = this->EchoSimulationData->getSimulationTaskName(); this->OutEchoMaskPath = JoinPath(this->OutEchoPath, name + "_echomask.bin"); Eigen::MatrixXd gt(2, 3); gt(0, 0) = 0; gt(0, 1) = 1; gt(0, 2) = 0; gt(1, 0) = 0; gt(1, 1) = 0; gt(1, 2) = 1; gdalImage echomaskImg = CreategdalImage(this->OutEchoMaskPath, this->EchoSimulationData->getPluseCount(), this->EchoSimulationData->getPlusePoints(), 1, gt, "", false, true, true); long cols = this->EchoSimulationData->getPlusePoints(); long rows = this->EchoSimulationData->getPluseCount(); long blocksize = Memory1GB / 8 / this->EchoSimulationData->getPlusePoints() * 4; for (long startid = 0; startid < rows; startid = startid + blocksize) { Eigen::MatrixXd data = echomaskImg.getData(startid, 0, blocksize, cols, 1); data = data.array() * 0; echomaskImg.saveImage(data, startid, 0, 1); } return ErrorCode::SUCCESS; } std::shared_ptr RFPCProcessCls::getSatelliteOribtNodes(double prf_time, double dt, bool antflag, long double imageStarttime) { std::shared_ptr sateOirbtNodes(new SatelliteOribtNode[this->PluseCount], delArrPtr); { // 姿态计算不同 qDebug() << "Ant position finished started !!!"; // 计算姿态 std::shared_ptr antpos = this->EchoSimulationData->getAntPos(); double dAt = 1e-6; double prf_time_dt = 0; Landpoint InP{ 0,0,0 }, outP{ 0,0,0 }; for (long prf_id = 0; prf_id < this->PluseCount; prf_id++) { prf_time = dt * prf_id; prf_time_dt = prf_time + dAt; SatelliteOribtNode sateOirbtNode; SatelliteOribtNode sateOirbtNode_dAt; this->TaskSetting->getSatelliteOribtNode(prf_time, sateOirbtNode, antflag); this->TaskSetting->getSatelliteOribtNode(prf_time_dt, sateOirbtNode_dAt, antflag); sateOirbtNode.AVx = (sateOirbtNode_dAt.Vx - sateOirbtNode.Vx) / dAt; // 加速度 sateOirbtNode.AVy = (sateOirbtNode_dAt.Vy - sateOirbtNode.Vy) / dAt; sateOirbtNode.AVz = (sateOirbtNode_dAt.Vz - sateOirbtNode.Vz) / dAt; InP.lon = sateOirbtNode.Px; InP.lat = sateOirbtNode.Py; InP.ati = sateOirbtNode.Pz; outP = XYZ2LLA(InP); antpos.get()[prf_id * 19 + 0] = prf_time + imageStarttime; antpos.get()[prf_id * 19 + 1] = sateOirbtNode.Px; antpos.get()[prf_id * 19 + 2] = sateOirbtNode.Py; antpos.get()[prf_id * 19 + 3] = sateOirbtNode.Pz; antpos.get()[prf_id * 19 + 4] = sateOirbtNode.Vx; antpos.get()[prf_id * 19 + 5] = sateOirbtNode.Vy; antpos.get()[prf_id * 19 + 6] = sateOirbtNode.Vz; antpos.get()[prf_id * 19 + 7] = sateOirbtNode.AntDirecX; antpos.get()[prf_id * 19 + 8] = sateOirbtNode.AntDirecY; antpos.get()[prf_id * 19 + 9] = sateOirbtNode.AntDirecZ; antpos.get()[prf_id * 19 + 10] = sateOirbtNode.AVx; antpos.get()[prf_id * 19 + 11] = sateOirbtNode.AVy; antpos.get()[prf_id * 19 + 12] = sateOirbtNode.AVz; antpos.get()[prf_id * 19 + 13] = sateOirbtNode.zeroDopplerDirectX; antpos.get()[prf_id * 19 + 14] = sateOirbtNode.zeroDopplerDirectY; antpos.get()[prf_id * 19 + 15] = sateOirbtNode.zeroDopplerDirectZ; antpos.get()[prf_id * 19 + 16] = outP.lon; antpos.get()[prf_id * 19 + 17] = outP.lat; antpos.get()[prf_id * 19 + 18] = outP.ati; sateOirbtNodes[prf_id] = sateOirbtNode; } this->EchoSimulationData->saveAntPos(antpos); antpos.reset(); qDebug() << "Ant position finished sucessfully !!!"; } return sateOirbtNodes; } void RFPCProcessMain(long num_thread, QString TansformPatternFilePath, QString ReceivePatternFilePath, QString simulationtaskName, QString OutEchoPath, QString GPSXmlPath, QString TaskXmlPath,QString demTiffPath, QString sloperPath, QString LandCoverPath) { std::shared_ptr < AbstractSARSatelliteModel> task = ReadSimulationSettingsXML(TaskXmlPath); if (nullptr == task) { return; } else { // 打印参数 qDebug() << "--------------Task Seting ---------------------------------------"; qDebug() << "SARImageStartTime: " << task->getSARImageStartTime(); qDebug() << "SARImageEndTime: " << task->getSARImageEndTime(); qDebug() << "BandWidth: " << task->getBandWidth(); qDebug() << "CenterFreq: " << task->getCenterFreq(); qDebug() << "PRF: " << task->getPRF(); qDebug() << "Lamda: " << task->getCenterLamda(); qDebug() << "Fs: " << task->getFs(); qDebug() << "POLAR: " << task->getPolarType(); qDebug() << "NearRange: " << task->getNearRange(); qDebug() << "FarRange: " << task->getFarRange(); qDebug() << (task->getFarRange() - task->getNearRange()) * 2 / LIGHTSPEED * task->getFs(); qDebug() << "\n\n"; } // 1.2 设置天线方向图 std::vector TansformPatternGainpoints = ReadGainFile(TansformPatternFilePath); std::shared_ptr TansformPatternGainPtr = CreateAbstractRadiationPattern(TansformPatternGainpoints); std::vector ReceivePatternGainpoints = ReadGainFile(ReceivePatternFilePath); std::shared_ptr ReceivePatternGainPtr = CreateAbstractRadiationPattern(ReceivePatternGainpoints); task->setTransformRadiationPattern(TansformPatternGainPtr); task->setReceiveRadiationPattern(ReceivePatternGainPtr); //2. 读取GPS节点 std::vector nodes; ErrorCode stateCode = ReadSateGPSPointsXML(GPSXmlPath, nodes); if (stateCode != ErrorCode::SUCCESS) { qWarning() << QString::fromStdString(errorCode2errInfo(stateCode)); return; } else {} std::shared_ptr SatelliteOribtModel = CreataPolyfitSatelliteOribtModel(nodes, task->getSARImageStartTime(), 3); // 以成像开始时间作为 时间参考起点 SatelliteOribtModel->setbeamAngle(task->getCenterLookAngle(), task->getIsRightLook()); // 设置天线方向图 if (nullptr == SatelliteOribtModel) { return; } else { task->setSatelliteOribtModel(SatelliteOribtModel); } qDebug() << "-------------- RFPC init ---------------------------------------"; RFPCProcessCls RFPC; RFPC.setTaskSetting(task); //qDebug() << "setTaskSetting"; RFPC.setTaskFileName(simulationtaskName); //qDebug() << "setTaskFileName"; RFPC.setDEMTiffPath(demTiffPath); //qDebug() << "setDEMTiffPath"; RFPC.setDEMTiffPath(demTiffPath); //qDebug() << "setDEMTiffPath"; RFPC.setLandCoverPath(LandCoverPath); //qDebug() << "setLandCoverPath"; RFPC.setOutEchoPath(OutEchoPath); //qDebug() << "setOutEchoPath"; qDebug() << "-------------- RFPC start---------------------------------------"; RFPC.Process(num_thread); // 处理程序 qDebug() << "-------------- RFPC end---------------------------------------"; } ErrorCode RFPCProcessCls::RFPCMainProcess_GPU() { double widthSpace = LIGHTSPEED / 2 / this->TaskSetting->getFs(); double prf_time = 0; double dt = 1 / this->TaskSetting->getPRF();// 获取每次脉冲的时间间隔 bool antflag = true; // 计算天线方向图 Landpoint LandP{ 0,0,0 }; Point3 GERpoint{ 0,0,0 }; double R = 0; double dem_row = 0, dem_col = 0, dem_alt = 0; QVector freqlist = this->TaskSetting->getFreqList(); long freqnum = freqlist.count(); std::shared_ptr freqPtr(new double[freqnum], delArrPtr); for (long ii = 0; ii < freqlist.count(); ii++) { freqPtr.get()[ii] = freqlist[ii]; } testOutAmpArr("freqlist.bin", (double*)(freqPtr.get()), freqnum, 1); float f0 = float(freqlist[0] / 1e9); float dfreq = float((freqlist[1] - freqlist[0]) / 1e9); long double imageStarttime = 0; imageStarttime = this->TaskSetting->getSARImageStartTime(); //std::vector sateOirbtNodes(this->PluseCount); std::shared_ptr sateOirbtNodes = this->getSatelliteOribtNodes(prf_time, dt, antflag, imageStarttime); // 获取天线坐标 long echoIdx = 0; double NearRange = this->EchoSimulationData->getNearRange(); // 近斜距 double FarRange = this->EchoSimulationData->getFarRange(); double TimgNearRange = 2 * NearRange / LIGHTSPEED; double TimgFarRange = 2 * FarRange / LIGHTSPEED; double dx = (FarRange - NearRange) / (PlusePoint - 1); double Fs = this->TaskSetting->getFs(); // 距离向采样率 double Pt = this->TaskSetting->getPt() * this->TaskSetting->getGri();// 发射电压 1v //double GainAntLen = -3;// -3dB 为天线半径 long pluseCount = this->PluseCount; double lamda = this->TaskSetting->getCenterLamda(); // 波长 double refphaseRange = this->TaskSetting->getRefphaseRange(); // 参考相位斜距 // 天线方向图 std::shared_ptr TransformPattern = this->TaskSetting->getTransformRadiationPattern(); // 发射天线方向图 std::shared_ptr ReceivePattern = this->TaskSetting->getReceiveRadiationPattern(); // 接收天线方向图 long PlusePoint = this->EchoSimulationData->getPlusePoints(); POLARTYPEENUM polartype = this->TaskSetting->getPolarType(); gdalImage echoMaskImg(this->OutEchoMaskPath); #ifndef __CUDANVCC___ QMessageBox::information(this, u8"程序提示", u8"请确定安装了CUDA库"); #else // RFPC CUDA版本 if (pluseCount * 4 * 18 > Memory1MB * 100) { long max = Memory1MB * 100 / 4 / 20 / PluseCount; QMessageBox::warning(nullptr, u8"仿真场景太大了", u8"当前频点数下,脉冲数量最多为:" + QString::number(max)); } gdalImage demxyz(this->demxyzPath);// 地面点坐标 gdalImage demlandcls(this->LandCoverPath);// 地表覆盖类型 gdalImage demsloperxyz(this->demsloperPath);// 地面坡向 // 参数与分块计算 long demRow = demxyz.height; long demCol = demxyz.width; long blokline = 100; // 每块 250MB*16 = 4GB blokline = Memory1MB / 8 / demCol * 500; blokline = blokline < 1 ? 1 : blokline; bool bloklineflag = false; PatternImageDesc TantPatternDesc = {}; double* h_TantPattern=nullptr; double* d_TantPattern=nullptr; { // 处理发射天线方向图 double Tminphi = TransformPattern->getMinPhi(); double Tmaxphi = TransformPattern->getMaxPhi(); double Tmintheta = TransformPattern->getMinTheta(); double Tmaxtheta = TransformPattern->getMaxTheta(); long Tphinum = TransformPattern->getPhis().size(); long Tthetanum = TransformPattern->getThetas().size(); double TstartTheta = Tmintheta; double TstartPhi = Tminphi; double Tdtheta = (Tmaxtheta - Tmintheta) / (Tthetanum - 1); double Tdphi = (Tmaxphi - Tminphi) / (Tphinum - 1); double* h_TantPattern = (double*)mallocCUDAHost(sizeof(double) * Tthetanum * Tphinum); double* d_TantPattern = (double*)mallocCUDADevice(sizeof(double) * Tthetanum * Tphinum); for (long i = 0; i < Tthetanum; i++) { for (long j = Tphinum - 1; j >= 0; j--) { //h_TantPattern[i * Tphinum + j] = TransformPattern->getGainLearThetaPhi(TstartTheta + i * Tdtheta, TstartPhi + j * Tdphi); h_TantPattern[i * Tphinum + j] = TransformPattern->getGain(TstartTheta + i * Tdtheta, TstartPhi + j * Tdphi); } } testOutAntPatternTrans("TransPattern.bin", h_TantPattern, TstartTheta, Tdtheta, TstartPhi, Tdphi, Tthetanum, Tphinum); for (long i = 0; i < Tthetanum; i++) { for (long j = 0; j < Tphinum; j++) { h_TantPattern[i * Tphinum + j] = powf(10.0, h_TantPattern[i * Tphinum + j] / 10); } } HostToDevice(h_TantPattern, d_TantPattern, sizeof(double) * Tthetanum * Tphinum); TantPatternDesc.startTheta = TstartTheta; TantPatternDesc.startPhi = TstartPhi; TantPatternDesc.dtheta = Tdtheta; TantPatternDesc.dphi = Tdphi; TantPatternDesc.phinum = Tphinum; TantPatternDesc.thetanum = Tthetanum; } PatternImageDesc RantPatternDesc = {}; double* h_RantPattern = nullptr; double* d_RantPattern = nullptr; { // 处理接收天线方向图 double Rminphi = ReceivePattern->getMinPhi(); double Rmaxphi = ReceivePattern->getMaxPhi(); double Rmintheta = ReceivePattern->getMinTheta(); double Rmaxtheta = ReceivePattern->getMaxTheta(); long Rphinum = ReceivePattern->getPhis().size(); long Rthetanum = ReceivePattern->getThetas().size(); double RstartTheta = Rmintheta; double RstartPhi = Rminphi; double Rdtheta = (Rmaxtheta - Rmintheta) / (Rthetanum - 1); double Rdphi = (Rmaxphi - Rminphi) / (Rphinum - 1); double* h_RantPattern = (double*)mallocCUDAHost(sizeof(double) * Rthetanum * Rphinum); double* d_RantPattern = (double*)mallocCUDADevice(sizeof(double) * Rthetanum * Rphinum); for (long i = 0; i < Rthetanum; i++) { for (long j = 0; j < Rphinum; j++) { //h_RantPattern[i * Rphinum + j] = ReceivePattern->getGainLearThetaPhi(RstartTheta + i * Rdtheta, RstartPhi + j * Rdphi); h_RantPattern[i * Rphinum + j] = ReceivePattern->getGain(RstartTheta + i * Rdtheta, RstartPhi + j * Rdphi); } } testOutAntPatternTrans("ReceivePattern.bin", h_RantPattern, Rmintheta, Rdtheta, RstartPhi, Rdphi, Rthetanum, Rphinum); for (long i = 0; i < Rthetanum; i++) { for (long j = 0; j < Rphinum; j++) { h_RantPattern[i * Rphinum + j] = powf(10.0, h_RantPattern[i * Rphinum + j] / 10); } } HostToDevice(h_RantPattern, d_RantPattern, sizeof(double) * Rthetanum * Rphinum); RantPatternDesc.startTheta = RstartTheta; RantPatternDesc.startPhi = RstartPhi; RantPatternDesc.dtheta = Rdtheta; RantPatternDesc.dphi = Rdphi; RantPatternDesc.phinum = Rphinum; RantPatternDesc.thetanum = Rthetanum; } //处理地表覆盖 QMap clamap; long clamapid = 0; long startline = 0; for (startline = 0; startline < demRow; startline = startline + blokline) { Eigen::MatrixXd clsland = demlandcls.getData(startline, 0, blokline, demlandcls.width, 1); long clsrows = clsland.rows(); long clscols = clsland.cols(); long clsid = 0; for (long ii = 0; ii < clsrows; ii++) { for (long jj = 0; jj < clscols; jj++) { clsid = clsland(ii, jj); if (clamap.contains(clsid)) {} else { clamap.insert(clsid, clamapid); clamapid = clamapid + 1; } } } } std::cout << "class id recoding" << std::endl; for (long id : clamap.keys()) { std::cout << id << " -> " << clamap[id] << std::endl; } CUDASigmaParam* h_clsSigmaParam = (CUDASigmaParam*)mallocCUDAHost(sizeof(CUDASigmaParam) * clamapid); CUDASigmaParam* d_clsSigmaParam = (CUDASigmaParam*)mallocCUDADevice(sizeof(CUDASigmaParam) * clamapid); { std::map tempSigmaParam = this->SigmaDatabasePtr->getsigmaParams(polartype); for (long id : clamap.keys()) { SigmaParam tempp = tempSigmaParam[id]; h_clsSigmaParam[clamap[id]].p1 = tempp.p1; h_clsSigmaParam[clamap[id]].p2 = tempp.p2; h_clsSigmaParam[clamap[id]].p3 = tempp.p3; h_clsSigmaParam[clamap[id]].p4 = tempp.p4; h_clsSigmaParam[clamap[id]].p5 = tempp.p5; h_clsSigmaParam[clamap[id]].p6 = tempp.p6; } // 打印日志 std::cout << "sigma params:" << std::endl; std::cout << "classid:\tp1\tp2\tp3\tp4\tp5\tp6" << std::endl; for (long ii = 0; ii < clamapid; ii++) { std::cout << ii << ":\t" << h_clsSigmaParam[ii].p1; std::cout << "\t" << h_clsSigmaParam[ii].p2; std::cout << "\t" << h_clsSigmaParam[ii].p3; std::cout << "\t" << h_clsSigmaParam[ii].p4; std::cout << "\t" << h_clsSigmaParam[ii].p5; std::cout << "\t" << h_clsSigmaParam[ii].p6 << std::endl; } std::cout << ""; } HostToDevice(h_clsSigmaParam, d_clsSigmaParam, sizeof(CUDASigmaParam) * clamapid); long blockwidth = demxyz.width; #ifdef __PRFDEBUG__ blokline = 1; blockwidth = 1; #endif // 地面 XYZ Eigen::MatrixXd dem_x = demxyz.getData(0, 0, blokline, blockwidth, 1); // 地面坐标 long tempDemRows = dem_x.rows(); long tempDemCols = dem_x.cols(); Eigen::MatrixXd dem_y = Eigen::MatrixXd::Zero(tempDemRows, tempDemCols); Eigen::MatrixXd dem_z = Eigen::MatrixXd::Zero(tempDemRows, tempDemCols); Eigen::MatrixXd demsloper_x = Eigen::MatrixXd::Zero(tempDemRows, tempDemCols); Eigen::MatrixXd demsloper_y = Eigen::MatrixXd::Zero(tempDemRows, tempDemCols); Eigen::MatrixXd demsloper_z = Eigen::MatrixXd::Zero(tempDemRows, tempDemCols); double* h_dem_x = (double*)mallocCUDAHost(sizeof(double) * blokline * tempDemCols); double* h_dem_y = (double*)mallocCUDAHost(sizeof(double) * blokline * tempDemCols); double* h_dem_z = (double*)mallocCUDAHost(sizeof(double) * blokline * tempDemCols); double* h_demsloper_x = (double*)mallocCUDAHost(sizeof(double) * blokline * tempDemCols); double* h_demsloper_y = (double*)mallocCUDAHost(sizeof(double) * blokline * tempDemCols); double* h_demsloper_z = (double*)mallocCUDAHost(sizeof(double) * blokline * tempDemCols); double* d_dem_x = (double*)mallocCUDADevice(sizeof(double) * blokline * tempDemCols); // 7 double* d_dem_y = (double*)mallocCUDADevice(sizeof(double) * blokline * tempDemCols); double* d_dem_z = (double*)mallocCUDADevice(sizeof(double) * blokline * tempDemCols); double* d_demsloper_x = (double*)mallocCUDADevice(sizeof(double) * blokline * tempDemCols); double* d_demsloper_y = (double*)mallocCUDADevice(sizeof(double) * blokline * tempDemCols); double* d_demsloper_z = (double*)mallocCUDADevice(sizeof(double) * blokline * tempDemCols); // 提前声明参数变量 float* h_R = (float*)mallocCUDAHost(sizeof(float) * blokline * tempDemCols); float* d_R = (float*)mallocCUDADevice(sizeof(float) * blokline * tempDemCols); float* h_amp = (float*)mallocCUDAHost(sizeof(float) * blokline * tempDemCols); float* d_amp = (float*)mallocCUDADevice(sizeof(float) * blokline * tempDemCols); //double* h_phi = (double*)mallocCUDAHost(sizeof(double) * blokline * tempDemCols); //double* d_phi = (double*)mallocCUDADevice(sizeof(double) * blokline * tempDemCols); //double* h_real = (double*)mallocCUDAHost(sizeof(double) * blokline * tempDemCols); //double* d_real = (double*)mallocCUDADevice(sizeof(double) * blokline * tempDemCols); //double* h_imag = (double*)mallocCUDAHost(sizeof(double) * blokline * tempDemCols); //double* d_imag = (double*)mallocCUDADevice(sizeof(double) * blokline * tempDemCols); long echoblockline = Memory1GB / 8 / 2 / PlusePoint * 2; double* h_PRFEcho_real = (double*)mallocCUDAHost(sizeof(double) * echoblockline * PlusePoint); double* h_PRFEcho_imag = (double*)mallocCUDAHost(sizeof(double) * echoblockline * PlusePoint); double* d_PRFEcho_real = (double*)mallocCUDADevice(sizeof(double) * echoblockline * PlusePoint); double* d_PRFEcho_imag = (double*)mallocCUDADevice(sizeof(double) * echoblockline * PlusePoint); double* h_factorj = (double*)mallocCUDAHost(sizeof(double) * freqlist.size()); double* h_freqlist = (double*)mallocCUDAHost(sizeof(double) * freqlist.size()); for (long ii = 0; ii < freqlist.size(); ii++) { h_factorj[ii] = -4 * PI * freqlist[ii] / LIGHTSPEED; h_freqlist[ii] = freqlist[ii]; } double* d_factorj = (double*)mallocCUDADevice(sizeof(double) * freqlist.size()); double* d_freqlist = (double*)mallocCUDADevice(sizeof(double) * freqlist.size()); HostToDevice(h_factorj, d_factorj, (sizeof(double) * freqlist.size())); HostToDevice(h_freqlist, d_freqlist, (sizeof(double) * freqlist.size())); testOutAmpArr("freqlist.bin", h_freqlist, freqlist.size(), 1); testOutAmpArr("factorj.bin", h_factorj, freqlist.size(), 1); // 地表覆盖类型 Eigen::MatrixXd landcover = Eigen::MatrixXd::Zero(blokline, tempDemCols);// 地面覆盖类型 long* h_demcls = (long*)mallocCUDAHost(sizeof(long) * blokline * tempDemCols); long* d_demcls = (long*)mallocCUDADevice(sizeof(long) * blokline * tempDemCols); for (startline = 0; startline < demRow; startline = startline + blokline) { long newblokline = blokline; if ((startline + blokline) >= demRow) { newblokline = demRow - startline; bloklineflag = true; } dem_x = demxyz.getData(startline, 0, newblokline, blockwidth, 1); // 地面坐标 dem_y = demxyz.getData(startline, 0, newblokline, blockwidth, 2); dem_z = demxyz.getData(startline, 0, newblokline, blockwidth, 3); demsloper_x = demsloperxyz.getData(startline, 0, newblokline, blockwidth, 1); demsloper_y = demsloperxyz.getData(startline, 0, newblokline, blockwidth, 2); demsloper_z = demsloperxyz.getData(startline, 0, newblokline, blockwidth, 3); landcover = demlandcls.getData(startline, 0, newblokline, blockwidth, 1); long calpluseFreqBufferLen = Memory1GB / 8 / 2 / PlusePoint * 2; if (calpluseFreqBufferLen < 1000) { qDebug() << "frequency point has morn than 50000"; QMessageBox::warning(nullptr, u8"frequency point has morn than 50000", u8"frequency point has morn than 50000"); } if (bloklineflag) { FreeCUDAHost(h_dem_x); FreeCUDADevice(d_dem_x); FreeCUDAHost(h_dem_y); FreeCUDADevice(d_dem_y); FreeCUDAHost(h_dem_z); FreeCUDADevice(d_dem_z); FreeCUDAHost(h_demsloper_x); FreeCUDADevice(d_demsloper_x); FreeCUDAHost(h_demsloper_y); FreeCUDADevice(d_demsloper_y); FreeCUDAHost(h_demsloper_z); FreeCUDADevice(d_demsloper_z); //6 FreeCUDAHost(h_demcls); FreeCUDADevice(d_demcls); FreeCUDAHost(h_R); FreeCUDADevice(d_R); FreeCUDAHost(h_amp); FreeCUDADevice(d_amp); //FreeCUDAHost(h_phi); FreeCUDADevice(d_phi); //FreeCUDAHost(h_real); FreeCUDADevice(d_real); //FreeCUDAHost(h_imag); FreeCUDADevice(d_imag); h_dem_x = (double*)mallocCUDAHost(sizeof(double) * newblokline * tempDemCols); h_dem_y = (double*)mallocCUDAHost(sizeof(double) * newblokline * tempDemCols); h_dem_z = (double*)mallocCUDAHost(sizeof(double) * newblokline * tempDemCols); h_demsloper_x = (double*)mallocCUDAHost(sizeof(double) * newblokline * tempDemCols); h_demsloper_y = (double*)mallocCUDAHost(sizeof(double) * newblokline * tempDemCols); h_demsloper_z = (double*)mallocCUDAHost(sizeof(double) * newblokline * tempDemCols); h_demcls = (long*)mallocCUDAHost(sizeof(long) * newblokline * tempDemCols); d_dem_x = (double*)mallocCUDADevice(sizeof(double) * newblokline * tempDemCols); d_dem_y = (double*)mallocCUDADevice(sizeof(double) * newblokline * tempDemCols); d_dem_z = (double*)mallocCUDADevice(sizeof(double) * newblokline * tempDemCols); d_demsloper_x = (double*)mallocCUDADevice(sizeof(double) * newblokline * tempDemCols); d_demsloper_y = (double*)mallocCUDADevice(sizeof(double) * newblokline * tempDemCols); d_demsloper_z = (double*)mallocCUDADevice(sizeof(double) * newblokline * tempDemCols);//6 d_demcls = (long*)mallocCUDADevice(sizeof(long) * newblokline * tempDemCols); // 临时变量 h_R = (float*)mallocCUDAHost(sizeof(float) * newblokline * tempDemCols); d_R = (float*)mallocCUDADevice(sizeof(float) * newblokline * tempDemCols); h_amp = (float*)mallocCUDAHost(sizeof(float) * newblokline * tempDemCols); d_amp = (float*)mallocCUDADevice(sizeof(float) * newblokline * tempDemCols); //h_phi = (double*)mallocCUDAHost(sizeof(double) * newblokline * tempDemCols); //d_phi = (double*)mallocCUDADevice(sizeof(double) * newblokline * tempDemCols); //h_real = (double*)mallocCUDAHost(sizeof(double) * newblokline * tempDemCols); //d_real = (double*)mallocCUDADevice(sizeof(double) * newblokline * tempDemCols); //h_imag = (double*)mallocCUDAHost(sizeof(double) * newblokline * tempDemCols); //d_imag = (double*)mallocCUDADevice(sizeof(double) * newblokline * tempDemCols); } //# pragma omp parallel for for (long i = 0; i < newblokline; i++) { for (long j = 0; j < blockwidth; j++) { #ifdef __PRFDEBUG__ h_dem_x[i * blockwidth + j] = -2028380.6250000; double(dem_x(i, j)); h_dem_y[i * blockwidth + j] = 4139373.250000; double(dem_y(i, j)); h_dem_z[i * blockwidth + j] = 4393382.500000; double(dem_z(i, j)); h_demsloper_x[i * blockwidth + j] = 4393382.500000; double(demsloper_x(i, j)); h_demsloper_y[i * blockwidth + j] = 446.923950; double(demsloper_y(i, j)); h_demsloper_z[i * blockwidth + j] = -219.002213; double(demsloper_z(i, j)); h_demcls[i * blockwidth + j] = clamap[80];// clamap[long(landcover(i, j))]; #else h_dem_x[i * blockwidth + j] = double(dem_x(i, j)); h_dem_y[i * blockwidth + j] = double(dem_y(i, j)); h_dem_z[i * blockwidth + j] = double(dem_z(i, j)); h_demsloper_x[i * blockwidth + j] = double(demsloper_x(i, j)); h_demsloper_y[i * blockwidth + j] = double(demsloper_y(i, j)); h_demsloper_z[i * blockwidth + j] = double(demsloper_z(i, j)); h_demcls[i * blockwidth + j] = clamap[long(landcover(i, j))]; #endif } } HostToDevice((void*)h_dem_x, (void*)d_dem_x, sizeof(double) * newblokline * tempDemCols); // 复制 机器 -> GPU HostToDevice((void*)h_dem_y, (void*)d_dem_y, sizeof(double) * newblokline * tempDemCols); HostToDevice((void*)h_dem_z, (void*)d_dem_z, sizeof(double) * newblokline * tempDemCols); HostToDevice((void*)h_demsloper_x, (void*)d_demsloper_x, sizeof(double) * newblokline * tempDemCols); HostToDevice((void*)h_demsloper_y, (void*)d_demsloper_y, sizeof(double) * newblokline * tempDemCols); HostToDevice((void*)h_demsloper_z, (void*)d_demsloper_z, sizeof(double) * newblokline * tempDemCols); HostToDevice((void*)h_demcls, (void*)d_demcls, sizeof(long) * newblokline * tempDemCols); #ifdef __PRFDEBUG__ && __PRFDEBUG_PRFINF__ printf("tatgetPs=[%f,%f,%f]\n", h_dem_x[0], h_dem_y[0], h_dem_z[0]); std::shared_ptr h_temp_R(new double[PluseCount], delArrPtr); #endif // __PRFDEBUG__ long pixelcount = newblokline * tempDemCols; long startprfid = 0; for (startprfid = 0; startprfid < pluseCount; startprfid = startprfid + echoblockline) { std::cout << "[" << QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss.zzz").toStdString() << "] dem:\t" << startline << "\t-\t" << startline + newblokline << "\t:\t pluse :\t" << startprfid << " / " << pluseCount << std::endl; long templine = startprfid + echoblockline < PluseCount ? echoblockline : PluseCount - startprfid; std::shared_ptr> echotemp = this->EchoSimulationData->getEchoArr(startprfid, templine); for (long tempprfid = 0; tempprfid < templine; tempprfid++) { for (long freqid = 0; freqid < PlusePoint; freqid++) { h_PRFEcho_real[tempprfid * PlusePoint + freqid] = 0;// echotemp.get()[tempprfid * PlusePoint + freqid].real(); h_PRFEcho_imag[tempprfid * PlusePoint + freqid] = 0;// echotemp.get()[tempprfid * PlusePoint + freqid].imag(); } } HostToDevice(h_PRFEcho_real, d_PRFEcho_real, sizeof(double) * echoblockline * PlusePoint); HostToDevice(h_PRFEcho_imag, d_PRFEcho_imag, sizeof(double) * echoblockline * PlusePoint); double* antpx = (double*)mallocCUDAHost(sizeof(double) * templine); double* antpy = (double*)mallocCUDAHost(sizeof(double) * templine); double* antpz = (double*)mallocCUDAHost(sizeof(double) * templine); double* antvx = (double*)mallocCUDAHost(sizeof(double) * templine); double* antvy = (double*)mallocCUDAHost(sizeof(double) * templine); double* antvz = (double*)mallocCUDAHost(sizeof(double) * templine); double* antdirectx = (double*)mallocCUDAHost(sizeof(double) * templine); double* antdirecty = (double*)mallocCUDAHost(sizeof(double) * templine); double* antdirectz = (double*)mallocCUDAHost(sizeof(double) * templine); double* antXaxisX = (double*)mallocCUDAHost(sizeof(double) * templine); double* antXaxisY = (double*)mallocCUDAHost(sizeof(double) * templine); double* antXaxisZ = (double*)mallocCUDAHost(sizeof(double) * templine); double* antYaxisX = (double*)mallocCUDAHost(sizeof(double) * templine); double* antYaxisY = (double*)mallocCUDAHost(sizeof(double) * templine); double* antYaxisZ = (double*)mallocCUDAHost(sizeof(double) * templine); double* antZaxisX = (double*)mallocCUDAHost(sizeof(double) * templine); double* antZaxisY = (double*)mallocCUDAHost(sizeof(double) * templine); double* antZaxisZ = (double*)mallocCUDAHost(sizeof(double) * templine); for (long tempprfid = 0; tempprfid < templine; tempprfid++) { long prfid = tempprfid + startprfid; antpx[tempprfid] = sateOirbtNodes[prfid].Px; antpy[tempprfid] = sateOirbtNodes[prfid].Py; antpz[tempprfid] = sateOirbtNodes[prfid].Pz; antvx[tempprfid] = sateOirbtNodes[prfid].Vx; antvy[tempprfid] = sateOirbtNodes[prfid].Vy; antvz[tempprfid] = sateOirbtNodes[prfid].Vz; //6 antdirectx[tempprfid] = sateOirbtNodes[prfid].AntDirecX; antdirecty[tempprfid] = sateOirbtNodes[prfid].AntDirecY; antdirectz[tempprfid] = sateOirbtNodes[prfid].AntDirecZ; // 9 天线指向 antXaxisX[tempprfid] = sateOirbtNodes[prfid].AntXaxisX; antXaxisY[tempprfid] = sateOirbtNodes[prfid].AntXaxisY; antXaxisZ[tempprfid] = sateOirbtNodes[prfid].AntXaxisZ;//12 天线坐标系 antYaxisX[tempprfid] = sateOirbtNodes[prfid].AntYaxisX; antYaxisY[tempprfid] = sateOirbtNodes[prfid].AntYaxisY; antYaxisZ[tempprfid] = sateOirbtNodes[prfid].AntYaxisZ;//15 antZaxisX[tempprfid] = sateOirbtNodes[prfid].AntZaxisX; antZaxisY[tempprfid] = sateOirbtNodes[prfid].AntZaxisY; antZaxisZ[tempprfid] = sateOirbtNodes[prfid].AntZaxisZ;//18 } CUDA_RFPC_MainBlock( antpx, antpy, antpz, // 天线的坐标 antXaxisX, antXaxisY, antXaxisZ, // 天线坐标系的X轴 antYaxisX, antYaxisY, antYaxisZ,// 天线坐标系的Y轴 antZaxisX, antZaxisY, antZaxisZ,// 天线坐标系的Z轴 antdirectx, antdirecty, antdirectz,// 天线的指向 templine, // 脉冲数 //h_freqlist, h_factorj, PlusePoint,// 频率数 f0, dfreq, PlusePoint,// 频率数 d_dem_x, d_dem_y, d_dem_z, pixelcount, // 地面坐标 d_demcls, d_demsloper_x, d_demsloper_y, d_demsloper_z, // 地表坡度矢量 Pt,// 增益后发射能量 refphaseRange, d_TantPattern, TstartTheta, TstartPhi, Tdtheta, Tdphi, Tthetanum, Tphinum, // 发射天线方向图 d_RantPattern, RstartTheta, RstartPhi, Rdtheta, Rdphi, Rthetanum, Rphinum,//接收天线方向图 NearRange, FarRange, d_clsSigmaParam, clamapid, d_PRFEcho_real, d_PRFEcho_imag,// 输出回波 d_R, d_amp //, d_phi, d_real, d_imag// 临时变量 ); FreeCUDAHost(antpx); // 回收局部数据 FreeCUDAHost(antpy); FreeCUDAHost(antpz); FreeCUDAHost(antvx); FreeCUDAHost(antvy); FreeCUDAHost(antvz); FreeCUDAHost(antdirectx); FreeCUDAHost(antdirecty); FreeCUDAHost(antdirectz); FreeCUDAHost(antXaxisX); FreeCUDAHost(antXaxisY); FreeCUDAHost(antXaxisZ); FreeCUDAHost(antYaxisX); FreeCUDAHost(antYaxisY); FreeCUDAHost(antYaxisZ); FreeCUDAHost(antZaxisX); FreeCUDAHost(antZaxisY); FreeCUDAHost(antZaxisZ); DeviceToHost(h_PRFEcho_real, d_PRFEcho_real, sizeof(double) * echoblockline * PlusePoint); DeviceToHost(h_PRFEcho_imag, d_PRFEcho_imag, sizeof(double) * echoblockline * PlusePoint); for (long tempprfid = 0; tempprfid < templine; tempprfid++) { for (long freqid = 0; freqid < PlusePoint; freqid++) { echotemp.get()[tempprfid * PlusePoint + freqid].real( echotemp.get()[tempprfid * PlusePoint + freqid].real() + h_PRFEcho_real[tempprfid * PlusePoint + freqid]); echotemp.get()[tempprfid * PlusePoint + freqid].imag( echotemp.get()[tempprfid * PlusePoint + freqid].imag() + h_PRFEcho_imag[tempprfid * PlusePoint + freqid]); } } this->EchoSimulationData->saveEchoArr(echotemp, startprfid, templine); } #ifdef __PRFDEBUG__ && __PRFDEBUG_PRFINF__ break; #endif // __PRFDEBUG__ } std::cout << std::endl; // 地面数据释放 FreeCUDAHost(h_dem_x); FreeCUDADevice(d_dem_x); FreeCUDAHost(h_dem_y); FreeCUDADevice(d_dem_y); FreeCUDAHost(h_dem_z); FreeCUDADevice(d_dem_z); FreeCUDAHost(h_demsloper_x); FreeCUDADevice(d_demsloper_x); FreeCUDAHost(h_demsloper_y); FreeCUDADevice(d_demsloper_y); FreeCUDAHost(h_demsloper_z); FreeCUDADevice(d_demsloper_z); //6 // 临时变量释放 FreeCUDAHost(h_R); FreeCUDADevice(d_R); FreeCUDAHost(h_amp); FreeCUDADevice(d_amp); FreeCUDAHost(h_demcls); FreeCUDADevice(d_demcls); FreeCUDAHost(h_factorj); FreeCUDADevice(d_factorj); FreeCUDAHost(h_freqlist); FreeCUDADevice(d_freqlist); FreeCUDAHost(h_PRFEcho_real); FreeCUDADevice(d_PRFEcho_real); FreeCUDAHost(h_PRFEcho_imag); FreeCUDADevice(d_PRFEcho_imag); //FreeCUDAHost(h_phi); FreeCUDADevice(d_phi); //FreeCUDAHost(h_real); FreeCUDADevice(d_real); //FreeCUDAHost(h_imag); FreeCUDADevice(d_imag); #endif this->EchoSimulationData->saveToXml(); return ErrorCode::SUCCESS; }