信号处理应用:生物医学信号处理_(2).生物医学信号的获取和预处理
生物医学信号的获取和预处理
在生物医学信号处理领域中,在获取与预处理信号方面存在著至关重要的地位。本节将深入探讨生物医学信号获取方法以及预处理技术,并具体阐述这些技术在实际应用中的实施步骤。我们将深入分析常见的心电图(ECG)、脑电图(EEG)以及肌电图(EMG)等多种生物医学signal类型,并详细探讨如何利用各类sensor与设备来进行数据采集工作。此外本节还将系统性地介绍多种signal pre-processing技术,并重点分析滤波器设计、噪声抑制策略以及基线漂移校正等关键技术环节,并结合实际案例与代码示例来具体说明这些技术的应用场景与实现流程。

1. 生物医学信号的获取
1.1 常见的生物医学信号类型
包含来自生物体的各种生理信息载体的是生物医学信号这一概念。它们能够反映出生物体的生理状态及其功能特性。常见的生物医学信号类型包括:
- 心电图(ECG)是一种能反映心脏电信号变化的技术,在临床应用中被广泛用于评估和诊断心脏相关疾病。
- 脑电图(EEG)是一种能捕捉大脑电信号动态变化的技术,在神经科学研究和临床诊断中发挥着关键作用。
- 肌肉兴奋性检测技术(EMG)是一种能生成对肌肉收缩与放松周期的具体信息采集方法。
- 血压监测系统通过捕捉血压波动的趋势特征来评估心血管系统的健康状况。
- 气候变化监测系统通过分析呼吸气体交换过程中的动态变化来评估呼吸系统的功能状态。
- 血糖监测系统通过捕捉血液中葡萄糖浓度的时间序列数据来进行糖尿病患者的血糖调控分析。
1.2 生物医学信号的采集设备
生物医学信号的采集一般会采用先进类型的传感器与设备进行操作。这些精密仪器能够实现生理信息从生物体向电信号的有效转换,并为后续的数据处理与深入分析提供可靠的基础支持。常见的采集装置主要包括:
- 心电图记录仪(ECG Monitor) 主要用于采集心电图数据
- 脑电信号记录仪(EEG Monitor) 负责捕捉脑部电信号
- 肌电活动监测仪(EMG Monitor) 继续监测肌肉活动
- 血压测量装置(Sphygmanometer) 精确测定血压数值
- 呼气追踪装置 高效采集呼气数据
- 血糖水平检测仪 精准测量血糖浓度
1.3 信号采集的基本步骤
信号采集的基本步骤包括:
- 根据特定类型选择相应的传感器以满足不同工作需求。
- 正确安装传感器位置确保测量参数的精确获取与可靠采集。
- 通过采集设备捕获并记录信号信息以供后续分析处理。
- 将采集的数据传输至计算机或存储装置中以便于进一步运算处理与分析存档管理。
- 将捕捉到的数据按照格式保存在适当的位置以便后续进行分析计算与管理运用
1.4 信号采集的注意事项
在信号采集过程中,需要注意以下几点:
- 传感器的校准工作:要求所有传感器均需处于校准状态以保证信号质量。
- 皮肤处理:可采用导电膏或电极片进行处理以确保设备与皮肤良好接触。
- 外界干扰源:努力消除由电磁场及环境噪音带来的干扰影响。
- 数据同步性:要求各传感器的数据采集能够保持同步性以提高测量精度。
2. 生物医学信号的预处理
2.1 滤波技术
滤波技术用于去除信号中的噪声和干扰。常见的滤波技术包括:
- 低通滤波器 主要用于过滤掉高于设定频率的信号。
- 高通滤波器 主要作用是过滤掉低于设定频率的信号。
- 带通滤波器 带有明确截止频率范围的技术装置。
- 带阻滤波器 设计时需排除指定频率区间内的干扰信号。
2.1.1 低通滤波器
该低通滤波器能够有效地抑制高频噪声干扰。它通过反馈机制维持低于设定截止频率的所有信号传输质量,并在此基础上减弱高于该阈值的所有信号的影响。
Python 代码示例 :
import numpy as np
import matplotlib.pyplot as plt
from scipy.signal import butter, lfilter
# 定义低通滤波器
def butter_lowpass(cutoff, fs, order=5):
nyq = 0.5 * fs
normal_cutoff = cutoff / nyq
b, a = butter(order, normal_cutoff, btype='low', analog=False)
return b, a
# 应用低通滤波器
def butter_lowpass_filter(data, cutoff, fs, order=5):
b, a = butter_lowpass(cutoff, fs, order=order)
y = lfilter(b, a, data)
return y
# 生成模拟的心电图信号
fs = 1000.0 # 采样频率
T = 5.0 # 信号长度
n = int(T * fs) # 信号总点数
t = np.linspace(0, T, n, endpoint=False)
# 模拟心电图信号
original_signal = 0.5 * np.sin(2 * np.pi * 1 * t) + 0.2 * np.sin(2 * np.pi * 10 * t) + 0.1 * np.random.randn(n)
# 应用低通滤波器
cutoff = 30 # 截止频率
order = 6 # 滤波器阶数
filtered_signal = butter_lowpass_filter(original_signal, cutoff, fs, order)
# 绘制原始信号和滤波后的信号
plt.figure(figsize=(12, 6))
plt.plot(t, original_signal, label='原始信号')
plt.plot(t, filtered_signal, label='滤波后的信号', linewidth=2)
plt.xlabel('时间 (s)')
plt.ylabel('幅度')
plt.legend()
plt.grid(True)
plt.show()
代码说明 :
butter_lowpass:基于巴特沃思设计的低通滤波器。butter_lowpass_filter:对数据应用巴特沃思型低通滤波器。original_signal:生成包含低频信号、高频噪声和随机噪声的模拟的心电图信号。filtered_signal:经过滤波处理后的信号。plt.plot:绘制原始心电图信号及其滤波后版本。
2.2 去噪技术
去噪技术用于去除信号中的随机噪声和其他干扰。常见的去噪技术包括:
- 算法 : 该算法通过小波变换对信号进行分解, 并成功去除噪声.
- 方法 : 该方法通过傅里叶变换将信号转换到频域, 并成功去除频域中的噪声.
- 滤波器 : 采用中值滤波器去除脉冲噪声.
2.2.1 小波变换去噪
该方法在降噪方面表现出色。通过将信号分解为不同频段的子带,并从高频子带中去除噪声。
Python 代码示例 :
import pywt
import numpy as np
import matplotlib.pyplot as plt
# 生成模拟的心电图信号
fs = 1000.0 # 采样频率
T = 5.0 # 信号长度
n = int(T * fs) # 信号总点数
t = np.linspace(0, T, n, endpoint=False)
# 模拟心电图信号
original_signal = 0.5 * np.sin(2 * np.pi * 1 * t) + 0.2 * np.sin(2 * np.pi * 10 * t) + 0.1 * np.random.randn(n)
# 小波变换去噪
wavelet = 'db4' # 选择小波基
level = 3 # 分解层数
coeffs = pywt.wavedec(original_signal, wavelet, level=level) # 小波分解
# 去除高频子带的噪声
threshold = np.std(coeffs[-1]) * np.sqrt(2 * np.log(len(original_signal)))
coeffs[-1] = pywt.threshold(coeffs[-1], threshold, mode='soft')
# 重构信号
denoised_signal = pywt.waverec(coeffs, wavelet)
# 绘制原始信号和去噪后的信号
plt.figure(figsize=(12, 6))
plt.plot(t, original_signal, label='原始信号')
plt.plot(t, denoised_signal, label='去噪后的信号', linewidth=2)
plt.xlabel('时间 (s)')
plt.ylabel('幅度')
plt.legend()
plt.grid(True)
plt.show()
代码说明 :
- pywt.wavedec:执行信号的小波分解。
- pywt.threshold:对高频子带的小波系数执行软阈值降噪处理。
- pywt.waverec:重建原始信号。
- threshold:生成用于降噪的阈值。
- denoised_signal:经过降噪处理后的数据序列。
2.3 基线校正
基线归零处理是指通过计算该信号的时间平均值并将其调整至零或固定数值来进行校准。在长时间持续采集的数据情境下,在生物医学工程领域中常会遇到基线漂移现象
2.3.1 基线校正方法
常见的基线校正方法包括:
- 移动平均滤波法:通过应用移动平均滤波器来实现对基线漂移的消除。
- 多项式拟合方法:采用多项式拟合技术计算出基线曲线后,并将其从原始数据序列中扣除。
Python 代码示例 :
import numpy as np
import matplotlib.pyplot as plt
from scipy.signal import detrend
# 生成模拟的心电图信号,包含基线漂移
fs = 1000.0 # 采样频率
T = 5.0 # 信号长度
n = int(T * fs) # 信号总点数
t = np.linspace(0, T, n, endpoint=False)
# 模拟心电图信号
original_signal = 0.5 * np.sin(2 * np.pi * 1 * t) + 0.2 * np.sin(2 * np.pi * 10 * t) + 0.1 * np.random.randn(n) + 0.05 * t
# 基线校正
detrended_signal = detrend(original_signal)
# 绘制原始信号和基线校正后的信号
plt.figure(figsize=(12, 6))
plt.plot(t, original_signal, label='原始信号')
plt.plot(t, detrended_signal, label='基线校正后的信号', linewidth=2)
plt.xlabel('时间 (s)')
plt.ylabel('幅度')
plt.legend()
plt.grid(True)
plt.show()
代码说明 :
remove_trend:通过多项式拟合方法去除时间趋势。original_signal:创建一个模拟的心电图信号,并包含基线漂移成分。detrended_signal:经过基线漂移去除后的干净信号。
2.4 信号的分割和重采样
在信号处理领域中,在某些情况下需要将信号切分为多个片段或进行重新取样以调整其采样频率。这些操作能够显著地提升该领域的效率与准确性。
2.4.1 信号分割
划分较长的一段信号为多个较短的部分;这种方法能够帮助我们分析其局部特征
Python 代码示例 :
import numpy as np
import matplotlib.pyplot as plt
# 生成模拟的心电图信号
fs = 1000.0 # 采样频率
T = 10.0 # 信号长度
n = int(T * fs) # 信号总点数
t = np.linspace(0, T, n, endpoint=False)
# 模拟心电图信号
original_signal = 0.5 * np.sin(2 * np.pi * 1 * t) + 0.2 * np.sin(2 * np.pi * 10 * t) + 0.1 * np.random.randn(n)
# 信号分割
segment_length = 1000 # 每个片段的长度
num_segments = int(n / segment_length) # 总片段数
segments = np.array([original_signal[i * segment_length:(i + 1) * segment_length] for i in range(num_segments)])
# 绘制分割后的信号片段
plt.figure(figsize=(12, 6))
for i, segment in enumerate(segments):
plt.plot(t[i * segment_length:(i + 1) * segment_length], segment, label=f'片段 {i+1}')
plt.xlabel('时间 (s)')
plt.ylabel('幅度')
plt.legend()
plt.grid(True)
plt.show()
代码说明 :
- The size of each segment.
- The number of segments.
- The signal segments after segmentation.
- Drawing the signal waveforms with plt.plot.
2.4.2 信号重采样
信号重采样是指改变信号的采样频率。这可以通过插值或降采样实现。
Python 代码示例 :
import numpy as np
import matplotlib.pyplot as plt
from scipy.signal import resample
# 生成模拟的心电图信号
fs = 1000.0 # 原始采样频率
T = 10.0 # 信号长度
n = int(T * fs) # 信号总点数
t = np.linspace(0, T, n, endpoint=False)
# 模拟心电图信号
original_signal = 0.5 * np.sin(2 * np.pi * 1 * t) + 0.2 * np.sin(2 * np.pi * 10 * t) + 0.1 * np.random.randn(n)
# 信号重采样
new_fs = 500.0 # 新的采样频率
new_n = int(T * new_fs) # 新的信号总点数
new_t = np.linspace(0, T, new_n, endpoint=False)
resampled_signal = resample(original_signal, new_n)
# 绘制原始信号和重采样后的信号
plt.figure(figsize=(12, 6))
plt.plot(t, original_signal, label='原始信号')
plt.plot(new_t, resampled_signal, label='重采样后的信号', linewidth=2)
plt.xlabel('时间 (s)')
plt.ylabel('幅度')
plt.legend()
plt.grid(True)
plt.show()
代码说明 :
- 使用插值技术实现数据重新采样。
- 更新后的"
mathnew_fsmath"表示采用更高精度的"mathsampling ratemath"。 - 新配置下的"
mathnew_nmath"设定为"```mathtotal signal points countmath``"。 - 输出端将生成经过"```math
interpolation techniquemath``"处理后的信号输出。
2.5 信号的标准化
归一化的处理使信号的幅度被限制在固定区间内,并且常见的范围包括0至1或-1至1区间。这种处理方法有助于提升整个系统的稳定性和一致性表现。
Python 代码示例 :
import numpy as np
import matplotlib.pyplot as plt
from sklearn.preprocessing import MinMaxScaler
# 生成模拟的心电图信号
fs = 1000.0 # 采样频率
T = 10.0 # 信号长度
n = int(T * fs) # 信号总点数
t = np.linspace(0, T, n, endpoint=False)
# 模拟心电图信号
original_signal = 0.5 * np.sin(2 * np.pi * 1 * t) + 0.2 * np.sin(2 * np.pi * 10 * t) + 0.1 * np.random.randn(n)
# 信号标准化
scaler = MinMaxScaler(feature_range=(-1, 1))
standardized_signal = scaler.fit_transform(original_signal.reshape(-1, 1)).flatten()
# 绘制原始信号和标准化后的信号
plt.figure(figsize=(12, 6))
plt.plot(t, original_signal, label='原始信号')
plt.plot(t, standardized_signal, label='标准化后的信号', linewidth=2)
plt.xlabel('时间 (s)')
plt.ylabel('幅度')
plt.legend()
plt.grid(True)
plt.show()
代码说明 :
MinMaxScaler:通过 sklearn 库的 MinMaxScaler 实现数据标准化。feature_range:设定归一化后的范围区间。original_signal:创建一个模拟的心电图信号数据。standardized_signal:归一化处理后的信号。
3. 实际应用案例
3.2 脑电图(EEG)信号的预处理
脑电图(EEG)信号的预处理不仅包括基线校正等技术,同时也涉及滤波与降噪等环节。这些措施对于有效去除噪声干扰,提升信号质量以及确保后续数据解析工作的准确性而言,缺一不可。EEG 信号所包含的各种噪声源主要来自外在环境与人体自身活动,因此实现有效的预处理显得尤为重要且难度较大。
3.2.1 基线校正
该方法旨在消除EEG信号长时间记录中出现的基线漂移现象。由于基线漂移可能导致EEG信号幅度发生改变,在分析和解释时可能会出现偏差。
Python 代码示例 :
import numpy as np
import matplotlib.pyplot as plt
from scipy.signal import detrend
# 生成模拟的脑电图信号,包含基线漂移
fs = 500.0 # 采样频率
T = 30.0 # 信号长度
n = int(T * fs) # 信号总点数
t = np.linspace(0, T, n, endpoint=False)
# 模拟脑电图信号
original_signal = 0.5 * np.sin(2 * np.pi * 10 * t) + 0.2 * np.sin(2 * np.pi * 20 * t) + 0.1 * np.random.randn(n) + 0.05 * t
# 基线校正
detrended_signal = detrend(original_signal)
# 绘制原始信号和基线校正后的信号
plt.figure(figsize=(12, 6))
plt.plot(t, original_signal, label='原始信号')
plt.plot(t, detrended_signal, label='基线校正后的信号', linewidth=2)
plt.xlabel('时间 (s)')
plt.ylabel('幅度')
plt.legend()
plt.grid(True)
plt.show()
代码说明 :
- 消减趋势(detrend):通过多项式拟合法消除(使用)基线漂移的影响(from).
- original_signal:生成了一个包含baseline drift的模拟脑电图信号.
- detrended_signal:经过消减趋势处理后的信号.
3.2.2 滤波
EEG 信号经常需要经过多层次的滤波处理以消除不同频率范围的干扰性噪音。通过这种方法能够有效改善信号质量并提取出有用的信息。常见的滤波技术主要有以下几种:低通滤波器用于抑制高频噪声;高通滤波器则用于去除低频背景信号;而带通滤波器则能够精确调节所需频段的信号输出
Python 代码示例 :
import numpy as np
import matplotlib.pyplot as plt
from scipy.signal import butter, lfilter, filtfilt
# 定义带通滤波器
def butter_bandpass(lowcut, highcut, fs, order=5):
nyq = 0.5 * fs
low = lowcut / nyq
high = highcut / nyq
b, a = butter(order, [low, high], btype='band', analog=False)
return b, a
# 应用带通滤波器
def butter_bandpass_filter(data, lowcut, highcut, fs, order=5):
b, a = butter_bandpass(lowcut, highcut, fs, order=order)
y = filtfilt(b, a, data)
return y
# 生成模拟的脑电图信号
fs = 500.0 # 采样频率
T = 30.0 # 信号长度
n = int(T * fs) # 信号总点数
t = np.linspace(0, T, n, endpoint=False)
# 模拟脑电图信号
original_signal = 0.5 * np.sin(2 * np.pi * 10 * t) + 0.2 * np.sin(2 * np.pi * 20 * t) + 0.1 * np.random.randn(n) + 0.05 * t
# 基线校正
detrended_signal = detrend(original_signal)
# 带通滤波
lowcut = 1.0 # 低频截止频率
highcut = 50.0 # 高频截止频率
order = 6 # 滤波器阶数
filtered_signal = butter_bandpass_filter(detrended_signal, lowcut, highcut, fs, order)
# 绘制原始信号、基线校正后的信号和滤波后的信号
plt.figure(figsize=(12, 6))
plt.plot(t, original_signal, label='原始信号', alpha=0.5)
plt.plot(t, detrended_signal, label='基线校正后的信号', linewidth=2, alpha=0.7)
plt.plot(t, filtered_signal, label='滤波后的信号', linewidth=2)
plt.xlabel('时间 (s)')
plt.ylabel('幅度')
plt.legend()
plt.grid(True)
plt.show()
代码说明 :
butter_bandpass:建立一个带通滤波器模型。butter_bandpass_filter:将带通滤波器应用于数据集。original_signal:模拟生成脑电信号,并包含低频成分、高频干扰以及随机噪声。detrended_signal(detrended signal):去除基线趋势的信号。filtered_signal(filtered signal):经过过滤处理的信号输出结果。
3.2.3 去噪
EEG 信号中的噪声源多种多样,具体表现为电源干扰、肌电活动产生的噪音等。常用降噪方法涉及小波变换以及中值滤波器等技术手段。
Python 代码示例 :
import pywt
import numpy as np
import matplotlib.pyplot as plt
# 生成模拟的脑电图信号,包含噪声
fs = 500.0 # 采样频率
T = 30.0 # 信号长度
n = int(T * fs) # 信号总点数
t = np.linspace(0, T, n, endpoint=False)
# 模拟脑电图信号
original_signal = 0.5 * np.sin(2 * np.pi * 10 * t) + 0.2 * np.sin(2 * np.pi * 20 * t) + 0.1 * np.random.randn(n) + 0.05 * t
# 基线校正
detrended_signal = detrend(original_signal)
# 带通滤波
lowcut = 1.0 # 低频截止频率
highcut = 50.0 # 高频截止频率
order = 6 # 滤波器阶数
filtered_signal = butter_bandpass_filter(detrended_signal, lowcut, highcut, fs, order)
# 小波变换去噪
wavelet = 'db4' # 选择小波基
level = 3 # 分解层数
coeffs = pywt.wavedec(filtered_signal, wavelet, level=level) # 小波分解
# 去除高频子带的噪声
threshold = np.std(coeffs[-1]) * np.sqrt(2 * np.log(len(filtered_signal)))
coeffs[-1] = pywt.threshold(coeffs[-1], threshold, mode='soft')
# 重构信号
denoised_signal = pywt.waverec(coeffs, wavelet)
# 绘制原始信号、基线校正后的信号、滤波后的信号和去噪后的信号
plt.figure(figsize=(12, 6))
plt.plot(t, original_signal, label='原始信号', alpha=0.5)
plt.plot(t, detrended_signal, label='基线校正后的信号', linewidth=2, alpha=0.7)
plt.plot(t, filtered_signal, label='滤波后的信号', linewidth=2, alpha=0.7)
plt.plot(t, denoised_signal, label='去噪后的信号', linewidth=2)
plt.xlabel('时间 (s)')
plt.ylabel('幅度')
plt.legend()
plt.grid(True)
plt.show()
代码说明 :
pywt.wavedec:该Python库中的函数pywt.wavedec负责执行小波分解。pywt.threshold:该库中的函数pywt.threshold采用软阈值方法去除高频噪声。pywt.waverec:通过函数pywt.waverec可以恢复原始信号状态。- denoised_signal:经过去噪处理后的信号被命名为'denoised_signal'。
3.3 肌电图(EMG)信号的预处理
肌电图(EMG)信号的前处理过程同样涵盖了基线漂移修正、数字滤波器应用以及降噪技术这三个主要步骤。通常情况下,EMG信号会受到肌肉活动和环境因素的干扰较为明显的影响,在这种情况下进行数据预处理环节显得尤为重要
3.3.1 基线校正
通过基线校正处理可以有效消除EMG信号中的基线漂移影响
Python 代码示例 :
import numpy as np
import matplotlib.pyplot as plt
from scipy.signal import detrend
# 生成模拟的肌电图信号,包含基线漂移
fs = 1000.0 # 采样频率
T = 5.0 # 信号长度
n = int(T * fs) # 信号总点数
t = np.linspace(0, T, n, endpoint=False)
# 模拟肌电图信号
original_signal = 0.5 * np.sin(2 * np.pi * 100 * t) + 0.2 * np.sin(2 * np.pi * 200 * t) + 0.1 * np.random.randn(n) + 0.05 * t
# 基线校正
detrended_signal = detrend(original_signal)
# 绘制原始信号和基线校正后的信号
plt.figure(figsize=(12, 6))
plt.plot(t, original_signal, label='原始信号')
plt.plot(t, detrended_signal, label='基线校正后的信号', linewidth=2)
plt.xlabel('时间 (s)')
plt.ylabel('幅度')
plt.legend()
plt.grid(True)
plt.show()
代码说明 :
- detrend:通过多项式拟合法去除基线漂移。
- original_signal:创建一个含有基线漂移的模拟肌电图信号。
- detrended_signal:经过去趋势处理后的信号。
3.3.2 滤波
EMG 信号的滤波通常要求去除低频干扰(如直流漂移)和高频干扰(如电源干扰)。常用的滤波方法主要包括高通滤波器和低通滤波器。
Python 代码示例 :
import numpy as np
import matplotlib.pyplot as plt
from scipy.signal import butter, lfilter, filtfilt
# 定义高通滤波器
def butter_highpass(cutoff, fs, order=5):
nyq = 0.5 * fs
normal_cutoff = cutoff / nyq
b, a = butter(order, normal_cutoff, btype='high', analog=False)
return b, a
# 应用高通滤波器
def butter_highpass_filter(data, cutoff, fs, order=5):
b, a = butter_highpass(cutoff, fs, order=order)
y = filtfilt(b, a, data)
return y
# 生成模拟的肌电图信号
fs = 1000.0 # 采样频率
T = 5.0 # 信号长度
n = int(T * fs) # 信号总点数
t = np.linspace(0, T, n, endpoint=False)
# 模拟肌电图信号
original_signal = 0.5 * np.sin(2 * np.pi * 100 * t) + 0.2 * np.sin(2 * np.pi * 200 * t) + 0.1 * np.random.randn(n) + 0.05 * t
# 基线校正
detrended_signal = detrend(original_signal)
# 高通滤波
cutoff = 20 # 截止频率
order = 6 # 滤波器阶数
filtered_signal = butter_highpass_filter(detrended_signal, cutoff, fs, order)
# 绘制原始信号、基线校正后的信号和滤波后的信号
plt.figure(figsize=(12, 6))
plt.plot(t, original_signal, label='原始信号', alpha=0.5)
plt.plot(t, detrended_signal, label='基线校正后的信号', linewidth=2, alpha=0.7)
plt.plot(t, filtered_signal, label='高通滤波后的信号', linewidth=2)
plt.xlabel('时间 (s)')
plt.ylabel('幅度')
plt.legend()
plt.grid(True)
plt.show()
代码说明 :
- The butterworth high-pass concept is established.
- The butterworth high-pass filter is utilized to process the data.
- A simulated electromyography (EMG) signal incorporating both low-frequency signals and high-frequency noise is created.
- The processed signal has been adjusted to remove baseline drifts.
- The final filtered signal is the result after applying high-pass filtering.
3.3.3 去噪
EMG 信号中的噪声可以通过多种方法去除,包括中值滤波和小波变换。
Python 代码示例 :
import pywt
import numpy as np
import matplotlib.pyplot as plt
from scipy.signal import medfilt
# 生成模拟的肌电图信号,包含噪声
fs = 1000.0 # 采样频率
T = 5.0 # 信号长度
n = int(T * fs) # 信号总点数
t = np.linspace(0, T, n, endpoint=False)
# 模拟肌电图信号
original_signal = 0.5 * np.sin(2 * np.pi * 100 * t) + 0.2 * np.sin(2 * np.pi * 200 * t) + 0.1 * np.random.randn(n) + 0.05 * t
# 基线校正
detrended_signal = detrend(original_signal)
# 高通滤波
cutoff = 20 # 截止频率
order = 6 # 滤波器阶数
filtered_signal = butter_highpass_filter(detrended_signal, cutoff, fs, order)
# 中值滤波去噪
denoised_signal = medfilt(filtered_signal, kernel_size=3)
# 绘制原始信号、基线校正后的信号、滤波后的信号和去噪后的信号
plt.figure(figsize=(12, 6))
plt.plot(t, original_signal, label='原始信号', alpha=0.5)
plt.plot(t, detrended_signal, label='基线校正后的信号', linewidth=2, alpha=0.7)
plt.plot(t, filtered_signal, label='高通滤波后的信号', linewidth=2, alpha=0.7)
plt.plot(t, denoised_signal, label='去噪后的信号', linewidth=2)
plt.xlabel('时间 (s)')
plt.ylabel('幅度')
plt.legend()
plt.grid(True)
plt.show()
代码说明 :
medfilt:使用中值滤波器去除脉冲噪声。denoised_signal:去噪后的信号。
4. 总结
在生物医学信号处理领域中,信号采集与预处理环节对于后续分析至关重要。借助于合适传感器与设备的选型以及有效的数据采集方法,在实际应用中通常会采用滤波去噪与基线校正等预处理措施以有效提升数据质量的同时也为其后续分析诊断奠定了更优的基础。本研究通过心电图(ECG)、脑电图(EEG)以及肌电图(EMG)等实际案例的详细分析,并结合相应的代码实现探讨了这些预处理技术的应用场景与操作流程。
