findpeaks函数可以获得峰值位置。
10余年的安平网站建设经验,针对设计、前端、开发、售后、文案、推广等六对一服务,响应快,48小时及时工作处理。成都全网营销推广的优势是能够根据用户设备显示端的尺寸不同,自动调整安平建站的显示方式,使网站能够适用不同显示终端,在浏览器中调整网站的宽度,无论在任何一种浏览器上浏览网站,都能展现优雅布局与设计,从而大程度地提升浏览体验。成都创新互联公司从事“安平网站设计”,“安平网站推广”以来,每个客户项目都认真落实执行。
1、a=findpeaks(data),获得data的局部峰值,此方法即峰值点大于相邻两点即可。
2、a,b=findpeaksd(ata),可以返回峰值位置,峰值位置赋予给b。
你的办法估计可行性不高,稍微出个毛刺就不对了。
建议采用fft分析,根据频域的结果判断一个合理值。
#includestdio.h
#include stdlib.h
#include limits.h
#includemalloc.h
#define maxsize 6 //每个波形数据最大采集个数 默认6
typedef struct array1
{
int *data;
struct array1 *next;
}ARR1;
ARR1 *addNewArr(ARR1 *arrHead,ARR1 *arrTail);//插入一组波形数据节点 返回尾节点
int findMaxF(ARR1 *arrHead);//查找最大峰值
int removeMinF(ARR1 *arrHead);//移除最小峰值数据组 返回最小峰值
void printfArr(ARR1 *arrHead);//打印数据链表
int main()
{
ARR1 *arrHead=(ARR1 *)malloc(sizeof(ARR1));
arrHead-next=NULL;
ARR1 *arrTail=NULL;
arrTail=addNewArr(arrHead,arrTail);//想插入几组,就调用几次 我就测试6组
arrTail=addNewArr(arrHead,arrTail);
arrTail=addNewArr(arrHead,arrTail);
arrTail=addNewArr(arrHead,arrTail);
arrTail=addNewArr(arrHead,arrTail);
arrTail=addNewArr(arrHead,arrTail);
printf("采集的原数据组为:\n");
printfArr(arrHead);
printf("最大峰值:%d,最小峰值值:%d\n",findMaxF(arrHead),removeMinF(arrHead));
printf("删除最小峰值数据组后的数据为:\n");
printfArr(arrHead);
return 0;
}
void printfArr(ARR1 *arrHead)//打印数据链表
{
while(arrHead-next!=NULL)
{
printf("%d,%d,%d,%d,%d,%d\n",arrHead-next-data[0],arrHead-next-data[1],arrHead-next-data[2],arrHead-next-data[3],arrHead-next-data[4],arrHead-next-data[5]);
arrHead=arrHead-next;
}
}
ARR1 *addNewArr(ARR1 *arrHead,ARR1 *arrTail)//插入一组波形数据 返回尾节点
{
int *data=(int *)malloc(sizeof(int)*maxsize),i;
printf("采集一组波形数据(最大采集个数%d):",maxsize);
for(i=0;imaxsize;i++)
scanf("%d",data[i]);
ARR1 *arrNew=(ARR1 *)malloc(sizeof(ARR1));
arrNew-data=data;
arrNew-next=NULL;
if(arrHead-next==NULL)//插入第一组数组 作为首节点
arrHead-next=arrNew;
else
arrTail-next=arrNew;
arrTail=arrNew;
return arrTail;
}
int findMaxF(ARR1 *arrHead)//查找最大峰值
{
int i,maxNum=0,maxf=0;
while(arrHead-next!=NULL)
{
maxNum=0;
for(i=0;imaxsize;i++)//获取每组数据的峰值
{
if(arrHead-next-data[i]maxNum)
maxNum=arrHead-next-data[i];
}
if(maxNummaxf)//获取最大峰值
maxf=maxNum;
arrHead=arrHead-next;
}
return maxf;
}
int removeMinF(ARR1 *arrHead)//移除最小峰值数据组 返回最小峰值
{
int i,maxNum=0,minf=INT_MAX;
ARR1 *minDataSave=NULL,*arrHeadSave=arrHead;
while(arrHead-next!=NULL)
{
maxNum=0;
for(i=0;imaxsize;i++)//获取每组数据的峰值
{
if(arrHead-next-data[i]maxNum)
maxNum=arrHead-next-data[i];
}
if(maxNumminf)//获取最小峰值
{
minDataSave=arrHead-next;
minf=maxNum;
}
arrHead=arrHead-next;
}
arrHead=arrHeadSave;
//移除最小峰值数据组
while(arrHead-next!=NULL)
{
if(arrHead-next==minDataSave)//删除节点重组链表
{
arrHead-next=minDataSave-next;
minDataSave-next=NULL;
free(minDataSave-data);//释放节点内存
free(minDataSave);
break;
}
arrHead=arrHead-next;
}
return minf;
}