2016-05-31 4 views
2

Я написал функцию в MATLAB для подсчета числа пересечений нуля, заданных вектором данных сигнала. Если я нахожу пересечение нуля, я также проверяю, является ли абсолютная разница между задействованными двумя векторными индексами больше порогового значения - это попытка уменьшить влияние шума сигнала.В MATLAB найдите нулевые пересечения в пределах порогового значения, заданного вектором данных

zc = []; 
    thresh = 2; 
    for i = 1:length(v)-1 
     if ((v(i)>0 && v(i+1)<0) || (v(i)<0 && v(i+1)>0)) && abs(v(i)-v(i+1)) >= thresh 
      zc = [zc; i+1]; 
     end 
    end 
    zcCount = length(zc); 

Я использовал вектор из функции переходов через нуль здесь, чтобы проверить: http://hips.seas.harvard.edu/content/count-zero-crossings-matlab

A = [-0.49840598306643, 
     1.04975509964655, 
     -1.67055867973620, 
     -2.01437026154355, 
     0.98661592496732, 
     -0.06048256273708, 
     1.19294080740269, 
     2.68558025885591, 
     0.85373360483580, 
     1.00554850567375]; 

Это, кажется, работает нормально, но есть более эффективный способ достижения того же результата? Например. на веб-странице выше, они просто использовать следующую строку для расчета переходов через нуль:

z=find(diff(v>0)~=0)+1; 

Есть ли способ включить пороговую проверку в чем-то подобным эффективным?

+0

Вы должны смотреть на все «найти пересечения нуля» вопросы, связанные там ----> –

ответ

2

Как насчет

zeroCrossIndex=diff(v>0)~=0 
threshholdIndex = diff(v) >= thresh; 
zcCount = sum(zeroCrossIndex & threshholdIndex) 
+0

Это большой @Dan. Я могу даже использовать 'abs (diff (v)> = thresh' во второй строке для проверки порога с любой стороны нуля – humbleHacker

+0

Просто хотелось добавить, что вы можете добавить некоторую дополнительную гибкость для ненулевых пересечений, заменив' diff (v > 0) 'с diff (v> val)' где val интересующая точка пересечения. Обязательно добавьте abs (diff (v)> = thresh, предложенный @humbleHacker –