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

📄 wi.cpp

📁 该程序用于在线数字签名,可以将读入的图像与用户开户时录入的图像比较,从而确定身份的合法性.
💻 CPP
📖 第 1 页 / 共 4 页
字号:
	for(i = 0;i<dataLen;i++)
	{
		data[i] = com1[i].r;
	}
}

/****************************************************************************/
/*功能:fft算法
/*参数:td-输入
/*	    fd-输出
/*      r-维数
/****************************************************************************/
void CWi::fft(complex *td, complex *fd, int r)
{
	// 付立叶变换点数
	long	count;
	
	// 循环变量
	int		i,j,k;
	
	// 中间变量
	int		bfsize,p;
	
	// 角度
	double	angle;
	
	complex *w,*x1,*x2,*x;
	
	// 计算付立叶变换点数
	count = 1 << r;
	
	// 分配运算所需存储器
	w = (complex *)malloc(sizeof(complex)*count/2);
	x1 = (complex *)malloc(sizeof(complex)*count);
	x2 = (complex *)malloc(sizeof(complex)*count);
	
	// 计算加权系数
	for(i = 0; i < count / 2; i++)
	{
		angle = -i * PI * 2 / count;
		w[i].r = cos(angle);
		w[i].i = sin(angle);
	}
	
	// 将时域点写入X1
	memcpy(x1, td, sizeof(complex) * count);
	
	// 采用蝶形算法进行快速付立叶变换
	for(k = 0; k < r; k++)
	{
		for(j = 0; j < 1 << k; j++)
		{
			bfsize = 1 << (r-k);
			for(i = 0; i < bfsize / 2; i++)
			{
				p = j * bfsize;
				x2[i + p].r = x1[i + p].r + x1[i + p + bfsize / 2].r;
				x2[i + p].i = x1[i + p].i + x1[i + p + bfsize / 2].i;
				x2[i + p + bfsize / 2].r = (x1[i + p].r - x1[i + p + bfsize / 2].r) * w[i * (1<<k)].r
										  -(x1[i + p].i - x1[i + p + bfsize / 2].i) * w[i * (1<<k)].i;
				x2[i + p + bfsize / 2].i = (x1[i + p].i - x1[i + p + bfsize / 2].i) * w[i * (1<<k)].r
										  +(x1[i + p].r - x1[i + p + bfsize / 2].r) * w[i * (1<<k)].i;
			}
		}
		x  = x1;
		x1 = x2;
		x2 = x;
	}
	
	// 重新排序
	for(j = 0; j < count; j++)
	{
		p = 0;
		for(i = 0; i < r; i++)
		{
			if (j&(1<<i))
			{
				p+=1<<(r-i-1);
			}
		}
		fd[j]=x1[p];
	}
	
	// 释放内存
	free(w);
	free(x1);
	free(x2);
}

/****************************************************************************/
/*功能:逆fft变换
/*参数:fd-输入
/*      td-输出
/*      r-维数
/****************************************************************************/
void CWi::ifft(complex *fd, complex *td, int r)
{
	// 付立叶变换点数
	long 	count;
	
	// 循环变量
	int		i;
	
	complex  *x;
	
	// 计算付立叶变换点数
	count = 1 << r;
	
	// 分配运算所需存储器
	x = (complex *)malloc(sizeof(complex)*count);
	// 将频域点写入X
	memcpy(x, fd, sizeof(complex) * count);
	
	// 求共轭
	for(i = 0; i < count; i++)
	{
		x[i].r = x[i].r;
		x[i].i = -x[i].i;
	}
	
	// 调用快速付立叶变换
	fft(x, td, r);
	
	// 求时域点的共轭
	for(i = 0; i < count; i++)
	{
		td[i].r = td[i].r/count;
		td[i].i = -td[i].i/count;
	}
	
	// 释放内存
	free(x);
}

/****************************************************************************/
/*
/*	
/*  
/****************************************************************************/

