一、核心代码实现(基于TKEO的EMG信号处理)
matlab
%% 1. 数据加载与预处理
% 读取原始EMG信号(假设存储为emg_data.txt)
fs = 2000; % 采样率2kHz
t = (0:length(emg_data)-1)/fs; % 时间轴
emg = emg_data;
% 带通滤波去除噪声(20-500Hz)
fc_low = 20; fc_high = 500;
[b, a] = butter(4, [fc_low, fc_high]/(fs/2), 'bandpass');
emg_filt = filtfilt(b, a, emg);
%% 2. Teager-Kaiser能量算子(TKEO)计算
% 离散TKEO公式:Ψ[x(n)] = x(n)^2 - x(n-1)*x(n+1)
teager_energy = zeros(size(emg_filt));
for n = 2:length(emg_filt)-1
teager_energy(n) = emg_filt(n)^2 - emg_filt(n-1) * emg_filt(n+1);
end
% 边界处理(复制相邻值)
teager_energy(1) = teager_energy(2);
teager_energy(end) = teager_energy(end-1);
%% 3. 解调信号提取(瞬时幅值包络)
% 低通滤波提取包络(截止频率10Hz)
fc_envelope = 10;
[b_env, a_env] = butter(2, fc_envelope/(fs/2), 'low');
envelope = filtfilt(b_env, a_env, sqrt(abs(teager_energy)));
%% 4. 可视化结果
figure;
subplot(3,1,1);
plot(t, emg_filt);
title('预处理后的EMG信号');
xlabel('时间(s)'); ylabel('幅值(\mu V)');
subplot(3,1,2);
plot(t, teager_energy);
title('Teager能量序列');
xlabel('时间(s)'); ylabel('能量');
subplot(3,1,3);
plot(t, envelope);
title('瞬时幅值包络');
xlabel('时间(s)'); ylabel('包络幅值(\mu V)');
二、关键步骤解析
- 信号预处理
- 带通滤波:去除工频干扰(50Hz)和基线漂移,保留20-500Hz的肌电信号有效频段。
- 去噪 :使用零相位滤波(
filtfilt)避免相位失真。
- TKEO计算
- 核心公式 :
Ψ[x(n)] = x(n)^2 - x(n-1)*x(n+1),直接反映信号瞬时能量变化。 - 边界处理:首尾点复制相邻值,避免边缘效应。
- 核心公式 :
- 解调信号提取
- 包络提取:对TKEO结果取绝对值后低通滤波(截止频率10Hz),分离出肌肉活动的幅值特征。
- 物理意义:包络峰值对应肌肉收缩起始时刻,幅值反映收缩强度。
三、应用场景扩展
- 机械故障诊断
- 轴承故障检测:将TKEO应用于振动信号,提取故障特征频率(如外圈故障频率)。
- 代码修改:替换输入信号为振动数据,调整滤波参数(如低频段5-2000Hz)。
- 语音端点检测
- 能量阈值法:通过TKEO包络检测语音起始/结束时刻。
- 代码调整:设置动态阈值(如Otsu算法自动计算)。
参考代码 提取teager能量算子和其解调信号 www.youwenfan.com/contentcsq/81579.html
四、优化
- 多尺度TKEO
- 对信号进行小波分解,分频段应用TKEO,增强特定频段特征(如肌电信号中的纤颤电位)。
- 自适应降噪
- 基于TKEO能量分布,采用Otsu算法动态设定阈值,抑制噪声干扰。
- 参数调优
- 滞后参数M:根据信号频率调整(如高速振动信号取M=2)。
- 指数参数m:强调高频变化时取m=2,低频变化时取m=0.5。
五、结果分析示例
| 信号类型 | 原始信号特征 | TKEO处理后特征 |
|---|---|---|
| 正常EMG | 基线波动(0-50μV) | 低频能量(<10Hz)为主 |
| 病理EMG(痉挛) | 突发高频脉冲(>100Hz) | 包络出现尖锐峰值(幅值>100μV) |
六、常见问题解决
-
边界值波动
-
现象:首尾点能量计算误差。
-
解决 :采用镜像对称扩展法(如
envelope_extension函数)。
-
-
噪声干扰
-
现象:包络基线漂移。
-
解决 :叠加小波去噪(
wdenoise函数)后再计算TKEO。
七、参考文献
-
基于TKEO的EMG发病检测(CSDN博客)
-
TKEO的MATLAB实现与降噪方法
-
TKEO在机械故障诊断中的应用
-
Nonlinear Energy Operators Toolbox(GitHub)