如何切割EMG信号并获得平均信号?

时间:2014-11-24 14:46:03

标签: matlab signal-processing average cycle

我有一个受试者在跑步机上行走的EMG信号。 我们使用脚踏开关能够看到受试者何时放置他的脚,因此我们可以看到有多少时间段(步骤)。 我们希望以周期(步长)切断信号并获得一个平均信号(100%步进周期)。

我尝试了重塑功能,但它不起作用

当我计算38步时:

nwaves = 38;
sig2 = reshape(sig,[numel(sig)/nwaves nwaves])';
avgSig = mean(sig2,1);
plot(avgSig);

显示的错误是:大小参数必须是实数整数。

任何人都可以帮我吗?谢谢!

2 个答案:

答案 0 :(得分:1)

首先,重塑数组是解决问题的一种不好的方法。在现实世界中,我们不能假设跑步机上的人会以毫秒精度(即相同数量的样本)有节奏地步进。

更现实的方法是使用footswitch信号:假设单脚上的真的是一个开关1 =脚踏,0 =脚踏开),其动作过滤以避免噪音(例如施密特触发器),当脚从跑步机上取下时,你可以获得样品索引:

foot_off = find(diff(footswitch) < 0);

然后你可以在连续步骤之间的数据向量的单元格数组(可变长度)中转换信号:

step_len = diff([0, foot_off, numel(footswitch)]);
sig2     = mat2cell(sig(:), step_len, 1);

现在的问题是,您无法将mean()应用于信号切片以获得“平均步数”:您必须先处理每个步骤,然后对结果取平均值。

答案 1 :(得分:0)

可能是因为numel(sig)/nwaves不是整数。您需要使用round(numel(sig)/nwaves)将其四舍五入到最接近的整数。

根据评论编辑:

您的问题是,您无法将51116除以38(它是1345.2),因此您无法以38长的块重新塑造您的信号。如果您希望能够以38的块重新整形,则需要一个长度恰好是38的倍数的信号。要么是这样,要么删除信号中的最后一个(或第一个)6值,使其具有381345 * 38 = 51110)的精确倍数:

nwaves = 38;
n_chunks = round(numel(sig)/nwaves);
max_sig_length =  n_chunks * nwaves;
sig2 = reshape(sig(1:max_sig_length),[n_chunks nwaves])';
avgSig = mean(sig2,1);
plot(avgSig);