64,648
社区成员
发帖
与我相关
我的任务
分享
void PeakSearch2(int n,int m,int H,double*argA,int*argB,double C)
//n是道数
//H是峰的半宽
//m是起始道数
//两参数可指定为常数
{
//寻峰函数
double a=0;//argB寻峰结果数组
int num=0;//C为预先给定的常数
bool first=true;
bool is=false;
int numb=0;
for(int i=m;i<n-m;i++)
{
numb++;
double x = IsPossiblePeak(i,m,H,argA);
if(IsPossiblePeak(i,m,H,argA)>C)
{
if(first==true)
{
first=false;
is=true;
a=IsPossiblePeak(i,m,H,argA);
argB[num]=i;
}
else
{
if(a<IsPossiblePeak(i,m,H,argA))
{
a=IsPossiblePeak(i,m,H,argA);
argB[num]=i;
}
}
}
else
{
if(is==true)
{
first=true;
is=false;
num++;
}
}
}
}
//测试论文代码寻峰方法
double Gauss(int i,int m,int H)//高斯函数
{
double a=i;
double b=H;
double c=4*log((double)2)*(a/b)*(a/b);
return exp(-c);
}//H为半高宽,2m+1为窗宽
double SimilarGaussConstant(int m,int H)//类高斯常数
{
double sum=0;
for(int i=-m;i<=m;i++)
sum+=Gauss(i,m,H);
return sum/(2*m+1);
}
double SimilarGauss(int i,int m,int H)//类高斯函数
{
return Gauss(i,m,H)-SimilarGaussConstant(m,H);
}
double SimilarGauss2(int i,int m,int H)//类高斯函数的平方
{
return SimilarGauss(i,m,H)*SimilarGauss(i,m,H);
}
double IsPossiblePeak(int j,int m,int H,double*argA)
{//可能峰区判断函数
double a=0;
double b=0;
for(int i=-m;i<=m;i++)
{
a+=SimilarGauss(i,m,H)*argA[j+i];
b+=SimilarGauss2(i,m,H)*argA[j+i];
}
if(b!=0)
return a/sqrt(b);
else
return 0;
}//argA为待分析数组