double CWi::OriginalDistance(int sample1,int sample2)
{
	//unsigned char Path[DTWRESULTNUM][DTWRESULTNUM];
	CWi::Sample *s0 =(CWi::Sample*)trainSampleArray.GetAt(sample1);
	CWi::Sample *s1 =(CWi::Sample*)trainSampleArray.GetAt(sample2);
	//SamplePress2(s0->pressTotal2,s0->pressTotal,s0->effectDataNum/4,4);
	//SamplePress2(s1->pressTotal2,s1->pressTotal,s1->effectDataNum/4,4);
	//double result = DTWDistanceCompute(s0->pressTotal,s0->effectDataNum/4,
	//									 s1->pressTotal,s1->effectDataNum/4);
	double result = DTWDistanceFun(s0->pressTotal2,s0->effectDataNum,
								s1->pressTotal2,s1->effectDataNum,100);
	return result;
}
/****************************************************************************/
/*
/*	
/*  
/****************************************************************************/

double CWi::WaveCrestPosDistance(int sample1,int sample2)
{
	//unsigned char Path[DTWRESULTNUM][DTWRESULTNUM];
	
	int num0,num1;
	int pos[1000];
	double temp1[1000],temp2[1000];
	CWi::Sample *s0 =(CWi::Sample*)trainSampleArray.GetAt(sample1);
	CWi::Sample *s1 =(CWi::Sample*)trainSampleArray.GetAt(sample2);
 	num0 = WaveCrest(s0->pressTotal2,s0->pressTotal,pos,s0->effectDataNum,5);
	for(int i=0;i<num0-1;i++)
	{
		temp1[i] = pos[i+1]-pos[i];
	}
	num1 = WaveCrest(s1->pressTotal2,s1->pressTotal,pos,s1->effectDataNum,5);
	for(i=0;i<num1-1;i++)
	{
		temp2[i] = pos[i+1]-pos[i];
	}
	
	double result = DTWDistanceFun(temp1,num0-1,temp2,num1-1,100);
									 
	return result;

}
/****************************************************************************/
/*
/*	
/*  
/****************************************************************************/

double CWi::WaveCrestDistance(int sample1,int sample2)
{
	 
	int pos[500];
	int num0,num1;
 	CWi::Sample *s0 =(CWi::Sample*)trainSampleArray.GetAt(sample1);
	CWi::Sample *s1 =(CWi::Sample*)trainSampleArray.GetAt(sample2);
 	num0=WaveCrest(s0->pressTotal2,s0->pressTotal,pos,s0->effectDataNum,5);
	num1=WaveCrest(s1->pressTotal2,s1->pressTotal,pos,s1->effectDataNum,5);
 
	
	double result = DTWDistanceFun(s0->pressTotal,num0,s1->pressTotal,num1,100);
	return result;

}
/****************************************************************************/
/*
/*	
/*  
/****************************************************************************/

double CWi::XposDistance(int sample1,int sample2)
{
	CWi::Sample *s0 =(CWi::Sample*)trainSampleArray.GetAt(sample1);
	CWi::Sample *s1 =(CWi::Sample*)trainSampleArray.GetAt(sample2);
	double result = DTWDistanceFun(s0->xLoc2,s0->effectDataNum,
										 s1->xLoc2,s1->effectDataNum,100);
	return result;

}
/****************************************************************************/
/*
/*	
/*  
/****************************************************************************/

double CWi::YposDistance(int sample1,int sample2)
{
	CWi::Sample *s0 =(CWi::Sample*)trainSampleArray.GetAt(sample1);
	CWi::Sample *s1 =(CWi::Sample*)trainSampleArray.GetAt(sample2);
 	double result = DTWDistanceFun(s0->yLoc2,s0->effectDataNum,
										 s1->yLoc2,s1->effectDataNum,100);
	return result;

}
/****************************************************************************/
/*
/*	
/*  
/****************************************************************************/

