Ноль пересекает среднее - PullRequest
       21

Ноль пересекает среднее

1 голос
/ 10 февраля 2020

Я работаю над разработкой набора классификаторов для сигналов ЭЭГ, и мне понадобится функция пересечения нуля вокруг среднего значения, определенная следующим образом:

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

Что мне здесь не хватает?

Ответы [ 3 ]

1 голос
/ 10 февраля 2020

Выражение типа:

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

всегда будет возвращать вектор всех нулей, поскольку ни один отдельный элемент x не является ни большим, ни меньшим нуля. Вам необходимо учесть подписки на x s в определении ZX:

((x(1:end-1)-m)>0) & ((x(2:end)-m)<0)
0 голосов
/ 10 февраля 2020

Простым решением является использование movprod и подсчет отрицательных продуктов, т. Е.

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

На примере вашей игрушки вы получите cnt = 3.

0 голосов
/ 10 февраля 2020

Вы можете использовать функцию 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

...