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

📄 check.cpp

📁 一个实用超声波滤波算法
💻 CPP
字号:
#include "stdafx.h"
#include "check.h"

//函数名规范:check_
//数据规整化
int check_DataNormal(double * inData,int * outData,int nDataLength,double d_T)
{
	if(inData==NULL) return -1;//输入参数错误!	
	if(outData==NULL) return -2;//输出参数错误!
	int i;	
	
	//高电平起始位置和结束位置
	for(i=0;i<nDataLength;i++)
	{
		outData[i]=0;
	}
	
	for(i=0;i<nDataLength;i++)
	{
		if(inData[i]>=d_T)
		{
			outData[i]=1;
		}
		else
		{
			outData[i]=0;
		}
	}
	return 1;
}

//单通道数据预处理
int check_DataPrepare(int * inData,int * outData,
                                          int nDataLength,int nWidth_T,int nDistance_T)
{
	if(inData==NULL) return -1;//输入参数错误!	
	if(outData==NULL) return -2;//输出参数错误!
	int i;
	int j;
	int k;
	
	//高电平起始位置和结束位置
	int iBegin1;
	int iEnd1;
//	int iBegin2;
//	int iEnd2;	
	
	//高电平长度
//	int tWidth1;
//	int tWidth2;
	
	//循环控制参数
	int nEndFlag=0;
	int nContinueFlag=1;	
	
	//初始化输出数据
	for(i=0;i<nDataLength;i++)
	{
		outData[i]=0;
	}
	
	iBegin1=0;
	iEnd1=0;
	i=0;
	while(i<nDataLength)
	{
		if(inData[i]==1)
		{
			iBegin1=i;
			iEnd1=iBegin1;
			j=iBegin1+1;
			
			//寻找高电平的断点,并将合理的高电平修补
			nContinueFlag=1;
			while((j<nDataLength) && (nContinueFlag))
			{
				while(j<nDataLength)
				{				
					if(inData[j]==0)
					{
						iEnd1=j-1;
						break;//高电平断点
					}
					else
					{
						j++;
					}
				}
				//寻找断点长度				
				while(j<nDataLength)
				{
					if(inData[j]==1)
					{
						break;				
					}
					else
					{
						j++;
					}
				}
				if((j-iEnd1-1)<=nDistance_T)
				{
					iEnd1=j-1;
				}
				else//符合高电平合并的条件,并且已无新的合并可能
				{
					for(k=iBegin1;k<=iEnd1;k++)
					{
						outData[k]=1;						
					}
					nContinueFlag=0;
				}
			}
			i=j;			
			
		}	
		else
		{
			i++;
		}	
	}
	
	//去除宽度小于阈值高电平部分
	i=0;
	j=0;	
	while(i<nDataLength)
	{
		if(outData[i]==1)
		{
			iBegin1=i;
			iEnd1=iBegin1;
			j=iBegin1;
			while(j<nDataLength)
			{
				if(outData[j]==0)
				{
					break;
				}
				j++;
			}
			
			
			//去除不符合条件的高电平
			if((j-iBegin1)<nWidth_T)
			{
				iEnd1=j-1;
				for(k=iBegin1;k<=iEnd1;k++)
				{
					outData[k]=0;
				}
			}
			
			i=j;			
		}
		else
		{
			i++;
		}
	}
	return 1;
	
		
}

int check_ConvertDataFormat(int * inData,int nDataLength)
{
	if(inData==NULL) return -1;//输入参数错误
	int i=0;
	for(i=0;i<nDataLength;i++)
	{
		if(inData[i]==1)
		{
			inData[i]=2;
		}
	}
	return 1;
}

