如何使用Matlab程序 -GUI的肌电信号处理,设有用户登录界面、信号处理界面,特征计算界面。对给定动作的表面肌电信号进行滤波预处理,时域分析、频谱分析和熵值分析,比较疲劳前后各特征变化,分析肌肉不同工作状态下的特点。
在 MATLAB 中使用 GUI(图形用户界面)处理肌电信号(EMG 信号)是一个非常实用的方法。以下是一个简单的示例,展示如何创建一个 GUI 来加载、预处理和分析 EMG 信号。
步骤概述
- 加载 EMG 数据:从文件中读取数据。
- 信号预处理:包括滤波、去噪等操作。
- 信号分析:计算时域特征(如 RMS、MAV 等)或频域特征。
- 显示结果:通过图形界面展示原始信号和处理后的信号。
代码实现
以下是一个完整的 MATLAB GUI 示例代码:
function emg_gui
% 创建 GUI 主窗口
fig = uifigure('Name', 'EMG Signal Processing', 'Position', [100, 100, 800, 600]);
% 添加按钮:加载数据
btnLoad = uibutton(fig, 'push', 'Text', 'Load EMG Data', ...
'Position', [50, 500, 150, 30], 'ButtonPushedFcn', @(btn, event) loadEMGData());
% 添加按钮:滤波
btnFilter = uibutton(fig, 'push', 'Text', 'Filter Signal', ...
'Position', [250, 500, 150, 30], 'ButtonPushedFcn', @(btn, event) filterSignal());
% 添加按钮:分析
btnAnalyze = uibutton(fig, 'push', 'Text', 'Analyze Signal', ...
'Position', [450, 500, 150, 30], 'ButtonPushedFcn', @(btn, event) analyzeSignal());
% 添加绘图区域
ax = uiaxes(fig, 'Position', [50, 50, 700, 400]);
% 全局变量存储数据和图形句柄
data = struct('raw', [], 'filtered', [], 'analyzed', []);
handles = struct('ax', ax);
% 定义加载数据的回调函数
function loadEMGData()
% 打开文件选择对话框
[file, path] = uigetfile({'*.mat', 'MAT Files (*.mat)'; '*.csv', 'CSV Files (*.csv)'}, 'Select EMG Data File');
if isequal(file, 0)
return; % 用户取消选择
end
% 加载数据
filePath = fullfile(path, file);
if contains(file, '.mat')
loadedData = load(filePath);
data.raw = loadedData.signal; % 假设 MAT 文件中信号存储在变量 signal 中
elseif contains(file, '.csv')
data.raw = csvread(filePath); % 如果是 CSV 文件
end
% 绘制原始信号
plot(handles.ax, data.raw, 'b', 'DisplayName', 'Raw Signal');
title(handles.ax, 'Raw EMG Signal');
xlabel(handles.ax, 'Samples');
ylabel(handles.ax, 'Amplitude');
legend(handles.ax, 'show');
end
% 定义滤波信号的回调函数
function filterSignal()
if isempty(data.raw)
uialert(fig, 'Please load EMG data first!', 'Error');
return;
end
% 设计带通滤波器 (20-500 Hz)
fs = 1000; % 假设采样频率为 1000 Hz
lowCutoff = 20 / (fs / 2);
highCutoff = 500 / (fs / 2);
[b, a] = butter(4, [lowCutoff, highCutoff], 'bandpass');
% 应用滤波器
data.filtered = filtfilt(b, a, data.raw);
% 绘制滤波后的信号
hold(handles.ax, 'on');
plot(handles.ax, data.filtered, 'r', 'DisplayName', 'Filtered Signal');
title(handles.ax, 'Raw and Filtered EMG Signals');
legend(handles.ax, 'show');
hold(handles.ax, 'off');
end
% 定义分析信号的回调函数
function analyzeSignal()
if isempty(data.filtered)
uialert(fig, 'Please filter the signal first!', 'Error');
return;
end
% 计算 RMS(均方根值)
rmsValue = sqrt(mean(data.filtered.^2));
% 显示分析结果
uialert(fig, sprintf('RMS Value: %.4f', rmsValue), 'Analysis Result');
end
end
代码说明
-
GUI 创建:
- 使用
uifigure
创建主窗口。 - 添加按钮用于加载数据、滤波和分析信号。
- 使用
uiaxes
创建绘图区域。
- 使用
-
加载数据:
- 支持
.mat
和.csv
格式的数据文件。 - 假设
.mat
文件中信号存储在变量signal
中。
- 支持
-
信号滤波:
- 使用
butter
函数设计一个四阶带通滤波器。 - 使用
filtfilt
实现零相位滤波。
- 使用
-
信号分析:
- 计算信号的均方根值(RMS),作为时域特征之一。
- 使用
uialert
显示分析结果。
-
绘图:
- 原始信号用蓝色绘制,滤波后的信号用红色绘制。
运行步骤
- 将上述代码保存为
emg_gui.m
文件。 - 在 MATLAB 中运行
emg_gui
。 - 按照界面上的按钮提示操作:
- 点击 “Load EMG Data” 加载数据。
- 点击 “Filter Signal” 对信号进行滤波。
- 点击 “Analyze Signal” 查看信号分析结果。
扩展功能
- 可以添加更多分析功能,例如计算平均绝对值(MAV)、过零率(ZC)等。
- 支持更多类型的滤波器(如高通、低通)。
- 提供导出处理后数据的功能。
希望这个示例能帮助你快速上手 MATLAB GUI 的 EMG 信号处理!