krekninao Asked:2024-12-14 15:30:35 +0000 UTC2024-12-14 15:30:35 +0000 UTC 2024-12-14 15:30:35 +0000 UTC 通过模态频率确定有用信号的开始 772 我有一个信号,例如: 我将信号分成 1 秒的片段。在每个段中,我将信号展开为傅里叶级数并确定模态(即具有最大幅度)频率。我得到了一组分段和这些分段上的模态频率。例如,像这样: 可以看出,当有用信号到达时(火车、电动火车等),5-6 Hz 的低频占主导地位。其余时间,高频噪声占主导地位。我需要自动确定有用信号的开始和结束。我该怎么做?有一个滑动窗口的想法,但我无法理解具有有用信号的部分的开始和结束的具体标准是什么。请告诉我可以完成此操作的算法。 фурье 2 个回答 Voted MBo 2024-12-14T16:23:40Z2024-12-14T16:23:40Z 如果您的第一个图表与真实信号相关,那么您应该使用信号功率(信号^2在间隔内的积分或总和),并使用频率作为可靠性的证据。 如果您依赖于频率,请构建一个频谱图 - 一组连续(或重叠)间隔的傅里叶变换幅度,并估计所需频率间隔(例如 5-15 Hz)中每个频谱的功率与总功率的比率功率(零,并且可能一定要从计算中删除第一个计数)。如果该比率高于阈值(取决于您的具体数据),则低频占主导地位。 请注意,时尚不太适合您的任务。 Best Answer CrazyElf 2024-12-14T16:43:32Z2024-12-14T16:43:32Z 嗯,这是给您的一个例子。需要选择窗口大小和截止值。窗口越大,越能平滑异常值,但检测延迟也越大。那么,截止值的选择也需要大致相同的考虑因素。 import pandas as pd import numpy as np import matplotlib.pylab as plt data = np.array([50]*40+[5]*15+[50]*30+[5]*10+[50]*40) data += np.random.randint(2, size=(len(data))) data[45] = 30 data[50] = 40 data[90] = 25 series = pd.Series(data) roll = series.rolling(3).mean() found = roll < 20 result = (found != found.shift(-1))[:-1] startstop = result[result].index plt.figure() plt.bar(range(len(data)), data) plt.scatter(startstop, data[startstop], color='red', marker='*') plt.savefig('data.png') plt.figure() roll.plot() plt.scatter(startstop, roll[startstop], color='red', marker='*') plt.savefig('dataroll.png') for a, b in zip(startstop[::2], startstop[1::2]): print(f'{a}:{b}') # 41:54 # 86:94
如果您的第一个图表与真实信号相关,那么您应该使用信号功率(信号^2在间隔内的积分或总和),并使用频率作为可靠性的证据。
如果您依赖于频率,请构建一个频谱图 - 一组连续(或重叠)间隔的傅里叶变换幅度,并估计所需频率间隔(例如 5-15 Hz)中每个频谱的功率与总功率的比率功率(零,并且可能一定要从计算中删除第一个计数)。如果该比率高于阈值(取决于您的具体数据),则低频占主导地位。
请注意,时尚不太适合您的任务。
嗯,这是给您的一个例子。需要选择窗口大小和截止值。窗口越大,越能平滑异常值,但检测延迟也越大。那么,截止值的选择也需要大致相同的考虑因素。