import numpy as np
from GLOBAL import *
class Roi2Signal:
def __init__(self):
self._times = []
self._signals = []
def append_signal(self, time, signal):
"""
Detection結果から算出された信号強度を保存
(Detection失敗により)信号強度が算出されなかった場合, 0-paddingするか前回の信号強度を参照
:param time: 時間
:param signal: 信号強度
:return: None
"""
if len(self._times) == 0:
self._signals.append(signal if signal is not None else 0)
else:
self._signals.append(signal if signal is not None
else self._signals[-1])
self._times.append(time)
def get_size(self):
return len(self._times)
def load_signals(self, times, signals):
"""
時系列の信号を読み込み
:param times: 時間データ
:param signals: 信号強度データ
:return: None
"""
self._times = times
self._signals = signals
def get_times(self, window=False):
"""
時間データをNumpyに変換してreturn
window=Falseの時すべてreturn, window=intの時窓の長さ分return
:param window: 窓の長さ
:return: 時間データ(Numpy)
"""
if window:
return np.array(self._times[-window:])
else:
return np.array(self._times)
def get_signal(self, window=False):
"""
信号データをNumpyに変換してreturn
window=Falseの時すべてreturn, window=intの時窓の長さ分return
:param window: 窓の長さ
:return: 信号データ
"""
if window:
return np.array(self._signals[-window:])
else:
return np.array(self._signals)
def apply_moving_average_filter(self, num=5, window=False):
"""
移動平均
:param num:移動平均
:param window: 窓の長さ
:return: 平滑化された信号
"""
b = np.ones(num)/float(num)
if window:
windowed_signals = np.array(self._signals[-window:])
else:
windowed_signals = np.array(self._signals)
filtered_signals = np.convolve(windowed_signals, b, mode="same")
return filtered_signals