简单的方法找到函数的零交叉

1243(30天)
BlueBee77
BlueBee77 2016年2月8日
评论道: 明星黾 2021年11月26日
我试图找到一个函数的零交叉在Matlab和情节点零交点。然而,我无法找到一个简单的方法。我试着 http://terpconnect.umd.edu/ toh /范围/ PeakFindingandMeasurement.htm
和Matlab fnzeros,但是我不能理解spmak和x, y中使用这些函数。我想找到的函数零交叉是欧几里得距离函数。我将很感激如果有人能告诉我这样做的一个简单的方法。
2的评论
BlueBee77
BlueBee77 2016年2月9日
它在一个图像处理的项目使用。在一个eclosed边界找到峰值点

登录置评。

答案(7)

明星黾
明星黾 2016年2月8日
编辑:明星黾 2020年7月8日
如果你的函数是一个向量的值,您可以使用这个函数来近似:
zci = @ (v)找到(v (:)。* circshift (v (:), [1 0]) < = 0);%返回零交点参数向量的指标
如果你想使用也有帮助 fzero interp1 在一个循环中得到准确的值。
请注意 它返回 指数 零交叉,所以你必须做适当的处理获得相应的向量 x y 的坐标。
编辑- (2020年7月7日在2:54)
另一种定义 “zci” 是:
zci = @ (v)找到(diff(签署(v)));
产生相同的结果。
6个评论
明星黾
明星黾 2016年2月9日
我不知道什么是你的信号。可能你的信号没有零交叉,和零交叉的纸是看着别的东西(也许信号的导数)。如果你想找到峰值相反,信号处理工具箱,看看 findpeaks 函数将为你工作。
例如,在我的说明,如果原始信号是一个余弦,正弦曲线的零交点(余弦信号的负导数)将余弦信号的峰(谷)。

登录置评。


艾萨克雪
艾萨克雪 2021年11月25日
我写了以下函数zci函数的基础上 @Star黾 :
函数[number_zeros, zero_crossings] = findzeros(数组,samplerate)
% FINDZEROS发现zerocrossings
%发现一分之零的零或最近的值函数和回馈
%因此zerocrossings和包含值的数组
%数组值为零的位置或nearst为零
%零交叉区域,所以它的中间值的零交叉区域
z =找到(diff(签署(数组)));
= 1;
b = 1;
我= 2:1:长度(z)
如果z z (i) >(张)+圆((samplerate / 10000)) + 1
= 1;
如果我= = 2
zci (b) = z(张);
结束
zci z(终端+ 1,)=(我);
b = b + 1;
其他的
zci (b) = z(我);
= + 1;
结束
结束
number_zeros = b;% output1
zci2 = [];
zb = [];
佐= [];
zero_crossings = [];
b = 1:1: number_zeros
zci2 = zci (b);
j = 1:1:长度(zci2)
如果zci2 (j) = = 0 & & j ~ = 1
打破
结束
zci3 (b, j) =阵列(zci2 (j));
结束
zb =找到(abs (zci3 (b,:)) = = min (abs (zci3 (b,:))));
zb = zci2 (zb);
如果长度(zb) < = 1
zero_crossings = [zero_crossings zb];% output2
其他的
zero_crossings结束(+ 1)= zb(地板(长度(zb) / 2));% outpu2
结束
结束
结束

xszm
xszm 2019年8月10日
我认为你可以插入数据。你可以找到我的结果跟进。谢谢你 明星黾 很长一段时间,我发现它。
没有插值函数
uninterp.png
插值函数
interp.png
10评论

登录置评。


尼克•亨特
尼克•亨特 2020年4月12日
编辑:尼克•亨特 2020年7月16日
我刚刚制定了一个更快的缺陷的解决方案,我想:
清晰;
θ= (0:7:360 * 4,1440);%角矢量(必须是一个行向量)
y =信德(θ);%信号向量(必须是一个行向量)
UpZCi = @ (v)找到(v (1: end-1) < = 0 & v(2:结束)> 0);%返回零交点指数
DownZCi = @ (v)找到(v (1: end-1) > = 0 & v(2:结束)< 0);%返回零交点指数
ZeroX = @ (x0, y0 (x1, y1) x0——(y0。* (x0 - x1))。/ (y0 - y1);%以内插值替换的x值零交点
ZXi =排序([UpZCi (y), DownZCi (y)]);
ZX = ZeroX(θ(ZXi), y (ZXi),θ(ZXi + 1), y (ZXi + 1));
% = = =检查忽略为零值= = =
如果y(结束)= = 0
ZX结束(+ 1)=θ(结束);
结束
% = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
图(1)
情节(θ,y,“- b”)
持有;
情节(ZX 0(1,长度(ZX)),“罗”)
网格;
传奇(“信号”,“插入零交点的)
4评论
尼克•亨特
尼克•亨特 2020年7月16日
非常感谢你,沃尔特。这是一个很好的观点。我增加了这个条件在评论。

登录置评。


米奇Lautigar
米奇Lautigar 2020年7月7日
编辑:沃尔特·罗伯森 2020年7月7日
有很多方法去尝试和皮肤这个问题,很多人试过,发现不同不同程度的成功。这是一个函数可以使用,需要一个正弦波形近似为0的交叉点上。
[out_array] = signal_manip (s_in)
sign_array = [];% predeclaration
% % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % %
%在for循环检查每个位置创建以下数字:
%为正数,“1”是放置在一个数组中。
%为负数,“1”是放置在一个数组中。
%为零,“0”是放置在一个数组中。
% % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % %
i = 1:长度(s_in)
如果s_in(我)> 0
curr_sign = 1;
elseifs_in(我)< 0
curr_sign = 1;
其他的
curr_sign = 0;
结束%结束“如果s_in > 0 "
sign_array = [sign_array, curr_sign];%给输出数组显示你所有的正面和负面的数字
结束% i = 1:长度(s_in)
% % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % %
%以下循环查找变化点和处理发生0点。
% % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % %
咕咕叫= sign_array (1,1);%比较点开始
out_array = []% Predeclaration的数组
我= 2:长度(s_in)
如果(sign_array(我)~ =咕咕叫)%如果数量变化检测,标记它。
out_array = (out_array,我);
elseif我(sign_array (1) = = 0)%如果我们有一个零图上的标记,跳过我,1,没有虚假。
out_array = (out_array,我);
我=我+ 1;
结束
我咕咕叫= sign_array (1);
结束
5个评论
默罕默德·贾马尔
默罕默德·贾马尔 2020年7月15日
是的,这没问题,但这个函数返回数组的零交叉点对吧?因为我没有得到我的信号以零交叉分情节明显. .没有得到一个阴谋,只是数组!

登录置评。


UMAIR RASOOL
UMAIR RASOOL 2020年8月13日
关闭所有
清除所有
clc
n = 10:10;
一个=。9;
y = 0(大小(n));
k = 5
temp =找到(n - (2 * k) = = 0);%找到xaxis哪儿0(零交叉)
y(临时)= 1;%的值取代零交叉
x = n。* ((^ k) * y)之和;
结束
情节(n, x)
包含(“n”)
ylabel (x (n))
最大= max (x);

米奇Lautigar
米奇Lautigar 2020年7月27日
所以我把以前的代码使用和修改它,我需要(找到零点交叉作赎罪/ cos波。下面的代码是
函数[freq_val] = peakfind (dm_allow)
%步骤1:加载文件,找到零交叉
负载(“s_m.mat”、“s_m2”,“t”)
zci = @ (v)找到(v (:)。* circshift (v (:), [1 0]) < = 0);
zx = zci (s_m2)”;
rp_zx = [];
%步骤2:以上操作值,找到独特的值。
zx2 =圆(zx。/ max (zx), 2);
i = 1:长度(zx2) 1
如果轮(zx2(我),3)~ =圆(zx2 (i + 1), 3)
rp_zx = [rp_zx zx2 (i + 1)];
结束
结束
end_array = [1];
%消除冗余数据
i = 1:长度(rp_zx)
ζ=找到(zx2 = = rp_zx(我));
end_array = [end_array,泽塔(1,1)];
结束
actual_spots = zx (end_array);
t_val = [];
%以上数字转换为时间值。
i = 1:长度(end_array) 1
low_spot = actual_spots (1,);
high_spot = actual_spots (i + 1);
max_spot = max (s_m2 (low_spot: high_spot));
min_spot = abs (min (s_m2 (low_spot: high_spot)));
如果max_spot > min_spot
β=找到(s_m2 (low_spot: high_spot) = = max_spot);
t_val = [t_val t(β+ low_spot)];
elseif max_spot < min_spot
%什么也不做
结束
结束
%时间值转换为频率值。
如果长度(t_val) > 1
freq_val = [];
i = 1:长度(t_val) 1
freq_val = [freq_val, 1 / (t_val -t_val (i + 1)(我)));
结束
其他的
错误(“周期时间不够长”)
结束
结束
如果你使用我的代码,只需改变如下:
zx = zci (s_m2) % s_m2替换成任何你想要找到零交叉的信号。
1评论
马修•诺伊
马修•诺伊 2020年11月5日
亲爱的所有人
通知你——这是我使用的函数长时间以来,一直工作适合所有类型的信号
函数(印第安纳州、t0 s0) = crossing_V6 (S t水平,imeth)
%(印第安纳州、t0 s0、t0close s0close] = crossing_V6 (S t水平,imeth)
%穿越的口岸一个给定水平的一个信号
%印第安纳=穿越(S)返回索引向量印第安纳州,这个信号
% S穿过零在印第安纳州或在印第安纳州和印第安纳州+ 1之间
%(印第安纳州,t0] =穿越(S, t)另外返回时间
%向量t0的信号的零交叉十字路口
% *之间是线性插值给定* t
%(印第安纳州,t0] =穿越(S t级别)返回的过境点
%给定水平而不是零交叉
%印第安纳=穿越(年代,[],级别)如上但是没有时间插值
%(印第安纳州,t0] =穿越(S t水平,par)允许额外的参数
% par ={“没有”|“线性”}。
%与插值关闭(par =‘没有’)这个函数
%返回值的零(这是最近的数据点
%的零,小于零交叉)。
%
%(印第安纳州、t0 s0) =…还返回数据向量对应
% t0的值。
%
%(印第安纳州、t0 s0、t0close s0close]此外返回数据点
%接近零交叉阵列t0close和s0close。
%
%这个版本已经修改整合良好的和有价值的
% Matlabcentral修正由用户。特别感谢
%霍华德Fishman,基督教Rothleitner,乔纳森·凯洛格,
%扎克·刘易斯的输入。
% Steffen布鲁克纳,2002-09-25
% Steffen布鲁克纳2007-08-27修订版
%版权(c) Steffen布鲁克纳2002 - 2007
% brueckner@sbrs.net
%检查输入参数的数量
错误(nargchk(1, 4,输入参数个数));
%检查输入向量的时间一致性
如果输入参数个数< 2 | isempty (t)
%如果没有时间向量,使用索引向量随着时间的
t = 1:长度(S);
elseif长度(t) ~ = (S)
%如果S和t不相同的长度,抛出一个错误
错误(t和年代一定是相同长度的!”);
结束
%检查输入水平
如果输入参数个数< 3
%设置标准值0,如果水平不是
水平= 0;
结束
%检查输入插值方法
如果输入参数个数< 4
imeth =“线性”;
结束
%使行向量
t = t (:)”;
S =年代(:);
%总是寻找零。所以,如果我们想要的跨越
%其他阈值“水平”,我们减去它
% 0的值和搜索。
S = S -水平;
%的第一个寻找确切的0
ind0 =找到(S = = 0);
%然后寻找数据点之间的零交叉
S1 = S (1: end-1)。* S(2:结束);
ind1 =找到(S1 < 0);
%将确切0 0和“中间”联系在一起
印第安纳州=排序([ind0 ind1]);
%,选择相关的时间值
t0 = t(印第安纳州);
s0 = S(印第安纳州);
如果比较字符串(imeth“线性”)
%穿越的线性插值
2 = 1:长度(t0)
%如果abs (S(印第安纳州(ii))) > eps (S(印第安纳州(ii))) % MATLAB V7 et +
如果abs (S(印第安纳州(ii))) > eps * abs (S(印第安纳州(ii)))% MATLAB V6 et - EPS * ABS (X)
%插入只有当数据点没有零
NUM = (t(印第安纳州(2)+ 1)- t(印第安纳州(ii)));
穴= (S(印第安纳州(2)+ 1)年代(印第安纳州(ii)));
斜率= NUM /穴;
terme = S(印第安纳州(ii)) *斜率;
t0 (ii) = t0 (ii)——领域;
%我是一个坏的人,所以我只是将值设置为零
%,而不是计算完全数。
s0 (ii) = 0;
结束
结束
结束
% %添加:
% %有些人喜欢得到的数据点最接近零交叉,
% %我们回报这些
% (CC, II) = min (abs ([S (ind-1);年代(印第安纳州);(印第安纳州+ 1)]),[],1);
% ind2 =印第安纳+ (II-2);%更新指标
%
% t0close = t (ind2);
% s0close = S (ind2);

登录置评。

社区寻宝

找到宝藏在MATLAB中央,发现社区如何帮助你!

开始狩猎!