SciPy:检测时间序列数据的频率

6vl6ewon  于 2022-11-10  发布在  其他
关注(0)|答案(1)|浏览(199)

我有一个包含几十万个(时间、值)点的文件,我想从数据点估计波形的频率。我一直在考虑使用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*",
    )
vnjpjtjt

vnjpjtjt1#

它将更加稳健,并且更容易计算谱图:

from scipy.signal import welch

frequencies, power = welch(my_signal, my_signals_sampling_rate)
dominant_frequency = frequencies[np.argmax(power)]

采样率为1/dt,其中dt是连续采样之间的时间(以秒为单位)。

相关问题