Попробуйте?
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.Вы можете интерполировать всю форму сигнала и затем использовать приведенный выше ответ, чтобы найти более точные нули.
Кроме того, вы можете рассчитать нули на интерполированной форме сигнала и затем отобразить его в необработанных данных.
Удаленно возможное решение для улучшения ваших данных;
Если вы измеряете человеческий голос, почему бы не попробовать фильтрацию в диапазоне человеческой речи?Это должно быть хорошо математически и может улучшить вашу форму волны.