int check_ExpandData(int * inData, int nDataLength, int nDistance_T)
{
	if(inData==NULL) return -1;//输入参数错误
	int i=0;
	int j=0;
	int k=0;

	int iBegin;
	int iEnd;
 
	while(i<nDataLength)
	{
		if(inData[i]==2)
		{
			j=i+1;
			while(j<nDataLength)
			{
				if(inData[j]==0)
				{
					break;
				}
				j++;
			}
			iBegin=i-nDistance_T;
			iEnd=j-1+nDistance_T;
			if(iBegin<0) iBegin=0;
			if(iEnd>=nDataLength-1) iEnd=nDataLength-1;
			for(k=iBegin;k<=iEnd;k++)
			{
				if(inData[k]==0) inData[k]=1;
				if(inData[k]==2) inData[k]=3;
			}
			i=j;
		}
		else
		{
			i++;
		}
	}
	return 1;
}
int check_DataTwoChannel(int * inDataA, int * inDataB, int * outData,int nDataLength, int nChannelD_T)
{
	if((inDataA==NULL) || (inDataB==NULL)) return -1;//输入参数错误
	if(outData==NULL) return -2;//输出参数错误
	
	int i=0;
    int j=0;
	int k=0;
	
//	int iBegin;
//	int iEnd;

//	int iBegin1;
//	int iEnd1;

	int * sumAB=new int[nDataLength];
	
	check_ConvertDataFormat(inDataA,nDataLength);
    check_ConvertDataFormat(inDataB,nDataLength);
	check_ExpandData(inDataA,nDataLength,nChannelD_T);
	check_ExpandData(inDataB,nDataLength,nChannelD_T);

	for(i=0;i<nDataLength;i++)
	{
		outData[i]=0;
		sumAB[i]=inDataA[i]+inDataB[i];
	}

	//单裂纹,查1 3 * * 3 1 
	//或查2 3 * * 3 1
	//或查1 3 * * 3 2
	i=0;
	while(i<nDataLength-1)
	{
		if(((sumAB[i]==1) || (sumAB[i]==2))&& (sumAB[i+1]==3))
		{
			j=i+2;			
			while(j<nDataLength-1)
			{
				if(sumAB[j]==3) 
				{
					if((sumAB[j+1]==2) || (sumAB[j+1]==1))
					{
						if(inDataA[i+(j+1-i+1)/2]==3)
						{
							outData[i+(j+1-i+1)/2]=1;//A通道
						}
						else
						{
							outData[i+(j+1-i+1)/2]=2;//B通道
						}
						break;
					}
					else
					{
						if(sumAB[j+1]==3)
						{
							j++;
						}
						else
						{
							break;
						}
					}
				}
				else
				{
					j++;
				}
				//j++;
			}						
			i=j;
		}
		else
		{
			i++;
		}
	}

	//交叉,查6
	i=0;
	while(i<nDataLength)
	{
		if(sumAB[i]==6)
		{
			j=i+1;			
			while(j<nDataLength)
			{
				if(sumAB[j]!=6) 
				{
					break;
				}
				j++;
			}
			outData[i+(j-i)/2]=3;//双裂纹				
			i=j;			
		}
		else
		{
			i++;
		}
	}

	//扩展交叉,查3 4 * * 4 3	
	i=0;
	while(i<nDataLength-1)
	{
		if((sumAB[i]==3) && (sumAB[i+1]==4))
		{
			j=i+2;			
			while(j<nDataLength-1)
			{
				if(sumAB[j]==4) 
				{
					if(sumAB[j+1]==3)
					{
						outData[i+(j+1-i+1)/2]=3;//双裂纹
						break;
					}
					else
					{
						break;
					}
				}
				j++;
			}						
			i=j;
		}
		else
		{
			i++;
		}
	}

	//扩展交叉4 * 4 其中*是4或2
    i=0;
	while(i<nDataLength-1)
	{
		if((sumAB[i]<4) && (sumAB[i+1]==4))
		{
			j=i+2;			
			while(j<nDataLength-1)
			{
				if(sumAB[j]!=4)
				{
					if((sumAB[j]==6)) 
					{
						break;
					}					
				}
				
				if(sumAB[j+1]!=4)
				{
					if(sumAB[j+1]==6)
					{
						break;
					}
					else 
					{
						if(sumAB[j+1]!=2)
						{
							outData[i+(j+1-i+1)/2]=3;//交叉孔
							break;
						}
					}
				}
				j++;
			}						
			i=j;
		}
		else
		{
			i++;
		}
	}

	delete [] sumAB;
	return 1;
}

//inDataA和inDataB的值在函数执行的过程中已经改变
int check_Inspection(double * inDataA,double * inDataB, int * outData,int nDataLength,Check_T inCheck_T)
{
	if((inDataA==NULL) || (inDataB==NULL)) return -1;//输入参数错误
	if(outData==NULL) return -2;//输出参数错误

	double dA_T=inCheck_T.dA_T;//高电平门限
	double dB_T=inCheck_T.dB_T;//高电平门限

	int nSingleChannel_Distance_T=inCheck_T.nSingleChannel_Distance_T;//单通道高电平距离门限
	int nAWidth_T=inCheck_T.nAWidth_T;//高电平宽度门限
	int nBWidth_T=inCheck_T.nBWidth_T;
	int nTwoChannel_Distance_T=inCheck_T.nTwoChannel_Distance_T;//双通道高电平距离门限 
    
	//函数的临时工作空间,大约是数据长度的 5 倍
	int * outData1=new int[nDataLength];
	int * outData2=new int[nDataLength];  
	
	int * outData3=new int[nDataLength];
	int * outData4=new int[nDataLength];
	
	check_DataNormal(inDataA,outData1,nDataLength,dA_T);
	check_DataNormal(inDataB,outData2,nDataLength,dB_T);

	check_DataPrepare(outData1,outData3,nDataLength,nAWidth_T,nSingleChannel_Distance_T);
	check_DataPrepare(outData2,outData4,nDataLength,nBWidth_T,nSingleChannel_Distance_T);

	check_DataTwoChannel(outData3,outData4,outData,nDataLength,nTwoChannel_Distance_T);

	delete [] outData1;
	delete [] outData2;
	delete [] outData3;
	delete [] outData4;
	return 1;
}
 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -