53 lines
1.3 KiB
Python
53 lines
1.3 KiB
Python
#!/usr/bin/python
|
|
# -*- coding: UTF-8 -*-
|
|
"""
|
|
@author:andrew
|
|
@file:SignalPreprocess.py
|
|
@email:admin@marques22.com
|
|
@email:2021022362@m.scnu.edu.cn
|
|
@time:2023/09/15
|
|
"""
|
|
|
|
# 输入信号为一维的的整晚信号
|
|
|
|
import numpy as np
|
|
from scipy import signal
|
|
|
|
|
|
def XinXiaoPreprocess(data=None, signal_frequency=1000, low_cut=0.01, high_cut=0.7, order=4):
|
|
"""
|
|
# 预处理操作
|
|
# 提取呼吸
|
|
# 四阶巴特沃斯滤波器 提取呼吸信号主成分
|
|
# 四秒移动平均滤波器 平滑呼吸信号
|
|
# Z-Score 标准化
|
|
# 降采样至5Hz
|
|
|
|
:param data:
|
|
:param signal_frequency:
|
|
:param low_cut:
|
|
:param high_cut:
|
|
:param order:
|
|
|
|
:return:
|
|
"""
|
|
order = order
|
|
low_cut = low_cut
|
|
high_cut = high_cut
|
|
sample_rate = signal_frequency
|
|
low = low_cut / (sample_rate * 0.5)
|
|
high = high_cut / (sample_rate * 0.5)
|
|
sos = signal.butter(N=order, Wn=[low, high], btype="bandpass", output='sos')
|
|
data = signal.sosfilt(sos, data)
|
|
# 比对采样率 将信号采样率调整至100Hz
|
|
data= data[::10]
|
|
|
|
data -= np.convolve(data, np.ones(400) / 400, mode='same')
|
|
data = (data - data.mean()) / data.std()
|
|
data[data > 3] = 3
|
|
data[data < -3] = -3
|
|
# 降采样至5Hz
|
|
|
|
data = data[::20]
|
|
return data
|