#include "stdafx.h" #include "TBPImageAlgCls.h" #include #include #include #include #include #include #include "GPUTool.cuh" #include "GPUTBPImage.cuh" void CreatePixelXYZ(std::shared_ptr echoL0ds, QString outPixelXYZPath) { // 创建坐标系统 long prfcount = echoL0ds->getPluseCount(); long freqcount = echoL0ds->getPlusePoints(); Eigen::MatrixXd gt = Eigen::MatrixXd::Zero(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 xyzRaster = CreategdalImage(outPixelXYZPath, prfcount, freqcount, 3, gt, QString(""), false, true,true); std::shared_ptr antpos = echoL0ds->getAntPos(); double dx = LIGHTSPEED / 2 / echoL0ds->getFs(); double Rnear = echoL0ds->getNearRange(); long echocol = 1073741824 / 8 / 4 / prfcount*8; std::cout << "echocol:\t " << echocol << std::endl; echocol = echocol < 3000 ? 3000 : echocol; long startcolidx = 0; for (startcolidx = 0; startcolidx < freqcount; startcolidx = startcolidx + echocol) { long tempechocol = echocol; if (startcolidx + tempechocol >= freqcount) { tempechocol = freqcount - startcolidx; } std::cout << "\r[" << QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss.zzz").toStdString() << "] imgxyz :\t" << startcolidx << "\t-\t" << startcolidx + tempechocol << " / " << freqcount << std::endl; Eigen::MatrixXd demx = xyzRaster.getData(0, startcolidx, prfcount, tempechocol, 1); Eigen::MatrixXd demy = xyzRaster.getData(0, startcolidx, prfcount, tempechocol, 2); Eigen::MatrixXd demz = xyzRaster.getData(0, startcolidx, prfcount, tempechocol, 3); #pragma omp parallel for for (long i = 0; i < prfcount; i++) { double Px = 0; double Py = 0; double Pz = 0; double AntDirectX = 0; double AntDirectY = 0; double AntDirectZ = 0; double R = 0; double NormAnt = 0; Px = antpos.get()[i * 19 + 1]; Py = antpos.get()[i * 19 + 2]; Pz = antpos.get()[i * 19 + 3]; AntDirectX = antpos.get()[i * 19 + 13];// zero doppler AntDirectY = antpos.get()[i * 19 + 14]; AntDirectZ = antpos.get()[i * 19 + 15]; NormAnt = std::sqrt(AntDirectX * AntDirectX + AntDirectY * AntDirectY + AntDirectZ * AntDirectZ); AntDirectX = AntDirectX / NormAnt; AntDirectY = AntDirectY / NormAnt; AntDirectZ = AntDirectZ / NormAnt;// 归一化 for (long j = 0; j < tempechocol; j++) { R = (j + startcolidx)*dx + Rnear; demx(i,j) = Px + AntDirectX * R; demy(i,j) = Py + AntDirectY * R; demz(i,j) = Pz + AntDirectZ * R; } } xyzRaster.saveImage(demx, 0, startcolidx, 1); xyzRaster.saveImage(demy, 0, startcolidx, 2); xyzRaster.saveImage(demz, 0, startcolidx, 3); } } void TBPImageProcess(QString echofile, QString outImageFolder, QString imagePlanePath,long num_thread) { std::shared_ptr echoL0ds(new EchoL0Dataset); echoL0ds->Open(echofile); std::shared_ptr< SARSimulationImageL1Dataset> imagL1(new SARSimulationImageL1Dataset); imagL1->setCenterAngle(echoL0ds->getCenterAngle()); imagL1->setCenterFreq(echoL0ds->getCenterFreq()); imagL1->setNearRange(echoL0ds->getNearRange()); imagL1->setRefRange((echoL0ds->getNearRange() + echoL0ds->getFarRange()) / 2); imagL1->setFarRange(echoL0ds->getFarRange()); imagL1->setFs(echoL0ds->getFs()); imagL1->setLookSide(echoL0ds->getLookSide()); imagL1->OpenOrNew(outImageFolder, echoL0ds->getSimulationTaskName(), echoL0ds->getPluseCount(), echoL0ds->getPlusePoints()); TBPImageAlgCls TBPimag; TBPimag.setEchoL0(echoL0ds); TBPimag.setImageL1(imagL1); TBPimag.setImagePlanePath(imagePlanePath); TBPimag.Process(num_thread); } void TBPImageAlgCls::setImagePlanePath(QString INimagePlanePath) { this->imagePlanePath = INimagePlanePath; } QString TBPImageAlgCls::getImagePlanePath() { return this->imagePlanePath; } void TBPImageAlgCls::setEchoL0(std::shared_ptr inL0ds) { this->L0ds = inL0ds; } void TBPImageAlgCls::setImageL1(std::shared_ptr inL1ds) { this->L1ds = inL1ds; } std::shared_ptr TBPImageAlgCls::getEchoL1() { return this->L0ds; } std::shared_ptr TBPImageAlgCls::getImageL0() { return this->L1ds; } ErrorCode TBPImageAlgCls::Process(long num_thread) { qDebug() << u8"创建成像平面的XYZ"; QString outRasterXYZ = JoinPath(this->L1ds->getoutFolderPath(), this->L0ds->getSimulationTaskName() + "_xyz.bin"); CreatePixelXYZ(this->L0ds, outRasterXYZ); this->outRasterXYZPath = outRasterXYZ; // 初始化Raster qDebug() << u8"初始化影像"; long imageheight = this->L1ds->getrowCount(); long imagewidth = this->L1ds->getcolCount(); long blokline = Memory1GB / 8 / 4 / imageheight * 32; blokline = blokline < 1000 ? 1000 : blokline; long startline = 0; for (startline = 0; startline < imageheight; startline = startline + blokline) { long templine = blokline; if (startline + templine >= imageheight) { templine = imageheight - startline; } std::cout << "\r[" << QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss.zzz").toStdString() << "] imgxyz :\t" << startline << "\t-\t" << startline + templine << " / " << imageheight << std::endl; std::shared_ptr> imageRaster = this->L1ds->getImageRaster(startline, templine); for (long i = 0; i < templine; i++) { for (long j = 0; j < imagewidth; j++) { imageRaster.get()[i * imagewidth + j] = std::complex(0,0); } } this->L1ds->saveImageRaster(imageRaster, startline,templine); } qDebug() << u8"开始成像"; if (GPURUN) { return this->ProcessGPU(); } else { QMessageBox::information(nullptr,u8"提示",u8"目前只支持显卡"); return ErrorCode::FAIL; } } ErrorCode TBPImageAlgCls::ProcessGPU() { // 常用参数 long rowCount = this->L1ds->getrowCount(); long colCount = this->L1ds->getcolCount(); long pixelCount = rowCount * colCount; long PRFCount = this->L0ds->getPluseCount(); long PlusePoints = this->L0ds->getPlusePoints(); float Rnear = this->L1ds->getNearRange(); float Rfar = this->L1ds->getFarRange(); float fs = this->L1ds->getFs(); double dx = LIGHTSPEED / 2 / fs; float freq = this->L1ds->getCenterFreq(); double factorj = freq * 4 * M_PI / LIGHTSPEED ; qDebug() << "------------------------------------------------"; qDebug() << "TBP params:"; qDebug() << "Rnear:\t" << Rnear; qDebug() << "Rfar:\t" << Rfar; qDebug() << "fs:\t" << fs; qDebug() << "freq:\t" << freq; qDebug() << "rowCount:\t" << rowCount; qDebug() << "colCount:\t" << colCount; qDebug() << "PRFCount:\t" << PRFCount; qDebug() << "PlusePoints:\t" << PlusePoints; std::shared_ptr Pxs (new float[this->L0ds->getPluseCount()]); std::shared_ptr Pys (new float[this->L0ds->getPluseCount()]); std::shared_ptr Pzs (new float[this->L0ds->getPluseCount()]); { std::shared_ptr antpos = this->L0ds->getAntPos(); double time = 0; double Px = 0; double Py = 0; double Pz = 0; for (long i = 0; i < rowCount; i++) { time = antpos.get()[i *19 + 0]; Px = antpos.get()[i *19 + 1]; Py = antpos.get()[i *19 + 2]; Pz = antpos.get()[i *19 + 3]; Pxs.get()[i] = Px; Pys.get()[i] = Py; Pzs.get()[i] = Pz; } antpos.reset(); } // 按照回波分块,图像分块 long echoBlockline = Memory1GB / 8 / 2 / PlusePoints * 2; echoBlockline = echoBlockline < 1 ? 1 : echoBlockline; long imageBlockline = Memory1GB / 8 / 2 / colCount * 2; imageBlockline = imageBlockline < 1 ? 1 : imageBlockline; gdalImage imageXYZ(this->outRasterXYZPath); long startimgrowid = 0; for (startimgrowid = 0; startimgrowid < rowCount; startimgrowid = startimgrowid + imageBlockline) { long tempimgBlockline = imageBlockline; if (startimgrowid + imageBlockline >= rowCount) { tempimgBlockline = rowCount - startimgrowid; } std::cout << "\r[" << QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss.zzz").toStdString() << "] image create :\t" << startimgrowid << "\t-\t" << startimgrowid + tempimgBlockline<<"\t/\t"<< rowCount << std::endl; // 提取局部pixel x,y,z std::shared_ptr img_x = readDataArr(imageXYZ,startimgrowid,0,tempimgBlockline,colCount,1,GDALREADARRCOPYMETHOD::VARIABLEMETHOD); std::shared_ptr img_y = readDataArr(imageXYZ,startimgrowid,0,tempimgBlockline,colCount,2,GDALREADARRCOPYMETHOD::VARIABLEMETHOD); std::shared_ptr img_z = readDataArr(imageXYZ,startimgrowid,0,tempimgBlockline,colCount,3,GDALREADARRCOPYMETHOD::VARIABLEMETHOD); std::shared_ptr> imgArr = this->L1ds->getImageRaster(startimgrowid, tempimgBlockline); // 获取回波 long startechoid = 0; for (long startechoid = 0; startechoid < PRFCount; startechoid = startechoid + echoBlockline) { long tempechoBlockline = echoBlockline; if (startechoid + tempechoBlockline >= PRFCount) { tempechoBlockline = PRFCount - startechoid; } std::shared_ptr> echoArr = this->L0ds->getEchoArr(startechoid, tempechoBlockline); std::shared_ptr antpx(new float[tempechoBlockline*PlusePoints]); std::shared_ptr antpy(new float[tempechoBlockline* PlusePoints]); std::shared_ptr antpz(new float[tempechoBlockline* PlusePoints]); // 复制 for (long anti = 0; anti < tempechoBlockline; anti++) { antpx.get()[anti] = Pxs.get()[anti + startechoid]; antpy.get()[anti] = Pys.get()[anti + startechoid]; antpz.get()[anti] = Pzs.get()[anti + startechoid]; } TBPImageGPUAlg( antpx, antpy, antpz, img_x, img_y, img_z, echoArr, imgArr, freq, fs, Rnear, Rfar, tempimgBlockline, colCount, tempechoBlockline, PlusePoints, startechoid,startimgrowid ); } this->L1ds->saveImageRaster(imgArr, startimgrowid, tempimgBlockline); } qDebug() << "\r[" << QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss.zzz") << "] image writing:\t" << this->L1ds->getxmlFilePath(); this->L1ds->saveToXml(); return ErrorCode::SUCCESS; } void TBPImageGPUAlg(std::shared_ptr antPx, std::shared_ptr antPy, std::shared_ptr antPz, std::shared_ptr imgx, std::shared_ptr imgy, std::shared_ptr imgz, std::shared_ptr> echoArr, std::shared_ptr> imgArr, float freq, float fs, float Rnear, float Rfar, long rowcount, long colcount, long prfcount, long freqcount, long startPRFId, long startRowID ) { // 声明GPU变量 float* h_antPx = (float*)mallocCUDAHost(sizeof(float) * prfcount); float* h_antPy = (float*)mallocCUDAHost(sizeof(float) * prfcount); float* h_antPz = (float*)mallocCUDAHost(sizeof(float) * prfcount); float* d_antPx = (float*)mallocCUDADevice(sizeof(float) * prfcount); float* d_antPy = (float*)mallocCUDADevice(sizeof(float) * prfcount); float* d_antPz = (float*)mallocCUDADevice(sizeof(float) * prfcount); float* h_imgx = (float*)mallocCUDAHost(sizeof(float) * rowcount * colcount); float* h_imgy = (float*)mallocCUDAHost(sizeof(float) * rowcount * colcount); float* h_imgz = (float*)mallocCUDAHost(sizeof(float) * rowcount * colcount); float* d_imgx = (float*)mallocCUDADevice(sizeof(float) * rowcount * colcount); float* d_imgy = (float*)mallocCUDADevice(sizeof(float) * rowcount * colcount); float* d_imgz = (float*)mallocCUDADevice(sizeof(float) * rowcount * colcount); cuComplex* h_echoArr = (cuComplex*)mallocCUDAHost(sizeof(cuComplex) * prfcount * freqcount); cuComplex* d_echoArr = (cuComplex*)mallocCUDADevice(sizeof(cuComplex) * prfcount * freqcount); cuComplex* h_imgArr = (cuComplex*)mallocCUDAHost(sizeof(cuComplex) * rowcount * colcount); cuComplex* d_imgArr = (cuComplex*)mallocCUDADevice( sizeof(cuComplex) * rowcount * colcount); cuComplex* h_imgEchoArr = (cuComplex*)mallocCUDAHost(sizeof(cuComplex) * rowcount * colcount); cuComplex* d_imgEchoArr = (cuComplex*)mallocCUDADevice(sizeof(cuComplex) * rowcount * colcount); float* h_R=(float*)mallocCUDAHost(sizeof(float) * rowcount * colcount); float* d_R=(float*)mallocCUDADevice(sizeof(float) * rowcount * colcount); long* h_CIdx = (long*)mallocCUDAHost(sizeof(long) * rowcount * colcount); long* d_CIdx = (long*)mallocCUDADevice(sizeof(long) * rowcount * colcount); // 初始化 // 天线位置 for (long i = 0; i < prfcount; i++) { h_antPx[i] = antPx.get()[i]; h_antPy[i] = antPy.get()[i]; h_antPz[i] = antPz.get()[i]; } // 成像平面 for (long i = 0; i < rowcount; i++) { for (long j = 0; j < colcount; j++) { h_imgx[i * colcount + j]=imgx.get()[i * colcount + j]; h_imgy[i * colcount + j]=imgy.get()[i * colcount + j]; h_imgz[i * colcount + j]=imgz.get()[i * colcount + j]; } } // 回波 for (long i = 0; i < prfcount; i++) { for (long j = 0; j < freqcount; j++) { h_echoArr[i * freqcount + j] = make_cuComplex(echoArr.get()[i * freqcount + j].real(), echoArr.get()[i * freqcount + j].imag()); } } // 图像 for (long i = 0; i < rowcount; i++) { for (long j = 0; j < colcount; j++) { h_imgArr[i * colcount + j].x = imgArr.get()[i * colcount + j].real(); h_imgArr[i * colcount + j].y = imgArr.get()[i * colcount + j].imag(); } } // Host -> GPU HostToDevice(h_antPx, d_antPx, sizeof(float) * prfcount); HostToDevice(h_antPy, d_antPy, sizeof(float) * prfcount); HostToDevice(h_antPz, d_antPz, sizeof(float) * prfcount); HostToDevice(h_imgx, d_imgx, sizeof(float) * rowcount * colcount); HostToDevice(h_imgy, d_imgy, sizeof(float) * rowcount * colcount); HostToDevice(h_imgz, d_imgz, sizeof(float) * rowcount * colcount); HostToDevice(h_R, d_R, sizeof(float) * rowcount * colcount); HostToDevice(h_CIdx, d_CIdx, sizeof(long) * rowcount * colcount); HostToDevice(h_echoArr, d_echoArr, sizeof(cuComplex) * prfcount * freqcount); HostToDevice(h_imgArr, d_imgArr, sizeof(cuComplex) * rowcount * colcount); HostToDevice(h_imgEchoArr, d_imgEchoArr, sizeof(cuComplex) * rowcount * colcount); #ifdef __TBPIMAGEDEBUG__ // 定义采样点 long tc[4] = { 6956,6542,7003,6840}; long tr[4] = { 1100,9324,9415,11137}; for (long iii = 0; iii < 4; iii) { tr[iii] = tr[iii] - startRowID; } std::shared_ptr Rlist(new float[4*prfcount], delArrPtr); std::shared_ptr CIdslist(new long[4*prfcount], delArrPtr); std::shared_ptr imgchoReal (new float[4 * prfcount], delArrPtr); std::shared_ptr imgchoImag (new float[4 * prfcount], delArrPtr); std::shared_ptr imgdataReal(new float[4 * prfcount], delArrPtr); std::shared_ptr imgdataImag(new float[4 * prfcount], delArrPtr); #endif for (long prfid = 0; prfid < prfcount; prfid++) { CUDATBPImage( d_antPx,d_antPy,d_antPz, d_imgx,d_imgy,d_imgz, d_R, d_CIdx, d_echoArr, d_imgArr, d_imgEchoArr, freq, fs, Rnear, Rfar, rowcount, colcount, prfid, freqcount ); #ifdef __TBPIMAGEDEBUG__ DeviceToHost(h_R, d_R, sizeof(float) * rowcount * colcount); DeviceToHost(h_CIdx, d_CIdx, sizeof(float) * rowcount * colcount); DeviceToHost(h_imgEchoArr, d_imgEchoArr, sizeof(cuComplex) * rowcount * colcount); DeviceToHost(h_imgArr, d_imgArr, sizeof(cuComplex) * rowcount * colcount); for (long iii = 0; iii < 4; iii++) { Rlist.get()[prfid * 4 + iii] = h_R[tr[iii] * colcount + tc[iii]]; CIdslist.get()[prfid * 4 + iii] = h_CIdx[tr[iii] * colcount + tc[iii]]; imgchoReal.get()[prfid * 4 + iii] = h_imgEchoArr[tr[iii] * colcount + tc[iii]].x; imgchoImag.get()[prfid * 4 + iii] = h_imgEchoArr[tr[iii] * colcount + tc[iii]].y; imgdataReal.get()[prfid * 4 + iii] = h_imgArr[tr[iii] * colcount + tc[iii]].x; imgdataImag.get()[prfid * 4 + iii] = h_imgArr[tr[iii] * colcount + tc[iii]].y; } #endif } // Device -> Host DeviceToHost(h_imgArr, d_imgArr, sizeof(cuComplex) * rowcount * colcount); #ifdef __TBPIMAGEDEBUG__ testOutAmpArr(QString("Rlist_%1.bin").arg(startPRFId), Rlist.get(), prfcount, 4); testOutAmpArr(QString("imgchoReal_%1.bin").arg(startPRFId), imgchoReal.get(), prfcount, 4); testOutAmpArr(QString("imgchoImag_%1.bin").arg(startPRFId), imgchoImag.get(), prfcount, 4); testOutAmpArr(QString("imgdataReal_%1.bin").arg(startPRFId), imgdataReal.get(), prfcount, 4); testOutAmpArr(QString("imgdataImag_%1.bin").arg(startPRFId), imgdataImag.get(), prfcount, 4); testOutClsArr(QString("CIdslist_%1.bin").arg(startPRFId), CIdslist.get(), prfcount, 4); #endif for (long i = 0; i < rowcount; i++) { for (long j = 0; j < colcount; j++) { imgArr.get()[i * colcount + j] = std::complex(h_imgArr[i * colcount + j].x,h_imgArr[i * colcount + j].y); } } FreeCUDAHost(h_antPx); FreeCUDADevice(d_antPx); FreeCUDAHost(h_antPy); FreeCUDADevice(d_antPy); FreeCUDAHost(h_antPz); FreeCUDADevice(d_antPz); FreeCUDAHost(h_imgx); FreeCUDADevice(d_imgx); FreeCUDAHost(h_imgy); FreeCUDADevice(d_imgy); FreeCUDAHost(h_imgz); FreeCUDADevice(d_imgz); FreeCUDAHost(h_echoArr); FreeCUDADevice(d_echoArr); FreeCUDAHost(h_imgArr); FreeCUDADevice(d_imgArr); FreeCUDAHost(h_R); FreeCUDADevice(d_R); } void TBPImageAlgCls::setGPU(bool flag) { this->GPURUN = flag; } bool TBPImageAlgCls::getGPU( ) { return this->GPURUN; } /** ErrorCode TBPImageAlgCls::ProcessCPU(long num_thread) { omp_set_num_threads(num_thread); // 常用参数 long rowCount = this->L1ds->getrowCount(); long colCount = this->L1ds->getcolCount(); long pixelCount = rowCount * colCount; long PRFCount = this->L0ds->getPluseCount(); long PlusePoints = this->L0ds->getPlusePoints(); double Rnear = this->L1ds->getNearRange(); double Rfar = this->L1ds->getFarRange(); double fs = this->L1ds->getFs(); double dx = LIGHTSPEED / 2 / fs; double factorj = this->L1ds->getCenterFreq() * 4 * M_PI / LIGHTSPEED * 1e9; Eigen::MatrixXcd echo = Eigen::MatrixXcd::Zero(PRFCount, PlusePoints); { std::shared_ptr> echodata = this->L0ds->getEchoArr(); for (long i = 0; i < PRFCount; i++) { for (long j = 0; j < PlusePoints; j++) { echo(i, j) = echodata.get()[i * PlusePoints + j]; } } echodata.reset(); } Eigen::MatrixXd pixelX = Eigen::MatrixXd::Zero(rowCount, colCount); Eigen::MatrixXd pixelY = Eigen::MatrixXd::Zero(rowCount, colCount); Eigen::MatrixXd pixelZ = Eigen::MatrixXd::Zero(rowCount, colCount); Eigen::MatrixXd Pxs = Eigen::MatrixXd::Zero(this->L0ds->getPluseCount(), 1); Eigen::MatrixXd Pys = Eigen::MatrixXd::Zero(this->L0ds->getPluseCount(), 1); Eigen::MatrixXd Pzs = Eigen::MatrixXd::Zero(this->L0ds->getPluseCount(), 1); // 图像网格坐标 { std::shared_ptr antpos = this->L0ds->getAntPos(); double time = 0; double Px = 0; double Py = 0; double Pz = 0; double Vx = 0; double Vy = 0; double Vz = 0; double AntDirectX = 0; double AntDirectY = 0; double AntDirectZ = 0; double AVx = 0; double AVy = 0; double AVz = 0; double R = 0; double NormAnt = 0; for (long i = 0; i < rowCount; i++) { time = antpos.get()[i * 19 + 0]; Px = antpos.get()[i * 19 + 1]; Py = antpos.get()[i * 19 + 2]; Pz = antpos.get()[i * 19 + 3]; Vx = antpos.get()[i * 19 + 4]; Vy = antpos.get()[i * 19 + 5]; Vz = antpos.get()[i * 19 + 6]; AntDirectX = antpos.get()[i * 19 + 13]; // Zero doppler AntDirectY = antpos.get()[i * 19 + 14]; AntDirectZ = antpos.get()[i * 19 + 15]; AVx = antpos.get()[i * 19 + 10]; AVy = antpos.get()[i * 19 + 11]; AVz = antpos.get()[i * 19 + 12]; NormAnt = std::sqrt(AntDirectX * AntDirectX + AntDirectY * AntDirectY + AntDirectZ * AntDirectZ); AntDirectX = AntDirectX / NormAnt; AntDirectY = AntDirectY / NormAnt; AntDirectZ = AntDirectZ / NormAnt;// 归一化 antpos.get()[i * 19 + 13] = AntDirectX; antpos.get()[i * 19 + 14] = AntDirectY; antpos.get()[i * 19 + 15] = AntDirectZ; Pxs(i, 0) = Px; Pys(i, 0) = Py; Pzs(i, 0) = Pz; for (long j = 0; j < colCount; j++) { R = j * dx + Rnear; pixelX(i, j) = Px + AntDirectX * R; pixelY(i, j) = Py + AntDirectY * R; pixelZ(i, j) = Pz + AntDirectZ * R; } } this->L1ds->saveAntPos(antpos); antpos.reset(); } // BP成像 long BlockLine = Memory1MB * 10 / 16 / rowCount; if (rowCount / BlockLine / num_thread < 3) { BlockLine = rowCount / num_thread / 3; } BlockLine = BlockLine > 10 ? BlockLine : 10; std::shared_ptr> imagarr = this->L1ds->getImageRaster(); { for (long i = 0; i < pixelCount; i++) { imagarr.get()[i] = imagarr.get()[i]; } } omp_lock_t lock; // 定义锁 omp_init_lock(&lock); // 初始化锁 long writeImageCount = 0; qDebug() << "block line:\t" << BlockLine; long startLine = 0; long processValue = 0; long processNumber = 0; QProgressDialog progressDialog(u8"RFPC回波生成中", u8"终止", 0, rowCount); progressDialog.setWindowTitle(u8"RFPC回波生成中"); progressDialog.setWindowModality(Qt::WindowModal); progressDialog.setAutoClose(true); progressDialog.setValue(0); progressDialog.setMaximum(rowCount); progressDialog.setMinimum(0); progressDialog.show(); #pragma omp parallel for for (startLine = 0; startLine < rowCount; startLine = startLine + BlockLine) { // 图像大小 long stepLine = startLine + BlockLine < rowCount ? BlockLine : rowCount - startLine; long imageRowID = startLine; // //Eigen::MatrixXd R = Eigen::MatrixXd::Zero(rowCount, 1); long pluseId = 0; std::complex factPhas(0, 0); std::complex < double> sign(0, 0); Eigen::MatrixXd R = Eigen::MatrixXd::Zero(rowCount, 1); Eigen::MatrixXcd Rphi = Eigen::MatrixXd::Zero(rowCount, 1); long PluseIDs = 0; double mask = 0; for (long i = 0; i < stepLine; i++) { // 图像行 imageRowID = startLine + i; for (long j = 0; j < colCount; j++) { //图像列 R = ((pixelX(i, j) - Pxs.array()).array().pow(2) + (pixelY(i, j) - Pys.array()).array().pow(2) + (pixelZ(i, j) - Pzs.array()).array().pow(2)).array().sqrt(); Rphi = Rphi.array() * 0; Rphi.imag() = R.array() * factorj; Rphi = Rphi.array().exp(); for (long prfid = 0; prfid < rowCount; prfid++) { // 脉冲行 PluseIDs = std::floor((R(prfid, 0) - Rnear) / dx); mask = (PluseIDs < 0 || PluseIDs >= PlusePoints) ? 0 : 1; PluseIDs = (PluseIDs < 0 || PluseIDs >= PlusePoints) ? 0 : PluseIDs; imagarr.get()[imageRowID * colCount + j] = imagarr.get()[imageRowID * colCount + j] + mask * echo(prfid, PluseIDs) * Rphi(prfid, 0);// 信号* 相位校正 } } } omp_set_lock(&lock); // 保存文件 processValue = processValue + BlockLine; this->L1ds->saveImageRaster(imagarr, 0, rowCount); qDebug() << QDateTime::currentDateTime().toString("yyyy-MM-dd HH:mm:ss.zzz").toUtf8().constData() << "\t" << processValue * 100.0 / rowCount << "%\t" << startLine << "\t-\t" << startLine + BlockLine << "\tend\t\t"; processNumber = processNumber + BlockLine; processNumber = processNumber < progressDialog.maximum() ? processNumber : progressDialog.maximum(); progressDialog.setValue(processNumber); omp_unset_lock(&lock); // 解锁 } omp_destroy_lock(&lock); // 销毁锁 this->L1ds->saveImageRaster(imagarr, 0, rowCount); this->L1ds->saveToXml(); progressDialog.close(); return ErrorCode::SUCCESS; } */