我们使用数据采集卡从设备读取信号,将信号增加到峰值,然后回落到接近原始值。为了找到峰值,我们当前在数组中搜索最高读数,并使用索引来确定我们计算中使用的峰值的时间。
如果最高值是我们正在寻找的峰值,那么效果很好但是如果设备工作不正常,我们可以看到第二个峰值可能高于初始峰值。我们在90秒的时间内从16个设备中每秒读取10个读数。
我最初的想法是循环读数检查以查看前一个和下一个点是否小于当前找到峰值并构建一个峰值阵列。也许我们应该查看当前位置两侧的平均点数以允许系统中的噪声。这是最好的方法还是有更好的技术?
我们使用LabVIEW并检查了LAVA forums,并且有许多有趣的例子。这是我们的测试软件的一部分,我们试图避免使用太多的非标准VI库,因此我希望得到有关所涉及的过程/算法的反馈,而不是特定的代码。
答案 0 :(得分:83)
有许多经典的峰值检测方法,其中任何一种都可行。您必须看到特别限制数据质量的内容。以下是基本描述:
在您的数据(x(0), y(0))
和(x(n), y(n))
中的任意两点之间,为y(i + 1) - y(i)
添加0 <= i < n
并将其称为T
(“旅行“)并将R
(”上升“)设置为y(n) - y(0) + k
,以获得适当的小k
。 T/R > 1
表示峰值。如果由于噪声导致的大行程不太可能或者噪声在基本曲线形状周围对称分布,则这种方法正常。对于您的应用,接受分数高于给定阈值的最早峰值,或分析每个上升值的行程曲线以获得更有趣的属性。
使用匹配的过滤器来获得与标准峰形的相似性(基本上,使用针对某些形状的标准化点积来获得余弦相似度)
对标准峰形进行去卷积并检查高值(尽管我经常发现2对于简单的仪器输出噪声不太敏感)。
平滑数据并检查等间距点的三元组,如果x0 < x1 < x2, y1 > 0.5 * (y0 + y2)
,或检查欧几里德距离如下:D((x0, y0), (x1, y1)) + D((x1, y1), (x2, y2)) > D((x0, y0),(x2, y2))
,它依赖于三角形不等式。使用简单比率将再次为您提供评分机制。
为您的数据拟合一个非常简单的2高斯混合模型(例如,Numerical Recipes有一个很好的现成代码块)。采取较早的高峰。这将正确处理重叠峰值。
将数据中的最佳匹配找到简单的高斯,柯西,泊松或有什么曲线。在宽范围内评估此曲线,并在注意到其峰值位置后从数据副本中减去该曲线。重复。采取最早的峰值,其模型参数(标准偏差可能,但一些应用可能关心峰度或其他特征)符合一些标准。从数据中减去峰值时,请注意遗留的工件。 最佳匹配可能取决于上面#2中建议的匹配得分类型。
我之前做过你正在做的事情:在DNA序列数据中找到峰值,在测量曲线中估算衍生物的峰值,并在直方图中找到峰值。
我鼓励您仔细参加适当的基线会议。在存在噪声的情况下,维纳滤波或其他滤波或简单直方图分析通常是一种简单的基线方法。
最后,如果您的数据通常是嘈杂的,并且您从卡中获取数据作为未引用的单端输出(或甚至引用,只是非差分),并且如果您将大量观察结果平均到每个数据点,尝试对这些观察结果进行排序并丢弃第一个和最后一个四分位数并平均剩下的四分位数有许多这样的异常消除策略可能非常有用。
答案 1 :(得分:10)
您可以尝试对每个点进行信号平均,将该值与周围的3个或更多点进行平均。如果噪音很大,那么即使这样也没有用。
我意识到这与语言无关,但猜测您正在使用LabView,LabView附带的许多预打包信号处理VI可用于平滑和降噪。 NI forums是获得更专业帮助的好地方。
答案 2 :(得分:6)
已经对这个问题进行了详细研究。
ROOT TSpectrum*
类(核/粒子物理分析工具)中有一组非常新的实现。该代码适用于一维到三维数据。
ROOT源代码可用,因此您可以根据需要获取此实现。
来自TSpectrum课程文档:
此类中使用的算法已发布在以下参考文献中:
[1] M.Morhac等人:背景 消除方法 多维重合伽马射线 光谱。核仪器和 物理研究方法A 401 (1997)113- 132。
[2] M.Morhac等人:高效的一维和二维金 反卷积及其在中国的应用 伽马射线光谱分解。 核仪器和方法 物理研究A 401(1997)385-408。
[3] M.Morhac等人: 多维重合伽马射线 光谱。核仪器和 研究物理方法A. 443(2000),108-125。
这些论文与那些没有NIM在线订阅的人的课程文档相关联。
所做的简短版本是直方图展平以消除噪音,然后在展平直方图中通过强力检测局部最大值。
答案 3 :(得分:6)
我想为这个线程贡献一个I have developed myself:
的算法它基于dispersion的原理:如果新的数据点是距离某些移动平均值的给定x个标准偏差,则算法发出信号(也称为z-score)。该算法非常稳健,因为它构造了单独的移动平均值和偏差,使得信号不会破坏阈值。因此,无论先前信号的量如何,未来信号都以大致相同的精度被识别。该算法需要3个输入:lag = the lag of the moving window
,threshold = the z-score at which the algorithm signals
和influence = the influence (between 0 and 1) of new signals on the mean and standard deviation
。例如,lag
为5将使用最后5个观察值来平滑数据。如果数据点与移动平均值相差3.5个标准差,则threshold
为3.5将发出信号。并且influence
的0.5给出正常数据点具有的影响一半。同样,influence
为0会完全忽略信号以重新计算新阈值:0的影响因此是最强大的选项。
它的工作原理如下:
<强> 伪代码 强>
# Let y be a vector of timeseries data of at least length lag+2
# Let mean() be a function that calculates the mean
# Let std() be a function that calculates the standard deviaton
# Let absolute() be the absolute value function
# Settings (the ones below are examples: choose what is best for your data)
set lag to 5; # lag 5 for the smoothing functions
set threshold to 3.5; # 3.5 standard deviations for signal
set influence to 0.5; # between 0 and 1, where 1 is normal influence, 0.5 is half
# Initialise variables
set signals to vector 0,...,0 of length of y; # Initialise signal results
set filteredY to y(1,...,lag) # Initialise filtered series
set avgFilter to null; # Initialise average filter
set stdFilter to null; # Initialise std. filter
set avgFilter(lag) to mean(y(1,...,lag)); # Initialise first value
set stdFilter(lag) to std(y(1,...,lag)); # Initialise first value
for i=lag+1,...,t do
if absolute(y(i) - avgFilter(i-1)) > threshold*stdFilter(i-1) then
if y(i) > avgFilter(i-1)
set signals(i) to +1; # Positive signal
else
set signals(i) to -1; # Negative signal
end
# Adjust the filters
set filteredY(i) to influence*y(i) + (1-influence)*filteredY(i-1);
set avgFilter(i) to mean(filteredY(i-lag,i),lag);
set stdFilter(i) to std(filteredY(i-lag,i),lag);
else
set signals(i) to 0; # No signal
# Adjust the filters
set filteredY(i) to y(i);
set avgFilter(i) to mean(filteredY(i-lag,i),lag);
set stdFilter(i) to std(filteredY(i-lag,i),lag);
end
end
答案 4 :(得分:4)
这种方法基本上来自David Marr的书“Vision”
高斯模糊您的信号与峰值的预期宽度。 这消除了噪音尖峰,你的相位数据完好无损。
然后边缘检测(LOG会做)
然后你的边缘是特征的边缘(如峰)。 在边缘之间寻找峰值,按大小排序峰值,然后就完成了。
我使用过这方面的变化而且效果非常好。
答案 5 :(得分:2)
我认为你希望用一个预期的示例信号来cross-correlate你的信号。但是,自从我研究信号处理以来,已经有很长一段时间了,即便如此,我也没有注意到它。
答案 6 :(得分:0)
您可以将一些Standard Deviation应用于您的逻辑,并注意超过x%的峰值。
答案 7 :(得分:0)
我对仪器仪表知之甚少,所以这可能是完全不切实际的,但这又可能是一个有用的不同方向。如果您知道读数如何失败,并且在给定此类故障的峰值之间存在一定的间隔,为什么不在每个间隔进行梯度下降。如果下降让你回到之前搜索过的区域,你可以放弃它。根据采样表面的形状,这也可以帮助您比搜索更快地找到峰值。
答案 8 :(得分:0)
所需峰值与不需要的第二峰值之间是否存在质的差异?如果两个峰值都是“尖锐的” - 即持续时间很短 - 当在频域中查看信号时(通过FFT),您将获得大多数频段的能量。但是,如果“良好”峰值可靠地在“坏”峰值中不存在的频率处存在能量,反之亦然,那么您可以通过这种方式自动区分它们。