一种峰值检测算法——AMPD算法(C语言实现)

这篇具有很好参考价值的文章主要介绍了一种峰值检测算法——AMPD算法(C语言实现)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一种峰值检测算法——AMPD算法(C语言实现)

本文算法的原始论文出处:Algorithms | Free Full-Text | An Efficient Algorithm for Automatic Peak Detection in Noisy Periodic and Quasi-Periodic Signals | HTML (mdpi.com)
有位老哥在知乎写了Python代码:python代码

在数字信号处理中,经常涉及到波峰查找算法,如振动信号分析,样条插值法求包络等。对于周期信号或者准周期信号,文章介绍了一种名为Automatic multiscale-based peak detection (AMPD),即自动多尺度峰值查找算法。
同时对非周期信号的效果也很nice,强烈安利!
其优势是:
(1)算法本身(几乎)对信号具有良好的自适应性,唯一的假设是信号是周期的或者准周期的;
(2)抗噪能力强,后面可以看到,对周期性的要求也不是很高。
原理不多讲,可以直接来看原文,也比较简单,就是用一个多尺度的滑动窗口去两侧进行比较,寻找局部最大值。

下面为该算法的C语言实现:

// 寻找数组最小值的下标
int argmin(int* index, int index_len)
{
	int min_index = 0;
	int min = index[0];
	for (int i = 1; i < index_len; i++)
	{
		if (index[i] < min)
		{
			min = index[i];
			min_index = i;
		}
	}
	return min_index;
}

//寻找极值点函数
// data是存放数据的数组
//index是存放峰值点下标的数组
//len_index是峰值个数,即index数组长度
void AMPD(double* data,int* index,int *len_index)
{
	int* p_data = (int*)malloc(sizeof(int) * size); //size可以最大为数组长度
	int* arr_rowsum = (int*)malloc(sizeof(int) * size);
	int min_index, max_window_length;
	for (int i = 0; i < size; i++)
	{
		p_data[i] = 0;
	}
	for (int k = 1; k <= size / 2 + 1; k++)
	{
		int row_sum = 0;
		for (int i = k; i <= size - k; i++)
		{
			if ((data[i] > data[i - k]) && (data[i] > data[i + k]))
				row_sum -= 1;
		}
		*(arr_rowsum + k - 1) = row_sum;
	}
	/*for (int i = 0; i < size/2; i++)
	{
		printf("%d\n", arr_rowsum[i]);
	}*/
	min_index = argmin(arr_rowsum, size/2); //此处为最大的窗口
	//printf("%d\n", min_index);
	max_window_length = min_index;
	for (int k = 1; k < max_window_length + 1;k++)
	{
		for (int i = 1; i < size - k; i++)
		{
			if ((data[i] > data[i - k]) && (data[i] > data[i + k]))
				p_data[i] += 1;
		}
	}
	for (int i_find = 0; i_find < size; i_find++)
	{
		if (p_data[i_find] == max_window_length)
		{
			index[*len_index] = i_find;
			(*len_index) += 1;
		}
	}
	free(p_data);
	free(arr_rowsum);
}

周期信号效果原始文章内太多了,这里就不展示了。
下面来展示一波我自己使用的,非周期信号的峰值寻找情况
一种峰值检测算法——AMPD算法(C语言实现)
可以根据AMPD后得到的峰值数组,进行三次样条插值进行原信号包络的获取。(参考MATLAB内envelope函数)

寻找波谷的话直接将原始数据翻转一下,就可以得到波谷的下标了。文章来源地址https://www.toymoban.com/news/detail-436058.html

