⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 imagerd.cpp

📁 本程序是应用于雷达成像的距离多普勒成像算法的c++程序源代码。
💻 CPP
📖 第 1 页 / 共 2 页
字号:
#include "stdafx.h"
#include "ImageRD.h"
#include <MATH.H>
/************************************************************************
* 版权说明:         buaa
* 生成日期:         2005年12月  
* 作者:             yoyo          
* 内容:             RD成像算法   
* 模块的目的/功能:  完成对回波数据的成像Rang-doppler算法
* 主要函数及其功能: 
  **  构造函数            : 从参数文件中获得雷达平台参数,给输入框参数赋初值
  **  ParaSet             : 处理所用到参数,将回波数据读入内存中
  **  RangeCompress       : 距离压缩 
  **  AzimuthCompress     : 方位向压缩
  **  CreateMemoryMap     : 产生内存映射文件,用来保存点数据
  **  ReadReflectWaveData : 读取保存在回波数据文件里的数据
  **  MYFFT               : 傅立叶变化
  **  IMYFFT              : 逆傅立叶变化
  **  GetLogNum: 求大于或等于输入值取2的对数后的最近整数值
* 与其他文件的关系:是CMainFram中DrawCutRecCube入口,给其提供房屋
      参数和确定模型建立后存入的数据库。   
* 修改日期:2006年8月
* 修改原因:版式整理,详细注释
**************************************************************************/
CImageRD::CImageRD()
{
	m_reflectData=NULL;		     			 //回波内存映像
	m_iRow=m_iCol=0;			     	  	 //回波范围
	k_a=0.0;				                 // azimuth factor
	k_r=0.0;				                 // range factor
	sita=0.0;			                     // squint angle (正侧视) 
	i=j=k=0;                                 // variable of circle
	res_a=0.0;		                         // required azimuth resolution
	res_r=0.0;								 // required range resolution
	H=0.0;									 // radar working high
	Theta=0.0;								 // angle of radar's incidence
	Ra=0.0;									 // radar working distance
	va=0.0; 						         // radar/platform forward velocity
	Tp=0.0; 							     // transmitted pulse width      
	fc=0.0;				 					 // carrier frequency 
	lamda=0.0;								 // wavelength
	Br=0.0;									 // required transmitted bandwidth(k_r*c/2./res_r)
	Fs=0.0;									 // A/D sampling rate(FsFactor=1.5)
	bin_r=0.0;								 // range bin
	La=0.0;									 // required synthetic aperture length
	Ta=0.0;					                 // required synthetic aperture time
	fdc=0.0;                                 // doppler centriod(正侧视就为0)
	fdr=0.0;							     // doppler rate
	Bd=Kr=0.0;				                 // doppler bandwidth
	prf=0.0;					             // PRF(Bd*2)
    rmin=0.0;								 // maximal rang
	rmax=0.0;                                // minimal rang
    Na=0;                                    //azimuth sampling number
	Nr=0;                                    //rang sampling number
	m_NumRFFT=0;						 	 //距离向FFT点数
	m_NumAFFT=0;					 		 //方位向FFT点数
	m_rR=0;                                  //比距离向点数大的并且最接近距离向点数的2的幂次
	m_rA=0;                                  //比方位向点数大的并且最接近方位向点数的2的幂次
	m_buffer=NULL;						     //临时存储区
	m_signal=NULL;			                 //信号存储区
	//用于创建内存映射文件时产生的句柄
	m_hFile=NULL;    
	m_hFileMap=NULL; 
}
CImageRD::~CImageRD()
{
	if(m_buffer)
		delete[] m_buffer;
	if(m_reflectData)
		UnmapViewOfFile(m_reflectData);
	if(m_hFileMap)
		CloseHandle(m_hFileMap);
	if(m_hFile)
		CloseHandle(m_hFile);
}
/*************************************************************************
* 函数名	: ParaSet
* 功  能	: 处理所用到参数,将回波数据读入内存中
* 返回值	: 参数赋值成功返回true,失败返回false
* 参  数	: strFileName  存放参数的文件名
* 调用关系  : 调用function中round(四舍五入)
              run中成像部分调用此函数
* 作  者	: yoyo
* 创建日期	: 2006年5月
* 修改日期  : 2006年8月
* 修改原因  : 版式整理,详细注释
************************************************************************/
bool CImageRD::ParaSet(CString strFileName)
{
	CStdioFile paraFile;
	CFileException e;
	CString m_sParaFile;
	if(strFileName=="")
		m_sParaFile=GetExeDir()+"\\Exe\\parameter.d";
	else
		m_sParaFile = strFileName;
	if(!paraFile.Open(m_sParaFile, CFile::modeRead, &e))
	{
		AfxMessageBox("打不开参数文件 "+m_sParaFile);
		return false;
	}
	char lineString[128], temp[128];
	paraFile.ReadString(lineString, 127);//29
	paraFile.ReadString(lineString, 127);                   //PI	1
	paraFile.ReadString(lineString, 127);                   //2 C	
	paraFile.ReadString(lineString, 127);                   //3 radar working high
	sscanf(lineString, "%s %f", temp, &H);               	
    paraFile.ReadString(lineString, 127);                   //4 distance 
	paraFile.ReadString(lineString, 127);                   //5 angle of radar's incidence
	sscanf(lineString, "%s %f", temp, &Theta);	        	  
	paraFile.ReadString(lineString, 127);                   //6 squint angle (正侧视)
	sscanf(lineString, "%s %f", temp, &sita);              
	paraFile.ReadString(lineString, 127);                   //7 azimuth 波束宽度               
	paraFile.ReadString(lineString, 127);                   //8 rang 波束宽度
	paraFile.ReadString(lineString, 127);                   //9 radar/platform forward velocity(y)
	sscanf(lineString, "%s %f", temp, &va);
	paraFile.ReadString(lineString, 127);                   //10 carrier frequency 
	sscanf(lineString, "%s %f", temp, &fc);
	paraFile.ReadString(lineString, 127);                   //11 A/D sampling rate(FsFactor=1.5)
	sscanf(lineString, "%s %f", temp, &Fs);
	paraFile.ReadString(lineString, 127);                   //12 transmitted pulse width     
	sscanf(lineString, "%s %f", temp, &Tp);
	paraFile.ReadString(lineString, 127);                   //13 PRF(Bd*2)	
	paraFile.ReadString(lineString, 127);                   //14 required transmitted bandwidth(k_r*c/2./res_r)
	sscanf(lineString, "%s %f", temp, &Br);
	paraFile.ReadString(lineString, 127);                   //15 l_begin
	paraFile.ReadString(lineString, 127);                   //16 l_end	
 	paraFile.ReadString(lineString, 127);                   //17 modal	
	paraFile.ReadString(lineString, 127);                   //18 required azimuth resolution
	sscanf(lineString, "%s %f", temp, &res_a);
	paraFile.ReadString(lineString, 127);                   //19 
	paraFile.ReadString(lineString, 127);                   //20 
	paraFile.ReadString(lineString, 127);                   //21 
	paraFile.ReadString(lineString, 127);                   //22 
	paraFile.ReadString(lineString, 127);                   //23 
	paraFile.ReadString(lineString, 127);                   //24
	paraFile.ReadString(lineString, 127);                   //25 
	paraFile.ReadString(lineString, 127);                   //26 
	paraFile.ReadString(lineString, 127);                   //27 
	paraFile.ReadString(lineString, 127);                   //28
	paraFile.ReadString(lineString, 127);                   //29
	paraFile.ReadString(lineString, 127);                   //30 required rang resolution
	sscanf(lineString, "%s %f", temp, &res_r);
	sita=sita*pi/180.0;
	Ra=H*cos(Theta*pi/180);									// radar working distance
    k_a=1;												    // azimuth factor
	k_r=1;												    // range factor
  	Br=k_r*Br;												// extended Br
  	lamda=c/fc;						    					// wavelength
	bin_r=c/2.0/Fs;		                   					// range bin
	Kr=Br/Tp;					  	       					// range chirp rate	  
	La=Ra*k_a*lamda/2/res_a/sin(sita);						// required synthetic aperture length
	Ta=La/va;					            				// required synthetic aperture time
	fdc=2*va*cos(sita)/lamda;                 				// doppler centriod(正侧视就为0)
	fdr=-2*(va*sin(sita))*(va*sin(sita))/lamda/Ra;			// doppler rate
	Bd=(-fdr)*Ta;											// doppler bandwidth
	prf=round(Bd);				                            // PRF
	return true;
}
///////////////////    距离压缩   //////////////////////////////////////////// 
/*************************************************************************
* 函数名	: RangeCompress
* 功  能	: 距离压缩
* 返回值	: 成功返回true,失败返回false
* 参  数	: 无
* 调用关系  : 调用本类中的MYFFT(傅立叶变化)
              本类中的MYFFTShift(傅立叶转换)
			  本类中的MYIFFT(逆傅立叶变换)
              run中成像部分调用此函数
* 作  者	: yoyo
* 创建日期	: 2006年5月
* 修改日期  : 2006年8月
* 修改原因  : 版式整理,详细注释
************************************************************************/
bool CImageRD::RangeCompress()
{
	double dfr,fr,phase;
	DComplex phase1;
	for(i=0;i<m_NumAFFT;i++)
		{
			for(j=0;j<m_NumRFFT;j++)  
				{
					m_buffer[j]=SIGNAL1(i,j);
				}
			MYFFT(m_buffer,m_rR);
			MYFFTShift(m_buffer,m_rR);
			dfr=Fs/m_NumRFFT;
			for(j=0;j<m_NumRFFT;j++)
				{
					fr=(j-(double)m_NumRFFT/2)*dfr;
					phase=-pi*fr*fr/Kr;
					phase1=DComplex(cos(phase),sin(phase));
					m_buffer[j]=m_buffer[j]*phase1;
				}
			MYFFTShift(m_buffer,m_rR);
			MYIFFT(m_buffer,m_rR);
			for(j=0;j<m_NumRFFT;j++)  
				{
					SIGNAL1(i,j)=m_buffer[j];
				}			
		}

  return true;
}

