微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Python findpeaks与Matlab的实现差异

如何解决Python findpeaks与Matlab的实现差异

我有兴趣使用Python在数据样本中发现正峰和负峰。

为了给您一个更好的主意,我正在考虑使用Matlab的findpeaks函数https://it.mathworks.com/help/signal/ref/findpeaks.html)。

例如,当我在Matlab中工作时

ListViewItem

我得到了峰和出现峰的索引。

现在,我在scipy信号find_peaks函数https://docs.scipy.org/doc/scipy/reference/generated/scipy.signal.find_peaks.html)中找到了一个不错的候选人。

这似乎非常相似。但按原样,它没有提供我想要的结果。实际上,它会返回峰和包含返回峰属性的字典。

所以要返回a1和peak_loc1值,我做了一些额外的操作:

IN

但是我得到的结果与Matlab中的结果不是1:1的匹配。

为使区别更容易看到,请看一下此屏幕快照,在其中我并排放置了值。左边是matlab的值,右边是Python的值。

values comparison

白色值是相同的。但是,在某些时候仍然有些奇怪,Matlab的对应值稍后会移动一个位置。我用颜色突出显示了匹配的值。然后有两个值(红色)与Python计算的值没有任何对应关系。

这是我的Python代码

请注意,数据是一个简单的np.array,但其中包含大约12K的值,因此您可以在此处查看它:https://pastebin.pl/view/d3d5dba4

IN

可能是什么原因?我唯一想到的是缺少一些参数...即“ DoubleSided”对应什么?鉴于'MinPeakHeight'应该是我已经传递给Python的peak_height参数。

解决方法

基于使用的参数DoubleSided和您的屏幕截图,我假设您实际上是在使用Octave's findpeaks而不是Matlab的!如果您阅读了该参数说明:

“ DoubleSided” -告诉函数数据采用正值和负值。峰的基线作为函数的平均值。这等效于在除去平均值后传递数据的绝对值。

因此,使用DoubleSided实际上会在检查data之前操纵MinPeakHeight中的绝对值,因此会更改哪些峰落在高度0.4455之下或之上。我们可以在Python中模仿它(我为简化/加快您的功能而冒昧):

def findpeaks(arr,h,w=1,d=1):
    # Adjust baseline to emulate 'DoubleSided'
    adjusted = arr - arr.mean()
    # Only consider absolute value to find local maxima AND minima
    adjusted = abs(adjusted)

    indexes,_ = find_peaks(adjusted,height=h)
    # Retrieve extrema heights from original signal rather
    # than from the properties dict with adjusted heights
    heights = arr[indexes]

    return heights,indexes

a1,peak_loc1 = findpeaks(data,h=0.4455)

for h,i in zip(a1,peak_loc1):
    # For display purpose,adjust index by +1
    # to match Octave/Matlab's indexing
    print(f"{h:>9.5f} | {i + 1:>5}")

使用您的data运行此命令,将打印出与Octave输出相同的值(至少我没有发现不同)。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。