Python 标记信号

Python 标记信号,python,numpy,signals,Python,Numpy,Signals,我想知道是否有一种简单有效的方法来标记一个信号,这是一个连接到监视器上的光电二极管的信号,它收集关于亮度变化的信息。亮度突然变化 在下图中,我指出了一个亮度的信号从高到低的变化 现在,问题是,我不知道用标记标记收集到的信号的最佳方式是什么,即亮度发生变化时的信息。不幸的是,我没有任何代码要检查,因为,老实说,我不知道从哪里开始。谢谢你的提示和建议。先谢谢你 PS关键是,使用一种方法,将标记及时放置在正确的位置。上述图像上信号的采样频率为1024 Hz,x标度以秒表示 样本数据: 更新10.02

我想知道是否有一种简单有效的方法来标记一个信号,这是一个连接到监视器上的光电二极管的信号,它收集关于亮度变化的信息。亮度突然变化

在下图中,我指出了一个亮度的信号从高到低的变化

现在,问题是,我不知道用标记标记收集到的信号的最佳方式是什么,即亮度发生变化时的信息。不幸的是,我没有任何代码要检查,因为,老实说,我不知道从哪里开始。谢谢你的提示和建议。先谢谢你

PS关键是,使用一种方法,将标记及时放置在正确的位置。上述图像上信号的采样频率为1024 Hz,x标度以秒表示

样本数据:

更新10.02.2015

当我试图找到解决问题的办法时,我有了一个想法,这也许是一个很好的途径

我在信号上使用了低通滤波器

# File name "Filters.py"

import scipy.signal as ss

def filt(sig, sf, cf, btype='higphass'):
    """
    :param sig: signal.
    :param sf: sampling frequency.
    :param cf: cut frequencies - array.
    :param btype: bandpass type.
    :return: bandpassed signal.
    """
    if btype == 'higphass' or btype == 'lowpass':
        b, a = ss.butter(3, Wn=cf/(0.5*sf), btype=btype, analog=0, output='ba')
        return ss.filtfilt(b, a, sig)
    elif btype == 'bandstop' or btype == 'bandpass':
        b, a = ss.butter(3, Wn=(cf[0]/(0.5*sf), cf[1]/(0.5*sf)), btype=btype, analog=0, output='ba')
        return ss.filtfilt(b, a, sig)
…对于40 Hz切割:

import IBD.ElectricalStimulation.Filters as filt

filtered = filt.filt(signal, 1024, 40, btype='lowpass')
py.plot(time_scale, filtered)
…这给了我:

接下来,我推导出了步骤n等于1的滤波信号,然后将其提高到2的幂

# Derivate signal.
step = 1
accuracy_range = 9
derivative = np.diff(filtered, n=step)
derivative = np.append(derivative, np.zeros(step)) ** 2
derivative[derivative > accuracy_range] = np.max(filtered)
derivative[derivative < accuracy_range] = 0
py.plot(time_scale, derivative)
其结果是:


现在的问题是,我不能标记每一个事件。某些亮度变化很低,可以通过导数运算看到。

正常。所以我找到了解决问题的有效方法。它不是完美的,但它是有效的。现在。情况如下:

def walk_on_the_beach(sig, t, interval=1000):
    """
    :param sig: signal.
    :param t: threshold.
    :param interval: interval between next value check (ms).
    """
    last_value = 0
    interval_flag = True
    interval_iterator = 0
    markers = np.zeros(np.size(sig))
    for i in np.arange(np.size(sig)):
        absolute = np.abs(last_value - sig[i])
        last_value = sig[i]
        if interval_flag:
            if absolute > t:
                markers[i] = np.max(sig)
                interval_flag = False
        else:
            if interval_iterator == interval:
                interval_flag = True
                interval_iterator = 0
            else:
                interval_iterator += 1

    return markers

py.plot(time_scale[:100000], walk_on_the_beach(filtered, 0.02))

你能上传一些示例数据吗。Data.txt文件中的数据是使用numpy.savetxt方法编写的。Numpy数组本身是用float32类型编码的。