在信号中找到零交叉点并将其绘制为Matlab

时间:2019-09-20 19:57:39

标签: matlab

我有一个语音信号,您可以在此处看到摘录:

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 :(得分:0)

尝试一下?

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并使用“样条线”方法。您可以对整个波形进行插值,然后使用上述答案找到更准确的零点。

此外,您可以在插值波形上计算零,然后将其显示在原始数据上。

一种远程解决方案,可以改善您的数据;

如果要测量人的声音,为什么不尝试在人的语音范围内进行过滤?这在数学上应该没问题,并且可能会改善您的波形。