////////////////     方位向压缩   //////////////////////////////
/*********************************************************************
* 函数名	: AzimuthCompress
* 功  能	: 方位向压缩
* 返回值	: 成功返回true,失败返回false
* 参  数	: 无
* 调用关系  : 调用本类中的MYFFT(傅立叶变化)
              本类中的MYFFTShift(傅立叶转换)
			  本类中的MYIFFT(逆傅立叶变换)
              run中成像部分调用此函数
* 作  者	: yoyo
* 创建日期	: 2006年5月
* 修改日期  : 2006年8月
* 修改原因  : 版式整理,详细注释
************************************************************************/
bool CImageRD::AzimuthCompress()
{
   int N_ex=50;
   DComplex* Up00=new DComplex[m_NumRFFT+2*N_ex];
   memset((char*)Up00,0,(m_NumRFFT+N_ex*2)*sizeof(DComplex));
   double dfa=prf/m_NumAFFT;
   double fa,alpha_fx,rr,alpha_dc,dRa,delt_beta,phase;
   DComplex phase2;
   int kpos;
   for(j=0;j<m_NumRFFT;j++)
   {
		for(i=0;i<m_NumAFFT;i++)
		{
			m_buffer[i]=SIGNAL1(i,j);	
		}
		MYFFT(m_buffer,m_rA);
		MYFFTShift(m_buffer,m_rA);
		for(i=0;i<m_NumAFFT;i++)  
		{
			SIGNAL1(i,j)=m_buffer[i];
		}
   }
   alpha_dc=1/sqrt(1-((lamda*fdc/2.0/va)*(lamda*fdc/2.0/va)));
   dfa=prf/m_NumAFFT;
   for(i=0;i<m_NumAFFT;i++)  
	{
	    fa=(i-(m_NumAFFT/2.0))*dfa+fdc;
		alpha_fx=1/sqrt(1-((lamda*fa/2.0/va)*(lamda*fa/2.0/va)));
		memset((char*)Up00,0,(m_NumRFFT+N_ex*2)*sizeof(DComplex));
		for(j=0;j<m_NumRFFT;j++)
		{
			Up00[j+N_ex]=SIGNAL1(i,j);
		}
		for(j=0;j<m_NumRFFT;j++)
		{
		    rr=rmin+(j*bin_r);
			dRa=rr*(alpha_fx-alpha_dc);
			kpos=j+round(dRa/bin_r)+N_ex;
			SIGNAL1(i,j)=Up00[kpos-1];
			fa=fa-fdc;
			delt_beta=sqrt(1-(lamda*fa/2.0/va)*(lamda*fa/2.0/va))-1;
			phase=4*pi/lamda*delt_beta*rr;
			phase2=DComplex(cos(phase),sin(phase));
			SIGNAL1(i,j)=SIGNAL1(i,j)*phase2;
		}
	}
   for(j=0;j<m_NumRFFT;j++)
   {
		for(i=0;i<m_NumAFFT;i++)
		{
			m_buffer[i]=SIGNAL1(i,j);	
		}
		MYFFTShift(m_buffer,m_rA);
		MYIFFT(m_buffer,m_rA);		
		for(i=0;i<m_NumAFFT;i++)  
		{
			SIGNAL1(i,j)=m_buffer[i];
		}
   }

⌨️ 快捷键说明

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