我有一个受试者在跑步机上行走的EMG信号。 我们使用脚踏开关能够看到受试者何时放置他的脚,因此我们可以看到有多少时间段(步骤)。 我们希望以周期(步长)切断信号并获得一个平均信号(100%步进周期)。
我尝试了重塑功能,但它不起作用
当我计算38步时:
nwaves = 38;
sig2 = reshape(sig,[numel(sig)/nwaves nwaves])';
avgSig = mean(sig2,1);
plot(avgSig);
显示的错误是:大小参数必须是实数整数。
任何人都可以帮我吗?谢谢!
答案 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
值,使其具有38
(1345 * 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);