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(信封<极限))

您的意思是需要检测局部峰值何时不超过阈值。你们可以在相反的时间进行分析,或者你们可以区分,只在梯度为零的点上和阈值进行比较。