double CWi::XYposDistance(int sample1,int sample2)
{

	CWi::Sample *s0 =(CWi::Sample*)trainSampleArray.GetAt(sample1);
	CWi::Sample *s1 =(CWi::Sample*)trainSampleArray.GetAt(sample2);

	double *diff0 = (double *)malloc(sizeof(double)*(s0->effectDataNum));
	double *diff1 = (double *)malloc(sizeof(double)*(s1->effectDataNum));
	double *dis0 = (double *)malloc(sizeof(double)*(s0->effectDataNum));
	double *dis1 = (double *)malloc(sizeof(double)*(s1->effectDataNum));
	
	DiffSample (s0->xLoc2, diff0, s0->effectDataNum);	//微分
	DiffSample (s0->yLoc2, diff1, s0->effectDataNum);
	for(int i = 0;i<s0->effectDataNum;i++)
	{
		dis0[i] = SQUARE(diff0[i])+SQUARE(diff1[i]);
	}
	DiffSample (s1->xLoc2, diff0, s1->effectDataNum);	//微分
	DiffSample (s1->yLoc2, diff1, s1->effectDataNum);

	for(i = 0;i<s1->effectDataNum;i++)
	{
		dis1[i] = SQUARE(diff0[i])+SQUARE(diff1[i]);
	}

	double result = DTWDistanceFun(dis0,s0->effectDataNum,dis1,s1->effectDataNum,100);

	return result;

}
/****************************************************************************/
/*
/*	
/*  
/****************************************************************************/

double CWi::GenTemplatePress()
{
	int num = trainSampleArray.GetSize();
	int retval;
	CWi::Sample *s0 = (CWi::Sample *)trainSampleArray.GetAt(0);
	CWi::Sample *s1 = (CWi::Sample *)trainSampleArray.GetAt(1);
	templen = DTWTemplate(s0->pressTotal2,s0->effectDataNum,s1->pressTotal2,s1->effectDataNum,dtwtemplate,1,20,&threshold);
	if(templen == -1)
	{
		return -1;
	}
	for(int i = 2 ;i<num;i++)
	{
		CWi::Sample *s = (CWi::Sample *)trainSampleArray.GetAt(i);
		retval = DTWTemplate(dtwtemplate,templen,s->pressTotal2,s->effectDataNum,dtwtemplate,i,20,&threshold);
		if(templen == -1)
		{	
			return -1;
		}
	}

	return retval;
}
/****************************************************************************/
/*
/*	
/*  
/****************************************************************************/

int  CWi::RecogTemplatePress(double *distance,int index)
{
	double retval;
	CWi::Sample *s = (CWi::Sample *)testSampleArray.GetAt(index);
	retval = DTWDistanceFun(dtwtemplate,templen,s->pressTotal2,s->effectDataNum,100);
	*distance = retval;
	if(retval >=threshold*1.0)
	{
		return -1;
	}
	else
	{
		return 1;
	}


}
/****************************************************************************/
/*
/*	
/*  
/****************************************************************************/

double CWi::GenTemplateXpos()
{
	int num = trainSampleArray.GetSize();
	int retval;
	CWi::Sample *s0 = (CWi::Sample *)trainSampleArray.GetAt(0);
	CWi::Sample *s1 = (CWi::Sample *)trainSampleArray.GetAt(1);
	templenx = DTWTemplate(s0->xLoc2,s0->effectDataNum,s1->xLoc2,s1->effectDataNum,dtwtemplatex,1,20,&thresholdx);
	if(templenx == -1)
	{
		return -1;
	}
	for(int i = 2 ;i<num;i++)
	{
		CWi::Sample *s = (CWi::Sample *)trainSampleArray.GetAt(i);
		retval = DTWTemplate(dtwtemplatex,templenx,s->xLoc2,s->effectDataNum,dtwtemplatex,i,20,&thresholdx);
		if(templenx == -1)
		{	
			return -1;
		}
	}
	threshold = thresholdx;
	return retval;
}

/****************************************************************************/
/*
/*	
/*  
/****************************************************************************/
int  CWi::RecogTemplateXpos(double *distance,int index)
{
	double retval;
	CWi::Sample *s = (CWi::Sample *)testSampleArray.GetAt(index);
	retval = DTWDistanceFun(dtwtemplate,templen,s->xLoc2,s->effectDataNum,100);
	*distance = retval;
	if(retval >=threshold*1.0)
	{
		return -1;
	}
	else
	{
		return 1;
	}


}
/****************************************************************************/
/*
/*	
/*  
/****************************************************************************/

