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

📄 imagerd(cpp).txt

📁 模块的目的/功能: 完成对回波数据的成像Rang-doppler算法
💻 TXT
📖 第 1 页 / 共 2 页
字号:
        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 + -