如何在Matlab中的EMG数据上生成平滑的滤波包络

时间:2019-02-09 00:31:14

标签: matlab smoothing envelope

我刚开始分析EMG数据,希望能得到一些经过仔细解释的帮助。

我想用我的EMG数据生成平滑,线性的包络信号(采样率为50kHz),就像本文中发布的信号一样:https://openi.nlm.nih.gov/detailedresult.php?img=PMC3480942_1743-0003-9-29-3&req=4

我的最终目标是能够分析EMG活动(输出)与同时记录的上游神经元(假定输入)激发的动作电位之间的关系。

尽管本文非常清楚地列出了过滤方法,但我不了解它们的含义或如何在matlab(这是我可以使用的分析工具)中执行这些方法。

在到目前为止编写的代码中,我可以进行直流偏移以及纠正数据:

x = EMGtime_data
y = EMGvoltage_data

%dc offset
y2=detrend(y)
% Rectification of the EMG signal
rec_y=abs(y2);
plot(x, rec_y)

但是我不确定如何继续。 我已经尝试过信封功能,但是它不像我想要的那么平滑: 例如,如果我使用以下内容:

 envelope(y_rec,2000,'rms')

我明白了(这似乎也不在乎数据是否已纠正):

enter image description here

即使我接受包络功能,也不确定如何仅访问已处理的包络数据来调整绘图(即更改y范围),或者进一步分析数据的起落点信号集,因为此功能的结果似乎与原始轨迹有关。

我也遇到了f​​astrms.m,这似乎很有希望。不幸的是,我不了解如何实现此功能,因为一般性的解释已经超出了我的理解,并且示例代码缺少任何已定义的变量(因此我不知道在哪里集成我自己的数据!) 这里是来自fastrms.m文件交换的示例代码

Fs = 200; T = 5; N = T*Fs; t = linspace(0,T,N); 
noise = randn(N,1); 
[a,b] = butter(5, [9 12]/(Fs/2)); 
x = filtfilt(a,b,noise); 
window = gausswin(0.25*Fs); 
rms = fastrms(x,window,[],1); 
plot(t,x,t,rms*[1 -1],'LineWidth',2); 
xlabel('Time (sec)'); ylabel('Signal') 
title('Instantaneous amplitude via RMS')

我将非常感谢您了解如何过滤和平滑EMG数据!

1 个答案:

答案 0 :(得分:0)

为了在时域上分析EMG信号,研究人员使用了整流和低通滤波的组合,也称为寻找信号的“线性包络”。
并且如上一句话和所附图片说明中所述,为了绘制叠加信号,您可以简单地对特定频率的信号进行低通滤波。
在您的随附文章中,上述信号已在8 HZ处过滤。

为了更好地了解EMG信号分析的技巧,我认为本文档可以为您提供很多帮助(link