到了这里,关于一种峰值检测算法——AMPD算法(C语言实现)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 密度峰值聚类算法DPC(Density Peak Clustering)理论基础与python实现

    基于密度峰值的聚类算法全称为基于快速搜索和发现密度峰值的聚类算法(clustering by fast search and find of density peaks, DPC)。它是2014年在Science上提出的聚类算法,该算法能够自动地发现簇中心,实现任意形状数据的高效聚类。 密度峰值聚类算法是对K-Means算法的一种改进,回顾K

    2024年02月16日
    浏览(36)
  • GroundingDINO(一种开集目标检测算法)服务化,根据文本生成检测框

    最近发现一个叫GroundingDINO的开集目标检测算法,所谓开集目标检测就是能检测的目标类别不局限于训练的类别,这个算法可以通过输入文本的prompt然后输出对应的目标框。可以用来做预标注或者其他应用,比如我们要训练某个细分场景的算法时,我们找不到足够的已经标注的

    2024年02月06日
    浏览(48)
  • 峰值检测电路汇总

      峰值检测电路(PKD,Peak Detector)的作用是对输入信号的峰值进行提取,产生输出Vo = Vpeak,为了实现这样的目标,电路输出值会一直保持,直到一个新的更大的峰值出现或电路复位。   峰值检测电路在AGC(自动增益控制)电路和传感器最值求取电路中广泛应用,自己平

    2024年02月03日
    浏览(19)
  • FPGA对高速采集ADC(8路并行数据)进行峰值检测,并记录峰值位置

              本模块主要是ADC(2Gsps)采集信号波形进行峰值检测,主要是检测单音信号或者脉冲信号中的所有峰峰值信号(对噪声大信号适用性不是很好),并记录峰值点的位置。         1. 峰值检测8路并行数据端口 2.连续3点检测峰值,被例化8次,                

    2024年02月16日
    浏览(70)
  • 【数据结构与算法分析】使用C语言实现队列的两种(带头结点与不带头结点)链式存储,并且给出一种循环队列的设计思想

      当我们编写程序时,经常需要处理各种数据结构。队列是一种常见的数据结构,它有着广泛的应用场景。队列的基本操作包括入队和出队,应用于模拟等待队列、消息队列、计算机缓存等场合。   在实际编程中,我们可以用不同的数据结构来实现队列。本文主要介绍了

    2024年02月08日
    浏览(100)
  • C语言每日一题:15:寻找峰值。

    题目链接

    2024年02月13日
    浏览(31)
  • 一种基于注意机制的快速、鲁棒的混合气体识别和浓度检测算法,配备了具有双损失函数的递归神经网络

    提出一个由注意力机制组成的电子鼻系统。首先采用端到端的编码器译码器,提供处理可变长度输入的灵活性。然后提供一种新的门控循环单元网络,方便从时间动态中提取特征,在此基础上注意力机制动态分配气体特征的权重向量。最后采用双损失函数,利用同一网络实现

    2024年02月09日
    浏览(44)
  • 密度峰值聚类(DPC)算法的介绍

    密度峰值聚类算法(Density Peak Clustering Algorithm)是一种无监督的聚类算法,它能够自动发现数据中的密度峰值点,并根据这些峰值点将数据进行聚类。该算法由Alex Rodriguez和Alessandro Laio于2014年提出,其原理相对简单但非常有效。 局部密度():局部密度指的是一个数据点周围

    2024年02月05日
    浏览(39)
  • 将Speex AEC MDF算法从C语言移植到Matlab:一种谦逊的语言变换与重构的旅程

    尊敬的读者们,我今天希望与大家分享的是一个非常有趣的编程挑战,即将Speex AEC (Acoustic Echo Cancellation) MDF (Multi-Delay Filter) 算法从C语言移植到Matlab的过程。这是一个激动人心的主题,涉及到多个领域的知识,包括信号处理、算法设计、以及跨语言的编程技能。 实战项目下载

    2024年02月16日
    浏览(45)
  • ICCV 2023 | MoCoDAD:一种基于人体骨架的运动条件扩散模型,实现高效视频异常检测

    论文链接: https://arxiv.org/abs/2307.07205 视频异常检测(Video Anomaly Detection,VAD)扩展自经典的异常检测任务, 由于异常情况样本非常少见,因此经典的异常检测通常被定义为一类分类问题(One-Class Classification,OCC) 。而对于VAD而言,属于异常情况的样本更是非常罕见,因此常

    2024年02月09日
    浏览(50)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包