修改记录:

1. RTPC算法修改为RFPC
2. 删去Fs的读取,由带宽与成像范围计算得到频率点数
pull/3/head
陈增辉 2025-01-02 18:53:33 +08:00
parent 00017a32bd
commit 6615e35332
32 changed files with 1339 additions and 426 deletions

View File

@ -2,7 +2,7 @@
#ifndef BASECONSTVARIABLE_H
#define BASECONSTVARIABLE_H
#define EIGEN_USE_MKL_ALL
//#define EIGEN_USE_MKL_ALL
//#define EIGEN_NO_DEBUG

View File

@ -312,6 +312,16 @@ void EchoL0Dataset::setLookSide(QString lookside)
this->LookSide = lookside;
}
double EchoL0Dataset::getBandwidth()
{
return this->bandwidth;
}
void EchoL0Dataset::setBandwidth(double Inbandwidth)
{
this->bandwidth = Inbandwidth;
}
SatelliteAntPos EchoL0Dataset::getSatelliteAntPos(long prf_id)
{
std::shared_ptr<double> antpos = this->getAntPos();
@ -347,6 +357,7 @@ void EchoL0Dataset::printInfo() {
std::cout << "Far Range: " << this->FarRange << std::endl;
std::cout << "Center Frequency: " << this->centerFreq << std::endl;
std::cout << "Sampling Frequency: " << this->Fs << std::endl;
std::cout << "Band width: " << this->bandwidth << std::endl;
}
// xmlÎļþ¶Áд
@ -366,6 +377,7 @@ void EchoL0Dataset::saveToXml() {
xmlWriter.writeStartElement("SimulationConfig");
xmlWriter.writeTextElement("PluseCount", QString::number(this->PluseCount));
xmlWriter.writeTextElement("BandWidth", QString::number(this->bandwidth));
xmlWriter.writeTextElement("PlusePoints", QString::number(this->PlusePoints));
xmlWriter.writeTextElement("NearRange", QString::number(this->NearRange));
xmlWriter.writeTextElement("FarRange", QString::number(this->FarRange));
@ -408,7 +420,11 @@ ErrorCode EchoL0Dataset::loadFromXml() {
if (xmlReader.isStartElement()) {
QString elementName = xmlReader.name().toString();
if (elementName == "PluseCount") {
if (elementName == "BandWidth") {
this->bandwidth = xmlReader.readElementText().toLong();
PluseCountflag = true;
}
else if (elementName == "PluseCount") {
this->PluseCount = xmlReader.readElementText().toLong();
PluseCountflag = true;
}

View File

@ -153,6 +153,9 @@ public: //
QString getLookSide();
void setLookSide(QString lookside);
double getBandwidth();
void setBandwidth(double Inbandwidth);
SatelliteAntPos getSatelliteAntPos(long plusePRFID);
// 打印信息的成员函数
void printInfo() ;
@ -169,6 +172,8 @@ private: //
double CenterAngle;
QString LookSide;
double bandwidth;
public: // 读写 XML 的函数
void saveToXml();
ErrorCode loadFromXml();

View File

@ -58,8 +58,8 @@ std::string errorCode2errInfo(ErrorCode e)
_CASE_STR(Error_GSL_ETOLX );
_CASE_STR(Error_GSL_ETOLG );
_CASE_STR(Error_GSL_EOF );
// RTPC
_CASE_STR(RTPC_PARAMSISEMPTY);
// RFPC
_CASE_STR(RFPC_PARAMSISEMPTY);
_CASE_STR(ECHO_L0DATA_NOTOPEN);
_CASE_STR(ECHO_L0DATA_ROW_COL_NOEQUAL);
_CASE_STR(ECHO_L0DATA_PRFIDXOUTRANGE);

View File

@ -68,8 +68,8 @@ enum ErrorCode {
Error_GSL_ETOLG = 131, /* cannot reach the specified tolerance in gradient */
Error_GSL_EOF = 132, /* end of file */
// RTPC
RTPC_PARAMSISEMPTY = 201,
// RFPC
RFPC_PARAMSISEMPTY = 201,
// L0 数据
ECHO_L0DATA_NOTOPEN = 202,
ECHO_L0DATA_ROW_COL_NOEQUAL = 203, // 行或者列数量错误

View File

@ -10,24 +10,30 @@
#include <cuComplex.h>
#include "BaseConstVariable.h"
#include "GPURTPC.cuh"
#include "GPURFPC.cuh"
#ifdef __CUDANVCC___
__device__ float GPU_getSigma0dB(CUDASigmaParam param, float theta) {//线性值
float sigma= param.p1 + param.p2 * exp(-param.p3 * theta) + param.p4 * cos(param.p5 * theta + param.p6);
return sigma;
}
__device__ CUDAVectorEllipsoidal GPU_SatelliteAntDirectNormal(float RstX, float RstY, float RstZ,
__device__ CUDAVectorEllipsoidal GPU_SatelliteAntDirectNormal(
float RstX, float RstY, float RstZ,
float antXaxisX, float antXaxisY, float antXaxisZ,
float antYaxisX, float antYaxisY, float antYaxisZ,
float antZaxisX, float antZaxisY, float antZaxisZ,
float antDirectX, float antDirectY, float antDirectZ
) {
CUDAVectorEllipsoidal result{ 0,0,-1 };
// 求解天线增益
float Xst = -1 * RstX; // 卫星 --> 地面
float Yst = -1 * RstY;
float Zst = -1 * RstZ;
@ -40,18 +46,69 @@ __device__ CUDAVectorEllipsoidal GPU_SatelliteAntDirectNormal(float RstX, float
float AntZaxisX = antZaxisX;
float AntZaxisY = antZaxisY;
float AntZaxisZ = antZaxisZ;
// 天线指向在天线坐标系下的值
float Xant = (Xst * (AntYaxisY * AntZaxisZ - AntYaxisZ * AntZaxisY) + Xst * (AntXaxisZ * AntZaxisY - AntXaxisY * AntZaxisZ) + Xst * (AntXaxisY * AntYaxisZ - AntXaxisZ * AntYaxisY)) / (AntXaxisX * (AntYaxisY * AntZaxisZ - AntZaxisY * AntYaxisZ) - AntYaxisX * (AntXaxisY * AntZaxisZ - AntXaxisZ * AntZaxisY) + AntZaxisX * (AntXaxisY * AntYaxisZ - AntXaxisZ * AntYaxisY));
float Yant = (Yst * (AntYaxisZ * AntZaxisX - AntYaxisX * AntZaxisZ) + Yst * (AntXaxisX * AntZaxisZ - AntXaxisZ * AntZaxisX) + Yst * (AntYaxisX * AntXaxisZ - AntXaxisX * AntYaxisZ)) / (AntXaxisX * (AntYaxisY * AntZaxisZ - AntZaxisY * AntYaxisZ) - AntYaxisX * (AntXaxisY * AntZaxisZ - AntXaxisZ * AntZaxisY) + AntZaxisX * (AntXaxisY * AntYaxisZ - AntXaxisZ * AntYaxisY));
float Zant = (Zst * (AntYaxisX * AntZaxisY - AntYaxisY * AntZaxisX) + Zst * (AntXaxisY * AntZaxisX - AntXaxisX * AntZaxisY) + Zst * (AntXaxisX * AntYaxisY - AntYaxisX * AntXaxisY)) / (AntXaxisX * (AntYaxisY * AntZaxisZ - AntZaxisY * AntYaxisZ) - AntYaxisX * (AntXaxisY * AntZaxisZ - AntXaxisZ * AntZaxisY) + AntZaxisX * (AntXaxisY * AntYaxisZ - AntXaxisZ * AntYaxisY));
// 归一化
float RstNorm = sqrtf(Xst * Xst + Yst * Yst + Zst * Zst);
float AntXaxisNorm = sqrtf(AntXaxisX * AntXaxisX + AntXaxisY * AntXaxisY + AntXaxisZ * AntXaxisZ);
float AntYaxisNorm = sqrtf(AntYaxisX * AntYaxisX + AntYaxisY * AntYaxisY + AntYaxisZ * AntYaxisZ);
float AntZaxisNorm = sqrtf(AntZaxisX * AntZaxisX + AntZaxisY * AntZaxisY + AntZaxisZ * AntZaxisZ);
float Rx = Xst / RstNorm;
float Ry = Yst / RstNorm;
float Rz = Zst / RstNorm;
float Xx = AntXaxisX / AntXaxisNorm;
float Xy = AntXaxisY / AntXaxisNorm;
float Xz = AntXaxisZ / AntXaxisNorm;
float Yx = AntYaxisX / AntYaxisNorm;
float Yy = AntYaxisY / AntYaxisNorm;
float Yz = AntYaxisZ / AntYaxisNorm;
float Zx = AntZaxisX / AntZaxisNorm;
float Zy = AntZaxisY / AntZaxisNorm;
float Zz = AntZaxisZ / AntZaxisNorm;
float Xant = (Rx * Yy * Zz - Rx * Yz * Zy - Ry * Yx * Zz + Ry * Yz * Zx + Rz * Yx * Zy - Rz * Yy * Zx) / (Xx * Yy * Zz - Xx * Yz * Zy - Xy * Yx * Zz + Xy * Yz * Zx + Xz * Yx * Zy - Xz * Yy * Zx);
float Yant = -(Rx * Xy * Zz - Rx * Xz * Zy - Ry * Xx * Zz + Ry * Xz * Zx + Rz * Xx * Zy - Rz * Xy * Zx) / (Xx * Yy * Zz - Xx * Yz * Zy - Xy * Yx * Zz + Xy * Yz * Zx + Xz * Yx * Zy - Xz * Yy * Zx);
float Zant = (Rx * Xy * Yz - Rx * Xz * Yy - Ry * Xx * Yz + Ry * Xz * Yx + Rz * Xx * Yy - Rz * Xy * Yx) / (Xx * Yy * Zz - Xx * Yz * Zy - Xy * Yx * Zz + Xy * Yz * Zx + Xz * Yx * Zy - Xz * Yy * Zx);
// 计算theta 与 phi
float Norm = sqrtf(Xant * Xant + Yant * Yant + Zant * Zant); // 计算 pho
float ThetaAnt = acosf(Zant / Norm); // theta 与 Z轴的夹角
float YsinTheta = Yant / sinf(ThetaAnt);
float PhiAnt = (YsinTheta / abs(YsinTheta)) * acosf(Xant / (Norm * sinf(ThetaAnt)));
float PhiAnt = atanf(Yant / Xant); // -pi/2 ~pi/2
if (abs(Yant) < PRECISIONTOLERANCE) { // X轴上
PhiAnt = 0;
}
else if (abs(Xant) < PRECISIONTOLERANCE) { // Y轴上原点
if (Yant > 0) {
PhiAnt = PI / 2;
}
else {
PhiAnt = -PI / 2;
}
}
else if (Xant < 0) {
if (Yant > 0) {
PhiAnt = PI + PhiAnt;
}
else {
PhiAnt = -PI + PhiAnt;
}
}
else { // Xant>0 X 正轴
}
if (isnan(PhiAnt)) {
printf("V=[%f,%f,%f];norm=%f;thetaAnt=%f;phiAnt=%f;\n", Xant, Yant, Zant, Norm, ThetaAnt, PhiAnt);
}
result.theta = ThetaAnt;
result.phi = PhiAnt;
result.pho = Norm;
result.Rho = Norm;
return result;
}
@ -328,8 +385,6 @@ __global__ void CUDA_InterpSigma(
long clsid = demcls[idx];
float localangle = localanglearr[idx];
CUDASigmaParam tempsigma = sigma0Paramslist[clsid];
//printf("cls:%d;localangle=%f;\n",clsid, localangle);
if (localangle < 0 || localangle >= LAMP_CUDA_PI/2) {
sigmaAmp[idx] = 0;
}
@ -403,6 +458,165 @@ __global__ void CUDA_CombinationEchoAmpAndPhase(float* R,
}
__global__ void CUDAKernel_RFPC_Caluation_R_Gain(
float antX, float antY, float antZ,
float* targetX, float* targetY, float* targetZ, long len,
float* demSlopeX, float* demSlopeY, float* demSlopeZ,
float antXaxisX, float antXaxisY, float antXaxisZ,
float antYaxisX, float antYaxisY, float antYaxisZ,
float antZaxisX, float antZaxisY, float antZaxisZ,
float antDirectX, float antDirectY, float antDirectZ,
float* TransAntpattern,
float Transtarttheta, float Transstartphi, float Transdtheta, float Transdphi, int Transthetapoints, int Transphipoints,
float* ReceiveAntpattern,
float Receivestarttheta, float Receivestartphi, float Receivedtheta, float Receivedphi, int Receivethetapoints, int Receivephipoints,
float NearR, float FarR,
float* outR,
float* outLocalAngle,
float* AmpGain) {
long idx = blockIdx.x * blockDim.x + threadIdx.x;
if (idx < len) {
float RstX = antX - targetX[idx]; // 计算坐标矢量
float RstY = antY - targetY[idx];
float RstZ = antZ - targetZ[idx];
float slopeX = demSlopeX[idx];
float slopeY = demSlopeY[idx];
float slopeZ = demSlopeZ[idx];
float RstR= sqrtf(RstX* RstX + RstY* RstY + RstZ* RstZ); // 矢量距离
if (RstR<NearR || RstR>FarR) {
outLocalAngle[idx] = 0;
outR[idx] = 0;
AmpGain[idx] = 0;
}
else {
// 求解坡度
float slopR = sqrtf(slopeX * slopeX + slopeY * slopeY + slopeZ * slopeZ); //
float dotAB = RstX * slopeX + RstY * slopeY + RstZ * slopeZ;
outLocalAngle[idx] = acosf(dotAB / (RstR * slopR)); // 局地入射角
float ampGain = 0;
// 求解天线方向图指向
CUDAVectorEllipsoidal antVector = GPU_SatelliteAntDirectNormal(
RstX, RstY, RstZ,
antXaxisX, antXaxisY, antXaxisZ,
antYaxisX, antYaxisY, antYaxisZ,
antZaxisX, antZaxisY, antZaxisZ,
antDirectX, antDirectY, antDirectZ
);
if (antVector.Rho > 0) {
// 发射方向图
float temptheta = antVector.theta * r2d;
float tempphi = antVector.phi * r2d;
float TansantPatternGain =
GPU_BillerInterpAntPattern(
TransAntpattern,
Transtarttheta, Transstartphi, Transdtheta, Transdphi, Transthetapoints, Transphipoints,
temptheta, tempphi);
// 接收方向图
float antPatternGain = GPU_BillerInterpAntPattern(
ReceiveAntpattern,
Receivestarttheta, Receivestartphi, Receivedtheta, Receivedphi, Receivethetapoints, Receivephipoints,
temptheta, tempphi);
ampGain = TansantPatternGain * antPatternGain;
ampGain = ampGain / (powf(4 * LAMP_CUDA_PI, 2) * powf(RstR, 4)); // 反射强度
AmpGain[idx] = ampGain;
outR[idx] = RstR;
}
else {
outR[idx] = 0;
AmpGain[idx] = 0;
}
}
}
}
__global__ void CUDARFPCKernel_Target_Freq_EchoData(
float* InR,
float* InlocalAngle,
float* InampGain,
long* Indemcls,
long len,
float Pt, float freq,
CUDASigmaParam* sigma0Paramslist, long sigmaparamslistlen,
cuComplex* OutechoArr) {
long idx = blockIdx.x * blockDim.x + threadIdx.x;
if (idx < len) {
float sigma0 = 0;
{
long clsid = Indemcls[idx];
float localangle = InlocalAngle[idx];
CUDASigmaParam tempsigma = sigma0Paramslist[clsid];
if (localangle < 0 || localangle >= LAMP_CUDA_PI / 2) {
sigma0 = 0;
}
else {}
if (abs(tempsigma.p1) < PRECISIONTOLERANCE &&
abs(tempsigma.p2) < PRECISIONTOLERANCE &&
abs(tempsigma.p3) < PRECISIONTOLERANCE &&
abs(tempsigma.p4) < PRECISIONTOLERANCE &&
abs(tempsigma.p5) < PRECISIONTOLERANCE &&
abs(tempsigma.p6) < PRECISIONTOLERANCE
) {
sigma0 = 0;
}
else {
float sigma = GPU_getSigma0dB(tempsigma, localangle);
sigma0 = powf(10.0, sigma / 10.0);// 后向散射系数
}
}
float amp = Pt * InampGain[idx] * sigma0;
float phi = 4 * PI * freq / LIGHTSPEED * InR[idx];
// 欧拉公式 exp(ix)=cos(x)+isin(x)
// echo=Aexp(ix)=A*cos(x)+i*A*sin(x)
cuComplex echotemp = make_cuComplex(amp * cosf(phi), amp * sinf(phi));
OutechoArr[idx] = echotemp;
}
}
__global__ void CUDACkernel_Complex_SUM_reduce_dynamicshared(cuComplex* d_x, cuComplex* d_y, long N)
{
const int tid = threadIdx.x; // 某个block内的线程标号 index
const int bid = blockIdx.x; // 某个block在网格grid内的标号 index
const int n = bid * blockDim.x + tid; // n 是某个线程的标号 index
__shared__ cuComplex s_y[128]; // 分配共享内存空间不同的block都有共享内存变量的副本
s_y[tid] = (n < N) ? d_x[n] : make_cuComplex(0.0,0.0); // 每个block的共享内存变量副本都用全局内存数组d_x来赋值最后一个多出来的用0
__syncthreads(); // 线程块内部直接同步
for (int offset = blockDim.x >> 1; offset > 0; offset >>= 1) // 折半
{
if (tid < offset) // 线程标号的index 不越界 折半
{
s_y[tid] = cuCaddf(s_y[tid], s_y[tid + offset]); // 某个block内的线程做折半规约
}
__syncthreads(); // 同步block内部的线程
}
if (tid == 0) // 某个block只做一次操作
{
d_y[bid] = s_y[0]; // 复制共享内存变量累加的结果到全局内存
}
}
/** 对外封装接口 *******************************************************************************************************/
extern "C" void SatelliteAntDirectNormal(float* RstX, float* RstY, float* RstZ,
float antXaxisX, float antXaxisY, float antXaxisZ,
@ -426,7 +640,7 @@ extern "C" void SatelliteAntDirectNormal(float* RstX, float* RstY, float* RstZ,
#ifdef __CUDADEBUG__
cudaError_t err = cudaGetLastError();
if (err != cudaSuccess) {
printf("CUDA_RTPC_SiglePRF CUDA Error: %s\n", cudaGetErrorString(err));
printf("CUDA_RFPC_SiglePRF CUDA Error: %s\n", cudaGetErrorString(err));
// Possibly: exit(-1) if program cannot continue....
}
#endif // __CUDADEBUG__
@ -438,7 +652,7 @@ extern "C" void AntPatternInterpGain(float* anttheta, float* antphi, float* ga
float* antpattern, float starttheta, float startphi, float dtheta, float dphi, int thetapoints, int phipoints, long len) {
int blockSize = 256; // 每个块的线程数
int numBlocks = (len + blockSize - 1) / blockSize; // 根据 pixelcount 计算网格大小
//printf("\nCUDA_RTPC_SiglePRF blockSize:%d ,numBlock:%d\n", blockSize, numBlocks);
//printf("\nCUDA_RFPC_SiglePRF blockSize:%d ,numBlock:%d\n", blockSize, numBlocks);
CUDA_AntPatternInterpGain << <numBlocks, blockSize >> > ( anttheta,antphi, gain,
antpattern,
@ -447,7 +661,7 @@ extern "C" void AntPatternInterpGain(float* anttheta, float* antphi, float* ga
#ifdef __CUDADEBUG__
cudaError_t err = cudaGetLastError();
if (err != cudaSuccess) {
printf("CUDA_RTPC_SiglePRF CUDA Error: %s\n", cudaGetErrorString(err));
printf("CUDA_RFPC_SiglePRF CUDA Error: %s\n", cudaGetErrorString(err));
// Possibly: exit(-1) if program cannot continue....
}
#endif // __CUDADEBUG__
@ -472,7 +686,7 @@ extern "C" void calculationEcho(float* sigma0, float* TransAnt, float* ReciveAnt
#ifdef __CUDADEBUG__
cudaError_t err = cudaGetLastError();
if (err != cudaSuccess) {
printf("CUDA_RTPC_SiglePRF CUDA Error: %s\n", cudaGetErrorString(err));
printf("CUDA_RFPC_SiglePRF CUDA Error: %s\n", cudaGetErrorString(err));
// Possibly: exit(-1) if program cannot continue....
}
#endif // __CUDADEBUG__
@ -490,7 +704,7 @@ extern "C" void CUDACalculationEchoAmp(float* sigma0, float* TransAnt, float* Re
#ifdef __CUDADEBUG__
cudaError_t err = cudaGetLastError();
if (err != cudaSuccess) {
printf("CUDA_RTPC_SiglePRF CUDA Error: %s\n", cudaGetErrorString(err));
printf("CUDA_RFPC_SiglePRF CUDA Error: %s\n", cudaGetErrorString(err));
// Possibly: exit(-1) if program cannot continue....
}
#endif // __CUDADEBUG__
@ -508,7 +722,7 @@ extern "C" void CUDACalculationEchoPhase(float* R, float lamda, float* phaseArr,
#ifdef __CUDADEBUG__
cudaError_t err = cudaGetLastError();
if (err != cudaSuccess) {
printf("CUDA_RTPC_SiglePRF CUDA Error: %s\n", cudaGetErrorString(err));
printf("CUDA_RFPC_SiglePRF CUDA Error: %s\n", cudaGetErrorString(err));
// Possibly: exit(-1) if program cannot continue....
}
#endif // __CUDADEBUG__
@ -533,7 +747,7 @@ extern "C" void CUDACombinationEchoAmpAndPhase(float* R,
#ifdef __CUDADEBUG__
cudaError_t err = cudaGetLastError();
if (err != cudaSuccess) {
printf("CUDA_RTPC_SiglePRF CUDA Error: %s\n", cudaGetErrorString(err));
printf("CUDA_RFPC_SiglePRF CUDA Error: %s\n", cudaGetErrorString(err));
// Possibly: exit(-1) if program cannot continue....
}
#endif // __CUDADEBUG__
@ -555,13 +769,128 @@ extern "C" void CUDAInterpSigma(
#ifdef __CUDADEBUG__
cudaError_t err = cudaGetLastError();
if (err != cudaSuccess) {
printf("CUDA_RTPC_SiglePRF CUDA Error: %s\n", cudaGetErrorString(err));
printf("CUDA_RFPC_SiglePRF CUDA Error: %s\n", cudaGetErrorString(err));
// Possibly: exit(-1) if program cannot continue....
}
#endif // __CUDADEBUG__
cudaDeviceSynchronize();
}
extern "C" void CUDARFPC_Caluation_R_Gain(float antX, float antY, float antZ,
float* targetX, float* targetY, float* targetZ, long TargetPixelNumber,
float* demSlopeX, float* demSlopeY, float* demSlopeZ,
float antXaxisX, float antXaxisY, float antXaxisZ,
float antYaxisX, float antYaxisY, float antYaxisZ,
float antZaxisX, float antZaxisY, float antZaxisZ,
float antDirectX, float antDirectY, float antDirectZ,
float* TransAntpattern, float Transtarttheta, float Transstartphi, float Transdtheta, float Transdphi, int Transthetapoints, int Transphipoints,
float* ReceiveAntpattern, float Receivestarttheta, float Receivestartphi, float Receivedtheta, float Receivedphi, int Receivethetapoints, int Receivephipoints,
float NearR, float FarR,
float* outR,
float* outLocalAngle,
float* AmpGain)
{
int blockSize = 256; // 每个块的线程数
int numBlocks = (TargetPixelNumber + blockSize - 1) / blockSize; // 根据 pixelcount 计算网格大小
// 调用 CUDA 核函数
CUDAKernel_RFPC_Caluation_R_Gain << <numBlocks, blockSize >> > (
antX, antY, antZ,
targetX,targetY, targetZ, TargetPixelNumber,
demSlopeX, demSlopeY, demSlopeZ,
antXaxisX, antXaxisY, antXaxisZ,
antYaxisX, antYaxisY, antYaxisZ,
antZaxisX, antZaxisY, antZaxisZ,
antDirectX, antDirectY, antDirectZ,
TransAntpattern,
Transtarttheta, Transstartphi, Transdtheta, Transdphi, Transthetapoints, Transphipoints,
ReceiveAntpattern,
Receivestarttheta, Receivestartphi, Receivedtheta, Receivedphi, Receivethetapoints, Receivephipoints,
NearR, FarR,
outR,
outLocalAngle,
AmpGain
);
#ifdef __CUDADEBUG__
cudaError_t err = cudaGetLastError();
if (err != cudaSuccess) {
printf("CUDARFPC_Caluation_R_Gain CUDA Error: %s\n", cudaGetErrorString(err));
// Possibly: exit(-1) if program cannot continue....
}
#endif // __CUDADEBUG__
cudaDeviceSynchronize();
}
extern "C" void CUDARFPC_Target_Freq_EchoData(float* InR,
float* InlocalAngle,
float* InampGain,
long* Indemcls,
long len,
float Pt, float freq,
CUDASigmaParam* sigma0Paramslist, long sigmaparamslistlen,
cuComplex* OutechoArr
)
{
int blockSize = 256; // 每个块的线程数
int numBlocks = (len + blockSize - 1) / blockSize; // 根据 pixelcount 计算网格大小
// 调用 CUDA 核函数
CUDARFPCKernel_Target_Freq_EchoData << <numBlocks, blockSize >> > (
InR,
InlocalAngle,
InampGain,
Indemcls,
len,
Pt, freq,
sigma0Paramslist, sigmaparamslistlen,
OutechoArr
);
#ifdef __CUDADEBUG__
cudaError_t err = cudaGetLastError();
if (err != cudaSuccess) {
printf("CUDARFPC_Target_Freq_EchoData CUDA Error: %s\n", cudaGetErrorString(err));
// Possibly: exit(-1) if program cannot continue....
}
#endif // __CUDADEBUG__
cudaDeviceSynchronize();
}
extern "C" void CUDA_DemEchoSUM_NoMalloc(cuComplex* d_dem_echo,long N,
cuComplex* d_echosum_temp, int grid_size,
cuComplex* d_echo,long ehcoid
) {
long NUM_REPEATS = 100;
const int smem = sizeof(float) * BLOCK_SIZE;
for (long i = 0; i < grid_size; i++) { // 初始化
d_echosum_temp[i] = make_cuComplex(0,0);
}
CUDACkernel_Complex_SUM_reduce_dynamicshared << <grid_size, BLOCK_SIZE, smem >> > (d_dem_echo, d_echosum_temp,N); //归约求和
#ifdef __CUDADEBUG__
cudaError_t err = cudaGetLastError();
if (err != cudaSuccess) {
printf("CUDALinearInterp1 CUDA Error: %s\n", cudaGetErrorString(err));
// Possibly: exit(-1) if program cannot continue....
}
#endif // __CUDADEBUG__
cudaDeviceSynchronize();
for (int n = 0; n < grid_size; ++n)
{
d_echo[ehcoid] =cuCaddf(d_echo[ehcoid],d_echosum_temp[n]);
}
}
#endif

View File

@ -1,5 +1,5 @@
#ifndef _GPURTPC_H_
#define _GPURTPC_H_
#ifndef _GPURFPC_H_
#define _GPURFPC_H_
#include "BaseConstVariable.h"
#include "GPUTool.cuh"
@ -63,6 +63,50 @@ extern "C" void CUDAInterpSigma(
long* demcls, float* sigmaAmp, float* localanglearr, long len,
CUDASigmaParam* sigma0Paramslist, long sigmaparamslistlen);
// 计算坐标的 距离、增益
extern "C" void CUDARFPC_Caluation_R_Gain(
float antX,float antY,float antZ, // 天线的坐标
float* targetX,float* targetY, float* targetZ, long TargetPixelNumber, // 地面坐标
float* demSlopeX, float* demSlopeY, float* demSlopeZ, // 地表坡度矢量
float antXaxisX, float antXaxisY, float antXaxisZ, // 天线坐标系的X轴
float antYaxisX, float antYaxisY, float antYaxisZ,// 天线坐标系的Y轴
float antZaxisX, float antZaxisY, float antZaxisZ,// 天线坐标系的Z轴
float antDirectX, float antDirectY, float antDirectZ,// 天线的指向
float* TransAntpattern, float Transtarttheta, float Transstartphi, float Transdtheta, float Transdphi, int Transthetapoints, int Transphipoints, // 发射天线方向图
float* ReceiveAntpattern, float Receivestarttheta, float Receivestartphi, float Receivedtheta, float Receivedphi, int Receivethetapoints, int Receivephipoints,//接收天线方向图
float NearR,float FarR, // 距离范围
float* outR, // 输出距离
float* outLocalAngle, // 输出局地坐标系
float* AmpGain // 输出增益
);
// 创建回波
extern "C" void CUDARFPC_Target_Freq_EchoData(
float* InR,
float* InlocalAngle,
float* InampGain,
long* Indemcls, long TargetPixelNumber,
float Pt, float freq,
CUDASigmaParam* sigma0Paramslist, long sigmaparamslistlen,// 插值图
cuComplex* OutechoArr
);
extern "C" void CUDA_DemEchoSUM_NoMalloc(cuComplex* d_dem_echo, long N,
cuComplex* d_echosum_temp, int grid_size,
cuComplex* d_echo, long ehcoid
);
#endif

View File

@ -76,8 +76,8 @@ extern "C" void CUDATBPImage(float* antPx, float* antPy, float* antPz,
{
int blockSize = 256; // 每个块的线程数
int numBlocks = (rowcount * colcount + blockSize - 1) / blockSize; // 根据 pixelcount 计算网格大小
//printf("\nCUDA_RTPC_SiglePRF blockSize:%d ,numBlock:%d\n",blockSize,numBlocks);
// 调用 CUDA 核函数 CUDA_RTPC_Kernel
//printf("\nCUDA_RFPC_SiglePRF blockSize:%d ,numBlock:%d\n",blockSize,numBlocks);
// 调用 CUDA 核函数 CUDA_RFPC_Kernel
CUDA_TBPImage << <numBlocks, blockSize >> > (
antPx, antPy, antPz,

View File

@ -8,12 +8,13 @@
#include <cuda_runtime.h>
#include <cublas_v2.h>
#include <cuComplex.h>
#include <chrono>
#include "BaseConstVariable.h"
#include "GPUTool.cuh"
#ifdef __CUDANVCC___
#define BLOCK_DIM 1024
#define REDUCE_SCALE 4
// 定义参数
__device__ cuComplex cuCexpf(cuComplex x)
@ -43,6 +44,49 @@ __device__ float GPU_CosAngle_VectorA_VectorB(CUDAVector A, CUDAVector B) {
}
__global__ void CUDACkernel_SUM_reduce_dynamicshared(float* d_x, float* d_y,long N)
{
const int tid = threadIdx.x; // 某个block内的线程标号 index
const int bid = blockIdx.x; // 某个block在网格grid内的标号 index
const int n = bid * blockDim.x + tid; // n 是某个线程的标号 index
__shared__ float s_y[128]; // 分配共享内存空间不同的block都有共享内存变量的副本
s_y[tid] = (n < N) ? d_x[n] : 0.0; // 每个block的共享内存变量副本都用全局内存数组d_x来赋值最后一个多出来的用0
__syncthreads(); // 线程块内部直接同步
for (int offset = blockDim.x >> 1; offset > 0; offset >>= 1) // 折半
{
if (tid < offset) // 线程标号的index 不越界 折半
{
s_y[tid] += s_y[tid + offset]; // 某个block内的线程做折半规约
}
__syncthreads(); // 同步block内部的线程
}
if (tid == 0) // 某个block只做一次操作
{
d_y[bid] = s_y[0]; // 复制共享内存变量累加的结果到全局内存
}
}
__global__ void CUDA_DistanceAB(float* Ax, float* Ay, float* Az, float* Bx, float* By, float* Bz, float* R, long len) {
long idx = blockIdx.x * blockDim.x + threadIdx.x;
if (idx < len) {
@ -113,6 +157,22 @@ __global__ void CUDA_GridPoint_Linear_Interp1(float* v, float* q, float* qv, lon
}
}
}
//错误提示
extern "C" void checkCudaError(cudaError_t err, const char* msg) {
@ -314,3 +374,39 @@ extern "C" void CUDAGridPointLinearInterp1(float* v, float* q, float* qv, long
#endif
extern "C" float CUDA_SUM(float* d_x, long N)
{
long NUM_REPEATS = 100;
int grid_size = (N + BLOCK_SIZE - 1) / BLOCK_SIZE;
const int ymem = sizeof(float) * grid_size;
const int smem = sizeof(float) * BLOCK_SIZE;
float* d_y=(float*)mallocCUDADevice(ymem);
float* h_y = (float*)mallocCUDAHost(ymem);
CUDACkernel_SUM_reduce_dynamicshared << <grid_size, BLOCK_SIZE, smem >> > (d_x, d_y,N);
#ifdef __CUDADEBUG__
cudaError_t err = cudaGetLastError();
if (err != cudaSuccess) {
printf("CUDALinearInterp1 CUDA Error: %s\n", cudaGetErrorString(err));
// Possibly: exit(-1) if program cannot continue....
}
#endif // __CUDADEBUG__
cudaDeviceSynchronize();
DeviceToHost(h_y, d_y, ymem);
float result = 0.0;
for (int n = 0; n < grid_size; ++n)
{
result += h_y[n];
}
FreeCUDAHost(h_y);
FreeCUDADevice(d_y);
return result;
}

View File

@ -13,6 +13,7 @@
#define LAMP_CUDA_PI 3.141592653589793238462643383279
#define BLOCK_SIZE 256
// 默认显存分布
@ -32,7 +33,7 @@ extern "C" struct CUDAVector {
extern "C" struct CUDAVectorEllipsoidal {
float theta;
float phi;
float pho;
float Rho;
};
// 定义设备函数

View File

@ -0,0 +1,446 @@
#include "LAMPScatterS1B.h"
#include <flann/flann.hpp>
#include <QDebug>
LAMPScatterS1BRCSDataNode::LAMPScatterS1BRCSDataNode(QString PolarName, double AzAngle, double IncAngle, std::shared_ptr<double> freqs, std::shared_ptr<double> InRCSPoints, long freqnumber)
{
this->PolarName = PolarName;
this->FreqPointNumber = freqnumber;
this->FreqPoints = freqs;
this->RCSPoints = InRCSPoints;
this->AzAngle = AzAngle;
this->IncAngle = IncAngle;
}
LAMPScatterS1BRCSDataNode::~LAMPScatterS1BRCSDataNode()
{
}
long LAMPScatterS1BRCSDataNode::getFreqPointNumber()
{
return this->FreqPointNumber;
}
std::shared_ptr<double> LAMPScatterS1BRCSDataNode::getFreqPoints()
{
return this->FreqPoints;
}
std::shared_ptr<double> LAMPScatterS1BRCSDataNode::getRCSPoints()
{
return this->RCSPoints;
}
QString LAMPScatterS1BRCSDataNode::getPolarName()
{
return this->PolarName;
}
double LAMPScatterS1BRCSDataNode::getAzAngle()
{
return this->AzAngle;
}
double LAMPScatterS1BRCSDataNode::getIncAngle()
{
return this->IncAngle;
}
LAMPScatterS1BPolarKdTree::LAMPScatterS1BPolarKdTree(std::vector<std::shared_ptr<LAMPScatterS1BRCSDataNode>> inDatalist)
{
this->KdtreeFlannDatasetPtr = nullptr;
this->kdtreeIndexPtr = nullptr;
this->datalist = std::vector<std::shared_ptr< LAMPScatterS1BRCSDataNode >>(inDatalist.size());
for (long i = 0; i < inDatalist.size(); i++) {
this->datalist[i] = inDatalist[i];
}
this->dataset= std::vector<std::vector<double>>(this->datalist.size(), std::vector<double>(2));
for (size_t i = 0; i < this->datalist.size(); ++i) {
dataset[i][0] = static_cast<double>(this->datalist[i]->getAzAngle());
dataset[i][1] = static_cast<double>(this->datalist[i]->getIncAngle());
}
// 构建KDtree
this->KdtreeFlannDatasetPtr = std::make_shared < flann::Matrix<double>>(&(this->dataset)[0][0], this->dataset.size(), this->dataset[0].size());
this->kdtreeIndexPtr = std::make_shared<flann::Index<flann::L2<double>>>(*(this->KdtreeFlannDatasetPtr.get()), flann::KDTreeSingleIndexParams(1));
this->kdtreeIndexPtr->buildIndex();
}
LAMPScatterS1BPolarKdTree::~LAMPScatterS1BPolarKdTree()
{
this->datalist.clear();
std::vector<std::shared_ptr< LAMPScatterS1BRCSDataNode >>().swap(this->datalist);
}
QVector<std::shared_ptr< LAMPScatterS1BRCSDataNode >> LAMPScatterS1BPolarKdTree::search(double sAzAngle, double sIncAngle, long sPointNumber)
{
// 查询点
std::vector<double> queryPoint = { sAzAngle, sIncAngle };
flann::Matrix<double> query(&queryPoint[0], 1, queryPoint.size());
// 存储结果索引和距离
std::vector<int> indices(sPointNumber);
std::vector<double> dists(sPointNumber);
// 确保 indices 和 dists 是 flann::Matrix 类型
flann::Matrix<int> flannIndices(&indices[0], sPointNumber, 1);
flann::Matrix<double> flannDists(&dists[0], sPointNumber, 1);
// 执行最近邻搜索
int result = this->kdtreeIndexPtr->knnSearch(query, flannIndices, flannDists, sPointNumber, flann::FLANN_CHECKS_AUTOTUNED);
if (result > 0) {
QVector<std::shared_ptr< LAMPScatterS1BRCSDataNode >> searchResults(sPointNumber);
for(long i=0;i< sPointNumber;i++){
searchResults[i] = datalist[indices[0]];
}
return searchResults;
}
else {
return QVector<std::shared_ptr< LAMPScatterS1BRCSDataNode >>(0);
}
}
int LAMPScatterS1BDataset::OpenFile(QString s1bfilepath)
{
int ncid;
if (nc_open(s1bfilepath.toLocal8Bit().constData(), NC_NOWRITE, &ncid)) {
qCritical() << "Failed to open NetCDF file";
return 1;
}
int FreqVarid ;
int PolVarid ;
int AzVarid ;
int IncVarid ;
int RCSVarid ;
if (nc_inq_varid(ncid, "Freq", &FreqVarid)
|| nc_inq_varid(ncid, "Pol", &PolVarid)
|| nc_inq_varid(ncid, "Az", &AzVarid)
|| nc_inq_varid(ncid, "Inc", &IncVarid)
|| nc_inq_varid(ncid, "RCS", &RCSVarid)
) {
qDebug() << "Failed to get variable ";
qDebug() << "Freq:\t" << FreqVarid << "\tPol:\t" << PolVarid << "\tAz:\t" << AzVarid << "\tInc:\t" << IncVarid << "\RCS:\t" << RCSVarid;
nc_close(ncid);
return 1;
}
qDebug() << "[VarID]\t Freq:\t" << FreqVarid << "\tPol:\t" << PolVarid << "\tAz:\t" << AzVarid << "\tInc:\t" << IncVarid << "\RCS:\t" << RCSVarid;
// 检查变量维度
int Freqndims ;
int Polndims ;
int Azndims ;
int Incndims ;
int RCSndims ;
if ( nc_inq_varndims(ncid, FreqVarid , &Freqndims)
|| nc_inq_varndims(ncid, PolVarid , &Polndims )
|| nc_inq_varndims(ncid, AzVarid , &Azndims )
|| nc_inq_varndims(ncid, IncVarid , &Incndims )
|| nc_inq_varndims(ncid, RCSVarid , &RCSndims )
) {
qDebug() << "Failed to get number of dimensions for variable";
qDebug() << "[Dimensions]\t Freq:\t" << Freqndims
<< "\tPol:\t"<< Polndims
<< "\tAz:\t" << Azndims
<< "\tInc:\t"<< Incndims
<< "\RCS:\t" << RCSndims ;
nc_close(ncid);
return 1;
}
qDebug() << "[Dimensions]\t Freq:\t" << Freqndims
<< "\tPol:\t" << Polndims
<< "\tAz:\t" << Azndims
<< "\tInc:\t" << Incndims
<< "\RCS:\t" << RCSndims;
// 获取 点数据数量
std::vector<int> Freqdimids (Freqndims );
std::vector<int> Poldimids (Polndims );
std::vector<int> Azdimids (Azndims );
std::vector<int> Incdimids (Incndims );
std::vector<int> RCSdimids (RCSndims );
if ( nc_inq_vardimid(ncid, FreqVarid , Freqdimids.data())
|| nc_inq_vardimid(ncid, PolVarid , Poldimids .data())
|| nc_inq_vardimid(ncid, AzVarid , Azdimids .data())
|| nc_inq_vardimid(ncid, IncVarid , Incdimids .data())
|| nc_inq_vardimid(ncid, RCSVarid , RCSdimids .data())
) {
qDebug() << "Failed to get dimension IDs for variable";
qDebug() << "[Dimensions IDs]\t Freq:\t" << Freqdimids.size()
<< "\tPol:\t"<< Poldimids .size()
<< "\tAz:\t" << Azdimids .size()
<< "\tInc:\t"<< Incdimids .size()
<< "\RCS:\t" << RCSdimids .size() ;
nc_close(ncid);
return 1;
}
qDebug() << "[Dimensions IDs]\t Freq:\t" << Freqdimids.size()
<< "\tPol:\t" << Poldimids.size()
<< "\tAz:\t" << Azdimids.size()
<< "\tInc:\t" << Incdimids.size()
<< "\RCS:\t" << RCSdimids.size();
std::vector<int> Freqdimsize(Freqndims);
std::vector<int> Poldimsizes(Polndims);
std::vector<int> Azdimsize (Azndims);
std::vector<int> Incdimsize (Incndims);
std::vector<int> RCSdimsize (RCSndims);
for (long i = 0; i < Freqdimids.size(); i++) {
size_t datalen_temp;
if (nc_inq_dimlen(ncid, Freqdimids[i], &datalen_temp)) {
qDebug() << "Failed to get Freqdimsize for variable";
}
else {
Freqdimsize[i] = datalen_temp;
}
}
for (long i = 0; i < Poldimids.size(); i++) {
size_t datalen_temp;
if (nc_inq_dimlen(ncid, Poldimids[i], &datalen_temp)) {
qDebug() << "Failed to get Poldimids for variable";
}
else {
Poldimsizes[i] = datalen_temp;
}
}
for (long i = 0; i < Azdimids.size(); i++) {
size_t datalen_temp;
if (nc_inq_dimlen(ncid, Azdimids[i], &datalen_temp)) {
qDebug() << "Failed to get Azdimids for variable";
}
else {
Azdimsize[i] = datalen_temp;
}
}
for (long i = 0; i < Incdimids.size(); i++) {
size_t datalen_temp;
if (nc_inq_dimlen(ncid, Incdimids[i], &datalen_temp)) {
qDebug() << "Failed to get Incdimids for variable";
}
else {
Incdimsize[i] = datalen_temp;
}
}
for (long i = 0; i < RCSdimids.size(); i++) {
size_t datalen_temp;
if (nc_inq_dimlen(ncid, RCSdimids[i], &datalen_temp)) {
qDebug() << "Failed to get RCSdimids for variable";
}
else {
RCSdimsize[i] = datalen_temp;
}
}
long Freq_datalen =1;
long Pol_datalen =1;
long Az_datalen =1;
long Inc_datalen =1;
long RCS_datalen =1;
for (long i = 0; i < Freqdimsize.size(); i++) {
Freq_datalen = Freq_datalen * Freqdimsize[i];
}
for (long i = 0; i < Poldimsizes.size(); i++) {
Pol_datalen = Pol_datalen * Poldimsizes[i];
}
for (long i = 0; i < Azdimsize.size(); i++) {
Az_datalen = Az_datalen * Azdimsize[i];
}
for (long i = 0; i < Incdimsize.size(); i++) {
Inc_datalen = Inc_datalen * Incdimsize[i];
}
for (long i = 0; i < RCSdimsize.size(); i++) {
RCS_datalen = RCS_datalen * RCSdimsize[i];
}
qDebug() << "[Data Size]\t Freq:\t" << Freq_datalen
<< "\tPol:\t" << Pol_datalen
<< "\tAz:\t" << Az_datalen
<< "\tInc:\t" << Inc_datalen
<< "\RCS:\t" << RCS_datalen;
// 读取数据
std::vector<float> pol_data (Pol_datalen);
std::vector<float> inc_data (Inc_datalen);
std::vector<float> az_data (Az_datalen );
std::vector<float> freq_data (Freq_datalen);
std::vector<double> rcs_data (RCS_datalen);
if ( nc_get_var_float(ncid, FreqVarid, freq_data.data())
//|| nc_get_var_float(ncid, PolVarid, pol_data.data())
//|| nc_get_var_float(ncid, AzVarid, az_data.data())
//|| nc_get_var_float(ncid, IncVarid, inc_data.data())
//|| nc_get_var_double(ncid, RCSVarid, rcs_data.data())
) {
qDebug() << "reading Data for variable";
qDebug() << "[Data size ]\t Freq:\t" << pol_data .size()
<< "\tPol:\t" << inc_data .size()
<< "\tAz:\t" << az_data .size()
<< "\tInc:\t" << freq_data .size()
<< "\RCS:\t" << rcs_data .size();
nc_close(ncid);
return 1;
}
qDebug() << "[Data size ]\t Freq:\t" << pol_data.size()
<< "\tPol:\t" << inc_data.size()
<< "\tAz:\t" << az_data.size()
<< "\tInc:\t" << freq_data.size()
<< "\RCS:\t" << rcs_data.size();
// 读取Pol的属性
QMap<QString, QString> polnamedict = ReadPolAttribution(ncid, PolVarid);
if (polnamedict.count()==0) {
qDebug() << "Failed to get attribution Number for variable Pol ";
nc_close(ncid);
return 1;
}
nc_close(ncid);
// 创建节点
for (long PolId = 0; PolId < Pol_datalen; PolId++) { // Polar
QString polkey = QString("label_Pol_%1").arg(PolId+1);
QString polname = polnamedict[polkey];
std::vector<std::shared_ptr< LAMPScatterS1BRCSDataNode >> nodes(0);
for (long Azid = 0; Azid < Az_datalen; Azid++) { // Az
for (long Incid = 0; Incid < Inc_datalen; Incid++) { // Inc
std::shared_ptr<double> freqs(new double[Freq_datalen], LAMPScatterS1BdelArrPtr);
std::shared_ptr<double> RCSData(new double[Freq_datalen], LAMPScatterS1BdelArrPtr);
double Azvalue = az_data[Azid];
double Incvalue = inc_data[Azid];
for (long freqID = 0; freqID < Freq_datalen; freqID++) { // Freq
freqs.get()[freqID] = freq_data[freqID];
RCSData.get()[freqID] = rcs_data[PolId * Az_datalen * Inc_datalen * Freq_datalen +
Azid * Inc_datalen * Freq_datalen +
Incid * Freq_datalen +
freqID
];
}
std::shared_ptr<LAMPScatterS1BRCSDataNode> node(new LAMPScatterS1BRCSDataNode(polname, Azvalue, Incvalue, freqs, RCSData, Freq_datalen));
nodes.push_back(node);
}
}
std::shared_ptr< LAMPScatterS1BPolarKdTree> treetemp(new LAMPScatterS1BPolarKdTree(nodes));
polarRCSTree.insert(polname, treetemp); // KDTree
}
this->FreqPointNumber= Freq_datalen;
this->polNumber= Pol_datalen;
this->AzNumber = Az_datalen;
this->IncNumber = Inc_datalen;
std::vector<float>().swap(pol_data);
std::vector<float>().swap(inc_data);
std::vector<float>().swap(az_data);
std::vector<float>().swap(freq_data);
std::vector<double>().swap(rcs_data);
std::vector<int>().swap(Freqdimids);
std::vector<int>().swap(Poldimids);
std::vector<int>().swap(Azdimids);
std::vector<int>().swap(Incdimids);
std::vector<int>().swap(RCSdimids);
std::vector<int>().swap(Freqdimsize);
std::vector<int>().swap(Poldimsizes);
std::vector<int>().swap(Azdimsize);
std::vector<int>().swap(Incdimsize);
std::vector<int>().swap(RCSdimsize);
return 0;
}
std::complex<double> LAMPScatterS1BDataset::getRCSData(QString polarName, double AzAngle, double IncAngle, double FreqId)
{
return std::complex<double>();
}
QMap<QString, QString> LAMPScatterS1BDataset::ReadPolAttribution(int ncid, int pol_varid)
{
int num_atts;
if (nc_inq_varnatts(ncid, pol_varid, &num_atts)) {
return QMap<QString, QString>();
}
if (num_atts == 0) {
return QMap<QString, QString>();
}
else {
QMap<QString, QString> result;
qDebug() << "Attributes for Pol:" ;
for (int i = 0; i < num_atts; ++i) {
char att_name[NC_MAX_NAME + 1];
if (nc_inq_attname(ncid, pol_varid, i, att_name)) {
qDebug() << "Error getting attribute name";
}
// 获取属性类型和长度
nc_type xtype;
size_t len;
if (nc_inq_att(ncid, pol_varid, att_name, &xtype, &len)) {
qDebug() << "Error getting attribute type and length";
}
// 根据属性类型读取属性值
switch (xtype) {
case NC_CHAR: {
std::vector<char> att_value(len + 1); // +1 for null terminator
if (nc_get_att_text(ncid, pol_varid, att_name, att_value.data())) {
qDebug() << "Error reading text attribute";
}
qDebug() << "Attribute Name: " << att_name << ", Type: NC_CHAR, Value: " << att_value.data();
result.insert(QString(att_name), QString(att_value.data()));
break;
}
default:
std::cout << "Attribute Name: " << att_name << ", Type: Unknown" << std::endl;
break;
}
}
return result;
}
}

View File

@ -0,0 +1,90 @@
#pragma once
#ifndef _LAMPSCATTERS1B_H_
#define _LAMPSCATTERS1B_H_
#include <stdlib.h>
#include <QString>
#include <netcdf.h>
#include <complex>
#include <memory>
#include <Qset>
#include <QMap>
#include <flann/flann.hpp>
#include <memory>
#include <vector>
inline void LAMPScatterS1BdelArrPtr(void* p)
{
delete[] p;
p = nullptr;
}
class LAMPScatterS1BRCSDataNode {
public:
LAMPScatterS1BRCSDataNode(QString PolarName, double AzAngle, double IncAngle,std::shared_ptr<double> freqs, std::shared_ptr<double> RCSPoints,long freqnumber);
~LAMPScatterS1BRCSDataNode();
public:
long getFreqPointNumber();
std::shared_ptr<double> getFreqPoints();
std::shared_ptr<double> getRCSPoints();
QString getPolarName();
double getAzAngle();
double getIncAngle();
private:
double AzAngle;
double IncAngle;
long FreqPointNumber;
std::shared_ptr<double> FreqPoints;
std::shared_ptr<double> RCSPoints;
QString PolarName;
};
class LAMPScatterS1BPolarKdTree {// 这里使用 kdTree作为 检索索引,不需要考虑调整的
public:
LAMPScatterS1BPolarKdTree(std::vector<std::shared_ptr< LAMPScatterS1BRCSDataNode >> inDatalist);
~LAMPScatterS1BPolarKdTree();
public:
QVector<std::shared_ptr< LAMPScatterS1BRCSDataNode >> search(double sAzAngle, double sIncAngle,long sPointNumber);
private: //kdtree
std::vector<std::vector<double>> dataset;
std::shared_ptr < flann::Matrix<double>> KdtreeFlannDatasetPtr;
std::shared_ptr < flann::Index<flann::L2<double>>> kdtreeIndexPtr;
private:
std::vector<std::shared_ptr< LAMPScatterS1BRCSDataNode >> datalist; //所有节点
};
class LAMPScatterS1BDataset
{
public:
int OpenFile(QString s1bfilepath);
public:
std::complex<double> getRCSData(QString polarName, double AzAngle, double IncAngle, double FreqId);
private:
long FreqPointNumber;
long polNumber;
long AzNumber;
long IncNumber;
QMap<QString,std::shared_ptr<LAMPScatterS1BPolarKdTree>> polarRCSTree;
private:
QMap<QString,QString> ReadPolAttribution(int ncid, int polvarid);
};
#endif

10
QSimulationRFPCGUI.cpp Normal file
View File

@ -0,0 +1,10 @@
#include "QSimulationRFPCGUI.h"
QSimulationRFPCGUI::QSimulationRFPCGUI(QWidget *parent)
: QDialog(parent)
{
ui.setupUi(this);
}
QSimulationRFPCGUI::~QSimulationRFPCGUI()
{}

16
QSimulationRFPCGUI.h Normal file
View File

@ -0,0 +1,16 @@
#pragma once
#include <QDialog>
#include "ui_QSimulationRFPCGUI.h"
class QSimulationRFPCGUI : public QDialog
{
Q_OBJECT
public:
QSimulationRFPCGUI(QWidget *parent = nullptr);
~QSimulationRFPCGUI();
private:
Ui::QSimulationRFPCGUIClass ui;
};

View File

@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>QSimulationRTPCGUIClass</class>
<widget class="QDialog" name="QSimulationRTPCGUIClass">
<class>QSimulationRFPCGUIClass</class>
<widget class="QDialog" name="QSimulationRFPCGUIClass">
<property name="geometry">
<rect>
<x>0</x>
@ -11,7 +11,7 @@
</rect>
</property>
<property name="windowTitle">
<string>RTPC回波仿真</string>
<string>RFPC回波仿真</string>
</property>
</widget>
<layoutdefault spacing="6" margin="11"/>

View File

@ -1,10 +0,0 @@
#include "QSimulationRTPCGUI.h"
QSimulationRTPCGUI::QSimulationRTPCGUI(QWidget *parent)
: QDialog(parent)
{
ui.setupUi(this);
}
QSimulationRTPCGUI::~QSimulationRTPCGUI()
{}

View File

@ -1,16 +0,0 @@
#pragma once
#include <QDialog>
#include "ui_QSimulationRTPCGUI.h"
class QSimulationRTPCGUI : public QDialog
{
Q_OBJECT
public:
QSimulationRTPCGUI(QWidget *parent = nullptr);
~QSimulationRTPCGUI();
private:
Ui::QSimulationRTPCGUIClass ui;
};

View File

@ -78,14 +78,14 @@
<string>orthinterpRaster</string>
</property>
</action>
<action name="actionSARRTPC">
<action name="actionSARRFPC">
<property name="text">
<string>SARRTPC</string>
<string>SARRFPC</string>
</property>
</action>
<action name="actionSimuSARRTPC">
<action name="actionSimuSARRFPC">
<property name="text">
<string>SimuSARRTPC</string>
<string>SimuSARRFPC</string>
</property>
</action>
<action name="actionSimuBPImage">

View File

@ -68,7 +68,7 @@
<IncludePath>.\SimulationSAR;.\GF3ProcessToolbox;.\BaseTool;$(IncludePath)</IncludePath>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x64'">
<IncludePath>.\GPUTool;.\SimulationSAR;.\GF3ProcessToolbox;.\BaseTool;$(oneMKLIncludeDir);$(IncludePath)</IncludePath>
<IncludePath>.\LAMPScatterTool;.\GPUTool;.\SimulationSAR;.\GF3ProcessToolbox;.\BaseTool;$(oneMKLIncludeDir);$(IncludePath)</IncludePath>
</PropertyGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<ClCompile>
@ -128,17 +128,18 @@
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|x64'">Create</PrecompiledHeader>
</ClCompile>
<ClCompile Include="GF3ProcessToolbox\QOrthSlrRaster.cpp" />
<ClCompile Include="QSimulationRTPCGUI.cpp" />
<ClCompile Include="LAMPScatterTool\LAMPScatterS1B.cpp" />
<ClCompile Include="QSimulationRFPCGUI.cpp" />
<ClCompile Include="RegisterToolbox.cpp">
<DynamicSource Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">input</DynamicSource>
<QtMocFileName Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(Filename).moc</QtMocFileName>
<DynamicSource Condition="'$(Configuration)|$(Platform)'=='Release|x64'">input</DynamicSource>
<QtMocFileName Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(Filename).moc</QtMocFileName>
</ClCompile>
<ClCompile Include="SimulationSAR\QImageSARRTPC.cpp" />
<ClCompile Include="SimulationSAR\QImageSARRFPC.cpp" />
<ClCompile Include="SimulationSAR\QSimulationBPImage.cpp" />
<ClCompile Include="SimulationSAR\QToolAbstract.cpp" />
<ClCompile Include="SimulationSAR\RTPCProcessCls.cpp" />
<ClCompile Include="SimulationSAR\RFPCProcessCls.cpp" />
<ClCompile Include="SimulationSAR\SARSatelliteSimulationAbstractCls.cpp" />
<ClCompile Include="SimulationSAR\SARSimulationTaskSetting.cpp" />
<ClCompile Include="SimulationSAR\SatelliteOribtModel.cpp" />
@ -154,7 +155,7 @@
<QtUic Include="Imageshow\ImageShowDialogClass.ui" />
<QtUic Include="Imageshow\qcustomplot.ui" />
<QtUic Include="QMergeRasterProcessDialog.ui" />
<QtUic Include="QSimulationRTPCGUI.ui" />
<QtUic Include="QSimulationRFPCGUI.ui" />
<QtUic Include="RasterProcessTool.ui" />
<QtMoc Include="RasterProcessTool.h" />
<ClCompile Include="GF3ProcessToolbox\GF3CalibrationAndGeocodingClass.cpp" />
@ -171,11 +172,11 @@
<ClCompile Include="QMergeRasterProcessDialog.cpp" />
<ClCompile Include="RasterProcessTool.cpp" />
<ClCompile Include="main.cpp" />
<QtUic Include="SimulationSAR\QImageSARRTPC.ui" />
<QtUic Include="SimulationSAR\QImageSARRFPC.ui" />
<QtUic Include="SimulationSAR\QSimulationBPImage.ui" />
</ItemGroup>
<ItemGroup>
<QtMoc Include="SimulationSAR\QImageSARRTPC.h" />
<QtMoc Include="SimulationSAR\QImageSARRFPC.h" />
<QtMoc Include="SimulationSAR\QToolAbstract.h" />
<QtMoc Include="RegisterToolbox.h" />
<QtMoc Include="SimulationSAR\QSimulationBPImage.h" />
@ -190,13 +191,14 @@
<ClInclude Include="BaseTool\RasterToolBase.h" />
<ClInclude Include="BaseTool\SARSimulationImageL1.h" />
<ClInclude Include="BaseTool\stdafx.h" />
<ClInclude Include="GPUTool\GPURTPC.cuh" />
<ClInclude Include="GPUTool\GPURFPC.cuh" />
<ClInclude Include="GPUTool\GPUTBPImage.cuh" />
<ClInclude Include="GPUTool\GPUTool.cuh" />
<ClInclude Include="LAMPScatterTool\LAMPScatterS1B.h" />
<ClInclude Include="SimulationSAR\TBPImageAlgCls.h" />
<QtMoc Include="QSimulationRTPCGUI.h" />
<QtMoc Include="QSimulationRFPCGUI.h" />
<QtMoc Include="GF3ProcessToolbox\QOrthSlrRaster.h" />
<ClInclude Include="SimulationSAR\RTPCProcessCls.h" />
<ClInclude Include="SimulationSAR\RFPCProcessCls.h" />
<ClInclude Include="SimulationSAR\SARSatelliteSimulationAbstractCls.h" />
<ClInclude Include="SimulationSAR\SARSimulationTaskSetting.h" />
<ClInclude Include="SimulationSAR\SatelliteOribtModel.h" />
@ -218,7 +220,7 @@
<None Include="cpp.hint" />
</ItemGroup>
<ItemGroup>
<CudaCompile Include="GPUTool\GPURTPC.cu">
<CudaCompile Include="GPUTool\GPURFPC.cu">
<GenerateRelocatableDeviceCode Condition="'$(Configuration)|$(Platform)'=='Release|x64'">true</GenerateRelocatableDeviceCode>
</CudaCompile>
<CudaCompile Include="GPUTool\GPUTBPImage.cu">

View File

@ -36,6 +36,9 @@
<Filter Include="GPUTool">
<UniqueIdentifier>{c39dcd9f-dfd6-4d94-8912-7a3f5f719385}</UniqueIdentifier>
</Filter>
<Filter Include="LAMPScatter">
<UniqueIdentifier>{cc849de4-c841-40e3-96bc-54ebe034fa4a}</UniqueIdentifier>
</Filter>
</ItemGroup>
<ItemGroup>
<QtRcc Include="RasterProcessTool.qrc">
@ -94,7 +97,7 @@
<ClCompile Include="GF3ProcessToolbox\QRDOrthProcessClass.cpp">
<Filter>GF3ProcessToolbox</Filter>
</ClCompile>
<ClCompile Include="SimulationSAR\RTPCProcessCls.cpp">
<ClCompile Include="SimulationSAR\RFPCProcessCls.cpp">
<Filter>SimulationSAR</Filter>
</ClCompile>
<ClCompile Include="SimulationSAR\SARSatelliteSimulationAbstractCls.cpp">
@ -109,7 +112,7 @@
<ClCompile Include="SimulationSAR\SigmaDatabase.cpp">
<Filter>SimulationSAR</Filter>
</ClCompile>
<ClCompile Include="QSimulationRTPCGUI.cpp">
<ClCompile Include="QSimulationRFPCGUI.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="GF3ProcessToolbox\QOrthSlrRaster.cpp">
@ -124,7 +127,7 @@
<ClCompile Include="RegisterToolbox.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="SimulationSAR\QImageSARRTPC.cpp">
<ClCompile Include="SimulationSAR\QImageSARRFPC.cpp">
<Filter>SimulationSAR</Filter>
</ClCompile>
<ClCompile Include="SimulationSAR\QSimulationBPImage.cpp">
@ -160,6 +163,9 @@
<ClCompile Include="BaseTool\stdafx.cpp">
<Filter>BaseTool</Filter>
</ClCompile>
<ClCompile Include="LAMPScatterTool\LAMPScatterS1B.cpp">
<Filter>LAMPScatter</Filter>
</ClCompile>
</ItemGroup>
<ItemGroup>
<ClInclude Include="GF3ProcessToolbox\GF3CalibrationAndGeocodingClass.h">
@ -180,7 +186,7 @@
<ClInclude Include="GF3ProcessToolbox\WGS84_J2000.h">
<Filter>GF3ProcessToolbox</Filter>
</ClInclude>
<ClInclude Include="SimulationSAR\RTPCProcessCls.h">
<ClInclude Include="SimulationSAR\RFPCProcessCls.h">
<Filter>SimulationSAR</Filter>
</ClInclude>
<ClInclude Include="SimulationSAR\SARSatelliteSimulationAbstractCls.h">
@ -231,12 +237,15 @@
<ClInclude Include="GPUTool\GPUTool.cuh">
<Filter>GPUTool</Filter>
</ClInclude>
<ClInclude Include="GPUTool\GPURTPC.cuh">
<ClInclude Include="GPUTool\GPURFPC.cuh">
<Filter>GPUTool</Filter>
</ClInclude>
<ClInclude Include="GPUTool\GPUTBPImage.cuh">
<Filter>GPUTool</Filter>
</ClInclude>
<ClInclude Include="LAMPScatterTool\LAMPScatterS1B.h">
<Filter>LAMPScatter</Filter>
</ClInclude>
</ItemGroup>
<ItemGroup>
<QtMoc Include="QMergeRasterProcessDialog.h">
@ -257,7 +266,7 @@
<QtMoc Include="GF3ProcessToolbox\QRDOrthProcessClass.h">
<Filter>GF3ProcessToolbox</Filter>
</QtMoc>
<QtMoc Include="QSimulationRTPCGUI.h">
<QtMoc Include="QSimulationRFPCGUI.h">
<Filter>Header Files</Filter>
</QtMoc>
<QtMoc Include="GF3ProcessToolbox\QOrthSlrRaster.h">
@ -272,7 +281,7 @@
<QtMoc Include="RegisterToolbox.h">
<Filter>Header Files</Filter>
</QtMoc>
<QtMoc Include="SimulationSAR\QImageSARRTPC.h">
<QtMoc Include="SimulationSAR\QImageSARRFPC.h">
<Filter>SimulationSAR</Filter>
</QtMoc>
<QtMoc Include="SimulationSAR\QSimulationBPImage.h">
@ -298,13 +307,13 @@
<QtUic Include="GF3ProcessToolbox\QRDOrthProcessClass.ui">
<Filter>GF3ProcessToolbox</Filter>
</QtUic>
<QtUic Include="QSimulationRTPCGUI.ui">
<QtUic Include="QSimulationRFPCGUI.ui">
<Filter>Form Files</Filter>
</QtUic>
<QtUic Include="GF3ProcessToolbox\QOrthSlrRaster.ui">
<Filter>GF3ProcessToolbox</Filter>
</QtUic>
<QtUic Include="SimulationSAR\QImageSARRTPC.ui">
<QtUic Include="SimulationSAR\QImageSARRFPC.ui">
<Filter>SimulationSAR</Filter>
</QtUic>
<QtUic Include="SimulationSAR\QSimulationBPImage.ui">
@ -315,7 +324,7 @@
</QtUic>
</ItemGroup>
<ItemGroup>
<CudaCompile Include="GPUTool\GPURTPC.cu">
<CudaCompile Include="GPUTool\GPURFPC.cu">
<Filter>GPUTool</Filter>
</CudaCompile>
<CudaCompile Include="GPUTool\GPUTBPImage.cu">

View File

@ -5,7 +5,7 @@
#include "QComplex2AmpPhase.h"
#include "QRDOrthProcessClass.h"
#include "QOrthSlrRaster.h"
#include "QImageSARRTPC.h"
#include "QImageSARRFPC.h"
#include "QSimulationBPImage.h"
GF3ImportDataToolButton::GF3ImportDataToolButton(QWidget* parent) :QToolAbstract(parent)
@ -94,21 +94,21 @@ void MergeRasterProcessToolButton::excute()
dialog->show();
}
SARSimlulationRTPCToolButton::SARSimlulationRTPCToolButton(QWidget* parent) :QToolAbstract(parent)
SARSimlulationRFPCToolButton::SARSimlulationRFPCToolButton(QWidget* parent) :QToolAbstract(parent)
{
this->toolPath = QVector<QString>(0);
this->toolPath.push_back(u8"·ÂÕæ¹¤¾ß¿â");
this->toolname = QString(u8"RTPC");
this->toolname = QString(u8"RFPC");
}
SARSimlulationRTPCToolButton::~SARSimlulationRTPCToolButton()
SARSimlulationRFPCToolButton::~SARSimlulationRFPCToolButton()
{
}
void SARSimlulationRTPCToolButton::excute()
void SARSimlulationRFPCToolButton::excute()
{
QImageSARRTPC* dialog = new QImageSARRTPC();
QImageSARRFPC* dialog = new QImageSARRFPC();
dialog->show();
}
@ -136,7 +136,7 @@ void RegisterPreToolBox(RasterProcessTool* mainWindows)
QRDOrthProcessClassToolButton* items3 = new QRDOrthProcessClassToolButton(nullptr);
QOrthSlrRasterToolButton* items4 = new QOrthSlrRasterToolButton(nullptr);
MergeRasterProcessToolButton* items5 = new MergeRasterProcessToolButton(nullptr);
SARSimlulationRTPCToolButton* items6 = new SARSimlulationRTPCToolButton(nullptr);
SARSimlulationRFPCToolButton* items6 = new SARSimlulationRFPCToolButton(nullptr);
SARSimulationTBPImageToolButton* items7 = new SARSimulationTBPImageToolButton(nullptr);
emit mainWindows->addBoxToolItemSIGNAL(items1);

View File

@ -55,11 +55,11 @@ public slots:
};
class SARSimlulationRTPCToolButton : public QToolAbstract {
class SARSimlulationRFPCToolButton : public QToolAbstract {
Q_OBJECT
public:
SARSimlulationRTPCToolButton( QWidget* parent = nullptr);
~SARSimlulationRTPCToolButton();
SARSimlulationRFPCToolButton( QWidget* parent = nullptr);
~SARSimlulationRFPCToolButton();
public slots:
virtual void excute() override;

View File

@ -1,11 +1,11 @@
#include "QImageSARRTPC.h"
#include "QImageSARRFPC.h"
#include <QFileDialog>
#include <QMessageBox>
#include "RTPCProcessCls.h"
#include "RFPCProcessCls.h"
#include <boost/thread.hpp>
#include <thread>
QImageSARRTPC::QImageSARRTPC(QWidget *parent)
QImageSARRFPC::QImageSARRFPC(QWidget *parent)
: QDialog(parent)
{
ui.setupUi(this);
@ -30,10 +30,10 @@ QImageSARRTPC::QImageSARRTPC(QWidget *parent)
}
QImageSARRTPC::~QImageSARRTPC()
QImageSARRFPC::~QImageSARRFPC()
{}
void QImageSARRTPC::onpushButtonRPClieck()
void QImageSARRFPC::onpushButtonRPClieck()
{
// 调用文件选择对话框并选择一个 .tif 文件
QString fileName = QFileDialog::getSaveFileName(this,
@ -49,7 +49,7 @@ void QImageSARRTPC::onpushButtonRPClieck()
}
}
void QImageSARRTPC::onpushButtonTPClieck()
void QImageSARRFPC::onpushButtonTPClieck()
{
// 调用文件选择对话框并选择一个 .tif 文件
QString fileName = QFileDialog::getSaveFileName(this,
@ -65,7 +65,7 @@ void QImageSARRTPC::onpushButtonTPClieck()
}
}
void QImageSARRTPC::onpushButtonEchoClieck()
void QImageSARRFPC::onpushButtonEchoClieck()
{
// 调用文件选择对话框并选择一个 .tif 文件
QString fileName = QFileDialog::getExistingDirectory(this, u8"选择回波存放路径", "");
@ -79,7 +79,7 @@ void QImageSARRTPC::onpushButtonEchoClieck()
}
void QImageSARRTPC::onpushButtongpxmlClieck()
void QImageSARRFPC::onpushButtongpxmlClieck()
{
// 调用文件选择对话框并选择一个 .tif 文件
QString fileName = QFileDialog::getSaveFileName(this,
@ -95,7 +95,7 @@ void QImageSARRTPC::onpushButtongpxmlClieck()
}
}
void QImageSARRTPC::onpushButtonTaskxmlClieck()
void QImageSARRFPC::onpushButtonTaskxmlClieck()
{
// 调用文件选择对话框并选择一个 .tif 文件
QString fileName = QFileDialog::getSaveFileName(this,
@ -111,7 +111,7 @@ void QImageSARRTPC::onpushButtonTaskxmlClieck()
}
}
void QImageSARRTPC::onpushButtondemClieck()
void QImageSARRFPC::onpushButtondemClieck()
{
// 调用文件选择对话框并选择一个 .tif 文件
QString fileName = QFileDialog::getSaveFileName(this,
@ -127,7 +127,7 @@ void QImageSARRTPC::onpushButtondemClieck()
}
}
void QImageSARRTPC::onpushButtonlandcoverClieck()
void QImageSARRFPC::onpushButtonlandcoverClieck()
{
// 调用文件选择对话框并选择一个 .tif 文件
QString fileName = QFileDialog::getSaveFileName(this,
@ -143,7 +143,7 @@ void QImageSARRTPC::onpushButtonlandcoverClieck()
}
}
void QImageSARRTPC::onpushButtonHHSigma0Clieck()
void QImageSARRFPC::onpushButtonHHSigma0Clieck()
{
// 调用文件选择对话框并选择一个 .tif 文件
QString fileName = QFileDialog::getSaveFileName(this,
@ -159,7 +159,7 @@ void QImageSARRTPC::onpushButtonHHSigma0Clieck()
}
}
void QImageSARRTPC::onpushButtonHVSigma0Clieck()
void QImageSARRFPC::onpushButtonHVSigma0Clieck()
{
// 调用文件选择对话框并选择一个 .tif 文件
QString fileName = QFileDialog::getSaveFileName(this,
@ -175,7 +175,7 @@ void QImageSARRTPC::onpushButtonHVSigma0Clieck()
}
}
void QImageSARRTPC::onpushButtonVHSigma0Clieck()
void QImageSARRFPC::onpushButtonVHSigma0Clieck()
{
// 调用文件选择对话框并选择一个 .tif 文件
QString fileName = QFileDialog::getSaveFileName(this,
@ -191,7 +191,7 @@ void QImageSARRTPC::onpushButtonVHSigma0Clieck()
}
}
void QImageSARRTPC::onpushButtonVVSigma0Clieck()
void QImageSARRFPC::onpushButtonVVSigma0Clieck()
{
// 调用文件选择对话框并选择一个 .tif 文件
QString fileName = QFileDialog::getSaveFileName(this,
@ -207,7 +207,7 @@ void QImageSARRTPC::onpushButtonVVSigma0Clieck()
}
}
void QImageSARRTPC::onBtnaccept()
void QImageSARRFPC::onBtnaccept()
{
@ -242,11 +242,11 @@ void QImageSARRTPC::onBtnaccept()
long cpucore_num = std::thread::hardware_concurrency();
RTPCProcessMain(cpucore_num, TransAntPatternFilePath, ReceiveAntPatternFilePath, simulationtaskName, OutEchoPath, GPSXmlPath, TaskXmlPath, demTiffPath, landConverPath, HHSigmaPath, HVSigmaPath, VHSigmaPath, VVSigmaPath);
RFPCProcessMain(cpucore_num, TransAntPatternFilePath, ReceiveAntPatternFilePath, simulationtaskName, OutEchoPath, GPSXmlPath, TaskXmlPath, demTiffPath, landConverPath, HHSigmaPath, HVSigmaPath, VHSigmaPath, VVSigmaPath);
}
void QImageSARRTPC::onBtnReject()
void QImageSARRFPC::onBtnReject()
{
this->close();
}

View File

@ -1,15 +1,15 @@
#pragma once
#include <QMainWindow>
#include "ui_QImageSARRTPC.h"
#include "ui_QImageSARRFPC.h"
class QImageSARRTPC : public QDialog
class QImageSARRFPC : public QDialog
{
Q_OBJECT
public:
QImageSARRTPC(QWidget *parent = nullptr);
~QImageSARRTPC();
QImageSARRFPC(QWidget *parent = nullptr);
~QImageSARRFPC();
public slots:
@ -30,5 +30,5 @@ public slots:
void onBtnReject();
private:
Ui::QImageSARRTPCClass ui;
Ui::QImageSARRFPCClass ui;
};

View File

@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>QImageSARRTPCClass</class>
<widget class="QDialog" name="QImageSARRTPCClass">
<class>QImageSARRFPCClass</class>
<widget class="QDialog" name="QImageSARRFPCClass">
<property name="geometry">
<rect>
<x>0</x>
@ -11,7 +11,7 @@
</rect>
</property>
<property name="windowTitle">
<string>RTPC回波仿真</string>
<string>RFPC回波仿真</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<item>

View File

@ -1,6 +1,6 @@
#include "stdafx.h"
#include "RTPCProcessCls.h"
#include "RFPCProcessCls.h"
#include "BaseConstVariable.h"
#include "SARSatelliteSimulationAbstractCls.h"
#include "SARSimulationTaskSetting.h"
@ -21,7 +21,7 @@
#ifdef __CUDANVCC___
#include "GPUTool.cuh"
#include "GPURTPC.cuh"
#include "GPURFPC.cuh"
#endif // __CUDANVCC___
#include <Imageshow/ImageShowDialogClass.h>
@ -31,7 +31,7 @@
RTPCProcessCls::RTPCProcessCls()
RFPCProcessCls::RFPCProcessCls()
{
this->PluseCount = 0;
this->PlusePoint = 0;
@ -57,67 +57,67 @@ RTPCProcessCls::RTPCProcessCls()
}
RTPCProcessCls::~RTPCProcessCls()
RFPCProcessCls::~RFPCProcessCls()
{
}
void RTPCProcessCls::setTaskSetting(std::shared_ptr < AbstractSARSatelliteModel> TaskSetting)
void RFPCProcessCls::setTaskSetting(std::shared_ptr < AbstractSARSatelliteModel> TaskSetting)
{
this->TaskSetting = std::shared_ptr < AbstractSARSatelliteModel>(TaskSetting);
qDebug() << "RTPCProcessCls::setTaskSetting";
qDebug() << "RFPCProcessCls::setTaskSetting";
}
void RTPCProcessCls::setEchoSimulationDataSetting(std::shared_ptr<EchoL0Dataset> EchoSimulationData)
void RFPCProcessCls::setEchoSimulationDataSetting(std::shared_ptr<EchoL0Dataset> EchoSimulationData)
{
this->EchoSimulationData = std::shared_ptr<EchoL0Dataset>(EchoSimulationData);
qDebug() << "RTPCProcessCls::setEchoSimulationDataSetting";
qDebug() << "RFPCProcessCls::setEchoSimulationDataSetting";
}
void RTPCProcessCls::setTaskFileName(QString EchoFileName)
void RFPCProcessCls::setTaskFileName(QString EchoFileName)
{
this->TaskFileName = EchoFileName;
}
void RTPCProcessCls::setDEMTiffPath(QString DEMTiffPath)
void RFPCProcessCls::setDEMTiffPath(QString DEMTiffPath)
{
this->DEMTiffPath = DEMTiffPath;
}
void RTPCProcessCls::setLandCoverPath(QString LandCoverPath)
void RFPCProcessCls::setLandCoverPath(QString LandCoverPath)
{
this->LandCoverPath = LandCoverPath;
}
void RTPCProcessCls::setHHSigmaPath(QString HHSigmaPath)
void RFPCProcessCls::setHHSigmaPath(QString HHSigmaPath)
{
this->HHSigmaPath = HHSigmaPath;
}
void RTPCProcessCls::setHVSigmaPath(QString HVSigmaPath)
void RFPCProcessCls::setHVSigmaPath(QString HVSigmaPath)
{
this->HVSigmaPath = HVSigmaPath;
}
void RTPCProcessCls::setVHSigmaPath(QString VHSigmaPath)
void RFPCProcessCls::setVHSigmaPath(QString VHSigmaPath)
{
this->VHSigmaPath = VHSigmaPath;
}
void RTPCProcessCls::setVVSigmaPath(QString VVSigmaPath)
void RFPCProcessCls::setVVSigmaPath(QString VVSigmaPath)
{
this->VVSigmaPath = VVSigmaPath;
}
void RTPCProcessCls::setOutEchoPath(QString OutEchoPath)
void RFPCProcessCls::setOutEchoPath(QString OutEchoPath)
{
this->OutEchoPath = OutEchoPath;
}
ErrorCode RTPCProcessCls::Process(long num_thread)
ErrorCode RFPCProcessCls::Process(long num_thread)
{
// RTPC 算法
// RFPC 算法
qDebug() << u8"params init ....";
ErrorCode stateCode = this->InitParams();
if (stateCode != ErrorCode::SUCCESS) {
@ -130,7 +130,7 @@ ErrorCode RTPCProcessCls::Process(long num_thread)
return stateCode;
}
else {}
qDebug() << "RTPCMainProcess";
qDebug() << "RFPCMainProcess";
stateCode = this->InitEchoMaskArray();
if (stateCode != ErrorCode::SUCCESS) {
@ -139,8 +139,10 @@ ErrorCode RTPCProcessCls::Process(long num_thread)
else {}
qDebug() << "InitEchoMaskArray";
//stateCode = this->RTPCMainProcess(num_thread);
stateCode = this->RTPCMainProcess_GPU( );
//stateCode = this->RFPCMainProcess(num_thread);
// 初始化回波
this->EchoSimulationData->initEchoArr(std::complex<float>(0, 0));
stateCode = this->RFPCMainProcess_GPU( );
if (stateCode != ErrorCode::SUCCESS) {
return stateCode;
@ -151,13 +153,13 @@ ErrorCode RTPCProcessCls::Process(long num_thread)
return ErrorCode::SUCCESS;
}
ErrorCode RTPCProcessCls::InitParams()
ErrorCode RFPCProcessCls::InitParams()
{
if (nullptr == this->TaskSetting || this->DEMTiffPath.isEmpty() ||
this->LandCoverPath.isEmpty() || this->HHSigmaPath.isEmpty() ||
this->HVSigmaPath.isEmpty() || this->VHSigmaPath.isEmpty() ||
this->VVSigmaPath.isEmpty()) {
return ErrorCode::RTPC_PARAMSISEMPTY;
return ErrorCode::RFPC_PARAMSISEMPTY;
}
else {
@ -180,6 +182,7 @@ ErrorCode RTPCProcessCls::InitParams()
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);
@ -192,7 +195,7 @@ ErrorCode RTPCProcessCls::InitParams()
return ErrorCode::SUCCESS;
}
ErrorCode RTPCProcessCls::DEMPreprocess()
ErrorCode RFPCProcessCls::DEMPreprocess()
{
this->demxyzPath = QDir(tmpfolderPath).filePath("demxyz.bin");
@ -307,7 +310,7 @@ ErrorCode RTPCProcessCls::DEMPreprocess()
return ErrorCode::SUCCESS;
}
ErrorCode RTPCProcessCls::InitEchoMaskArray()
ErrorCode RFPCProcessCls::InitEchoMaskArray()
{
QString name = this->EchoSimulationData->getSimulationTaskName();
this->OutEchoMaskPath = JoinPath(this->OutEchoPath, name + "_echomask.bin");
@ -336,11 +339,9 @@ ErrorCode RTPCProcessCls::InitEchoMaskArray()
}
ErrorCode RTPCProcessCls::RTPCMainProcess_GPU( )
ErrorCode RFPCProcessCls::RFPCMainProcess_GPU( )
{
double widthSpace = LIGHTSPEED / 2 / this->TaskSetting->getFs();
double prf_time = 0;
double dt = 1 / this->TaskSetting->getPRF();// 获取每次脉冲的时间间隔
bool antflag = true; // 计算天线方向图
@ -348,6 +349,12 @@ ErrorCode RTPCProcessCls::RTPCMainProcess_GPU( )
Point3 GERpoint{ 0,0,0 };
double R = 0;
double dem_row = 0, dem_col = 0, dem_alt = 0;
QVector<double> freqlist = this->TaskSetting->getFreqList();
float* freqpoints=(float*)mallocCUDAHost(sizeof(float)*freqlist.size());
for (long ii = 0; ii < freqlist.size(); ii++) {
freqpoints[ii] = freqlist[ii];
}
long double imageStarttime = 0;
imageStarttime = this->TaskSetting->getSARImageStartTime();
@ -373,11 +380,7 @@ ErrorCode RTPCProcessCls::RTPCMainProcess_GPU( )
std::shared_ptr<AbstractRadiationPattern> TransformPattern = this->TaskSetting->getTransformRadiationPattern(); // 发射天线方向图
std::shared_ptr<AbstractRadiationPattern> ReceivePattern = this->TaskSetting->getReceiveRadiationPattern(); // 接收天线方向图
long PlusePoint = this->EchoSimulationData->getPlusePoints();
// 初始化回波
this->EchoSimulationData->initEchoArr(std::complex<float>(0, 0));
POLARTYPEENUM polartype = this->TaskSetting->getPolarType();
gdalImage echoMaskImg(this->OutEchoMaskPath);
@ -385,7 +388,7 @@ ErrorCode RTPCProcessCls::RTPCMainProcess_GPU( )
QMessageBox::information(this, u8"程序提示", u8"请确定安装了CUDA库");
#else
// RTPC CUDA版本
// RFPC CUDA版本
if (pluseCount * 4 * 18 > Memory1MB * 100) {
long max = Memory1MB * 100 / 4 / 20 / PluseCount;
QMessageBox::warning(nullptr, u8"仿真场景太大了", u8"当前频点数下,脉冲数量最多为:" + QString::number(max));
@ -431,7 +434,6 @@ ErrorCode RTPCProcessCls::RTPCMainProcess_GPU( )
}
}
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++) {
@ -578,21 +580,6 @@ ErrorCode RTPCProcessCls::RTPCMainProcess_GPU( )
d_demsloper_z=(float* )mallocCUDADevice( sizeof(float) * blokline * tempDemCols);
d_demsloper_angle= (float*)mallocCUDADevice( sizeof(float) * blokline * tempDemCols);
float* h_dem_theta; // 天线方向图
float* h_dem_phi;
float* d_dem_theta;
float* d_dem_phi;
h_dem_theta=(float* )mallocCUDAHost( sizeof(float) * blokline * tempDemCols);
h_dem_phi= (float*)mallocCUDAHost(sizeof(float) * blokline * tempDemCols);
d_dem_theta= (float*)mallocCUDADevice( sizeof(float) * blokline * tempDemCols);// 9
d_dem_phi= (float*)mallocCUDADevice( sizeof(float) * blokline * tempDemCols);
HostToDevice((void*)h_dem_theta, (void*)d_dem_theta, sizeof(float) * blokline * tempDemCols);
HostToDevice((void*)h_dem_phi, (void*)d_dem_phi, sizeof(float) * blokline * tempDemCols);
// 提前声明参数变量
float* h_R;// 辐射方向
float* h_localangle;//入射角
@ -605,37 +592,9 @@ ErrorCode RTPCProcessCls::RTPCMainProcess_GPU( )
d_R= (float*)mallocCUDADevice(sizeof(float) * blokline * tempDemCols);
d_localangle= (float*)mallocCUDADevice( sizeof(float) * blokline * tempDemCols);
float* h_RstX;
float* h_RstY;
float* h_RstZ;
float* d_RstX;
float* d_RstY;
float* d_RstZ;
h_RstX=(float*)mallocCUDAHost( sizeof(float) * blokline * tempDemCols);
h_RstY=(float*)mallocCUDAHost( sizeof(float) * blokline * tempDemCols);
h_RstZ=(float*)mallocCUDAHost( sizeof(float) * blokline * tempDemCols); // 14
d_RstX=(float*)mallocCUDADevice( sizeof(float) * blokline * tempDemCols);
d_RstY=(float*)mallocCUDADevice( sizeof(float) * blokline * tempDemCols);
d_RstZ=(float*)mallocCUDADevice( sizeof(float) * blokline * tempDemCols);
float* h_sigma0;
float* h_TransAnt;
float* h_ReciveAnt;
float* d_sigma0;
float* d_TransAnt;
float* d_ReciveAnt;
h_sigma0= (float*)mallocCUDAHost( sizeof(float)* blokline* tempDemCols);
h_TransAnt = (float*)mallocCUDAHost(sizeof(float) * blokline * tempDemCols);
h_ReciveAnt = (float*)mallocCUDAHost(sizeof(float) * blokline * tempDemCols); // 17
d_sigma0= (float*)mallocCUDADevice( sizeof(float) * blokline * tempDemCols);
d_TransAnt= (float*)mallocCUDADevice( sizeof(float) * blokline * tempDemCols);
d_ReciveAnt= (float*)mallocCUDADevice( sizeof(float) * blokline * tempDemCols);
float* h_gain = (float*)mallocCUDAHost( sizeof(float)* blokline* tempDemCols);
float* d_gain = (float*)mallocCUDADevice( sizeof(float) * blokline * tempDemCols);
// 回波
cuComplex* h_echo;
@ -643,30 +602,11 @@ ErrorCode RTPCProcessCls::RTPCMainProcess_GPU( )
h_echo=(cuComplex*)mallocCUDAHost(sizeof(cuComplex) * blokline * tempDemCols);
d_echo=(cuComplex*)mallocCUDADevice( sizeof(cuComplex) * blokline * tempDemCols); //19
long* h_FreqID;
long* d_FreqID;
h_FreqID=(long*)mallocCUDAHost( sizeof(long) * blokline * tempDemCols);
d_FreqID=(long*)mallocCUDADevice( sizeof(long) * blokline * tempDemCols); //21
// 地表覆盖类型
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);
float* h_amp=(float*)mallocCUDAHost(sizeof(float) * blokline * tempDemCols);
float* d_amp=(float*)mallocCUDADevice(sizeof(float) * blokline * tempDemCols);
float* h_echoAmp = (float*)mallocCUDAHost(sizeof(float) * blokline * tempDemCols);
float* d_echoAmp = (float*)mallocCUDADevice(sizeof(float) * blokline * tempDemCols);
float* h_echoPhase = (float*)mallocCUDAHost(sizeof(float) * blokline * tempDemCols);
float* d_echoPhase = (float*)mallocCUDADevice(sizeof(float) * blokline * tempDemCols);
//float* h_R = (float*)mallocCUDAHost(sizeof(float) * blokline * tempDemCols);
//float* d_R = (float*)mallocCUDADevice(sizeof(float) * blokline * tempDemCols);
for (startline = 0; startline < demRow; startline = startline + blokline) {
long newblokline = blokline;
if ((startline + blokline) >= demRow) {
@ -691,23 +631,11 @@ ErrorCode RTPCProcessCls::RTPCMainProcess_GPU( )
FreeCUDAHost(h_demsloper_y); FreeCUDADevice(d_demsloper_y);
FreeCUDAHost(h_demsloper_z); FreeCUDADevice(d_demsloper_z); //6
FreeCUDAHost(h_demsloper_angle); FreeCUDADevice(d_demsloper_angle);//7
FreeCUDAHost(h_dem_theta); FreeCUDADevice(d_dem_theta);
FreeCUDAHost(h_dem_phi); FreeCUDADevice(d_dem_phi); //9
FreeCUDAHost(h_R); FreeCUDADevice(d_R);
FreeCUDAHost(h_localangle); FreeCUDADevice(d_localangle); //11
FreeCUDAHost(h_RstX); FreeCUDADevice(d_RstX);
FreeCUDAHost(h_RstY); FreeCUDADevice(d_RstY);
FreeCUDAHost(h_RstZ); FreeCUDADevice(d_RstZ); //14
FreeCUDAHost(h_sigma0); FreeCUDADevice(d_sigma0);
FreeCUDAHost(h_TransAnt); FreeCUDADevice(d_TransAnt);
FreeCUDAHost(h_ReciveAnt); FreeCUDADevice(d_ReciveAnt); //17
FreeCUDAHost(h_gain); FreeCUDADevice(d_gain);
FreeCUDAHost(h_echo); FreeCUDADevice(d_echo);//19
FreeCUDAHost(h_FreqID); FreeCUDADevice(d_FreqID);//20
FreeCUDAHost(h_demcls); FreeCUDADevice(d_demcls);
FreeCUDAHost(h_amp); FreeCUDADevice(d_amp);
FreeCUDAHost(h_echoAmp); FreeCUDADevice(d_echoAmp);
FreeCUDAHost(h_echoPhase); FreeCUDADevice(d_echoPhase);
h_dem_x = (float*)mallocCUDAHost(sizeof(float) * newblokline * tempDemCols);
h_dem_y = (float*)mallocCUDAHost(sizeof(float) * newblokline * tempDemCols);
@ -716,25 +644,12 @@ ErrorCode RTPCProcessCls::RTPCMainProcess_GPU( )
h_demsloper_y = (float*)mallocCUDAHost(sizeof(float) * newblokline * tempDemCols);
h_demsloper_z = (float*)mallocCUDAHost(sizeof(float) * newblokline * tempDemCols);
h_demsloper_angle = (float*)mallocCUDAHost(sizeof(float) * blokline * tempDemCols);
h_dem_theta = (float*)mallocCUDAHost(sizeof(float) * newblokline * tempDemCols);
h_dem_phi = (float*)mallocCUDAHost(sizeof(float) * newblokline * tempDemCols);
h_R = (float*)mallocCUDAHost(sizeof(float) * newblokline * tempDemCols);
h_localangle = (float*)mallocCUDAHost(sizeof(float) * newblokline * tempDemCols);
h_RstX = (float*)mallocCUDAHost(sizeof(float) * newblokline * tempDemCols);
h_RstY = (float*)mallocCUDAHost(sizeof(float) * newblokline * tempDemCols);
h_RstZ = (float*)mallocCUDAHost(sizeof(float) * newblokline * tempDemCols);
h_sigma0 = (float*)mallocCUDAHost(sizeof(float) * newblokline * tempDemCols);
h_TransAnt = (float*)mallocCUDAHost(sizeof(float) * newblokline * tempDemCols);
h_ReciveAnt = (float*)mallocCUDAHost(sizeof(float) * newblokline * tempDemCols);
h_gain = (float*)mallocCUDAHost(sizeof(float) * newblokline * tempDemCols);
h_echo = (cuComplex*)mallocCUDAHost(sizeof(cuComplex) * newblokline * tempDemCols);
h_FreqID = (long*)mallocCUDAHost(sizeof(long) * newblokline * tempDemCols);
h_demcls = (long*)mallocCUDAHost(sizeof(long) * newblokline * tempDemCols);
h_amp = (float*)mallocCUDAHost(sizeof(float) * newblokline * tempDemCols);
h_R = (float*)mallocCUDAHost(sizeof(float) * newblokline * tempDemCols);
h_echoAmp = (float*)mallocCUDAHost(sizeof(float) * newblokline * tempDemCols);
h_echoPhase = (float*)mallocCUDAHost(sizeof(float) * newblokline * tempDemCols);
d_dem_x=(float*)mallocCUDADevice(sizeof(float) * newblokline * tempDemCols);
d_dem_y=(float*)mallocCUDADevice(sizeof(float) * newblokline * tempDemCols);
@ -743,23 +658,12 @@ ErrorCode RTPCProcessCls::RTPCMainProcess_GPU( )
d_demsloper_y=(float*)mallocCUDADevice(sizeof(float) * newblokline * tempDemCols);
d_demsloper_z=(float*)mallocCUDADevice(sizeof(float) * newblokline * tempDemCols);//6
d_demsloper_angle=(float*)mallocCUDADevice(sizeof(float) * newblokline * tempDemCols);//7
d_dem_theta=(float*)mallocCUDADevice(sizeof(float) * newblokline * tempDemCols);
d_dem_phi=(float*)mallocCUDADevice(sizeof(float) * newblokline * tempDemCols);// 9
d_R=(float*)mallocCUDADevice(sizeof(float) * newblokline * tempDemCols);
d_localangle=(float*)mallocCUDADevice(sizeof(float) * newblokline * tempDemCols);
d_RstX=(float*)mallocCUDADevice(sizeof(float) * newblokline * tempDemCols);
d_RstY=(float*)mallocCUDADevice(sizeof(float) * newblokline * tempDemCols);
d_RstZ=(float*)mallocCUDADevice(sizeof(float) * newblokline * tempDemCols);
d_sigma0=(float*)mallocCUDADevice(sizeof(float) * newblokline * tempDemCols);
d_TransAnt=(float*)mallocCUDADevice(sizeof(float) * newblokline * tempDemCols);
d_ReciveAnt=(float*)mallocCUDADevice(sizeof(float) * newblokline * tempDemCols);
d_gain =(float*)mallocCUDADevice(sizeof(float) * newblokline * tempDemCols);
d_echo=(cuComplex*)mallocCUDADevice(sizeof(cuComplex) * newblokline * tempDemCols);
d_FreqID=(long*)mallocCUDADevice(sizeof(long) * newblokline * tempDemCols);
d_demcls = (long*)mallocCUDADevice(sizeof(long) * newblokline * tempDemCols);
d_amp = (float*)mallocCUDADevice(sizeof(float) * newblokline * tempDemCols);
d_R = (float*)mallocCUDADevice(sizeof(float) * newblokline * tempDemCols);
d_echoAmp = (float*)mallocCUDADevice(sizeof(float) * newblokline * tempDemCols);
d_echoPhase = (float*)mallocCUDADevice(sizeof(float) * newblokline * tempDemCols);
}
//# pragma omp parallel for
for (long i = 0; i < newblokline; i++) {
@ -772,9 +676,6 @@ ErrorCode RTPCProcessCls::RTPCMainProcess_GPU( )
h_demsloper_z[i * demxyz.width + j] = float(demsloper_z(i, j));
h_demsloper_angle[i * demxyz.width + j] = float(sloperAngle(i, j));
h_demcls[i * demxyz.width + j] = clamap[long(landcover(i, j))];
h_amp[i * demxyz.width + j] = 0.0f;
h_echoAmp[i * demxyz.width + j] = 0.0f;
h_echoPhase[i * demxyz.width + j] = 0.0f;
}
}
@ -785,12 +686,7 @@ ErrorCode RTPCProcessCls::RTPCMainProcess_GPU( )
HostToDevice((void*)h_demsloper_y, (void*)d_demsloper_y, sizeof(float) * newblokline * tempDemCols);
HostToDevice((void*)h_demsloper_z, (void*)d_demsloper_z, sizeof(float) * newblokline * tempDemCols);
HostToDevice((void*)h_demsloper_angle, (void*)d_demsloper_angle, sizeof(float) * newblokline * tempDemCols);
HostToDevice((void*)h_dem_theta, (void*)d_dem_theta, sizeof(float) * newblokline * tempDemCols);
HostToDevice((void*)h_dem_phi, (void*)d_dem_phi, sizeof(float) * newblokline* tempDemCols);
HostToDevice((void*)h_demcls, (void*)d_demcls, sizeof(long) * newblokline* tempDemCols);
HostToDevice((void*)h_amp, (void*)d_amp, sizeof(float) * newblokline* tempDemCols);
HostToDevice((void*)h_echoAmp, (void*)d_echoAmp, sizeof(float) * newblokline* tempDemCols);
HostToDevice((void*)h_echoPhase, (void*)d_echoPhase, sizeof(float) * newblokline* tempDemCols);
@ -805,13 +701,27 @@ ErrorCode RTPCProcessCls::RTPCMainProcess_GPU( )
long pixelcount = newblokline * tempDemCols;
long echoblockline = Memory1MB * 2000 / 8 / 2 / PlusePoint;
long echoblockline = Memory1MB / 8 / 2 / PlusePoint*2;
long startprfid = 0;
int grid_size = (pixelcount + BLOCK_SIZE - 1) / BLOCK_SIZE;
cuComplex* d_echosum_temp = (cuComplex*)mallocCUDADevice(sizeof(cuComplex) * grid_size);
for (startprfid = 0; startprfid < pluseCount; startprfid = startprfid + echoblockline) {
long templine = startprfid + echoblockline < PluseCount ? echoblockline : PluseCount - startprfid;
std::shared_ptr<std::complex<float>> echotemp = this->EchoSimulationData->getEchoArr(startprfid, templine);
Eigen::MatrixXd echoMasktemp = echoMaskImg.getData(startprfid,0, templine,echoMaskImg.width,1);
// 创建内存
cuComplex* h_echoData_tempblock = (cuComplex*)mallocCUDAHost(sizeof(cuComplex) * templine * PlusePoint);
cuComplex* d_echoData_tempblock = (cuComplex*)mallocCUDADevice(sizeof(cuComplex) * templine * PlusePoint);
for (long tempprfid = 0; tempprfid < templine; tempprfid++) {
for (long j = 0; j < PlusePoint; j++) {
h_echoData_tempblock[tempprfid * PlusePoint + j] = make_cuComplex(0, 0);
}
}
HostToDevice(h_echoData_tempblock, d_echoData_tempblock, sizeof(cuComplex) * templine * PlusePoint); // 回波复制
for (long tempprfid = 0; tempprfid < templine; tempprfid++) {
{// 计算
long prfid = tempprfid + startprfid;
@ -837,99 +747,43 @@ ErrorCode RTPCProcessCls::RTPCMainProcess_GPU( )
#ifdef __PRFDEBUG__
std::cout << "ant Position=[" << antpx << "," << antpy << "," << antpz << "]" << std::endl;
#endif // __PRFDEBUG__
// 计算距离、局地入射角、增益
CUDARFPC_Caluation_R_Gain(
antpx, antpy, antpz, // 天线的坐标
d_dem_x, d_dem_y, d_dem_z, pixelcount, // 地面坐标
d_demsloper_x, d_demsloper_y, d_demsloper_z, // 地表坡度矢量
CUDAmake_VectorA_B(antpx, antpy, antpz, d_dem_x, d_dem_y, d_dem_z, d_RstX, d_RstY, d_RstZ, pixelcount); // Rst = Rs - Rt; 地面-> 指向
CUDANorm_Vector(d_RstX, d_RstY, d_RstZ, d_R, pixelcount); // R
CUDAcosAngle_VA_AB(d_RstX, d_RstY, d_RstZ, d_demsloper_x, d_demsloper_y, d_demsloper_z, d_localangle, pixelcount); // 局部入射角 (线性)
SatelliteAntDirectNormal(d_RstX, d_RstY, d_RstZ,
antXaxisX, antXaxisY, antXaxisZ,
antYaxisX, antYaxisY, antYaxisZ,
antZaxisX, antZaxisY, antZaxisZ,
antdirectx, antdirecty, antdirectz,
d_dem_theta, d_dem_phi, pixelcount);// 计算角度
antXaxisX, antXaxisY, antXaxisZ, // 天线坐标系的X轴
antYaxisX, antYaxisY, antYaxisZ,// 天线坐标系的Y轴
antZaxisX, antZaxisY, antZaxisZ,// 天线坐标系的Z轴
antdirectx, antdirecty, antdirectz,// 天线的指向
#ifdef __PRFDEBUG__
d_TantPattern, TstartTheta, TstartPhi, Tdtheta, Tdphi, Tthetanum, Tphinum, // 发射天线方向图
d_RantPattern, RstartTheta, RstartPhi, Rdtheta, Rdphi, Rthetanum, Rphinum,//接收天线方向图
NearRange, FarRange,
d_R, // 输出距离
d_localangle, // 输出局地入射角
d_gain // 输出增益
);
// 计算某个具体回波
CUDA_Norm_Vector(d_RstX, d_RstY, d_RstZ, d_R, pixelcount);
DeviceToHost(h_RstX, d_RstX, sizeof(float)* pixelcount);
DeviceToHost(h_RstY, d_RstY, sizeof(float)* pixelcount);
DeviceToHost(h_RstZ, d_RstZ, sizeof(float)* pixelcount);
DeviceToHost(h_R, d_R, sizeof(float)* pixelcount);
testOutAmpArr(QString("h_RstX_%1.bin").arg(prfid), h_RstX, newblokline, tempDemCols);
testOutAmpArr(QString("h_RstY_%1.bin").arg(prfid), h_RstY, newblokline, tempDemCols);
testOutAmpArr(QString("h_RstZ_%1.bin").arg(prfid), h_RstZ, newblokline, tempDemCols);
testOutAmpArr(QString("h_R_%1.bin").arg(prfid), h_R, newblokline, tempDemCols);
#endif // __PRFDEBUG__
AntPatternInterpGain(d_dem_theta, d_dem_phi, d_TransAnt, d_TantPattern, TstartTheta, TstartPhi, Tdtheta, Tdphi, Tthetanum, Tphinum, pixelcount);
AntPatternInterpGain(d_dem_theta, d_dem_phi, d_ReciveAnt, d_RantPattern, RstartTheta, RstartPhi, Rdtheta, Rdphi, Rthetanum, Rphinum, pixelcount);
#ifdef __PRFDEBUG__
DeviceToHost(h_dem_theta, d_dem_theta, sizeof(float)* pixelcount); // 从GPU -> 主机
DeviceToHost(h_dem_phi, d_dem_phi, sizeof(float)* pixelcount);
DeviceToHost(h_localangle, d_localangle, sizeof(float)* pixelcount);
testOutAmpArr(QString("h_localangle_%1.bin").arg(prfid), h_localangle, newblokline, tempDemCols);
DeviceToHost(h_TransAnt, d_TransAnt, sizeof(float)* pixelcount);
DeviceToHost(h_ReciveAnt, d_ReciveAnt, sizeof(float)* pixelcount);
testOutAmpArr(QString("ant_theta_%1.bin").arg(prfid), h_dem_theta, newblokline, tempDemCols);
testOutAmpArr(QString("ant_phi_%1.bin").arg(prfid), h_dem_phi, newblokline, tempDemCols);
testOutAmpArr(QString("antPattern_Trans_%1.bin").arg(prfid), h_TransAnt, newblokline, tempDemCols);
testOutAmpArr(QString("antPattern_Receive_%1.bin").arg(prfid), h_ReciveAnt, newblokline, tempDemCols);
#endif // __PRFDEBUG__
// 插值后向散射系数
CUDAInterpSigma(d_demcls, d_amp, d_localangle, pixelcount, d_clsSigmaParam, clamapid);
// 计算强度
CUDACalculationEchoAmp(d_amp, d_TransAnt, d_ReciveAnt, d_R, Pt, d_echoAmp, pixelcount);
// 计算相位
CUDACalculationEchoPhase(d_R,lamda, d_echoPhase, pixelcount);
// 计算回波
CUDACombinationEchoAmpAndPhase(d_R, d_echoAmp, d_echoPhase,NearRange,Fs,PlusePoint,d_echo,d_FreqID,pixelcount);
#ifdef __PRFDEBUG__
DeviceToHost(h_amp, d_amp, sizeof(float) * pixelcount);
DeviceToHost(h_echoAmp, d_echoAmp, sizeof(float) * pixelcount);
DeviceToHost(h_echoPhase, d_echoPhase, sizeof(float) * pixelcount);
testOutAmpArr(QString("amp_%1.bin").arg(prfid), h_amp, newblokline, tempDemCols);
testOutAmpArr(QString("echoAmp_%1.bin").arg(prfid), h_echoAmp, newblokline, tempDemCols);
testOutAmpArr(QString("echoPhase_%1.bin").arg(prfid), h_echoPhase, newblokline, tempDemCols);
#endif // __PRFDEBUG__
DeviceToHost(h_echo, d_echo, sizeof(cuComplex) * pixelcount);
DeviceToHost(h_FreqID, d_FreqID, sizeof(long) * pixelcount);
//DeviceToHost(h_amp, d_amp, sizeof(float) * pixelcount);
#ifdef __PRFDEBUG__
float* h_echoAmp_real = (float*)mallocCUDAHost(sizeof(float) * pixelcount);
float* h_echoAmp_imag = (float*)mallocCUDAHost(sizeof(float) * pixelcount);
float* h_echoAmp_abs = (float*)mallocCUDAHost(sizeof(float) * pixelcount);
for (long freqi = 0; freqi < pixelcount; freqi++) {
h_echoAmp_real[freqi] = h_echoAmp[freqi].x;
h_echoAmp_imag[freqi] = h_echoAmp[freqi].y;
h_echoAmp_abs[freqi] =20*std::log10(std::abs(std::complex<double>(h_echoAmp_real[freqi], h_echoAmp_imag[freqi])));
for (long freqid = 0; freqid < freqlist.size(); freqid++) {
float freqpoint = freqlist[freqid];
CUDARFPC_Target_Freq_EchoData(d_R,
d_localangle,
d_gain,
d_demcls,
pixelcount,
Pt, freqpoint,
d_clsSigmaParam, clamapid,
d_echo);
// 数据求和
long tempechoid = tempprfid * PlusePoint + freqid;
CUDA_DemEchoSUM_NoMalloc(d_echo, pixelcount,
d_echosum_temp, grid_size,
d_echoData_tempblock, tempechoid
);
}
testOutAmpArr(QString("h_echoAmp_real_%1.bin").arg(prfid), h_echoAmp_real, newblokline, tempDemCols);
testOutAmpArr(QString("h_echoAmp_imag_%1.bin").arg(prfid), h_echoAmp_imag, newblokline, tempDemCols);
testOutAmpArr(QString("h_echoAmp_absdB_%1.bin").arg(prfid), h_echoAmp_abs, newblokline, tempDemCols);
testOutClsArr(QString("h_FreqID_%1.bin").arg(prfid), h_FreqID, newblokline, tempDemCols);
FreeCUDAHost(h_echoAmp_real);
FreeCUDAHost(h_echoAmp_imag);
#endif // __PRFDEBUG__
for (long freqi = 0; freqi < pixelcount; freqi++) {
long pluseid = h_FreqID[freqi];
echotemp.get()[tempprfid * PlusePoint + pluseid] =
echotemp.get()[tempprfid * PlusePoint + pluseid]
+ std::complex<float>(h_echo[freqi].x, h_echo[freqi].y);
echoMasktemp(tempprfid, pluseid)=echoMasktemp(tempprfid, pluseid) + 1;
}
if (prfid % 1000 == 0) {
std::cout << "[" << QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss.zzz").toStdString() << "] dem:\t" << startline << "\t-\t" << startline + newblokline << "\t:\t pluse :\t" << prfid << " / " << pluseCount << std::endl;
}
@ -944,11 +798,26 @@ ErrorCode RTPCProcessCls::RTPCMainProcess_GPU( )
}
}
DeviceToHost(h_echoData_tempblock, d_echoData_tempblock, sizeof(cuComplex) * templine * PlusePoint); // 回波复制
std::shared_ptr<std::complex<float>> echotemp = this->EchoSimulationData->getEchoArr(startprfid, templine);
for (long tempprfid = 0; tempprfid < templine; tempprfid++) {
for (long j = 0; j < PlusePoint; j++) {
echotemp.get()[tempprfid * PlusePoint + j] = echotemp.get()[tempprfid * PlusePoint + j]
+ std::complex<float>(h_echoData_tempblock[tempprfid * PlusePoint + j].x,
h_echoData_tempblock[tempprfid * PlusePoint + j].y);
}
}
echoMaskImg.saveImage(echoMasktemp, startprfid, 0, 1);
this->EchoSimulationData->saveEchoArr(echotemp, startprfid, templine);
}
FreeCUDADevice(d_echosum_temp);
}
std::cout << std::endl;
@ -964,24 +833,12 @@ ErrorCode RTPCProcessCls::RTPCMainProcess_GPU( )
FreeCUDAHost(h_demsloper_angle); FreeCUDADevice(d_demsloper_angle); //7
// 临时变量释放
FreeCUDAHost(h_dem_theta); FreeCUDADevice(d_dem_theta);
FreeCUDAHost(h_dem_phi); FreeCUDADevice(d_dem_phi);// 9
FreeCUDAHost(h_R); FreeCUDADevice(d_R);
FreeCUDAHost(h_localangle); FreeCUDADevice(d_localangle); //11
FreeCUDAHost(h_RstX); FreeCUDADevice(d_RstX);
FreeCUDAHost(h_RstY); FreeCUDADevice(d_RstY);
FreeCUDAHost(h_RstZ); FreeCUDADevice(d_RstZ); //14
FreeCUDAHost(h_sigma0); FreeCUDADevice(d_sigma0);
FreeCUDAHost(h_TransAnt); FreeCUDADevice(d_TransAnt);
FreeCUDAHost(h_ReciveAnt); FreeCUDADevice(d_ReciveAnt); //17
FreeCUDAHost(h_echoAmp); FreeCUDADevice(d_echoAmp);//19
FreeCUDAHost(h_FreqID); FreeCUDADevice(d_FreqID);//20
FreeCUDAHost(h_gain); FreeCUDADevice(d_gain);
FreeCUDAHost(h_demcls); FreeCUDADevice(d_demcls);
FreeCUDAHost(h_amp); FreeCUDADevice(d_amp);
FreeCUDAHost(freqpoints);
#endif
@ -989,7 +846,7 @@ ErrorCode RTPCProcessCls::RTPCMainProcess_GPU( )
return ErrorCode::SUCCESS;
}
std::shared_ptr<SatelliteOribtNode[]> RTPCProcessCls::getSatelliteOribtNodes(double prf_time, double dt, bool antflag, long double imageStarttime)
std::shared_ptr<SatelliteOribtNode[]> RFPCProcessCls::getSatelliteOribtNodes(double prf_time, double dt, bool antflag, long double imageStarttime)
{
@ -1049,7 +906,7 @@ std::shared_ptr<SatelliteOribtNode[]> RTPCProcessCls::getSatelliteOribtNodes(dou
}
void RTPCProcessMain(long num_thread, QString TansformPatternFilePath, QString ReceivePatternFilePath, QString simulationtaskName, QString OutEchoPath, QString GPSXmlPath, QString TaskXmlPath, QString demTiffPath, QString LandCoverPath, QString HHSigmaPath, QString HVSigmaPath, QString VHSigmaPath, QString VVSigmaPath)
void RFPCProcessMain(long num_thread, QString TansformPatternFilePath, QString ReceivePatternFilePath, QString simulationtaskName, QString OutEchoPath, QString GPSXmlPath, QString TaskXmlPath, QString demTiffPath, QString LandCoverPath, QString HHSigmaPath, QString HVSigmaPath, QString VHSigmaPath, QString VVSigmaPath)
{
std::shared_ptr < AbstractSARSatelliteModel> task = ReadSimulationSettingsXML(TaskXmlPath);
@ -1106,19 +963,19 @@ void RTPCProcessMain(long num_thread, QString TansformPatternFilePath, QString R
task->setSatelliteOribtModel(SatelliteOribtModel);
}
qDebug() << "-------------- RTPC init ---------------------------------------";
RTPCProcessCls rtpc;
rtpc.setTaskSetting(task); //qDebug() << "setTaskSetting";
rtpc.setTaskFileName(simulationtaskName); //qDebug() << "setTaskFileName";
rtpc.setDEMTiffPath(demTiffPath); //qDebug() << "setDEMTiffPath";
rtpc.setLandCoverPath(LandCoverPath); //qDebug() << "setLandCoverPath";
rtpc.setHHSigmaPath(HHSigmaPath); //qDebug() << "setHHSigmaPath";
rtpc.setHVSigmaPath(HVSigmaPath); //qDebug() << "setHVSigmaPath";
rtpc.setVHSigmaPath(VHSigmaPath); //qDebug() << "setVHSigmaPath";
rtpc.setVVSigmaPath(VVSigmaPath); //qDebug() << "setVVSigmaPath";
rtpc.setOutEchoPath(OutEchoPath); //qDebug() << "setOutEchoPath";
qDebug() << "-------------- RTPC start---------------------------------------";
rtpc.Process(num_thread); // 处理程序
qDebug() << "-------------- RTPC end---------------------------------------";
qDebug() << "-------------- RFPC init ---------------------------------------";
RFPCProcessCls RFPC;
RFPC.setTaskSetting(task); //qDebug() << "setTaskSetting";
RFPC.setTaskFileName(simulationtaskName); //qDebug() << "setTaskFileName";
RFPC.setDEMTiffPath(demTiffPath); //qDebug() << "setDEMTiffPath";
RFPC.setLandCoverPath(LandCoverPath); //qDebug() << "setLandCoverPath";
RFPC.setHHSigmaPath(HHSigmaPath); //qDebug() << "setHHSigmaPath";
RFPC.setHVSigmaPath(HVSigmaPath); //qDebug() << "setHVSigmaPath";
RFPC.setVHSigmaPath(VHSigmaPath); //qDebug() << "setVHSigmaPath";
RFPC.setVVSigmaPath(VVSigmaPath); //qDebug() << "setVVSigmaPath";
RFPC.setOutEchoPath(OutEchoPath); //qDebug() << "setOutEchoPath";
qDebug() << "-------------- RFPC start---------------------------------------";
RFPC.Process(num_thread); // 处理程序
qDebug() << "-------------- RFPC end---------------------------------------";
}

View File

@ -1,7 +1,7 @@
#pragma once
/*****************************************************************//**
* \file RTPCProcessCls.h
* \file RFPCProcessCls.h
* \brief Range Time domain Pulse Coherent
*
*
@ -28,11 +28,11 @@
#include "EchoDataFormat.h"
#include "SigmaDatabase.h"
class RTPCProcessCls
class RFPCProcessCls
{
public:
RTPCProcessCls();
~RTPCProcessCls();
RFPCProcessCls();
~RFPCProcessCls();
public:
void setTaskSetting(std::shared_ptr < AbstractSARSatelliteModel> TaskSetting);
void setEchoSimulationDataSetting(std::shared_ptr < EchoL0Dataset> EchoSimulationData);
@ -48,7 +48,7 @@ public:
private:
std::shared_ptr <AbstractSARSatelliteModel> TaskSetting; // 仿真任务设置
std::shared_ptr <EchoL0Dataset> EchoSimulationData; // GPSÊý¾Ý
std::shared_ptr <EchoL0Dataset> EchoSimulationData; // »Ø²¨ÉèÖÃ
std::shared_ptr<SigmaDatabase> SigmaDatabasePtr;
long PluseCount; // 脉冲数量
long PlusePoint; // 脉冲点数
@ -58,11 +58,9 @@ private:
QString HVSigmaPath;
QString VHSigmaPath;
QString VVSigmaPath;
QString OutEchoPath; // 输出回波路径
QString TaskFileName;
QString tmpfolderPath;
QString OutEchoMaskPath;
public:
@ -71,8 +69,8 @@ private: //
ErrorCode InitParams();// 1. 初始化参数
ErrorCode DEMPreprocess(); // 2. 裁剪DEM范围
ErrorCode InitEchoMaskArray();
//ErrorCode RTPCMainProcess(long num_thread);
ErrorCode RTPCMainProcess_GPU();
//ErrorCode RFPCMainProcess(long num_thread);
ErrorCode RFPCMainProcess_GPU();
std::shared_ptr<SatelliteOribtNode[]> getSatelliteOribtNodes(double prf_time, double dt, bool antflag, long double imageStarttime);
@ -82,5 +80,5 @@ private:
QString demsloperPath;
};
void RTPCProcessMain(long num_thread,QString TansformPatternFilePath,QString ReceivePatternFilePath,QString simulationtaskName, QString OutEchoPath, QString GPSXmlPath,QString TaskXmlPath,QString demTiffPath, QString LandCoverPath, QString HHSigmaPath, QString HVSigmaPath, QString VHSigmaPath, QString VVSigmaPath);
void RFPCProcessMain(long num_thread,QString TansformPatternFilePath,QString ReceivePatternFilePath,QString simulationtaskName, QString OutEchoPath, QString GPSXmlPath,QString TaskXmlPath,QString demTiffPath, QString LandCoverPath, QString HHSigmaPath, QString HVSigmaPath, QString VHSigmaPath, QString VVSigmaPath);

View File

@ -199,6 +199,30 @@ double AbstractSARSatelliteModel::getBandWidth()
return 0.0;
}
QVector<double> AbstractSARSatelliteModel::getFreqList()
{
double bandwidth = this->getBandWidth(); // 频率范围
double centerFreq = this->getCenterFreq(); // 中心频率
double nearR = this->getNearRange();
double farR = this->getFarRange();
// 计算分辨率
double Resolution = LIGHTSPEED / 2.0 / bandwidth; // 计算分辨率
double freqpoints = (farR - nearR) / Resolution + 1;
double minFreq = centerFreq - bandwidth / 2.0;// 最小频率
double maxFreq = minFreq + bandwidth;
double deltaFreq = bandwidth / (freqpoints - 1);
QVector<double> freqlist(freqpoints);
for (long i = 0; i < freqpoints; i++) {
freqlist[i] = minFreq + i * deltaFreq;
}
return freqlist;
}
POLARTYPEENUM AbstractSARSatelliteModel::getPolarType()
{
return POLARTYPEENUM();
@ -219,13 +243,18 @@ double AbstractSARSatelliteModel::getPRF()
double AbstractSARSatelliteModel::getFs()
{
return 0;
}
double NearRange = this->getNearRange();
double FarRange = this->getFarRange();
void AbstractSARSatelliteModel::setFs(double Fs)
{
}
QVector<double> freqpoints = this->getFreqList();
long freqNum = freqpoints.size();
double timeRange = 2 * (FarRange - NearRange) / LIGHTSPEED;
double fs = freqNum / timeRange;
return fs;
}
double AbstractSARSatelliteModel::getCenterLookAngle()
{
return 0.0;

View File

@ -259,6 +259,9 @@ public: //
virtual void setBandWidth(double bandwidth); // 带宽范围
virtual double getBandWidth();
virtual QVector<double> getFreqList(); // 获取频点列表
virtual POLARTYPEENUM getPolarType();// 极化类型
virtual void setPolarType(POLARTYPEENUM type);
public: // 设置PRF、FS
@ -266,7 +269,7 @@ public: //
virtual double getPRF();
virtual double getFs(); // 距离向采样频率
virtual void setFs(double Fs);
virtual double getCenterLookAngle() ;
virtual void setCenterLookAngle(double angle) ;

View File

@ -143,16 +143,6 @@ double SARSimulationTaskSetting::getPRF()
return this->PRF;
}
double SARSimulationTaskSetting::getFs()
{
return this->Fs;
}
void SARSimulationTaskSetting::setFs(double Fs)
{
this->Fs = Fs;
}
void SARSimulationTaskSetting::setTransformRadiationPattern(std::shared_ptr<AbstractRadiationPattern> radiationPanttern)
{
this->TransformRadiationPattern = radiationPanttern;
@ -231,12 +221,14 @@ std::shared_ptr<AbstractSARSatelliteModel> ReadSimulationSettingsXML(QString xml
QDomElement bandWidth = taskSensor.firstChildElement("bandWidth");
QDomElement centerLookAngle = taskSensor.firstChildElement("centerLookAngle");
QDomElement prf = taskSensor.firstChildElement("prf");
QDomElement fs = taskSensor.firstChildElement("fs");
//QDomElement fs = taskSensor.firstChildElement("fs");
QDomElement polar = taskSensor.firstChildElement("polar");
QDomElement nearRange = taskSensor.firstChildElement("nearRange");
QDomElement farRange = taskSensor.firstChildElement("farRange");
QDomElement lookDirection = taskSensor.firstChildElement("lookDirection");
if (imagingMode.isNull() || radarCenterFrequency.isNull() || bandWidth.isNull() || centerLookAngle.isNull() || prf.isNull() || fs.isNull() || polar.isNull() || nearRange.isNull() || farRange.isNull() )
if (imagingMode.isNull() || radarCenterFrequency.isNull() || bandWidth.isNull()
|| centerLookAngle.isNull() || prf.isNull() || polar.isNull()
|| nearRange.isNull() || farRange.isNull() )
{
qDebug() << QString::fromStdString(errorCode2errInfo(ErrorCode::XMLNOTFOUNDElEMENT));
return nullptr;
@ -295,7 +287,7 @@ std::shared_ptr<AbstractSARSatelliteModel> ReadSimulationSettingsXML(QString xml
taskSetting->setBandWidth(bandWidth.text().toDouble());
taskSetting->setCenterFreq(radarCenterFrequency.text().toDouble()); // ÖÐÐÄÆµÂÊ
taskSetting->setPRF(prf.text().toDouble()); // PRF
taskSetting->setFs(fs.text().toDouble()); //Fs
//taskSetting->setFs(fs.text().toDouble()); //Fs
taskSetting->setNearRange(nearRange.text().toDouble()); // NearRange
taskSetting->setFarRange(farRange.text().toDouble()); // FarRange
taskSetting->setIsRightLook(isR);

View File

@ -78,13 +78,9 @@ private:
public: // 设置PRF、FS
virtual void setPRF(double prf) override; // 方位向采样频率
virtual double getPRF() override;
virtual double getFs() override; // ¾àÀëÏò²ÉÑùƵÂÊ
virtual void setFs(double Fs) override;
private:
double PRF;
double Fs;
public:// 天线方向图

View File

@ -608,8 +608,8 @@ ErrorCode TBPImageAlgCls::ProcessCPU(long num_thread)
long startLine = 0;
long processValue = 0;
long processNumber = 0;
QProgressDialog progressDialog(u8"RTPC回波生成中", u8"终止", 0, rowCount);
progressDialog.setWindowTitle(u8"RTPC回波生成中");
QProgressDialog progressDialog(u8"RFPC回波生成中", u8"终止", 0, rowCount);
progressDialog.setWindowTitle(u8"RFPC回波生成中");
progressDialog.setWindowModality(Qt::WindowModal);
progressDialog.setAutoClose(true);
progressDialog.setValue(0);