📄 dealiase.cpp
字号:
// Dealiase.cpp: implementation of the CDealiase class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
//#include "Radar.h"
#include "Dealiase.h"
#include "math.h" // Add by me
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
#include "Reference.h"
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CDealiase::CDealiase()
{
m_iHigh = (int)(POINT*0.15);
m_Infor = new int[POINT];
m_cHead = new char[384];
}
CDealiase::~CDealiase()
{
delete [] m_cHead;
delete [] m_Infor;
}
////////////////////////////////////////////////////////////////////
// DealiaseVelocity()函数的功能说明:
// 功能:
// 主要完成对双多普勒雷达反演方法中所使用的速度资料的退模糊处理。
// 思路主要是按徐晖于一九九九年二月提出的“逐点还原算法”进行退模糊。
//
// 参数:
// lpFile是一指针,用来传递一打开文件的句柄。
BOOL CDealiase::Dealiase(CFile *oFile)
{
short int *Buffer=new short int[POINT];
short int *iBuff=new short int[POINT];
unsigned char cBuff[4];
CString fileName=oFile->GetFilePath();
oFile->Read(m_cHead,384);
if (m_cHead[175]!=2 || m_cHead[245]!=0)
return FALSE;
// Create a new file name to save the data
int iNameLength=fileName.GetLength();
fileName.SetAt(iNameLength-1,'d');
CFile pFile(fileName,CFile::modeCreate|CFile::modeWrite);
// already dealiased
m_cHead[245] = 5;
pFile.Write(m_cHead,384);
/////////////////////////////////////////////////////////begin
for (int i=0; i<SWEEP; i++) {//////////////////////////working
for (int j=0; j<POINT; j++) m_Infor[j]=0;
oFile->Read(cBuff,4);
oFile->Read(Buffer,POINT*2);
for ( j=0; j<POINT; j++) {
// Get the negative velocity
if (Buffer[j]>127)
iBuff[j] = Buffer[j]-255;
else
iBuff[j]=Buffer[j];
}
for (j=1;j<POINT;j++)
if(iBuff[j-1]!=0 && iBuff[j]==0) iBuff[j] = iBuff[j-1];
/////////////////////////////////////////////////////////////
// 参数m_iHighSegment是一个取定的高速标准值,可根据模糊速度的
// 具体情况来取定,这个参数放在DealiaseData.h中
for (j=1; j<POINT; j++) {// dealaliase radar data
if(iBuff[j]*iBuff[j-1]<0) {
// 获得速度模糊的位置、并给出标记
int iAliaseSn=ReturnAliaseSign(iBuff,&j);
// 取得模糊标记后,进行速度退模糊
if(iBuff[j-1]<-m_iHigh && iAliaseSn==1) {
int nCurPlace = j;
for(int k=nCurPlace; k<POINT; k++)
if(iBuff[k]>0) m_Infor[k] = -1;
if(k >= POINT-1) break;
}
if(iBuff[j-1]>m_iHigh && iAliaseSn==1) {
int nCurPlace = j;
for(int k=nCurPlace; k<256; k++)
if(iBuff[k]<0) m_Infor[k] = 1;
if(k >= POINT-1) break;
}
}
}
for (j=0; j<POINT; j++) {
iBuff[j] = m_Infor[j]*255+iBuff[j];
if (Buffer[j]==0) iBuff[j] = 0;
}
pFile.Write(cBuff,4);
pFile.Write(iBuff,POINT*2);
}
pFile.Close();
oFile->Close();
delete [] Buffer;
delete [] iBuff;
return TRUE;
}
////////////////////////////////////////////////////////////////////
// 判断、找出每一径向上的模糊位置,并返回1或0
int CDealiase::ReturnAliaseSign(short*iBuff, int*iSign)
{
int nCurrent = *iSign, nLength = 0;
do{
nLength ++;
nCurrent ++;
}while(fabs(iBuff[nCurrent])>m_iHigh);
// 判断高速区、并给出模糊标志
if(nLength>4 && fabs(iBuff[*iSign-1])>m_iHigh/2)
return 1;
else
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -