sarsimulation01.cpp

来自「C语言实现机载SAR成像」· C++ 代码 · 共 165 行

CPP
165
字号
#include <iostream.h>
#include <fstream.h>
#include <math.h>
#include <stdlib.h>
#include <cstdlib>
#include <iomanip.h>
#define ARRAYNUM 2048
#define TARGETNUM 3
#define pi 3.14159
void main()
{
	//定义常数:光速,载频及波长
	double c=3e8;
	double fc=1e9;
	double lambda;
	lambda=c/fc;
	//定义目标区域
	double xmin=0,xmax=50;
	double yc=10000,y0=500;
	double v=100,H=5000;
	double R0=sqrt(yc*yc+H*H);
	//定义天线参数
	double D=4;
	double Lsar=lambda*R0/D;
	double Tsar=Lsar/v;
	//慢时间域参数
	double Ka=-2*v*v/lambda/R0;
	double Ba=Ka*Tsar;
	Ba=Ba>0?Ba:(-Ba);
	double PRF=Ba;
	double PRT=1/PRF;
	double ds=PRT;
	//慢时间域采样数
	int Nslow=int((xmax-xmin+Lsar)/v/ds);
	Nslow=Nslow+1;
	Nslow=int(log(Nslow)/log(2))+1;	
	int temp=1;
	for(int i=1;i<=Nslow;i++)
	{
		temp=temp*2;
	}
	Nslow=temp;
	//慢时间域离散采样序列
	double tp=((xmax+Lsar/2)/v-(xmin-Lsar/2)/v)/Nslow;
	double sn[ARRAYNUM];
	for(i=0;i<Nslow;i++)
	{
		sn[i]=(xmin-Lsar/2)/v+i*tp;
	}
	PRT=(xmax-xmin+Lsar)/v/Nslow;
	PRF=1/PRT;
	ds=PRT;
	//定义快时间域参数
	double Tr=5e-6;
	double Br=30e6;
	double Kr=Br/Tr;
	double Fsr=3*Br;
	double dt=1/Fsr;
	double Rmin=sqrt((yc-y0)*(yc-y0)+H*H);
	double Rmax=sqrt((yc+y0)*(yc+y0)+H*H+(Lsar/2)*(Lsar/2));
	//快时间域离散采样序列
	int Nfast=int(2*(Rmax-Rmin)/c/dt+Tr/dt)+1;
	Nfast=int(log(Nfast)/log(2))+1;	
	temp=1;
	for(i=1;i<=Nfast;i++)
	{
		temp=temp*2;
	}
	Nfast=temp;
	tp=(2*Rmax/c+Tr-2*Rmin/c)/Nfast;
	double tm[ARRAYNUM];
	for(i=0;i<Nfast;i++)
	{
		tm[i]=2*Rmin/c+i*tp;
	}
	dt=(2*Rmax/c+Tr-2*Rmin/c)/Nfast;
	Fsr=1/dt;
	//分辨率
	double DY=c/2/Br;
	double DX=D/2;
	//目标参量
	int Ntarget=3;
	double Ptarget[3][3]={{xmin,yc,1},{xmin,yc+10*DY,1},{xmin+10*DX,yc+20*DY,1}};
	int K=Ntarget;
	int N=Nslow;
	int M=Nfast;
	double T[TARGETNUM][3];
	for(i=0;i<3;i++)
		for(int j=0;j<3;j++)
		{
			T[i][j]=Ptarget[i][j];
		}
	//定义回波模型
	static double Srnmi[ARRAYNUM][ARRAYNUM],Srnmj[ARRAYNUM][ARRAYNUM],Dslow[ARRAYNUM],Dfast[ARRAYNUM][ARRAYNUM];
	for(i=0;i<N;i++)
		for(int j=0;j<M;j++)
		{
			Srnmi[i][j]=0;
			Srnmj[i][j]=0;
			Dfast[i][j]=0;
			Dslow[i]=0;
		}
    static double R[ARRAYNUM],tau[ARRAYNUM];
    static double Ptm[ARRAYNUM][ARRAYNUM],Ptau[ARRAYNUM][ARRAYNUM],PR[ARRAYNUM][ARRAYNUM],phase[ARRAYNUM][ARRAYNUM];
	for(int k=0;k<K;k++)
	{
		double sigma=T[k][2];
		for(i=0;i<Nslow;i++)
		{
			Dslow[i]=sn[i]*v-T[k][0];
			R[i]=sqrt(Dslow[i]*Dslow[i]+T[k][1]*T[k][1]+H*H);
			tau[i]=2*R[i]/c;
			Dslow[i]=Dslow[i]>0?Dslow[i]:(-Dslow[i]);
			if(Dslow[i]<Lsar/2)
				Dslow[i]=1;
			else
				Dslow[i]=0;
		}

		for(i=0;i<N;i++)
			for(int j=0;j<M;j++)
			{
				Ptm[i][j]=tm[j];
				Ptau[i][j]=tau[i];
				PR[i][j]=R[i];
				Dfast[i][j]=Ptm[i][j]-Ptau[i][j];
				phase[i][j]=pi*Kr*Dfast[i][j]*Dfast[i][j]-(4*pi/lambda)*PR[i][j];
				if((Dfast[i][j]>0)&&(Dfast[i][j])<Tr)
					Dfast[i][j]=1;
				else
					Dfast[i][j]=0;
			}
		for(i=0;i<N;i++)
			for(int j=0;j<M;j++)
			{
				Srnmi[i][j]=Srnmi[i][j]+sigma*cos(phase[i][j])*Dfast[i][j]*Dslow[i];
				Srnmj[i][j]=Srnmj[i][j]+sigma*sin(phase[i][j])*Dfast[i][j]*Dslow[i];
			}
	}
	ofstream out_stream;
	//将回波的实部存入sidata.dat中
	out_stream.open("sidata.dat");
	for(i=0;i<N;i++)
	{
		for(int j=0;j<M;j++)
		{
			out_stream<<setw(5)<<Srnmi[i][j]<<' ';
		}
		out_stream<<endl;
	}
	out_stream.close();
	ofstream out_stream1;
	//将回波的虚部部存入sjdata.dat中
	out_stream1.open("sjdata.dat");
	for(i=0;i<N;i++)
	{
		for(int j=0;j<M;j++)
		{
			out_stream1<<setw(5)<<Srnmj[i][j]<<' ';
		}
		out_stream1<<endl;
	}
	out_stream1.close();
	cout<<"End of output"<<endl;
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?