我有一个包含几十万个(时间、值)点的文件,我想从数据点估计波形的频率。我一直在考虑使用SciPy的find_peaks
函数为每个峰选择一个点,并对峰之间的时间求平均值以找到频率。但是,find_peaks
函数选择了许多峰,而不是下面所示的一个峰。
单个峰的特写:
我尝试使用prominence
参数来过滤噪声,但我不明白为什么它不起作用。
peak_idxs = list(
sig.find_peaks(
data,
prominence=0.15,
width=(0, 0.05 * sample_freq),
)[0]
)
troph_idxs = list(
sig.find_peaks(
np.negative(data),
prominence=0.15,
width=(0, 0.05 * sample_freq),
)[0]
)
peak_criticals = [timestamps[i] for i in peak_idxs]
troph_criticals = [timestamps[i] for i in troph_idxs]
t_criticals_freqs = [
1 / (b - a) for a, b in zip(peak_criticals[0:], peak_criticals[1:])
] + [1 / (b - a) for a, b in zip(troph_criticals[0:], troph_criticals[1:])]
freq = statistics.mean(t_criticals_freqs)
ax.plot(timestamps, data)
ax.plot(
[timestamps[i] for i in peak_idxs + troph_idxs],
[data[i] for i in peak_idxs + troph_idxs],
"r*",
)
1条答案
按热度按时间vnjpjtjt1#
它将更加稳健,并且更容易计算谱图:
采样率为
1/dt
,其中dt
是连续采样之间的时间(以秒为单位)。