Найти точки пересечения нуля в сигнале и построить их - PullRequest
0 голосов
/ 20 сентября 2019

У меня есть сигнал 's', голос которого вы можете увидеть здесь:

enter image description here

Я хотел бы построить пересечение нуляуказывает на тот же график.Я пытался с помощью следующего кода:

zci = @(v) find(v(:).*circshift(v(:), [-1 0]) <= 0); % Returns Zero-Crossing Indices Of Argument Vector
zx = zci(s); 

figure
set(gcf,'color','w')
plot(t,s)
hold on
plot(t(zx),s(zx),'o')

Но он не интерполирует точки, в которых меняется знак, поэтому результат:

enter image description here

Однако мне бы хотелось, чтобы выделенные точки были как можно ближе к нулю.Я надеюсь, что кто-то может мне помочь.Спасибо за ваши ответы в продвинутом.

1 Ответ

0 голосов
/ 21 сентября 2019

Попробуйте?

w = 1;
crossPts=[];
for k=1:(length(s)-1)
   if (s(k)*s(k+1)<0)
      crossPts(w) = (t(k)+t(k+1))/2;
      w = w + 1;
   end
end

figure
set(gcf,'color','w')
plot(t,s)
hold on
plot(t, s)

plot(crossPts, zeros(length(crossPts)), 'o')

Важные вопросы: какова самая высокая частотная составляющая сигнала, который вы измеряете?Можете ли вы помнить этот сигнал?Какова ваша частота дискретизации?Для чего этот анализ?(Школьные или научные исследования).У вас могут возникнуть проблемы с измерением нулей этой функции с какой-либо значимостью или точностью, поскольку похоже, что ваша форма волны имеет частоту, превышающую половину вашей частоты дискретизации (больше, чем ваша частота Найквиста).Повышение частоты дискретизации / интерполяция всей вашей формы сигнала позволит вам находить нули намного точнее (но без большей степени точности), но это огромное отклонение в научном сообществе.Хотя мой метод может выглядеть не очень красиво, это самый точный метод, который не делает небезопасных предположений.Если вы просто хотите, чтобы это выглядело красиво, я бы порекомендовал interp1 и использовать метод Spline.Вы можете интерполировать всю форму сигнала и затем использовать приведенный выше ответ, чтобы найти более точные нули.

Кроме того, вы можете рассчитать нули на интерполированной форме сигнала и затем отобразить его в необработанных данных.

Удаленно возможное решение для улучшения ваших данных;

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...