信号处理应用:生物医学信号处理_(9).肌电图信号处理与分析
肌电图信号处理与分析
1. 肌电图信号的基本概念
1.1 肌电图信号的定义
肌电图(Electromyography, EMG)信号指的是由肌肉收缩或放松过程中产生的电信号序列。这些电信号可以通过安装在皮肤表面或深入肌肉内的电极来进行采集,并用于评估肌肉的功能状态、神经系统活动情况以及诊断可能存在的肌肉或神经疾病。
1.2 肌电图信号的来源
肌电图信号主要由肌肉中的运动单位存在。这些运动单位是由一个特定的运动神经元以及它所支配的所有肌纤维共同构成集合体的组织结构。当该特定的运动神经元释放动作电位时会导致其所支配的所有肌纤维同步收缩从而产生电信号;这些电信号可经由皮肤表面或内部针状电极探测得到捕捉和分析
1.3 肌电图信号的特点
肌电图信号具有以下特点:
- 动态特性:肌肉活动呈现动态特征,在不同时间段表现出特定的特性。
- 频谱多样性:肌电图信号的频率范围一般介于0到500赫兹之间。
- 干扰因素:肌电图信号容易受到外部干扰和生物干扰的影响, 包括电源波动和肌肉相互作用等。
- 幅值范围:肌电图信号的幅值通常处于微伏至毫伏范围内。
2. 肌电图信号的采集
2.1 采集设备
肌电图信号的获取一般会采用特定设备进行操作,在实际应用中多选用专业的肌电图仪作为主要工具。这些关键组件主要包括用于采集信号所需的电极装置;在信号处理阶段起到重要作用的前置放大器模块;通过滤波技术去除噪声干扰的关键滤波组件;实现数字信号转换的核心ADC(模数转换器)单元;以及负责数据存储与管理的数据采集系统的核心部分。
2.2 电极类型
肌电图信号采集常用的电极类型有:
- 外置电极 贴附于皮肤表面区域并持续覆盖广泛肌肉区域。
- 尖端探头(针状探头) 深入至肌肉组织内部以精确定位特定肌群及其运动单元。
- 线性排列电极阵列 系统地采集多个离散点位置上的肌电信号并特别适用于分析动态肌群活动模式。
2.3 采集参数
肌电图信号的采集参数包括:
- 采样速率:采样速率一般高于1千赫兹(kHz),这有助于保证能够准确捕获高频信号。
- 滤波带宽:常用滤波带宽为2千赫兹至5千赫兹(kHz),这有助于有效抑制低频和高频干扰。
- 放大系数:放大系数一般设置为一千到一万倍(times),这有助于显著提升信噪比。
2.4 采集过程
- 电极放置:基于实验需求,在目标肌肉上按照实验设计确定正确的位置后实施电极放置。
- 预处理:借助前置放大器完成信号的放大过程,并借助滤波器执行过滤操作以去除不必要的高频噪声。
- 采集:通过数据采集卡完成模拟信号到数字信号的精确转换工作,并记录于电脑以便后续分析。
- 校准:对采集到的电信号执行校准操作以确保其准确性与一致性。
3. 肌电图信号的预处理
3.1 去噪
去除肌电图信号中的噪声是预处理的重要步骤。常用的去噪方法包括:
- 通带滤波 :通过通带滤波网络抑制低频和高频噪声。
- 陷波滤波 :用于抑制特定频率的干扰信号,例如50\,\text{Hz}或60\,\text{Hz}的电源 hum。
- 自适应滤波 :根据输入信号特征自动调节参数以实现最佳去噪效果。
3.1.1 带通滤波器
带通滤波器不仅能够有效地消除信号中的低频和高频噪声,并且能够精准地保留所需频率范围内的信号成分。它涵盖的常见类型包括 Butterworth 滤波器与 Chebyshev 滤波器等技术方案
import numpy as np
import scipy.signal as signal
import matplotlib.pyplot as plt
# 生成示例肌电图信号
fs = 1000 # 采样频率
t = np.linspace(0, 1, fs, endpoint=False) # 时间向量
emg_signal = np.sin(2 * np.pi * 50 * t) + 0.1 * np.sin(2 * np.pi * 5 * t) + 0.2 * np.sin(2 * np.pi * 500 * t) # 50 Hz的主信号,5 Hz和500 Hz的噪声
# 带通滤波器参数
lowcut = 20 # 低频截止频率
highcut = 500 # 高频截止频率
nyquist = 0.5 * fs
low = lowcut / nyquist
high = highcut / nyquist
# 设计Butterworth带通滤波器
b, a = signal.butter(4, [low, high], btype='band')
# 应用滤波器
filtered_signal = signal.lfilter(b, a, emg_signal)
# 绘制原始信号和滤波后的信号
plt.figure(figsize=(12, 6))
plt.subplot(2, 1, 1)
plt.plot(t, emg_signal)
plt.title('原始肌电图信号')
plt.xlabel('时间 (s)')
plt.ylabel('幅值 (mV)')
plt.subplot(2, 1, 2)
plt.plot(t, filtered_signal)
plt.title('滤波后的肌电图信号')
plt.xlabel('时间 (s)')
plt.ylabel('幅值 (mV)')
plt.tight_layout()
plt.show()
3.2 信号放大
信号放大是提高肌电图信号信噪比的关键环节之一,在实际应用中,则常用前置放大器来实现这一过程。
3.3 信号对齐
校准过程旨在将被采集的肌电信号与基准参考信号进行校准,以减少时间差值的差异。这一目标在多通道肌电图信号处理中具有重要意义。
3.3.1 信号对齐示例
假设我们有两个通道的肌电图信号,需要将它们对齐。
import numpy as np
import matplotlib.pyplot as plt
from scipy.signal import correlate
# 生成示例肌电图信号
fs = 1000 # 采样频率
t = np.linspace(0, 1, fs, endpoint=False) # 时间向量
emg_signal1 = np.sin(2 * np.pi * 50 * t) + 0.1 * np.sin(2 * np.pi * 5 * t)
emg_signal2 = np.sin(2 * np.pi * 50 * (t + 0.05)) + 0.1 * np.sin(2 * np.pi * 5 * t) # 信号2延迟0.05秒
# 计算互相关
correlation = correlate(emg_signal1, emg_signal2, mode='full')
lags = signal.correlation_lags(len(emg_signal1), len(emg_signal2), mode='full')
# 找到最大互相关的位置
lag = lags[np.argmax(correlation)]
# 对齐信号
aligned_signal2 = np.roll(emg_signal2, -lag)
# 绘制原始信号和对齐后的信号
plt.figure(figsize=(12, 6))
plt.subplot(2, 1, 1)
plt.plot(t, emg_signal1, label='通道1')
plt.plot(t, emg_signal2, label='通道2 (原始)')
plt.title('原始肌电图信号')
plt.xlabel('时间 (s)')
plt.ylabel('幅值 (mV)')
plt.legend()
plt.subplot(2, 1, 2)
plt.plot(t, emg_signal1, label='通道1')
plt.plot(t, aligned_signal2, label='通道2 (对齐)')
plt.title('对齐后的肌电图信号')
plt.xlabel('时间 (s)')
plt.ylabel('幅值 (mV)')
plt.legend()
plt.tight_layout()
plt.show()
4. 肌电图信号的特征提取
4.1 时域特征
时域特征是指在时间域内直接计算的信号特征。常用的时域特征包括:
- 均值:x是输入序列。
- 均方根(RMS):RMS指标为\sqrt{\frac{1}{N}\sum x_i^2}。
- 零交叉率(ZCR):ZCR为\frac{1}{N-1}\sum_{i=1}^{N-1}|sgn(x_i x_{i+1})|。
- 波形长度(WL):WL定义为\sum |x_{i+1}-x_i|。
4.1.1 时域特征提取示例
import numpy as np
import matplotlib.pyplot as plt
# 生成示例肌电图信号
fs = 1000 # 采样频率
t = np.linspace(0, 1, fs, endpoint=False) # 时间向量
emg_signal = np.sin(2 * np.pi * 50 * t) + 0.1 * np.sin(2 * np.pi * 5 * t) + 0.2 * np.sin(2 * np.pi * 500 * t)
# 计算时域特征
mean_value = np.mean(emg_signal)
rms_value = np.sqrt(np.mean(emg_signal**2))
zcr_value = np.sum(np.abs(np.diff(np.sign(emg_signal)))) / (2 * len(emg_signal))
wl_value = np.sum(np.abs(np.diff(emg_signal)))
# 输出特征值
print(f'均值: {mean_value}')
print(f'均方根 (RMS): {rms_value}')
print(f'零交叉率 (ZCR): {zcr_value}')
print(f'波形长度 (WL): {wl_value}')
# 绘制信号
plt.figure(figsize=(12, 6))
plt.plot(t, emg_signal)
plt.title('示例肌电图信号')
plt.xlabel('时间 (s)')
plt.ylabel('幅值 (mV)')
plt.show()
4.2 频域特征
频域特征是指在频率域内计算的信号特征。常用的频域特征包括:
- 功率谱密度(PSD)是一种用于表征信号能量在频域分布情况的技术指标。
- 中心频率是衡量信号主要能量集中在某一特定频段的重要参数。
- 带宽则指定了信号所覆盖的有效频谱范围。
4.2.1 频域特征提取示例
import numpy as np
import matplotlib.pyplot as plt
from scipy.signal import welch
# 生成示例肌电图信号
fs = 1000 # 采样频率
t = np.linspace(0, 1, fs, endpoint=False) # 时间向量
emg_signal = np.sin(2 * np.pi * 50 * t) + 0.1 * np.sin(2 * np.pi * 5 * t) + 0.2 * np.sin(2 * np.pi * 500 * t)
# 计算功率谱密度
frequencies, psd = welch(emg_signal, fs, nperseg=1000)
# 计算中心频率和带宽
center_frequency = np.sum(frequencies * psd) / np.sum(psd)
bandwidth = np.sqrt(np.sum((frequencies - center_frequency)**2 * psd) / np.sum(psd))
# 输出特征值
print(f'中心频率: {center_frequency}')
print(f'带宽: {bandwidth}')
# 绘制功率谱密度
plt.figure(figsize=(12, 6))
plt.plot(frequencies, psd)
plt.title('肌电图信号的功率谱密度')
plt.xlabel('频率 (Hz)')
plt.ylabel('功率谱密度 (mV^2/Hz)')
plt.axvline(x=center_frequency, color='r', linestyle='--', label=f'中心频率: {center_frequency:.2f} Hz')
plt.legend()
plt.show()
4.3 时频域特征
时空域内对信号进行分析处理得到的特性指标称为时频域特征。\ 常见的时空域特征包含:
- Short-time Fourier transform (STFT): 将信号划分为有限时间区间,并对每个区间进行Fourier transform。
- Wavelet transform: 利用小波变换来揭示信号的时间-频率特征.
4.3.1 短时傅里叶变换示例
import numpy as np
import matplotlib.pyplot as plt
from scipy.signal import stft
# 生成示例肌电图信号
fs = 1000 # 采样频率
t = np.linspace(0, 1, fs, endpoint=False) # 时间向量
emg_signal = np.sin(2 * np.pi * 50 * t) + 0.1 * np.sin(2 * np.pi * 5 * t) + 0.2 * np.sin(2 * np.pi * 500 * t)
# 计算短时傅里叶变换
frequencies, times, stft_signal = stft(emg_signal, fs, nperseg=100)
# 绘制时频图
plt.figure(figsize=(12, 6))
plt.pcolormesh(times, frequencies, np.abs(stft_signal), shading='gouraud')
plt.title('肌电图信号的短时傅里叶变换')
plt.xlabel('时间 (s)')
plt.ylabel('频率 (Hz)')
plt.colorbar(label='幅值 (mV)')
plt.show()
4.4 非线性特征
非线性特征被称为用于评估信号中存在非线性特性的指标。常见的包括用来分析复杂信号的各种统计量和动态参数。
- Lyapunov 指数 :用于表征信号中混乱运动的存在程度。
- 样本熵(Sample Entropy) :衡量信号的时间序列特征复杂度。
4.4.1 样本熵计算示例
import numpy as np
import matplotlib.pyplot as plt
from entropy import sample_entropy
# 生成示例肌电图信号
fs = 1000 # 采样频率
t = np.linspace(0, 1, fs, endpoint=False) # 时间向量
emg_signal = np.sin(2 * np.pi * 50 * t) + 0.1 * np.sin(2 * np.pi * 5 * t) + 0.2 * np.sin(2 * np.pi * 500 * t)
# 计算样本熵
sample_entropy_value = sample_entropy(emg_signal, sample_length=10, tolerance=0.5)
# 输出样本熵
print(f'样本熵: {sample_entropy_value}')
# 绘制信号
plt.figure(figsize=(12, 6))
plt.plot(t, emg_signal)
plt.title('示例肌电图信号')
plt.xlabel('时间 (s)')
plt.ylabel('幅值 (mV)')
plt.show()
5. 肌电图信号的分类
5.1 基于机器学习的分类
基于机器学习的分类技术能够用于鉴别不同类型的肌电图信号。广泛使用的机器学习算法涵盖:
- 支持向量机(SVM)
- 随机森林(Random Forest)
- 深度神经网络(DNN)
这些算法能够有效识别肌电图信号中的有用特征,并根据这些特征将信号归类为不同类别。例如,在区分不同的肌肉活动状态方面可以利用支持向量机(SVM)。
5.1.1 支持向量机分类示例
import numpy as np
import matplotlib.pyplot as plt
from sklearn.svm import SVC
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
# 生成示例肌电图数据
np.random.seed(0)
X1 = np.sin(2 * np.pi * 50 * np.linspace(0, 1, 1000, endpoint=False)).reshape(-1, 1) + 0.1 * np.random.randn(1000, 1)
X2 = np.sin(2 * np.pi * 100 * np.linspace(0, 1, 1000, endpoint=False)).reshape(-1, 1) + 0.1 * np.random.randn(1000, 1)
X = np.vstack((X1, X2))
y = np.hstack((np.zeros(1000), np.ones(1000)))
# 分割数据集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
# 训练支持向量机模型
svm = SVC(kernel='linear')
svm.fit(X_train, y_train)
# 预测并评估模型
y_pred = svm.predict(X_test)
accuracy = accuracy_score(y_test, y_pred)
# 输出准确率
print(f'准确率: {accuracy}')
# 绘制分类结果
plt.figure(figsize=(12, 6))
plt.scatter(X_train[:, 0], y_train, color='blue', label='训练数据')
plt.scatter(X_test[:, 0], y_test, color='green', label='测试数据')
plt.scatter(X_test[:, 0], y_pred, color='red', label='预测结果')
plt.title('支持向量机分类结果')
plt.xlabel('幅值 (mV)')
plt.ylabel('类别')
plt.legend()
plt.show()
5.2 基于深度学习的分类
利用深度学习技术开发出的有效分类方法能够处理复杂且具有挑战性的肌电图信号。经过多层次神经网络处理后提取出信号的关键特性,并能精确高效地完成分类任务。常见的深度学习模型类型包括:
- 卷积神经网络(CNN)
- 循环神经网络(RNN)
- 长短期记忆网络(LSTM)
这些模型在分析时间序列数据的特征方面表现出高度效率,并且能够有效识别信号的时间依赖关系及其关键局部特性。
5.2.1 卷积神经网络分类示例
import numpy as np
import matplotlib.pyplot as plt
import tensorflow as tf
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Conv1D, MaxPooling1D, Flatten, Dense
# 生成示例肌电图数据
np.random.seed(0)
X1 = np.sin(2 * np.pi * 50 * np.linspace(0, 1, 1000, endpoint=False)).reshape(1000, 1) + 0.1 * np.random.randn(1000, 1)
X2 = np.sin(2 * np.pi * 100 * np.linspace(0, 1, 1000, endpoint=False)).reshape(1000, 1) + 0.1 * np.random.randn(1000, 1)
X = np.vstack((X1, X2))
y = np.hstack((np.zeros(1000), np.ones(1000)))
# 分割数据集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
# 构建卷积神经网络模型
model = Sequential([
Conv1D(32, kernel_size=5, activation='relu', input_shape=(1000, 1)),
MaxPooling1D(pool_size=2),
Conv1D(64, kernel_size=5, activation='relu'),
MaxPooling1D(pool_size=2),
Flatten(),
Dense(128, activation='relu'),
Dense(1, activation='sigmoid')
])
# 编译模型
model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])
# 训练模型
history = model.fit(X_train, y_train, epochs=10, batch_size=32, validation_split=0.2)
# 预测并评估模型
y_pred = (model.predict(X_test) > 0.5).astype(int)
accuracy = accuracy_score(y_test, y_pred)
# 输出准确率
print(f'准确率: {accuracy}')
# 绘制训练和验证的准确率曲线
plt.figure(figsize=(12, 6))
plt.plot(history.history['accuracy'], label='训练准确率')
plt.plot(history.history['val_accuracy'], label='验证准确率')
plt.title('卷积神经网络训练和验证准确率')
plt.xlabel('Epoch')
plt.ylabel('准确率')
plt.legend()
plt.show()
# 绘制分类结果
plt.figure(figsize=(12, 6))
plt.scatter(X_test[:, 0], y_test, color='green', label='测试数据')
plt.scatter(X_test[:, 0], y_pred, color='red', label='预测结果')
plt.title('卷积神经网络分类结果')
plt.xlabel('幅值 (mV)')
plt.ylabel('类别')
plt.legend()
plt.show()
5.3 基于深度学习的分类示例:长短期记忆网络(LSTM)
长短期记忆网络(LSTM)被定义为一种特殊的循环神经网络(RNN),特别适合处理具有时间依赖性的数据。例如肌电图信号。该架构通过引入记忆单元和门控机制从而能够有效地捕捉长期依赖关系。
5.3.1 长短期记忆网络分类示例
import numpy as np
import matplotlib.pyplot as plt
import tensorflow as tf
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import LSTM, Dense, TimeDistributed
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
# 生成示例肌电图数据
np.random.seed(0)
X1 = np.sin(2 * np.pi * 50 * np.linspace(0, 1, 1000, endpoint=False)).reshape(1000, 1, 1) + 0.1 * np.random.randn(1000, 1, 1)
X2 = np.sin(2 * np.pi * 100 * np.linspace(0, 1, 1000, endpoint=False)).reshape(1000, 1, 1) + 0.1 * np.random.randn(1000, 1, 1)
X = np.vstack((X1, X2))
y = np.hstack((np.zeros(1000), np.ones(1000)))
# 分割数据集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
# 构建LSTM模型
model = Sequential([
LSTM(64, return_sequences=True, input_shape=(1000, 1)),
LSTM(64),
Dense(1, activation='sigmoid')
])
# 编译模型
model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])
# 训练模型
history = model.fit(X_train, y_train, epochs=10, batch_size=32, validation_split=0.2)
# 预测并评估模型
y_pred = (model.predict(X_test) > 0.5).astype(int).flatten()
accuracy = accuracy_score(y_test, y_pred)
# 输出准确率
print(f'准确率: {accuracy}')
# 绘制训练和验证的准确率曲线
plt.figure(figsize=(12, 6))
plt.plot(history.history['accuracy'], label='训练准确率')
plt.plot(history.history['val_accuracy'], label='验证准确率')
plt.title('长短期记忆网络训练和验证准确率')
plt.xlabel('Epoch')
plt.ylabel('准确率')
plt.legend()
plt.show()
# 绘制分类结果
plt.figure(figsize=(12, 6))
plt.scatter(X_test[:, 0, 0], y_test, color='green', label='测试数据')
plt.scatter(X_test[:, 0, 0], y_pred, color='red', label='预测结果')
plt.title('长短期记忆网络分类结果')
plt.xlabel('幅值 (mV)')
plt.ylabel('类别')
plt.legend()
plt.show()
6. 肌电图信号的应用
6.1 临床应用
肌电图信号在临床应用中具有重要意义,主要用于:
- 识别肌肉与神经系统的疾病 :临床医生能够通过分析患者的肌电图数据来识别肌肉无力症或神经系统损伤等问题。
- 评价肌肉的功能状态 :该方法旨在评价受试者的肌肉收缩能力及运动模式的变化情况。
- 提供康复指导建议 :临床医生与物理治疗师能够根据患者的肌电图结果制定相应的干预措施以促进康复进展。
6.2 生物力学研究
肌电图信号在生物力学研究中也有广泛的应用,包括:
- 肌电信号分析:利用肌电图数据探究不同运动阶段肌肉活动的表现及其规律。
- 神经调控机制探讨:深入探讨神经系统如何调控肌肉活动。
- 肌电信号变化判断:通过细致考察肌电图信号的变化情况来判断肌肉是否处于疲劳状态。
6.3 人机交互
肌电图信号在人机交互领域也有重要的应用,例如:
- 肌电控制假肢:通过肌电图信号实现假肢动作的精确控制,在提升动作流畅性的同时增强操作稳定性。
- 手势识别:识别不同手势序列并完成对设备的操作指令。
- 脑-机接口(BCI):结合肌电与脑电信号数据构建脑机接口系统,在提高信息传递效率的同时优化人机交互体验。
7. 肌电图信号处理的挑战
7.1 信号噪声
肌电图信号往往面临多种类型的噪声干扰。
常见的包括电源波动引起的干扰以及肌电信号自身产生的杂音。
去噪作为关键步骤,在现代信号处理中占据重要地位。
通常需要结合多种先进的滤波方法以达到最佳效果。
肌电图信号往往面临多种类型的噪声干扰。
常见的包括电源波动引起的干扰以及肌电信号自身产生的杂音。
去噪作为关键步骤,在现代信号处理中占据重要地位。
通常需要结合多种先进的滤波方法以达到最佳效果。
7.2 信号的非平稳性
肌电图信号表现出明显的非平稳特性,在传统时间域分析方法中无法实现有效的特征提取与信息解析。在时频分析领域中采用的方法包括短时傅里叶变换以及小波变换等技术
7.3 个体差异
不同个体之间的肌电图信号可能存在显著差异
7.4 信号的复杂性
由于肌电图信号具有高度复杂性,在进行特征提取时会面临诸多挑战。为了提升分类效果,在分析肌电图信号时建议综合运用时域分析、频域分析以及非线性分析等多维度的方法进行研究。
8. 未来发展方向
8.1 高精度传感器
未来的肌电图信号采集倚重高精度传感器技术的发展,在此过程中旨在提升信号采集质量与信噪比水平
8.2 多模态信号融合
利用肌电信号与其他相关生物信息相结合的方法中不仅包含脑电信号(EEG)以及心电信号(ECG)还可以进行更加精确的信号分析与分类
8.3 深度学习技术的发展
在深度学习技术日新月异的发展过程中,在肌电图信号处理领域中,新的模型与算法正在逐步应用于这一领域,并从而显著提升信号分类与识别的准确性
8.4 便携式设备
便携式肌电图设备的进步将带来肌电图信号采集与分析的更加便捷,并适应于更多应用场景,如家庭康复与运动监测。
9. 总结
肌电图信号处理与分析是一项涉及多个领域的交叉学科研究,在生物医学工程学、信号处理技术和人工智能算法等多个方面展开深入探讨。通过从肌电图信号中提取信息并进行特征识别,在实际应用中能够实现对肌肉活动情况及其神经系统调控机制的研究,并在临床医学应用中以及人机交互界面开发等领域均有广泛应用。展望未来,在人工智能技术快速发展的背景下,在提高相关领域研究效率的同时也有助于推动人类健康水平的整体提升

