【发布时间】:2014-08-30 15:18:00
【问题描述】:
我有一个 TOF 谱,我想使用 python (numpy) 实现一个算法,它可以找到谱的所有最大值并返回相应的 x 值。
我在网上查了一下,发现下面报道的算法。
这里的假设是,在最大值附近,之前的值与最大值之间的差值大于数字 DELTA。问题是我的频谱是由均匀分布的点组成的,甚至接近最大值,因此 DELTA 永远不会超过并且函数 peakdet 返回一个空数组。
您知道如何解决这个问题吗?我非常感谢 cmets 能够更好地理解代码,因为我是 python 的新手。
谢谢!
import sys
from numpy import NaN, Inf, arange, isscalar, asarray, array
def peakdet(v, delta, x = None):
maxtab = []
mintab = []
if x is None:
x = arange(len(v))
v = asarray(v)
if len(v) != len(x):
sys.exit('Input vectors v and x must have same length')
if not isscalar(delta):
sys.exit('Input argument delta must be a scalar')
if delta <= 0:
sys.exit('Input argument delta must be positive')
mn, mx = Inf, -Inf
mnpos, mxpos = NaN, NaN
lookformax = True
for i in arange(len(v)):
this = v[i]
if this > mx:
mx = this
mxpos = x[i]
if this < mn:
mn = this
mnpos = x[i]
if lookformax:
if this < mx-delta:
maxtab.append((mxpos, mx))
mn = this
mnpos = x[i]
lookformax = False
else:
if this > mn+delta:
mintab.append((mnpos, mn))
mx = this
mxpos = x[i]
lookformax = True
return array(maxtab), array(mintab)
下面显示了频谱的一部分。实际上,我的峰比这里显示的要多。
【问题讨论】:
-
更正以下内容: this > mn+delta 和 this (mn+delta) 和这个
-
代码没有括号。但是,即使有了它们也没有太大变化。仍然有一个空数组。
-
您不能只使用 convolve 并使用合适的一阶导数内核查找所有零交叉点吗?
-
你能用一个例子来编码你的话吗?或者给我发一个类似例子的链接。谢谢!
-
如果你这样做
plot(v[1:] - v[:-1]),你会看到什么?在峰值处,如果你没有看到一些有趣的值,就很难检测到峰值。