本帖最后由 xueseng 于 2014-5-17 20:24 编辑
程序实现雷达目标扫描,但不知道头文件和源代码怎么组织MATLAB的代码,是用多个m文件吗,存储数据是用.mat格式的文件吗??
求大神帮忙转换一下
这是头文件://#define RGates 460 //S BAND 反射率距离库数 //#define VGates 920 //S BAND 速度距离库数 //#define WGates 920 //S BAND 谱宽距离库数 /**/ //CB 雷达的距离库数 #define RGates 800 //C BAND 反射率距离库数 #define VGates 1600 //C BAND 速度距离库数 #define WGates 1600 //C BAND 谱宽距离库数 #define MaxCuts 20 //最大仰角层数 #define MaxRads 360 //每层仰角上的方位数,每度保留一个径向 #define CODE_INVALID 0 //编码值中的特殊标记,表示无有效观测数据 #define CODE_RANFOLD 1 //编码值中的特殊标记,表示有距离模糊 #define VALUE_INVALID -999. //实际值中的特殊标记,表示无有效观测数据 #define VALUE_RANFOLD 999. //实际值中的特殊标记,表示有距离模糊 #define RES_POINT_FIVE 2 //速度精度类型,代表的精度为0.5 M/S #define RES_ONE_POINT 4 //速度精度类型,代表的精度为1.0 M/S #define VOL_BEG 3 //体扫开始状态标志 #define VOL_END 4 //体扫结束状态标志 #define ELV_BEG 0 //仰角开始状态标志 #define ELV_END 2 //仰角结束状态标志 #define RADIAN 3.14159/180. // //tagBaseData 98D雷达信息结构(目标结构) typedef struct tagBaseData { unsigned short temp1[7]; //保留 unsigned short RadarStatus; //1 - 表示为雷达数据 unsigned short temp2[6]; //保留 unsigned int mSeconds; //径向数据收集时间 unsigned short JulianDate; //从1970/1/1起的日期 unsigned short URange; //不模糊距离 unsigned short Az; //方位角度 unsigned short RadialNumber; //径向数据序号 unsigned short RadialStatus; //径向数据状态 unsigned short El; //仰角 unsigned short ElNumber; //体扫内的仰角编号 short RangeToFirstGateOfRef; //第一个反射率数据表示的实际距离(m) short RangeToFirstGateOfDop; //第一个多普勒数据表示的实际距离(m) unsigned short GateSizeOfReflectivity; //反射率数据的距离库长(m) unsigned short GateSizeOfDoppler; //多普勒数据的距离库长(m) unsigned short GatesNumberOfReflectivity; //反射率数据的距离库数 unsigned short GatesNumberOfDoppler; //多普勒数据的距离库数 unsigned short CutSectorNumber; //扇区号 unsigned int CalibrationConst; //标定常数 unsigned short PtrOfReflectivity; //反射率数据指针 unsigned short PtrOfVelocity; //速度数据指针 unsigned short PtrOfSpectrumWidth; //谱宽数据指针 unsigned short ResolutionOfVelocity; //多普勒速度分辨率 unsigned short VcpNumber; //体扫号 unsigned short temp4[4]; //保留 unsigned short PtrOfArcReflectivity; //反射率数据指针 unsigned short PtrOfArcVelocity; //速度数据指针 unsigned short PtrOfArcWidth; //谱宽数据指针 unsigned short Nyquist; //不模糊速度 unsigned short temp46; //保留 unsigned short temp47; //保留 unsigned short temp48; //保留 unsigned short CircleTotal; //仰角数 unsigned char temp5[30]; //保留 unsigned char Echodata[RGates+VGates+WGates]; //129-588 共460字节反射率数据 unsigned char temp[4]; //保留 //129-1508 共1380字节速度数据 //129-2428 共2300字节谱宽数据 }RADIALDATA; float RData[MaxCuts][MaxRads][RGates]; float VData[MaxCuts][MaxRads][VGates]; float WData[MaxCuts][MaxRads][WGates]; float Elevation[MaxCuts]; // void DispSpw(CDC * pDC, CPoint cp, int r); // void DispVel(CDC * pDC, CPoint cp, int r); // void DispRef(CDC *pDC, CPoint cp, int r); int NumValidCuts; bool SavedataIntoFiles(); bool ReadBaseData(char filename[80]); RADIALDATA* pOneRadial; float DecodeSpw(unsigned char code); float DecodeVel(unsigned char code, short ResType); float DecodeRef(unsigned char code);
这是源程序:#include "DataBase.h" #include #include #include //************************************************************************// //* 1)在主函数中设置基数据文件名,并调用ReadBaseData(),SavedataIntoFiles //* 两个函数,分别进行读数据和写数据到文件中的操作 //* 2)定义了一个变量和4个数组: //* NumValidCuts I*4, 记录当前体扫的有效仰角数(指角度不同的仰角) //* Elevation[], R*4, 存放各层仰角 //* RData[][][], R*4, 存放反射率体扫数据 //* VData[][][], R*4, 存放速度体扫数据 //* WData[][][], R*4, 存放谱宽体扫数据 //* 3)将三种基数据分别保存到3个文件中,以二进制的格式存放. //* RefArray.dat 按顺序保存下列数据 //* NumValidCuts I4 //* Elevation[] NumValidCuts*R4 BYTES //* RData[][][] NumValidCuts*MaxRads*RGates*R4 BYTES //* VelArray.dat 按顺序保存下列数据 //* NumValidCuts I4 //* Elevation[] NumValidCuts*R4 BYTES //* VData[][][] NumValidCuts*MaxRads*VGates*R4 BYTES //* SpwArray.dat 按顺序保存下列数据 //* NumValidCuts I4 //* Elevation[] NumValidCuts*R4 BYTES //* WData[][][] NumValidCuts*MaxRads*WGates*R4 BYTES //* 4)对本程序作很小的改动,就可以分别读取C波段雷达基数据和S波段雷达基数据, //* 在DataBase.h头文件中,有如下几行代码,用来定义距离库长: //* ... ... //* SA,SB雷达的距离库数 //* #define RGates 460 //S BAND 反射率距离库数 //* #define VGates 920 //S BAND 速度距离库数 //* #define WGates 920 //S BAND 谱宽距离库数 //* CB 雷达的距离库数 //* #define RGates 800 //C BAND 反射率距离库数 //* #define VGates 1600 //C BAND 速度距离库数 //* #define WGates 1600 //C BAND 谱宽距离库数 //* ... ... //* 默认情况下可读S波段(SA,SB)雷达基数据, 定义C波段距离库长的代码被注释, //* 如果需要读C波段(CB)雷达基数据,只需使定义C波段距离库长的代码有效, //* 注释定义S波段距离库长的代码 //*************************************************************************// //* MAIN函数, //* 1)在其中设置基数据文件名,调用ReadBaseData函数,将基数据读出到数组中。 //* 2)调用SavedataIntoFiles函数,将基数据数组中的数据分别保存到3个文件中。 void main() { char filename[]=/*"archive2.001";*/"2006062510.43A";//"ARCHIVE2.189";// bool res; printf("Begin reading...\n"); res=ReadBaseData(filename); printf("Begin saving...\n"); if(res) SavedataIntoFiles(); printf("Complete!\n"); return; } //**************************************************************// //* 名称:ReadBaseData(char filename[80]) //* 类型:布耳型,若读文件操作失败(体扫不完整等),返回FALSE。 //* 功能:从基数据文件中读出仰角,反射率,速度,谱宽数据,保存到 //* 数组中。 //* 参数:filename,基数据文件名 //**************************************************************// bool ReadBaseData(char filename[80]) { FILE *fp=0; int FstBin,LstBin,BinNum; float CurAz,CurEl; int ElIndex,AzIndex,BnIndex; int ptrPos; size_t readSize; int fileEndFlag; bool VolBeg=false; bool VolEnd=false; bool RFlag,VFlag,WFlag; fp = fopen(filename,"rb"); if(fp==0) return false; pOneRadial = 0; pOneRadial = (RADIALDATA*)malloc(sizeof(RADIALDATA)); if(pOneRadial==0) return false; //Initialize array for(ElIndex=0; ElIndexRadialStatus == VOL_BEG) { ElIndex=0; CurEl = float((pOneRadial->El/8.)*(180./4096.)); Elevation[ElIndex] = CurEl; VolBeg = true; //output text information // TRACE("VCP number is %3d\n",pOneRadial->VcpNumber); printf("VCP number is %3d\n",pOneRadial->VcpNumber); // TRACE("Elevation %3d (%5.2f Degree) start...\n",ElIndex+1,CurEl); printf("Elevation %3d (%5.2f Degree) start...\n",ElIndex+1,CurEl); } //Find the beginning of the volume scan if(!VolBeg) continue; //Start an elevation if(pOneRadial->RadialStatus == ELV_BEG) { CurEl = float((pOneRadial->El/8.)*(180./4096.)); if(CurEl-Elevation[ElIndex] > 0.4) {//different elevation angle ElIndex++; Elevation[ElIndex] = CurEl; } // TRACE("Elevation %3d (%5.2f Degree) start...\n",ElIndex+1,CurEl); printf("Elevation %3d (%5.2f Degree) start...\n",ElIndex+1,CurEl); } //Start an elevation if(pOneRadial->RadialStatus == VOL_END) VolEnd=true; // if(pOneRadial->RadialStatus == ELV_BEG || pOneRadial->RadialStatus == VOL_BEG) //Calculate azimuth angle and Azimuth Index CurAz = float((pOneRadial->Az/8.)*(180./4096.)); if(CurAz >= 360.) CurAz = CurAz-360.; AzIndex = int(CurAz+0.5); //what kind of data in this cut if(pOneRadial->PtrOfReflectivity !=0) RFlag=true; if(pOneRadial->PtrOfVelocity !=0) VFlag=true; if(pOneRadial->PtrOfSpectrumWidth !=0) WFlag=true; //Save reflectivity data into the array if(RFlag) { //Get first bin, last bin, and number of bins FstBin = int(pOneRadial->RangeToFirstGateOfRef/pOneRadial->GateSizeOfReflectivity+0.5); BinNum = pOneRadial->GatesNumberOfReflectivity; if(FstBin<0) { BinNum = FstBin+BinNum; FstBin = -1*FstBin; } LstBin = FstBin + BinNum; ptrPos = pOneRadial->PtrOfReflectivity; //Save data for(BnIndex=FstBin; BnIndexEchodata[ptrPos+BnIndex]); } //Save velocity data into the array if(VFlag) { //Get first bin, last bin, and number of bins FstBin = int(pOneRadial->RangeToFirstGateOfDop/pOneRadial->GateSizeOfDoppler+0.5); BinNum = pOneRadial->GatesNumberOfDoppler; if(FstBin<0) { BinNum = FstBin+BinNum; FstBin = -1*FstBin; } LstBin = FstBin + BinNum; ptrPos = pOneRadial->PtrOfVelocity; //Save data for(BnIndex=FstBin; BnIndexEchodata[ptrPos+BnIndex],pOneRadial->ResolutionOfVelocity); } //Save spectrum width data into the array if(WFlag) { //Get first bin, last bin, and number of bins FstBin = int(pOneRadial->RangeToFirstGateOfDop/pOneRadial->GateSizeOfDoppler+0.5); BinNum = pOneRadial->GatesNumberOfDoppler; if(FstBin<0) { BinNum = FstBin+BinNum; FstBin = -1*FstBin; } LstBin = FstBin + BinNum; ptrPos = pOneRadial->PtrOfSpectrumWidth; //Save data for(BnIndex=FstBin; BnIndexEchodata[ptrPos+BnIndex]); } }while(fileEndFlag==0 && !VolEnd && !(readSize<1)); if(!VolEnd && VolBeg) { fclose(fp); free(pOneRadial); printf("Error! Incomplete Volume Scan\n"); // TRACE("Error! Incomplete Volume Scan\n"); return false; } NumValidCuts = ElIndex+1; fclose(fp); free(pOneRadial); return true; } //**************************************************************// //* 名称:DecodeRef(unsigned char code) //* 类型:实型,返回解码后的反射率(DBZ)。 //* 功能:将读出的反射率数据解码。 //* 参数:code,无符号的BYTE型,读出的反射率编码值。 //**************************************************************// float DecodeRef(unsigned char code) { if(code==CODE_INVALID) return VALUE_INVALID; else if(code==CODE_RANFOLD) return VALUE_RANFOLD; else return (float((code-2.)/2.-32.5)); } //**************************************************************// //* 名称:DecodeVel(unsigned char code) //* 类型:实型,返回解码后的径向速度(M/S)。 //* 功能:将读出的径向速度数据解码。 //* 参数:code,无符号的BYTE型,读出的径向速度编码值; //* ResType,2字节整型,速度精度标记,精度不同,解码方式不同 //* ResType = 2:精度为0.5 M/S //* ResType = 4:精度为1.0 M/S //**************************************************************// float DecodeVel(unsigned char code, short ResType) { if(code==CODE_INVALID) return VALUE_INVALID; else if(code==CODE_RANFOLD) return VALUE_RANFOLD; else { if(ResType==RES_POINT_FIVE) //0.5 m/s return (float((code-2.)/2.-63.5)); else return (float((code-2)-127.)); } } //**************************************************************// //* 名称:DecodeSpw(unsigned char code) //* 类型:实型,返回解码后的谱宽(M/S)。 //* 功能:将读出的谱宽数据解码。 //* 参数:code,无符号的BYTE型,读出的谱宽编码值。 //**************************************************************// float DecodeSpw(unsigned char code) { if(code==CODE_INVALID) return VALUE_INVALID; else if(code==CODE_RANFOLD) return VALUE_RANFOLD; else return (float((code-2.)/2.-63.5)); } //**************************************************************// //* 名称:SavedataIntoFiles() //* 类型:布耳型,保存数组到文件中的操作如果出错,返回FALSE。 //* 功能:将反射率数组,速度数组,谱宽数组,仰角数组分别保存到3个文件中。 //* RefArray.dat中保存仰角数,仰角,和体扫反射率数组的数据 //* VelArray.dat中保存仰角数,仰角,和体扫速度数组的数据 //* spwArray.dat中保存仰角数,仰角,和体扫谱宽数组的数据 //* 数据以二进制的方式保存,存放顺序: //* 1)当前仰角层数,类型为4字节整型,长度为4字节 //* 2)有效层数的仰角,类型为4字节实型,长度为4*仰角层数 字节 //* 3)R,V或W体扫数据,类型为4字节实型,长度为4*MaxRads*Gates**仰角层数 字节 //* 参数:code,无符号的BYTE型,读出的谱宽编码值。 //**************************************************************// bool SavedataIntoFiles() { FILE *fpR=0,*fpV=0,*fpW=0; char fileR[] = "RefArray.dat"; char fileV[] = "VelArray.dat"; char fileW[] = "spwArray.dat"; //Open Ref. File for Saving fpR = fopen(fileR,"wb"); if(fpR==0) return false; //Save Ref. Array fwrite(&NumValidCuts,sizeof(NumValidCuts),1,fpR); fwrite(Elevation,sizeof(float),NumValidCuts,fpR); fwrite(RData,sizeof(float),NumValidCuts*MaxRads*RGates,fpR); fclose(fpR); //Open Ref. File for Saving fpV = fopen(fileV,"wb"); if(fpV==0) return false; //Save Ref. Array fwrite(&NumValidCuts,sizeof(NumValidCuts),1,fpV); fwrite(Elevation,sizeof(float),NumValidCuts,fpV); fwrite(VData,sizeof(float),NumValidCuts*MaxRads*VGates,fpV); fclose(fpV); //Open Ref. File for Saving fpW = fopen(fileW,"wb"); if(fpW==0) return false; //Save Ref. Array fwrite(&NumValidCuts,sizeof(NumValidCuts),1,fpW); fwrite(Elevation,sizeof(float),NumValidCuts,fpW); fwrite(WData,sizeof(float),NumValidCuts*MaxRads*WGates,fpW); fclose(fpW); return true; }
2014-5-17 20:24 上传
点击文件名下载附件
13.29 KB, 下载次数: 2962
2014-5-17 20:24 上传
点击文件名下载附件
3.77 KB, 下载次数: 720