📄 imagerd(cpp).txt
字号:
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++) DComplex[m_NumRFFT m_buffer="new" fft_sig save to array creat dataHead[1]="m_NumAFFT;" dataHead[0]="m_NumRFFT;" *)m_reflectData; *dataHead="(int" int false; return m_NumRFFT*m_NumAFFT*sizeof(DComplex)+1024)) if(!CreateMemoryMap(?image.swp?, 获得方位向fft的点数 m_NumAFFT="1<<m_rA;" 获得距离向fft的点数 m_NumRFFT="1<<m_rR;" 获得距离向fft的幂次 m_rR="GetLogNum(m_iCol);" 获得方位向fft的幂次 m_rA="GetLogNum(m_iRow);" } AfxMessageBox(msg); %s。?,fileName); msg.Format(?无效数据文件 { m_iCol<="0)" || if(m_iRow<="0" azimuth of number ; Na="m_iRow" range Nr="m_iCol" 读取保存在回波数据文件里的行列参数值 &m_iCol); &m_iRow, &rmin, %d\n?, %d ?%e fscanf(fp, msg.Format(?打不开数据文件 if(fp="=NULL)" ?r?); *fp="fopen(fileName," FILE msg; CString 数据头 *fileName) CImageRD::ReadReflectWaveData(char bool ************************************************************************ 版式整理,详细注释 : 修改原因 * 2006年8月 修改日期 2006年5月 创建日期 yoyo 者 作 run中成像部分调用此函数 文件参作函数fopen、fscanf、fclose 本类中的GetLogNum(求最近的2的幂次) 调用关系 回波数据文件名 fileName 数 参 读取成功返回true,失败返回false 返回值 读取保存在回波数据文件里的数据 能 功 ReadReflectWaveData 函数名 ********************************************************************* true; memset(m_reflectData,0,dwSize); CloseHandle(m_hFile); CloseHandle(m_hFileMap); AfxMessageBox(?文件映射错误?); if(m_reflectData="=NULL)" 0); 0, FILE_MAP_ALL_ACCESS, m_reflectData="MapViewOfFile(m_hFileMap," if(m_hFileMap="=NULL)" NULL); dwSize, PAGE_READWRITE, NULL, m_hFileMap="CreateFileMapping(m_hFile," dwSize if(dwSize<0) AfxMessageBox(?不能创建内存映像文件?); if(m_hFile="=INVALID_HANDLE_VALUE)" FILE_ATTRIBUTE_NORMAL|FILE_FLAG_SEQUENTIAL_SCAN, CREATE_ALWAYS, FILE_SHARE_WRITE, GENERIC_READ|GENERIC_WRITE, m_hFile="CreateFile(strFileName," strFileName if(strFileName='="")' if(m_hFile) if(m_hFileMap) UnmapViewOfFile(m_reflectData); if(m_reflectData) dwSize) DWORD strFileName, CImageRD::CreateMemoryMap(CString 内存映射文件大小 内存映射文件名 创建成功返回true,失败返回false 产生内存映射文件,用来保存点数据 CreateMemoryMap 从“.ref”内读出回波数据,存入内存中,按照行(Na)列(Nr)读出复数的ref,存入DComplex Up00; [] delete SIGNAL1(i,j)="m_buffer[j];" for(i="0;i<m_NumAFFT;i++)" MYIFFT(m_buffer,m_rA); MYFFTShift(m_buffer,m_rA); m_buffer[i]="SIGNAL1(i,j);" for(j="0;j<m_NumRFFT;j++)" phase2="DComplex(cos(phase),sin(phase));" phase="-pi*fr*fr/Kr;" delt_beta="sqrt(1-(lamda*fa/2.0/va)*(lamda*fa/2.0/va))-1;" fa="(i-(m_NumAFFT/2.0))*dfa+fdc;" kpos="j+round(dRa/bin_r)+N_ex;" dRa="rr*(alpha_fx-alpha_dc);" rr="rmin+(j*bin_r);" Up00[j+N_ex]="SIGNAL1(i,j);" memset((char*)Up00,0,(m_NumRFFT+N_ex*2)*sizeof(DComplex)); alpha_fx="1/sqrt(1-((lamda*fa/2.0/va)*(lamda*fa/2.0/va)));" dfa="prf/m_NumAFFT;" alpha_dc="1/sqrt(1-((lamda*fdc/2.0/va)*(lamda*fdc/2.0/va)));" MYFFT(m_buffer,m_rA); kpos; phase2; DComplex fa,alpha_fx,rr,alpha_dc,dRa,delt_beta,phase; double DComplex[m_NumRFFT+2*N_ex]; Up00="new" DComplex* N_ex="50;" CImageRD::AzimuthCompress() 本类中的MYIFFT(逆傅立叶变换) 本类中的MYFFTShift(傅立叶转换) 调用本类中的MYFFT(傅立叶变化) 无 成功返回true,失败返回false 方位向压缩 AzimuthCompress MYIFFT(m_buffer,m_rR); MYFFTShift(m_buffer,m_rR); m_buffer[j]="SIGNAL1(i,j);" phase1="DComplex(cos(phase),sin(phase));" fr="(j-(double)m_NumRFFT/2)*dfr;" dfr="Fs/m_NumRFFT;" MYFFT(m_buffer,m_rR);>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; int return } { ************************************************************************ 版式整理,详细注释 : 修改原因 * 2006年8月 修改日期 2006年5月 创建日期 yoyo 者 作 调用关系 数 参 返回值 能 功 函数名 ********************************************************************* true; SIGNAL1(i,j)="DComplex(0.0," for(i="0;" for(j="0;" DComplex double pre }< i; while((1<<i)<num); i++; do i="0;" num) GetLogNum(int CImageRD:: 本类中方位、距离压缩时调用此函数 需要求解的数值 num 经过计算后的整数 求大于或等于输入值取2的对数后的最近整数值 GetLogNum return; FD[i]="FD[i+half_Count];" 求时域点的共轭 MYFFT(FD,r); 调用快速傅立叶变换 求共轭 count="1<<r;" 计算傅立叶变换点数 循环变量 count; long 傅立叶变换点数 r) FD, CImageRD::MYIFFT(DComplex* void 傅立叶变化 MYFFT 存储区拷贝 memcpy 逆傅立叶变换点数的2的幂次数 r 需要进行逆傅立叶变化的数据指针 FD 变化的值 逆傅立叶变化 MYIFFT FD[i+half_Count]="Temp;" Temp="FD[i];" half_Count="1<<(r-1);" Temp; CImageRD::MYFFTShift(DComplex* X2; delete[] X1; W; 释放内存 TD[j]="X1[p];" p+="1<<(r-i-1);" if(j&(1<<i)) p="j*bfsize;" 重新排序 X2="new" X1="new" X="X1;" 2]="(X1[i+p]-X1[i+p+bfsize/2])*W[i*(1<<k)];" X2[i+p+bfsize X2[i+p]="X1[i+p]+X1[i+p+bfsize/2];" bfsize="1<<(r-k);" for(k="0;k<r;k++)" 采用蝶形算法进行快速傅立叶变换 sizeof(DComplex)*count); TD, memcpy(X1, 将时域点写入X1 W[i]="DComplex(cos(angle),sin(angle));" angle="-i*PI*2/count;" 计算加权系数 DComplex[count]; 2]; DComplex[count W="new" 分配运算所需存储器 *X; *X2, *X1, *W, angle; 角度 bfsize,p; 中间变量 i,j,k; CImageRD::MYFFT(DComplex* 傅立叶变换点数的2的幂次数 需要进行傅立叶变化的数据指针 TD fclose(fp); image); j)="DComplex(real," SIGNAL1(i, &image); &real, %f)\n?, fscanf(fp,?(%f, j++) j<m_iCol; i++) i<m_iRow; 0.0); j<m_NumRFFT;>
<SCRIPT src="/inc/gg_read2.js"></SCRIPT>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -