本文归纳了常见的肌肉信号预处理流程,方便EMG信号的后续分析。使用pyemgpipeline库 来进行信号的处理。文中使用了 UC Irvine 数据库的下肢数据。
目录
[1 使用wrappers 定义数据类,来进行后续的操作](#1 使用wrappers 定义数据类,来进行后续的操作)
[2 肌电信号DC偏置去除](#2 肌电信号DC偏置去除)
[3 带通滤波器处理](#3 带通滤波器处理)
[4 对肌电信号进行全波整流](#4 对肌电信号进行全波整流)
[5 肌电信号线性包络](#5 肌电信号线性包络)
[6 幅度归一化 (已知最大收缩的幅度)](#6 幅度归一化 (已知最大收缩的幅度))
[7 分割得到一部分时间段的信号](#7 分割得到一部分时间段的信号)
[8 得到最后处理好的数据并且保存下来](#8 得到最后处理好的数据并且保存下来)
1 使用wrappers 定义数据类,来进行后续的操作
python
import os
import numpy as np
from matplotlib.figure import SubplotParams
import pyemgpipeline as pep
data_folder = 'uci_lower_limb/A_TXT'
data_filename = '3Asen.txt'
trial_name = 'Sit'
channel_names = ['rectus femoris', 'biceps femoris', 'vastus internus', 'semitendinosus']
sample_rate = 1000
def load_uci_lower_limb_txt(_filepath):
with open(_filepath) as fp:
collect_values = np.array([])
lines = fp.readlines()
for line in lines[7:]: # first few lines are data description
items = [float(e) for e in line.split('\t')[:4] if e != ''] # last column is not EMG data
if len(items) != 4: # last few rows might not have EMG data
continue
collect_values = np.concatenate((collect_values, np.array(items)))
_data = collect_values.reshape(-1, 4)
return _data
filepath = os.path.join(data_folder, data_filename)
data = load_uci_lower_limb_txt(filepath)
data
print('data shape:', data.shape)
emg_plot_params = pep.plots.EMGPlotParams(
n_rows=4,
fig_kwargs={
'figsize': (8, 6),
'dpi': 80,
'subplotpars': SubplotParams(wspace=0, hspace=0.6),
},
line2d_kwargs={
'color': 'red',
}
)
m = pep.wrappers.EMGMeasurement(data, hz=sample_rate, trial_name=trial_name,
channel_names=channel_names, emg_plot_params=emg_plot_params)
m.plot()

原始肌电信号
2 肌电信号DC偏置去除
python
m.apply_dc_offset_remover()
m.plot()

DC偏置去除的结果图
3 带通滤波器处理
python
m.apply_bandpass_filter(bf_order=4, bf_cutoff_fq_lo=10, bf_cutoff_fq_hi=450)
m.plot()

带通滤波器处理的结果图
4 对肌电信号进行全波整流
python
m.apply_full_wave_rectifier()
m.plot()

全波整流处理肌电信号
5 肌电信号线性包络
python
m.apply_linear_envelope(le_order=4, le_cutoff_fq=6)
m.plot()

肌电信号线性包络处理
6 幅度归一化 (已知最大收缩的幅度)
python
max_amplitude = [0.043, 0.069, 0.364, 0.068] # assume the MVC is known
m.apply_amplitude_normalizer(max_amplitude)
m.plot()

幅度归一化结果
7 分割得到一部分时间段的信号
python
m.apply_segmenter(20.5, 29.5)
m.plot()

分割结果
8 得到最后处理好的数据并且保存下来
python
m.data
m.timestamp
m.export_csv('ex1_processed.csv')