【问题标题】:Optimising parameters for finding peaks in 1D array优化参数以在一维数组中查找峰值
【发布时间】:2020-09-25 16:54:31
【问题描述】:

我需要优化一种方法来查找一维数组中的数据峰值数量。数据是 wav 文件幅度的时间序列。

我已经实现了代码:

from scipy.io.wavfile import read
from scipy.signal import find_peaks


_, amplitudes = read('audio1.wav')


indexes, _ = find_peaks(amplitudes, height=80)
print(f'Number of peaks: {len(indexes)}')

绘制后,数据如下所示:

General scale

我感兴趣的“峰”对人眼来说是很清楚的 - 在这个特定的数据集中有 23 个。

但是,由于阵列如此之大,数据在一般尺度上清晰的峰内变化很大(因此有数百个标有蓝色十字的峰):

Zoomed in view of one peak

以前曾多次询问过寻峰问题(我已经经历过很多次了!) - 但我找不到任何关于优化参数仅用于寻找的帮助或解释我想要的山峰。对 Python 了解一点,但对数学分析一窍不通!

按宽度分析似乎没用,因为根据第二张图像,大尺度清晰的峰实际上穿插着“无声”范围。距离没有帮助,因为我不知道其他 wav 文件中的峰值有多接近。 Prominence 被认为是最好的方法,但我无法得到我需要的结果;门槛同样。我还尝试过抽取信号、使用 Savitzky-Golay 滤波器平滑信号以及参数和值的不同组合,但结果都不准确。

仅身高就很有用,因为我可以从图表中看到峰值总是达到 80 以上。

【问题讨论】:

    标签: python scipy signal-processing data-analysis


    【解决方案1】:

    查看0d 持久同源以找到一个好的策略,其中您可以优化的参数是峰值持久性。一篇不错的博文 here 解释了基础知识。

    但简而言之,这个想法是想象你的图表被水填满,然后慢慢地排出水。每当图表的一部分浮出水面时,就会诞生一个新的岛屿。当两个岛屿彼此相邻时,它们会合并,这会导致较年轻的岛屿(具有较低的峰)死亡。 然后每个数据点都有一个出生时间和一个死亡时间。最显着的峰值是那些具有最长持久性的峰值,即death - birth

    如果水位以连续速率下降,则持续性是根据峰高定义的。另一种可能性是,随着时间从步骤t 到步骤t+1,从一个点到另一个点瞬时滴水,在这种情况下,持久性是根据信号样本在峰值宽度中定义的。

    对您而言,似乎使用原始定义的峰高 > 70 会发现您感兴趣的所有峰(尽管可能太多)聚集在一起。您可以通过选择每个集群中的第一个峰或每个集群中的最高峰来限制这一点,或者同时使用两种方法并只选择具有高高度持久性和宽度持久性的峰。

    【讨论】:

      【解决方案2】:

      这是音频处理中的一项常见任务,有几种方法完全取决于您的数据。

      但是,有一些实现用于寻找新奇函数的峰值(例如,节拍跟踪器的输出)。试试这些:

      它们基本上实现了相同的方法,但细节上可能存在差异。 此外,您可以检查是否真的需要处理这个高采样频率。尝试对信号进行下采样或使用移动平均滤波器。

      【讨论】:

        猜你喜欢
        • 2017-09-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-02-09
        • 2011-05-22
        • 1970-01-01
        • 2022-11-03
        • 2021-07-22
        相关资源
        最近更新 更多