声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 5216|回复: 9

[编程技巧] 如何找出一组数据的过零点??

[复制链接]
发表于 2007-6-5 21:09 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?我要加入

x
比如采样到一组正弦波信号,由于采样率的关系,未必有真正意义上的零点
只是在接近零点处有值,如何找到其过零点
我自己想了个办法,就是[a,b]=min(abs(yy));
但是这样只能找到若干过零点的最小一个值,有没有现成的命令可以把所有零点都找出来??
回复
分享到:

使用道具 举报

发表于 2007-6-5 21:14 | 显示全部楼层
到信号处理版块,寻找 EMD 工具箱的程序,然后打开 extr.m(或者 extr 函数)就可以看到

[ 本帖最后由 ChaChing 于 2009-12-7 21:37 编辑 ]
 楼主| 发表于 2007-6-5 21:29 | 显示全部楼层
不好意思,以前没有用过emd,完全不懂,能否具体说说,谢谢了

[ 本帖最后由 ChaChing 于 2009-12-7 21:37 编辑 ]
发表于 2007-6-5 21:31 | 显示全部楼层
我不是建议你使用 EMD,你也没有必要理解它,我的意思是 EMD 的实现过程中用到这个方面的知识,你找到 extr 函数就能看到你的问题的解答了(extr 函数用于求一个信号的所有零点和极值点)

[ 本帖最后由 ChaChing 于 2009-12-7 21:38 编辑 ]
 楼主| 发表于 2007-6-5 22:02 | 显示全部楼层
看了一些帖子,我现在要下emd的工具箱,可是你发的那个地址我打不开,也许我这里是教育网的缘故,好久没有能用的代理了
能不能给俺发一下lh900@163.com

[ 本帖最后由 ChaChing 于 2009-12-7 21:46 编辑 ]
发表于 2007-6-5 22:06 | 显示全部楼层
我贴一下吧:

  1. m = length(x); x1=x(1:m-1); x2=x(2:m);
  2. indzer = find(x1.*x2<0);

  3. if any(x == 0)
  4.    iz = find( x==0 ); indz = [];
  5.    if any(diff(iz)==1)
  6.      zer = x == 0;
  7.      dz = diff([0 zer 0]);
  8.      debz = find(dz == 1);
  9.      finz = find(dz == -1)-1;
  10.      indz = round((debz+finz)/2);
  11.    else
  12.      indz = iz;
  13.    end
  14.    indzer = sort([indzer indz]);
  15. end

复制代码

[ 本帖最后由 ChaChing 于 2009-12-7 21:47 编辑 ]

评分

1

查看全部评分

发表于 2007-6-5 22:24 | 显示全部楼层
原帖由 lierr 于 2007-6-5 22:02 发表



看了一些帖子,我现在要下emd的工具箱,可是你发的那个地址我打不开,也许我这里是教育网的缘故,好久没有能用的代理了
能不能给俺发一下lh900@163.com


给你推荐个加速器吧,亿目,和教育网直通车类似,现在是免费的

评分

1

查看全部评分

 楼主| 发表于 2007-6-5 23:06 | 显示全部楼层
原帖由 eight 于 2007-6-5 22:06 发表


我贴一下吧:

m = length(x);
x1=x(1:m-1);
x2=x(2:m);
indzer = find(x1.*x2


这个程序有点问题,它找的是零点左侧的点,有时候右侧的点会更接近零点一些

我改了一下,不知道改的好不好,俩百分号之间是我加的
function pzero=fz(x)
m = length(x);
x1=x(1:m-1);
x2=x(2:m);
indzer = find(x1.*x2<0);
%%
n=length(indzer);
for i=1:n
    if abs(x(indzer(i)))>abs(x(indzer(i)+1))
        indzer(i)=indzer(i)+1;
    end
end
%%
if any(x == 0)
   iz = find( x==0 );
   indz = [];
   if any(diff(iz)==1)
     zer = x == 0;
     dz = diff([0 zer 0]);
     debz = find(dz == 1);
     finz = find(dz == -1)-1;
     indz = round((debz+finz)/2);
   else
     indz = iz;
   end
   indzer = sort([indzer indz]);
end
pzero=indzer;
 楼主| 发表于 2007-6-5 23:07 | 显示全部楼层
原帖由 mulan 于 2007-6-5 22:24 发表


给你推荐个加速器吧,亿目,和教育网直通车类似,现在是免费的

好啊,万分感谢!!
发表于 2008-10-29 05:24 | 显示全部楼层
There may has something wrong in the code!
if the input is x=[1 0 -2 -3 2 -5 3 0 2 0     0   5   ]
the reture value should be pzero=[2 5 7 8 10 11]
but using the code above, the reture value
indzer =

     2     4     5     6     8    11
where is 10  ?? Obviously it is zero!

something wrong with my chinese input, Sorry!

I just make a little modification of the code above
here's my codes

function pickzero=fz(x)
m = length(x);
x1=x(1:m-1);
x2=x(2:m);
indzer = find(x1.*x2<=0);
n=length(indzer);
for i=1:n
    if abs(x(indzer(i)))>abs(x(indzer(i)+1))
        indzer(i)=indzer(i)+1;
    end
end
pickzero=indzer

[ 本帖最后由 leeking30 于 2008-10-29 06:48 编辑 ]
untitled.jpg
cossin.jpg

评分

1

查看全部评分

您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

QQ|小黑屋|Archiver|手机版|联系我们|声振论坛

GMT+8, 2024-9-23 01:19 , Processed in 0.061492 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表