📄 wi.cpp
字号:
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 + -