2015-02-09 3 views
1

Интересно, есть ли простой и эффективный способ отметить сигнал, который является сигналом от фотодиода, прикрепленного к монитору, и собирает информацию о его изменениях яркости. Яркость меняется резко.Маркировка сигнала

На следующем рисунке я указал часть сигнала от одного изменения яркости от более высокого до более низкого значения.

enter image description here

Теперь проблема, я не знаю, что было бы лучшим способом «знак» собрал сигнал с «маркеров», то есть. информация при изменении яркости. К сожалению, у меня нет никакого кода для обзора, потому что, если честно, я не знаю с чего начать. Буду признателен за советы и советы. Заранее спасибо.

enter image description here

PS Крайне важно, чтобы использовать метод, который будет поставить маркер в нужное место вовремя. Частота дискретизации сигнала на изображениях выше была 1024 Гц, а шкала x выражена в секундах.

Образец данных: http://www.filedropper.com/data_6

UPDATE 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 Гц для резки:

import IBD.ElectricalStimulation.Filters as filt 

filtered = filt.filt(signal, 1024, 40, btype='lowpass') 
py.plot(time_scale, filtered) 

... который дал мне:

enter image description here

Далее, я образовавшаяся отфильтрованный сигнал с шагом (п) равен 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) 

Это приводит к:

enter image description here

Теперь проблема в том, что я не могу «знак» каждое событие. Некоторые изменения освещенности должны быть низкими, чтобы их «видели» по производной операции.

+0

Не могли бы вы загрузить некоторые данные примера? –

+0

Добавлено. Данные в файле data.txt были написаны с использованием метода numpy.savetxt(). Сам массив Numpy кодируется в 'float32'. – bluevoxel

ответ

0

OK. Поэтому я нашел рабочее решение для своей проблемы. Это не идеально, но он работает. На данный момент. Он выглядит следующим образом:

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)) 

enter image description here

Смежные вопросы