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