Python 确定振荡信号上的事件位置
我正在进行事件驱动积分,其中一个事件应该检测信号的振幅是否低于某个值/极限 例如,衰减的正弦信号:Python 确定振荡信号上的事件位置,python,events,math,integration,signal-processing,Python,Events,Math,Integration,Signal Processing,我正在进行事件驱动积分,其中一个事件应该检测信号的振幅是否低于某个值/极限 例如,衰减的正弦信号: signal = sin(t)*exp(-t/50) limit = 0.05 从图中可以看出,应在t=~90处满足条件。虽然我可以看到它,但我希望在积分过程中以数字形式获得位置。我该怎么做?我如何定义条件 注意:如果我只取limit=0.05的第一个交叉点,它出现在t=~0.05,这显然不是我想要的。您可以计算信号的e,如果需要,用低通滤波器(噪声)对其进行滤波,并找到包络线跨越极限电平的位
signal = sin(t)*exp(-t/50)
limit = 0.05
从图中可以看出,应在t=~90
处满足条件。虽然我可以看到它,但我希望在积分过程中以数字形式获得位置。我该怎么做?我如何定义条件
注意:如果我只取limit=0.05
的第一个交叉点,它出现在t=~0.05
,这显然不是我想要的。您可以计算信号的e,如果需要,用低通滤波器(噪声)对其进行滤波,并找到包络线跨越极限电平的位置
要找到包络,可以尝试计算信号F(t)的希尔伯特变换H(t)以生成正交信号()。包络是源信号和正交信号平方和的平方根
E(t) = Sqrt(F^2(t) + H^2(t))
另外,可能还有更简单的方法来评估信封,请参见信封的wiki链接。您可以使用
scipy.signal.hilbert
计算信封:
import numpy as np
from scipy import signal
# Add some padding to limit the periodic extension effect
padlen = int(np.floor(0.1*len(x)))
y = np.pad(x, (0,padlen), mode='edge');
# Compute the envelope
envelope = np.abs(signal.hilbert(y));
# Truncate to the original signal length
envelope = envelope[:-padlen]
或者使用简单的实现:
def diode_detector(x,alpha):
xmax = abs(x[0])
y = np.array(x)
for i in np.arange(len(x)):
if (xmax < abs(x[i])):
xmax = abs(x[i])
else:
xmax = alpha*xmax
y[i] = xmax
return y
# you may need to tweak the alpha parameter depending on your signal bandwidth
envelope = diode_detector(x,0.9997)
def二极管_检测器(x,alpha):
xmax=abs(x[0])
y=np.数组(x)
对于np.arange中的i(len(x)):
如果(xmax
然后它只是一个计算触发器位置的问题:
T = t[1]-t[0]
print T*np.min(np.where(envelope < limit))
T=T[1]-T[0]
打印T*np.min(np.where(信封<极限))
您的意思是需要检测局部峰值何时不超过阈值。你们可以在相反的时间进行分析,或者你们可以区分,只在梯度为零的点上和阈值进行比较。