提前处理IFFT
parent
b34971e590
commit
9708114cf1
|
@ -159,6 +159,7 @@
|
||||||
<ConformanceMode>true</ConformanceMode>
|
<ConformanceMode>true</ConformanceMode>
|
||||||
<LanguageStandard>stdcpp14</LanguageStandard>
|
<LanguageStandard>stdcpp14</LanguageStandard>
|
||||||
<LanguageStandard_C>stdc11</LanguageStandard_C>
|
<LanguageStandard_C>stdc11</LanguageStandard_C>
|
||||||
|
<EnableParallelCodeGeneration>true</EnableParallelCodeGeneration>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
<Link>
|
<Link>
|
||||||
<SubSystem>Console</SubSystem>
|
<SubSystem>Console</SubSystem>
|
||||||
|
|
|
@ -1822,6 +1822,28 @@ gdalImageComplex CreategdalImageComplex(const QString& img_path, int height, int
|
||||||
return result_img;
|
return result_img;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
gdalImageComplex BASECONSTVARIABLEAPI CreategdalImageComplexNoProj(const QString& img_path, int height, int width, int band_num, bool overwrite)
|
||||||
|
{
|
||||||
|
|
||||||
|
// 创建新文件
|
||||||
|
omp_lock_t lock;
|
||||||
|
omp_init_lock(&lock);
|
||||||
|
omp_set_lock(&lock);
|
||||||
|
GDALAllRegister();
|
||||||
|
CPLSetConfigOption("GDAL_FILENAME_IS_UTF8", "YES");
|
||||||
|
|
||||||
|
GDALDriver* poDriver = GetGDALDriverManager()->GetDriverByName("ENVI");
|
||||||
|
GDALDataset* poDstDS = (poDriver->Create(img_path.toUtf8().constData(), width, height, band_num, GDT_CFloat64, NULL));
|
||||||
|
GDALFlushCache((GDALDatasetH)poDstDS);
|
||||||
|
GDALClose((GDALDatasetH)poDstDS);
|
||||||
|
//poDstDS.reset();
|
||||||
|
omp_unset_lock(&lock); //
|
||||||
|
omp_destroy_lock(&lock); //
|
||||||
|
|
||||||
|
gdalImageComplex result_img(img_path);
|
||||||
|
return result_img;
|
||||||
|
}
|
||||||
|
|
||||||
gdalImageComplex CreateEchoComplex(const QString& img_path, int height, int width, int band_num)
|
gdalImageComplex CreateEchoComplex(const QString& img_path, int height, int width, int band_num)
|
||||||
{
|
{
|
||||||
// 创建图像
|
// 创建图像
|
||||||
|
@ -2598,6 +2620,60 @@ void gdalImageComplex::saveImage(Eigen::MatrixXcd data, int start_row, int start
|
||||||
omp_destroy_lock(&lock); //
|
omp_destroy_lock(&lock); //
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void gdalImageComplex::saveImage(std::shared_ptr<std::complex<double>> data, long start_row, long start_col, long rowCount, long colCount, int band_ids)
|
||||||
|
{
|
||||||
|
omp_lock_t lock;
|
||||||
|
omp_init_lock(&lock);
|
||||||
|
omp_set_lock(&lock);
|
||||||
|
if (start_row + rowCount > this->height || start_col + colCount > this->width) {
|
||||||
|
QString tip = u8"file path: " + this->img_path;
|
||||||
|
qDebug() << tip;
|
||||||
|
throw std::exception(tip.toUtf8().constData());
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
GDALAllRegister();
|
||||||
|
CPLSetConfigOption("GDAL_FILENAME_IS_UTF8", "YES");
|
||||||
|
GDALDriver* poDriver = GetGDALDriverManager()->GetDriverByName("ENVI");
|
||||||
|
GDALDataset* poDstDS = nullptr;
|
||||||
|
if (exists_test(this->img_path)) {
|
||||||
|
poDstDS = (GDALDataset*)(GDALOpen(this->img_path.toUtf8().constData(), GA_Update));
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
poDstDS = poDriver->Create(this->img_path.toUtf8().constData(), this->width, this->height,
|
||||||
|
this->band_num, GDT_CFloat64, NULL); // 斤拷锟斤拷
|
||||||
|
poDstDS->SetProjection(this->projection.toUtf8().constData());
|
||||||
|
|
||||||
|
double gt_ptr[6];
|
||||||
|
for (int i = 0; i < this->gt.rows(); i++) {
|
||||||
|
for (int j = 0; j < this->gt.cols(); j++) {
|
||||||
|
gt_ptr[i * 3 + j] = this->gt(i, j);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
poDstDS->SetGeoTransform(gt_ptr);
|
||||||
|
//delete[] gt_ptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
double* databuffer = new double[rowCount * colCount * 2];
|
||||||
|
for (long i = 0; i < rowCount; i++) {
|
||||||
|
for (long j = 0; j < colCount; j++) {
|
||||||
|
databuffer[i * colCount * 2 + j * 2] = data.get()[i*colCount+j].real();
|
||||||
|
databuffer[i * colCount * 2 + j * 2 + 1] = data.get()[i * colCount + j].imag();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// poDstDS->RasterIO(GF_Write,start_col, start_row, datacols, datarows, databuffer, datacols,
|
||||||
|
// datarows, GDT_Float32,band_ids, num,0,0,0);
|
||||||
|
poDstDS->GetRasterBand(band_ids)->RasterIO(GF_Write, start_col, start_row, colCount, rowCount,
|
||||||
|
databuffer, colCount, rowCount, GDT_CFloat64, 0, 0);
|
||||||
|
GDALFlushCache(poDstDS);
|
||||||
|
delete databuffer;
|
||||||
|
GDALClose((GDALDatasetH)poDstDS);
|
||||||
|
// GDALDestroy(); // or, DllMain at DLL_PROCESS_DETACH
|
||||||
|
omp_unset_lock(&lock); //
|
||||||
|
omp_destroy_lock(&lock); //
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
Eigen::MatrixXcd gdalImageComplex::getDataComplex(int start_row, int start_col, int rows_count,
|
Eigen::MatrixXcd gdalImageComplex::getDataComplex(int start_row, int start_col, int rows_count,
|
||||||
int cols_count, int band_ids)
|
int cols_count, int band_ids)
|
||||||
{
|
{
|
||||||
|
@ -2617,8 +2693,8 @@ Eigen::MatrixXcd gdalImageComplex::getDataComplex(int start_row, int start_col,
|
||||||
poBand = poDataset->GetRasterBand(1);
|
poBand = poDataset->GetRasterBand(1);
|
||||||
|
|
||||||
// 读取波段信息,假设是复数类型
|
// 读取波段信息,假设是复数类型
|
||||||
int nXSize = poBand->GetXSize();
|
int nXSize = cols_count; poBand->GetXSize();
|
||||||
int nYSize = poBand->GetYSize();
|
int nYSize = rows_count; poBand->GetYSize();
|
||||||
|
|
||||||
double* databuffer = new double[nXSize * nYSize * 2];
|
double* databuffer = new double[nXSize * nYSize * 2];
|
||||||
poBand->RasterIO(GF_Read, start_col, start_row, cols_count, rows_count, databuffer, cols_count,
|
poBand->RasterIO(GF_Read, start_col, start_row, cols_count, rows_count, databuffer, cols_count,
|
||||||
|
@ -2636,6 +2712,44 @@ Eigen::MatrixXcd gdalImageComplex::getDataComplex(int start_row, int start_col,
|
||||||
return rasterData;
|
return rasterData;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::shared_ptr<std::complex<double>> gdalImageComplex::getDataComplexSharePtr(int start_row, int start_col, int rows_count, int cols_count, int band_ids)
|
||||||
|
{
|
||||||
|
GDALDataset* poDataset;
|
||||||
|
GDALAllRegister();
|
||||||
|
CPLSetConfigOption("GDAL_FILENAME_IS_UTF8", "YES");
|
||||||
|
|
||||||
|
// 打开TIFF文件
|
||||||
|
poDataset = (GDALDataset*)GDALOpen(this->img_path.toUtf8().constData(), GA_ReadOnly);
|
||||||
|
if(poDataset == nullptr) {
|
||||||
|
QMessageBox::warning(nullptr, u8"错误", u8"无法打开文件:" + this->img_path);
|
||||||
|
qDebug() << u8"无法打开文件:" + this->img_path;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 获取数据集的第一个波段
|
||||||
|
GDALRasterBand* poBand;
|
||||||
|
poBand = poDataset->GetRasterBand(1);
|
||||||
|
|
||||||
|
// 读取波段信息,假设是复数类型
|
||||||
|
|
||||||
|
|
||||||
|
double* databuffer = new double[rows_count * cols_count * 2];
|
||||||
|
poBand->RasterIO(GF_Read, start_col, start_row, cols_count, rows_count, databuffer, cols_count,
|
||||||
|
rows_count, GDT_CFloat64, 0, 0);
|
||||||
|
GDALClose((GDALDatasetH)poDataset);
|
||||||
|
|
||||||
|
std::shared_ptr<std::complex<double>> rasterData(new std::complex<double>[rows_count * cols_count], delArrPtr);
|
||||||
|
|
||||||
|
for(size_t i = 0; i < rows_count; i++) {
|
||||||
|
for(size_t j = 0; j < cols_count; j++) {
|
||||||
|
rasterData.get()[i*cols_count+ j] = std::complex<double>(databuffer[i * cols_count * 2 + j * 2],
|
||||||
|
databuffer[i * cols_count * 2 + j * 2 + 1]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
delete[] databuffer;
|
||||||
|
return rasterData;
|
||||||
|
}
|
||||||
|
|
||||||
void gdalImageComplex::saveImage()
|
void gdalImageComplex::saveImage()
|
||||||
{
|
{
|
||||||
this->saveImage(this->data, this->start_row, this->start_col, this->data_band_ids);
|
this->saveImage(this->data, this->start_row, this->start_col, this->data_band_ids);
|
||||||
|
|
|
@ -228,7 +228,9 @@ public: // 方法
|
||||||
~gdalImageComplex();
|
~gdalImageComplex();
|
||||||
void setData(Eigen::MatrixXcd);
|
void setData(Eigen::MatrixXcd);
|
||||||
void saveImage(Eigen::MatrixXcd data, int start_row, int start_col, int band_ids);
|
void saveImage(Eigen::MatrixXcd data, int start_row, int start_col, int band_ids);
|
||||||
|
void saveImage(std::shared_ptr<std::complex<double>> data, long start_row, long start_col, long rowCount, long colCount, int band_ids);
|
||||||
Eigen::MatrixXcd getDataComplex(int start_row, int start_col, int rows_count, int cols_count, int band_ids);
|
Eigen::MatrixXcd getDataComplex(int start_row, int start_col, int rows_count, int cols_count, int band_ids);
|
||||||
|
std::shared_ptr<std::complex<double>> getDataComplexSharePtr(int start_row, int start_col, int rows_count, int cols_count, int band_ids);
|
||||||
|
|
||||||
void saveImage() override;
|
void saveImage() override;
|
||||||
void savePreViewImage();
|
void savePreViewImage();
|
||||||
|
@ -243,6 +245,7 @@ gdalImage BASECONSTVARIABLEAPI CreategdalImage(const QString& img_path, int
|
||||||
gdalImage BASECONSTVARIABLEAPI CreategdalImage(const QString& img_path, int height, int width, int band_num, Eigen::MatrixXd gt, long espgcode, GDALDataType eType = GDT_Float32, bool need_gt = true, bool overwrite = false, bool isENVI = false);
|
gdalImage BASECONSTVARIABLEAPI CreategdalImage(const QString& img_path, int height, int width, int band_num, Eigen::MatrixXd gt, long espgcode, GDALDataType eType = GDT_Float32, bool need_gt = true, bool overwrite = false, bool isENVI = false);
|
||||||
|
|
||||||
gdalImageComplex BASECONSTVARIABLEAPI CreategdalImageComplex(const QString& img_path, int height, int width, int band_num, Eigen::MatrixXd gt, QString projection, bool need_gt = true, bool overwrite = false);
|
gdalImageComplex BASECONSTVARIABLEAPI CreategdalImageComplex(const QString& img_path, int height, int width, int band_num, Eigen::MatrixXd gt, QString projection, bool need_gt = true, bool overwrite = false);
|
||||||
|
gdalImageComplex BASECONSTVARIABLEAPI CreategdalImageComplexNoProj(const QString& img_path, int height, int width, int band_num, bool overwrite = true);
|
||||||
|
|
||||||
gdalImageComplex BASECONSTVARIABLEAPI CreateEchoComplex(const QString& img_path, int height, int width, int band_num);
|
gdalImageComplex BASECONSTVARIABLEAPI CreateEchoComplex(const QString& img_path, int height, int width, int band_num);
|
||||||
|
|
||||||
|
|
|
@ -203,6 +203,12 @@ ErrorCode TBPImageAlgCls::Process(long num_thread)
|
||||||
this->L1ds->saveImageRaster(imageRaster, startline,templine);
|
this->L1ds->saveImageRaster(imageRaster, startline,templine);
|
||||||
}
|
}
|
||||||
qDebug() << u8"开始成像";
|
qDebug() << u8"开始成像";
|
||||||
|
qDebug() << u8"频域回波-> 时域回波";
|
||||||
|
this->TimeEchoDataPath = JoinPath(this->L1ds->getoutFolderPath(), this->L0ds->getSimulationTaskName() + "_Timeecho.bin");
|
||||||
|
this->EchoFreqToTime();
|
||||||
|
|
||||||
|
qDebug() << u8"频域回波-> 时域回波 结束";
|
||||||
|
|
||||||
if (GPURUN) {
|
if (GPURUN) {
|
||||||
return this->ProcessGPU();
|
return this->ProcessGPU();
|
||||||
}
|
}
|
||||||
|
@ -361,6 +367,74 @@ ErrorCode TBPImageAlgCls::ProcessGPU()
|
||||||
return ErrorCode::SUCCESS;
|
return ErrorCode::SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void TBPImageAlgCls::EchoFreqToTime( )
|
||||||
|
{
|
||||||
|
// 读取数据
|
||||||
|
|
||||||
|
long PRFCount = this->L0ds->getPluseCount();
|
||||||
|
long inColCount = this->L0ds->getPlusePoints();
|
||||||
|
long outColCount = nextpow2(inColCount);
|
||||||
|
this->TimeEchoRowCount = PRFCount;
|
||||||
|
this->TimeEchoColCount = outColCount;
|
||||||
|
qDebug() << "IFFT : " << this->TimeEchoDataPath;
|
||||||
|
qDebug() << "PRF Count:\t" << PRFCount;
|
||||||
|
qDebug() << "inColCount:\t" << inColCount;
|
||||||
|
qDebug() << "outColCount:\t" << outColCount;
|
||||||
|
// 创建二进制文件
|
||||||
|
gdalImageComplex outTimeEchoImg = CreategdalImageComplexNoProj(this->TimeEchoDataPath,this->TimeEchoRowCount,this->TimeEchoColCount,1);
|
||||||
|
|
||||||
|
// 分块
|
||||||
|
long echoBlockline = Memory1GB / 8 / 2 / outColCount * 1; //1GB
|
||||||
|
echoBlockline = echoBlockline < 1 ? 1 : echoBlockline;
|
||||||
|
|
||||||
|
|
||||||
|
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<std::complex<double>> echoArr = this->L0ds->getEchoArr(startechoid, tempechoBlockline);
|
||||||
|
std::shared_ptr<std::complex<double>> IFFTArr = outTimeEchoImg.getDataComplexSharePtr(startechoid, 0, tempechoBlockline, outColCount, 1);
|
||||||
|
|
||||||
|
std::shared_ptr<cuComplex> host_echoArr((cuComplex*)mallocCUDAHost(sizeof(cuComplex)* tempechoBlockline * inColCount), FreeCUDAHost);
|
||||||
|
std::shared_ptr<cuComplex> host_IFFTechoArr((cuComplex*)mallocCUDAHost(sizeof(cuComplex)* tempechoBlockline * outColCount), FreeCUDAHost);
|
||||||
|
|
||||||
|
#pragma omp parallel for
|
||||||
|
for (long ii = 0; ii < tempechoBlockline * inColCount; ii++) {
|
||||||
|
host_echoArr.get()[ii] = make_cuComplex(echoArr.get()[ii].real(), echoArr.get()[ii].imag());
|
||||||
|
}
|
||||||
|
#pragma omp parallel for
|
||||||
|
for (long ii = 0; ii < tempechoBlockline * outColCount; ii++) {
|
||||||
|
host_IFFTechoArr.get()[ii] = make_cuComplex(0,0);
|
||||||
|
}
|
||||||
|
|
||||||
|
std::shared_ptr<cuComplex> device_echoArr((cuComplex*)mallocCUDADevice(sizeof(cuComplex) * tempechoBlockline * inColCount), FreeCUDADevice);
|
||||||
|
std::shared_ptr<cuComplex> device_IFFTechoArr((cuComplex*)mallocCUDADevice(sizeof(cuComplex) * tempechoBlockline * outColCount), FreeCUDADevice);
|
||||||
|
|
||||||
|
HostToDevice(host_echoArr.get(), device_echoArr.get(), sizeof(cuComplex) * tempechoBlockline * inColCount);
|
||||||
|
HostToDevice(host_IFFTechoArr.get(), device_IFFTechoArr.get(), sizeof(cuComplex) * tempechoBlockline * outColCount);
|
||||||
|
CUDAIFFT(device_echoArr.get(), device_IFFTechoArr.get(), tempechoBlockline, inColCount, outColCount);
|
||||||
|
|
||||||
|
DeviceToHost(host_IFFTechoArr.get(), device_IFFTechoArr.get(), sizeof(cuComplex) * tempechoBlockline * outColCount);
|
||||||
|
|
||||||
|
#pragma omp parallel for
|
||||||
|
for (long ii = 0; ii < tempechoBlockline * outColCount; ii++) {
|
||||||
|
IFFTArr.get()[ii] = std::complex<double>(host_IFFTechoArr.get()[ii].x, host_IFFTechoArr.get()[ii].y);
|
||||||
|
}
|
||||||
|
|
||||||
|
outTimeEchoImg.saveImage(IFFTArr, startechoid, 0, tempechoBlockline, outColCount, 1);
|
||||||
|
|
||||||
|
qDebug() << QString(" image block PRF:[%1] \t").arg((startechoid + tempechoBlockline) * 100.0 / PRFCount)
|
||||||
|
<< startechoid << "\t-\t" << startechoid + tempechoBlockline;
|
||||||
|
}
|
||||||
|
|
||||||
|
return;
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -57,6 +57,13 @@ private:
|
||||||
//ErrorCode ProcessCPU(long num_thread);
|
//ErrorCode ProcessCPU(long num_thread);
|
||||||
ErrorCode ProcessGPU();
|
ErrorCode ProcessGPU();
|
||||||
|
|
||||||
|
private://临时成员变量
|
||||||
|
QString TimeEchoDataPath;
|
||||||
|
long TimeEchoRowCount;
|
||||||
|
long TimeEchoColCount;
|
||||||
|
|
||||||
|
void EchoFreqToTime( );
|
||||||
|
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue