标记信号
Marking a signal
我想知道是否有一种简单有效的方法来标记信号,该信号是来自连接到显示器的光电二极管的信号,收集有关其亮度变化的信息。亮度突然变化。
在下图中,我指出了一个亮度从高值到低值变化的信号。
现在,问题是,我不知道 "mark" 使用 "markers" 收集信号的最佳方法是什么,即。发生亮度变化时的信息。不幸的是,我没有任何代码可以审查,因为老实说,我不知道从哪里开始。我将感谢您的提示和建议。提前谢谢你。
PS 关键是要使用一种方法,及时将标记放在正确的位置。上图中信号的采样频率为 1024 Hz,x
比例以秒表示。
示例数据:
http://www.filedropper.com/data_6
更新 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)
结果是:
现在的问题是,我不能 "mark" 每个事件。通过微分运算,亮度的某些变化太低了"seen"。
好的。所以我找到了解决我的问题的有效方法。它并不完美,但它确实有效。目前。它看起来如下:
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))
我想知道是否有一种简单有效的方法来标记信号,该信号是来自连接到显示器的光电二极管的信号,收集有关其亮度变化的信息。亮度突然变化。
在下图中,我指出了一个亮度从高值到低值变化的信号。
现在,问题是,我不知道 "mark" 使用 "markers" 收集信号的最佳方法是什么,即。发生亮度变化时的信息。不幸的是,我没有任何代码可以审查,因为老实说,我不知道从哪里开始。我将感谢您的提示和建议。提前谢谢你。
PS 关键是要使用一种方法,及时将标记放在正确的位置。上图中信号的采样频率为 1024 Hz,x
比例以秒表示。
示例数据: http://www.filedropper.com/data_6
更新 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)
结果是:
现在的问题是,我不能 "mark" 每个事件。通过微分运算,亮度的某些变化太低了"seen"。
好的。所以我找到了解决我的问题的有效方法。它并不完美,但它确实有效。目前。它看起来如下:
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))