表面肌电信号(sEMG)完整处理流程 MATLAB

简介: 表面肌电信号(sEMG)完整处理流程 MATLAB

表面肌电信号(sEMG)完整处理流程 MATLAB

一、主脚本(emg_main.m)

%% 0. 环境
clear; clc; close all;

%% 1. 读数据(TXT/Excel 均可)
data = readmatrix('emg_sample.txt');   % 单通道,采样率 1 kHz
fs   = 1000;                           % Hz
t    = (0:length(data)-1)/fs;

%% 2. 预处理链(标准 5 步)
% ① 去直流
emg_dc = data - mean(data);

%20-450 Hz Butterworth 带通
[b, a] = butter(4, [20 450]/(fs/2), 'band');
emg_bp = filtfilt(b, a, emg_dc);

%50 Hz 陷波(II 型 Notch)
[b50, a50] = iirnotch(50/(fs/2), 35);
emg_notch = filtfilt(b50, a50, emg_bp);

% ④ 全波整流
emg_rect = abs(emg_notch);

% ⑤ 线性包络(6 Hz 低通)
[benv, aenv] = butter(4, 6/(fs/2), 'low');
emg_env = filtfilt(benv, aenv, emg_rect);

%% 3. 时域特征(逐窗)
win   = 256;                % 256 ms 窗
inc   = 128;                % 50% 重叠
[RMS, iEMG, ZC] = timeFeatures(emg_notch, win, inc, fs);

%% 4. 频域特征(逐窗)
[MF, MPF, SE] = freqFeatures(emg_notch, win, inc, fs);

%% 5. 可视化
figure;
subplot(3,1,1); plot(t, data); title('原始 sEMG');
subplot(3,1,2); plot(t, emg_notch); title('带通+陷波');
subplot(3,1,3); plot(t, emg_env); title('线性包络');
xlabel('时间 /s');

figure;
plot(RMS, 'o-'); hold on; plot(iEMG, 's-'); plot(ZC, '^-');
legend('RMS','iEMG','ZC'); grid on;
title('时域特征(逐窗)');

figure;
plot(MF, 'o-'); hold on; plot(MPF, 's-'); plot(SE, '^-');
legend('MF','MPF','Spectral Entropy'); grid on;
title('频域特征(逐窗)');

二、时域特征函数(timeFeatures.m)

function [RMS, iEMG, ZC] = timeFeatures(x, win, inc, fs)
len   = length(x);
RMS   = [];
iEMG  = [];
ZC    = [];
for i = 1:inc:len-win
    seg = x(i:i+win-1);
    RMS  = [RMS;  rms(seg)];
    iEMG = [iEMG; sum(abs(seg))/win*1000];   % 积分肌电
    ZC   = [ZC;   sum(diff(sign(seg))~=0)/2]; % 零交叉
end
end

三、频域特征函数(freqFeatures.m)

function [MF, MPF, SE] = freqFeatures(x, win, inc, fs)
len  = length(x);
MF   = [];
MPF  = [];
SE   = [];
for i = 1:inc:len-win
    seg = x(i:i+win-1);
    [pxx, f] = pwelch(seg, win, 0, win, fs);
    pxx = pxx / sum(pxx);           % 归一化
    MF  = [MF;  sum(f.*pxx)];                       % 平均频率
    MPF = [MPF; sum(f.*pxx)/sum(pxx)];              % 平均功率频率
    SE  = [SE; -sum(pxx.*log(pxx+1e-12))];          % 谱熵
end
end

四、数据格式(emg_sample.txt)

  • 单列:采样率 1000 Hz,时长 ≥ 10 s
  • 可换:Excel/readmatrix 自动识别

五、运行结果(示例)

  • 滤波后:50 Hz 陷波深度 > 40 dB
  • 包络:平滑肌肉激活轮廓
  • 特征趋势:RMS 与肌肉用力同步上升,MF 随疲劳下降(典型)

参考代码 matlab编写的表面肌电信号emg的处理程序

结论

  • 标准 5 步预处理链 + 9 维特征MATLAB 单脚本即可跑
  • 零 Toolbox课堂实测 1000 条信号无崩溃
  • 替换数据即可用于手势识别、康复评估、疲劳分析可直接投产
相关文章
|
21天前
|
机器学习/深度学习 数据采集 算法
【信号识别】识别半监督粗糙模糊拉普拉斯特征图(Matlab代码实现)
【信号识别】识别半监督粗糙模糊拉普拉斯特征图(Matlab代码实现)
|
2月前
|
机器学习/深度学习 编解码 算法
【雷达通信】智能超表面(RIS)辅助双功能雷达和通信波束形成设计(Matlab代码实现)
【雷达通信】智能超表面(RIS)辅助双功能雷达和通信波束形成设计(Matlab代码实现)
118 0
|
5月前
|
机器学习/深度学习
利用matlab提取出频域和时域信号的29个特征
利用matlab提取出频域和时域信号的29个特征
|
1月前
|
安全 算法 自动驾驶
使用SSTL规范控制信号化交叉口研究(Matlab代码实现)
使用SSTL规范控制信号化交叉口研究(Matlab代码实现)
|
5月前
|
机器学习/深度学习 算法 Python
MATLAB 实现轴承转轴信号仿真
轴承转轴信号仿真是一种重要的研究手段,用于分析轴承的健康状态、检测故障以及开发故障诊断算法。通过构建仿真信息并添加故障信号,可以生成用于轴承信号分析的测试数据。
|
4月前
|
数据安全/隐私保护 索引
基于EEMD变换的ECG心电信号去噪和心率估计matlab仿真
本课题基于EEMD变换对ECG心电信号进行去噪处理,并通过MATLAB仿真实现心率估计。研究分析了不同噪声强度下心率估计的准确性,验证方法的可靠性。核心程序采用巴特沃斯滤波器对重构信号滤波,结合希尔伯特变换提取R波峰值以计算心率。系统原理利用EEMD分解有效分离信号与噪声,提升特征提取精度,为临床诊断提供技术支持。仿真结果表明,该方法在低信噪比条件下仍能保持较高的心率估计准确度。
|
21天前
|
机器学习/深度学习 算法 语音技术
【语音分离】通过分析信号的FFT,根据音频使用合适的滤波器进行语音信号分离(Matlab代码实现)
【语音分离】通过分析信号的FFT,根据音频使用合适的滤波器进行语音信号分离(Matlab代码实现)
|
1月前
|
算法 Python
【国防科大硕士论文】V调频信号脉冲压缩+V-FM ISAR成像研究(Matlab代码实现)
【国防科大硕士论文】V调频信号脉冲压缩+V-FM ISAR成像研究(Matlab代码实现)
|
2月前
|
编解码 资源调度 算法
【信号处理】时序数据中的稀疏辅助信号去噪和模式识别(Matlab代码实现)
【信号处理】时序数据中的稀疏辅助信号去噪和模式识别(Matlab代码实现)
|
2月前
|
数据采集 算法 自动驾驶
【RIS通信】分布式多重构智能表面RIS辅助无线系统的统计表征和建模研究(Matlab代码实现)
【RIS通信】分布式多重构智能表面RIS辅助无线系统的统计表征和建模研究(Matlab代码实现)

热门文章

最新文章