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

📄 imagerd.cpp

📁 本程序是应用于雷达成像的距离多普勒成像算法的c++程序源代码。
💻 CPP
📖 第 1 页 / 共 2 页
字号:
   delete [] Up00;
   return true;
}
//////////////////////////////////////////////////////////////////////////
// 产生内存映射文件,用来保存点数据	
// 从“.ref”内读出回波数据,存入内存中,按照行(Na)列(Nr)读出复数的ref,存入DComplex

/*********************************************************************
* 函数名	: CreateMemoryMap
* 功  能	: 产生内存映射文件,用来保存点数据
* 返回值	: 创建成功返回true,失败返回false
* 参  数	: strFileName  内存映射文件名
              dwSize       内存映射文件大小
* 调用关系  :  

              run中成像部分调用此函数
* 作  者	: yoyo
* 创建日期	: 2006年5月
* 修改日期  : 2006年8月
* 修改原因  : 版式整理,详细注释
************************************************************************/
bool CImageRD::CreateMemoryMap(CString strFileName, DWORD dwSize)
{
	if(m_reflectData)
		UnmapViewOfFile(m_reflectData);
	if(m_hFileMap)
		CloseHandle(m_hFileMap);
	if(m_hFile)
		CloseHandle(m_hFile);
	
	if(strFileName=="")
		strFileName = "image.swp";
	m_hFile = CreateFile(strFileName, GENERIC_READ|GENERIC_WRITE, FILE_SHARE_WRITE,
				NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL|FILE_FLAG_SEQUENTIAL_SCAN, NULL);
	if(m_hFile==INVALID_HANDLE_VALUE)
	{	AfxMessageBox("不能创建内存映像文件");
		return false;
	}
	if(dwSize<0)
		dwSize = GetFileSize(m_hFile, NULL);
	if(dwSize<0)
		dwSize = 1024;
	m_hFileMap = CreateFileMapping(m_hFile, NULL, PAGE_READWRITE, 0, dwSize, NULL);
	if(m_hFileMap==NULL)
	{	AfxMessageBox("文件映射错误");
		CloseHandle(m_hFile);
		return false;
	}
	m_reflectData = MapViewOfFile(m_hFileMap, FILE_MAP_ALL_ACCESS, 0, 0, 0);
	if(m_reflectData==NULL)
	{	AfxMessageBox("文件映射错误");
		CloseHandle(m_hFileMap);
		CloseHandle(m_hFile);
		return false;
	}
	memset(m_reflectData,0,dwSize);
	return true;
}
/*********************************************************************
* 函数名	: ReadReflectWaveData
* 功  能	: 读取保存在回波数据文件里的数据
* 返回值	: 读取成功返回true,失败返回false
* 参  数	: fileName  回波数据文件名
* 调用关系  : 本类中的GetLogNum(求最近的2的幂次)
              文件参作函数fopen、fscanf、fclose
              run中成像部分调用此函数
* 作  者	: yoyo
* 创建日期	: 2006年5月
* 修改日期  : 2006年8月
* 修改原因  : 版式整理,详细注释
************************************************************************/
bool CImageRD::ReadReflectWaveData(char *fileName)
{
	//数据头
	CString msg;
	FILE *fp = fopen(fileName, "r");
	if(fp==NULL)
	{
		msg.Format("打不开数据文件 %s。",fileName);
		AfxMessageBox(msg);
		return false;
	}
	fscanf(fp, "%e %d %d\n", &rmin, &m_iRow, &m_iCol); //读取保存在回波数据文件里的行列参数值
	Nr = m_iCol ;                // number of range
	Na = m_iRow ;               // number of azimuth
	if(m_iRow<=0 || m_iCol<=0)
	{
		msg.Format("无效数据文件 %s。",fileName);
		AfxMessageBox(msg);
		return false;
	}
	m_rA = GetLogNum(m_iRow);  //获得方位向fft的幂次
	m_rR = GetLogNum(m_iCol);  //获得距离向fft的幂次
	m_NumRFFT = 1<<m_rR;       //获得距离向fft的点数						 	
	m_NumAFFT = 1<<m_rA;       //获得方位向fft的点数
	
	if(!CreateMemoryMap("image.swp", m_NumRFFT*m_NumAFFT*sizeof(DComplex)+1024))
		return false;
	
	int *dataHead = (int *)m_reflectData;
	dataHead[0] = m_NumRFFT;
	dataHead[1] = m_NumAFFT;
	// creat array to save fft_sig
	m_buffer = new DComplex[m_NumRFFT>m_NumAFFT ? m_NumRFFT:m_NumAFFT];
	
	//数据区
	m_signal = (DComplex *)((char *)m_reflectData+1024);
	int i, j;
	float real, image;
	for(i=0; i<m_NumAFFT; i++)
		for(j=0; j<m_NumRFFT; j++)
			SIGNAL1(i,j) = DComplex(0.0, 0.0);
		for(i=0; i<m_iRow; i++)
		{
			for(j=0; j<m_iCol; j++)
			{
				fscanf(fp,"(%f, %f)\n", &real, &image);
				SIGNAL1(i, j) = DComplex(real, image);
			}
		}
		fclose(fp);
		return true;
}
/*********************************************************************
* 函数名	: MYFFT
* 功  能	: 傅立叶变化
* 返回值	: 变化的值
* 参  数	: TD  需要进行傅立叶变化的数据指针
              r   傅立叶变换点数的2的幂次数
* 调用关系  : memcpy 存储区拷贝
              本类中方位、距离压缩时调用此函数
* 作  者	: yoyo
* 创建日期	: 2006年5月
* 修改日期  : 2006年8月
* 修改原因  : 版式整理,详细注释
************************************************************************/
void CImageRD::MYFFT(DComplex* TD, int r)
{
	//傅立叶变换点数
	long count;
	//循环变量
	int i,j,k;
	//中间变量
	int bfsize,p;
	//角度
	double angle;
	DComplex *W, *X1, *X2, *X;
	//计算傅立叶变换点数
	count=1<<r;
	//分配运算所需存储器
	W = new DComplex[count/2];
	X1= new DComplex[count];
	X2= new DComplex[count];
	//计算加权系数
	for(i=0;i<count/2;i++)
	{
		angle=-i*PI*2/count;
		W[i]=DComplex(cos(angle),sin(angle));
	}
	
	//将时域点写入X1
	memcpy(X1, TD, sizeof(DComplex)*count);
	
	//采用蝶形算法进行快速傅立叶变换
	for(k=0;k<r;k++)
	{
		for(j=0;j<1<<k;j++)
		{
			bfsize=1<<(r-k);
			for(i=0;i<bfsize/2;i++)
			{
				p=j*bfsize;
				X2[i+p]=X1[i+p]+X1[i+p+bfsize/2];
				X2[i+p+bfsize/2]=(X1[i+p]-X1[i+p+bfsize/2])*W[i*(1<<k)];
			}
		}
		X=X1;
		X1=X2;
		X2=X;
	}
	
	//重新排序
	for(j=0;j<count;j++)
	{
		p=0;
		for(i=0;i<r;i++)
		{
			if(j&(1<<i))
			{
				p+=1<<(r-i-1);
			}
		}
		TD[j]=X1[p];
	}
	//释放内存
	delete[] W;
	delete[] X1;
	delete[] X2;
}
void CImageRD::MYFFTShift(DComplex* FD, int r)
{
	DComplex Temp;
	int half_Count = 1<<(r-1);
	int i;
	
	for(i=0;i<half_Count;i++)
	{
		Temp=FD[i];
		FD[i]=FD[i+half_Count];
		FD[i+half_Count]=Temp;
	}
	
	return;
}
/*********************************************************************
* 函数名	: MYIFFT
* 功  能	: 逆傅立叶变化
* 返回值	: 变化的值
* 参  数	: FD  需要进行逆傅立叶变化的数据指针
              r   逆傅立叶变换点数的2的幂次数
* 调用关系  : memcpy 存储区拷贝
              MYFFT 傅立叶变化
              本类中方位、距离压缩时调用此函数
* 作  者	: yoyo
* 创建日期	: 2006年5月
* 修改日期  : 2006年8月
* 修改原因  : 版式整理,详细注释
************************************************************************/
void CImageRD::MYIFFT(DComplex* FD, int r)
{
	//傅立叶变换点数
	long count;
	
	//循环变量
	int i;
	
	//计算傅立叶变换点数
	count=1<<r;
	
	//求共轭
	for(i=0;i<count;i++)
	{
		FD[i] = DComplex(FD[i].real(),-FD[i].imag());
	}
	
	//调用快速傅立叶变换
	MYFFT(FD,r);
	
	//求时域点的共轭
	for(i=0;i<count;i++)
	{
		FD[i]=DComplex(FD[i].real()/(double)count,-FD[i].imag()/(double)count);
	}
	return;
}

/*********************************************************************
* 函数名	: GetLogNum
* 功  能	: 求大于或等于输入值取2的对数后的最近整数值
* 返回值	: 经过计算后的整数
* 参  数	: num  需要求解的数值
* 调用关系  : 本类中方位、距离压缩时调用此函数
* 作  者	: yoyo
* 创建日期	: 2006年5月
* 修改日期  : 2006年8月
* 修改原因  : 版式整理,详细注释
************************************************************************/
int CImageRD:: GetLogNum(int num)
{
	int i=0;
	do
	{
		i++;
	}
	while((1<<i)<num);
	return i;

}

⌨️ 快捷键说明

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