确定振荡信号上的事件位置

时间:2016-03-01 10:59:04

标签: python events math integration signal-processing

我正在进行事件驱动的集成,其中一个事件应检测信号的幅度是否低于某个值/限制。

例如,一个衰减的正弦信号:

signal = sin(t)*exp(-t/50)
limit = 0.05

Decaying sine signal

从图中可以看出,t =~ 90应该满足这种情况。虽然我可以看到它,但我希望在集成期间以数字方式获取位置。我怎样才能做到这一点?我该如何定义条件?

注意:如果我只是limit = 0.05的第一个交叉点,它会出现在t =~ 0.05,这显然不是我想要的。

2 个答案:

答案 0 :(得分:1)

您可以计算信号的envelop e,如果需要,使用低通滤波器(噪声)对其进行滤波,并找出包络超过限制水平的位置。

要查找包络,您可以尝试计算信号F(t)的希尔伯特变换H(t),以产生正交信号(How to find HT using Fourier transform)。包络是源信号和正交信号平方和的平方根。

E(t) = Sqrt(F^2(t) + H^2(t))

P.S。可能有更简单的方法来评估信封,请参阅Envelope的wiki链接。

答案 1 :(得分:1)

您可以使用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]

或使用简单的diode detector实施:

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) 

然后只是计算触发位置的问题:

T = t[1]-t[0]
print T*np.min(np.where(envelope < limit))