我需要优化一种方法来查找一维数组中的数据峰值数。数据是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文件中的峰值会有多近。显赫被认为是最好的方法,但我无法得到我所需要的结果;阈值也是如此。我也尝试过抽取信号,用Savitzky-Golay滤波器平滑信号,以及不同参数和值的组合,结果都不准确。
单是身高本身就很有用,因为我可以从图表中看到高峰总是在80以上。
发布于 2020-06-07 14:04:04
发布于 2020-06-06 14:54:25
查看0d的持久性同源性,以找到一个很好的策略,其中您可以优化的参数是峰值持久性。一篇不错的博客文章这里解释了基本知识。
但简而言之,这个想法是想象你的图表被水填满,然后慢慢地排水。每当有一幅图出现在水面上时,一个新的岛屿就诞生了。当两个岛屿相邻,它们合并,这导致较年轻的岛屿(与较低的峰值)死亡。然后每个数据点都有一个出生时间和一个死亡时间。最重要的峰值是持久化时间最长的峰值,即death - birth。
如果水位以连续的速度下降,则以峰值高度来定义持久性。另一种可能是,随着时间的推移,随着时间的推移,从t到t+1,从点到点地滴水,在这种情况下,持久性是以信号样本的峰值宽度定义的。
对于您来说,使用峰值高度> 70的原始定义似乎可以找到您感兴趣的所有峰值,尽管可能太多,聚集在一起。您可以通过选择每个集群中的第一个峰值或每个集群中的最高峰值,或者通过两种方法来限制这一点,并且只能选择具有高度持久性和宽度持久性的峰值。
https://stackoverflow.com/questions/62233032
复制相似问题