double CWi::GenTemplateYpos()
{
	int num = trainSampleArray.GetSize();
	int retval;
	CWi::Sample *s0 = (CWi::Sample *)trainSampleArray.GetAt(0);
	CWi::Sample *s1 = (CWi::Sample *)trainSampleArray.GetAt(1);
	templeny = DTWTemplate(s0->yLoc2,s0->effectDataNum,s1->yLoc2,s1->effectDataNum,dtwtemplatey,1,20,&thresholdy);
	if(templeny == -1)
	{
		return -1;
	}
	for(int i = 2 ;i<num;i++)
	{
		CWi::Sample *s = (CWi::Sample *)trainSampleArray.GetAt(i);
		retval = DTWTemplate(dtwtemplatey,templeny,s->yLoc2,s->effectDataNum,dtwtemplatey,i,20,&thresholdy);
		if(templeny == -1)
		{	
			return -1;
		}
	}
	
	threshold = thresholdy;
	return retval;
}
/****************************************************************************/
/*
/*	
/*  
/****************************************************************************/

double CWi::GenTemplateVector()
{
	int num = trainSampleArray.GetSize();
	int retval;
	CWi::Sample *s0 = (CWi::Sample *)trainSampleArray.GetAt(0);
	CWi::Sample *s1 = (CWi::Sample *)trainSampleArray.GetAt(1);
	templenvec = VDTWTemplate(s0->dataVec,s0->effectDataNum,s1->dataVec,s1->effectDataNum,dtwtemplatev,1,50,&thresholdvec);
	if(templen == -1)
	{
		return -1;
	}
	for(int i = 2 ;i<num;i++)
	{
		CWi::Sample *s = (CWi::Sample *)trainSampleArray.GetAt(i);
		retval = VDTWTemplate(dtwtemplatev,templenvec,s->dataVec,s->effectDataNum,dtwtemplatev,i,50,&thresholdvec);
		if(templen == -1)
		{	
			return -1;
		}
	}
	
	threshold = thresholdvec;
	return retval;
}
/****************************************************************************/
/*
/*	
/*  
/****************************************************************************/

int  CWi::RecogTemplateVec(double *distance,int index)
{
	double retval;
	CWi::Sample *s = (CWi::Sample *)testSampleArray.GetAt(index);
	retval = VDTWDistanceFun(dtwtemplatev,templenvec,s->dataVec,s->effectDataNum,100);
	*distance = retval;
	if(retval >= thresholdvec*1.05)
	{
		return -1;
	}
	else
	{
		return 1;
	}

}
/****************************************************************************/
/*
/*	
/*  
/****************************************************************************/


int  CWi::RecogTemplateYpos(double *distance,int index)
{
	double retval;
	CWi::Sample *s = (CWi::Sample *)testSampleArray.GetAt(index);
	retval = DTWDistanceFun(dtwtemplate,templen,s->yLoc2,s->effectDataNum,100);
	*distance = retval;
	if(retval >=threshold*1.0)
	{
		return -1;
	}
	else
	{
		return 1;
	}

}

/****************************************************************************/
/*功能:总和利用X,Y坐标生成模板
/****************************************************************************/
double CWi::GenTemplateXY()
{
	int num = trainSampleArray.GetSize();
	int retval;
	CWi::Sample *s0 = (CWi::Sample *)trainSampleArray.GetAt(0);
	CWi::Sample *s1 = (CWi::Sample *)trainSampleArray.GetAt(1);
	templeny = DTWTemplate(s0->yLoc2,s0->effectDataNum,s1->yLoc2,s1->effectDataNum,dtwtemplatey,1,20,&thresholdy);
	if(templeny == -1)
	{
		return -1;
	}
	for(int i = 2 ;i<num;i++)
	{
		CWi::Sample *s = (CWi::Sample *)trainSampleArray.GetAt(i);
		retval = DTWTemplate(dtwtemplatey,templeny,s->yLoc2,s->effectDataNum,dtwtemplatey,i,20,&thresholdy);
		if(templeny== -1)
		{	
			return -1;
		}
	}

⌨️ 快捷键说明

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