📄 imagerd.cpp
字号:
#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 + -