均值附近的零交叉点

问题描述 投票:1回答:3

我正在开发针对EEG信号的套件分类器,我将需要以下列方式定义的均值函数周围的零交叉:

enter image description here

理想情况下,如果我有一些向量,其值的范围表示一个正弦曲线或任何随时间变化的信号,我将希望返回一个布尔值向量,该布尔值向量的大小与该向量相同,说明该特定值是否是均值交叉。我有以下Matlab实现:

ZX = @(x) sum(((x - mean(x)>0) & (x - mean(x)<0)) | ((x - mean(x)<0) & (x - mean(x)>0)));

根据玩具数据进行测试:

[0 4 -6 9 -20 -5]

收益率:

0

编辑:但是我相信它应该返回:

3

我在这里想念什么?

matlab anonymous-function
3个回答
1
投票

类似的表达式:

((x-m)>0) & ((x-m)<0)

总是将返回全零的向量,因为x的单个元素都不会大于或小于零。您需要考虑x定义中ZX的下标:

((x(1:end-1)-m)>0) & ((x(2:end)-m)<0)

0
投票

您可以使用findpeaks为原始数据的-abs(x)上的x功能来查找峰的位置。对于连续的信号,这通常会给您零交叉,而连续信号的实际最大值不为零。

t = 0:0.01:10;
x = sin(pi*t);
plot(t,x)
grid

y = -abs(x);
[P,L] = findpeaks(y,t);

hold on
plot(L,P,'*')

enter image description here


0
投票

一种简单的解决方案是使用movprod,并计算负数的乘积,即]

cnt = sum(sign(movprod(x-mean(x),2))<0);

通过您的玩具示例,您将获得cnt = 3

© www.soinside.com 2019 - 2024. All rights reserved.