【发布时间】: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)}')
绘制后,数据如下所示:
我感兴趣的“峰”对人眼来说是很清楚的 - 在这个特定的数据集中有 23 个。
但是,由于阵列如此之大,数据在一般尺度上清晰的峰内变化很大(因此有数百个标有蓝色十字的峰):
以前曾多次询问过寻峰问题(我已经经历过很多次了!) - 但我找不到任何关于优化参数仅用于寻找的帮助或解释我想要的山峰。对 Python 了解一点,但对数学分析一窍不通!
按宽度分析似乎没用,因为根据第二张图像,大尺度清晰的峰实际上穿插着“无声”范围。距离没有帮助,因为我不知道其他 wav 文件中的峰值有多接近。 Prominence 被认为是最好的方法,但我无法得到我需要的结果;门槛同样。我还尝试过抽取信号、使用 Savitzky-Golay 滤波器平滑信号以及参数和值的不同组合,但结果都不准确。
仅身高就很有用,因为我可以从图表中看到峰值总是达到 80 以上。
【问题讨论】:
标签: python scipy signal-processing data-analysis