首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >一维阵列中求峰参数的优化

一维阵列中求峰参数的优化
EN

Stack Overflow用户
提问于 2020-06-06 14:22:29
回答 2查看 487关注 0票数 1

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

我已经实现了代码:

代码语言:javascript
复制
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以上。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-06-07 14:04:04

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

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

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

票数 2
EN

Stack Overflow用户

发布于 2020-06-06 14:54:25

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

但简而言之,这个想法是想象你的图表被水填满,然后慢慢地排水。每当有一幅图出现在水面上时,一个新的岛屿就诞生了。当两个岛屿相邻,它们合并,这导致较年轻的岛屿(与较低的峰值)死亡。然后每个数据点都有一个出生时间和一个死亡时间。最重要的峰值是持久化时间最长的峰值,即death - birth

如果水位以连续的速度下降,则以峰值高度来定义持久性。另一种可能是,随着时间的推移,随着时间的推移,从tt+1,从点到点地滴水,在这种情况下,持久性是以信号样本的峰值宽度定义的。

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62233032

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档