【问题标题】:Zero crossings around mean均值附近的零交叉
【发布时间】:2020-02-10 22:36:29
【问题描述】:

我正在为 EEG 信号开发套件分类器,我需要一个围绕均值函数的零交叉点,定义方式如下:

理想情况下,如果我有一些向量具有代表正弦曲线或任何时变信号的值范围,我将希望返回一个与向量相同大小的布尔向量,说明该特定值是否为均值交叉。我有以下 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

我在这里错过了什么?

【问题讨论】:

  • 您如何得出预期的结果? sigma 会将所有内容加起来为一个数字。
  • 我对所需的输出进行了编辑以反映这一点。它应该返回信号穿过平均值的次数。原来的问题仍然存在。

标签: matlab anonymous-function


【解决方案1】:

这样的表达式:

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

总是会返回一个全为零的向量,因为 x 中没有一个元素既大于零又小于零。你需要考虑ZX的定义中xs上的下标:

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

【讨论】:

  • 谢谢。我还意识到,对于上面的测试用例,它实际上应该返回 3,而不是 4
【解决方案2】:

您可以使用-abs(x) 上的findpeaks 函数(其中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,'*')

【讨论】:

    【解决方案3】:

    一个简单的解决方案是使用movprod,并计算为负的产品,即,

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多