声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 14122|回复: 24

[其他] 请教关于 matlab 的hilbert 函数

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

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

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

x
如果t为实数
对cos(20000*pi*t)+cos(4000*pi*t)作hilbert变换应该是
sin(20000*pi*t)+sin(4000*pi*t)是实数
为什么用matlab里的hilbert函数得到的是复数?谢谢

[ 本帖最后由 zhangnan3509 于 2007-6-26 16:22 编辑 ]
回复
分享到:

使用道具 举报

发表于 2007-6-26 16:13 | 显示全部楼层

回复 #1 营生 的帖子

help hilbert

Example:
%     Xr = [1 2 3 4];
%     X = hilbert(Xr)
%   produces X=[1+1i 2-1i 3-1i 4+1i] such that Xi=imag(X)=[1 -1 -1 1] is the
%   Hilbert transform of Xr, and Xr=real(X)=[1 2 3 4].
发表于 2007-6-26 16:15 | 显示全部楼层

回复 #2 zhlong 的帖子

zhlong总是以例服人

[ 本帖最后由 zhangnan3509 于 2007-6-26 16:22 编辑 ]
 楼主| 发表于 2007-6-26 16:19 | 显示全部楼层
非常非常的感谢
发表于 2007-6-26 16:20 | 显示全部楼层

回复 #3 zhangnan3509 的帖子

呵呵,不明白版主的意思。我太愚钝了,:@L
俺觉得别的解释不如 公式或例子 来得直接。
发表于 2007-6-26 16:22 | 显示全部楼层

回复 #5 zhlong 的帖子

没什么,觉得你的方式很好,讲半天理,不如一个例子更清楚,所以应该是以例服人,我打错了。另外楼主 这个问题还不完全属于HHT吧,这样的分类不合适。
 楼主| 发表于 2007-6-26 16:28 | 显示全部楼层
原帖由 zhangnan3509 于 2007-6-26 16:22 发表
没什么,觉得你的方式很好,讲半天理,不如一个例子更清楚,所以应该是以例服人,我打错了。另外楼主 这个问题还不完全属于HHT吧,这样的分类不合适。

目的是hht,分类要不是hht就是其他了
发表于 2007-6-26 16:30 | 显示全部楼层

回复 #7 营生 的帖子

hilbert不一定是只做HHT,单就这问题,还是分作其他的好。
 楼主| 发表于 2007-6-26 16:33 | 显示全部楼层
原帖由 zhlong 于 2007-6-26 16:13 发表
help hilbert

Example:
%     Xr = [1 2 3 4];
%     X = hilbert(Xr)
%   produces X=[1+1i 2-1i 3-1i 4+1i] such that Xi=imag(X)=[1 -1 -1 1] is the
%   Hilbert transform of Xr, and Xr=real(X)= ...

又来请教了,为什么我说的那个例子,hilbert算出的虚部imag(hilbert(cos(20000*pi*t)+cos(4000*pi*t)))与理论解sin(20000*pi*t)+sin(4000*pi*t)不一样呢?例子中我取t=(0:1/1023:1)
发表于 2007-6-26 22:23 | 显示全部楼层
我也试了一下,好像存在一个负号问题,即hilbert()函数得到的数值是理论值的负数,不知道为什么。还有就是前面几个数值和理论值相差比较大,中间都还蛮吻合的,应该是数值计算的问题。

有知道的朋友请指点一下哈!
clear
t=(0:1/1023:1);
x=cos(20000*pi*t)+cos(4000*pi*t);
y=hilbert(x);
x1=imag(y);
x2=sin(20000*pi*t)+sin(4000*pi*t);
plot(t(1:20),x1(1:20),t(1:20),x2(1:20))
figure;plot(t(1:20),-x1(1:20),t(1:20),x2(1:20))
figure;plot(t(20:30),-x1(20:30),t(20:30),x2(20:30))
1.gif
2.gif
3.gif

评分

1

查看全部评分

发表于 2007-6-26 23:38 | 显示全部楼层
原帖由 zhlong 于 2007-6-26 22:23 发表
我也试了一下,好像存在一个负号问题,即hilbert()函数得到的数值是理论值的负数,不知道为什么。还有就是前面几个数值和理论值相差比较大,中间都还蛮吻合的,应该是数值计算的问题。

有知道的朋友请指点一 ...


这个问题一早被我们注意到了,我的一个同学也搞了一些改进,好像准备投稿了,到时候大家留意吧
发表于 2007-6-26 23:41 | 显示全部楼层

回复 #11 eight 的帖子

是hilbert这个函数的程序问题么?
其实就差一个负号,所以我们在做EMD中用到这个函数也没出什么乱子哈。
发表于 2007-6-26 23:53 | 显示全部楼层
原帖由 zhlong 于 2007-6-26 23:41 发表
是hilbert这个函数的程序问题么?
其实就差一个负号,所以我们在做EMD中用到这个函数也没出什么乱子哈。


恩,matlab的库函数 hilbert 在两端误差比较大,我的同学提出了一种改进,效果好像还可以
发表于 2007-6-26 23:55 | 显示全部楼层

回复 #13 eight 的帖子

嗯,对的对的,我也发现末端的数据效果也不好!希望早点看到你同学的大作!
发表于 2007-6-27 15:01 | 显示全部楼层
原帖由 zhlong 于 2007-6-26 22:23 发表
我也试了一下,好像存在一个负号问题,即hilbert()函数得到的数值是理论值的负数,不知道为什么。还有就是前面几个数值和理论值相差比较大,中间都还蛮吻合的,应该是数值计算的问题。

有知道的朋友请指点一 ...


zhlong 得到负值的原因是信号采样率远小于正弦信号的频率(简单的说,就是一个正弦周期内连一个采样点都不能保证),代码修改一下:

clear
t = (0:1/1023:1);
x = cos(20*pi*t)+cos(40*pi*t);
y = hilbert(x);
x1 = imag(y);
x2 = sin(20*pi*t)+sin(40*pi*t);
figure(1);
plot(t,x1,t,x2)

这样就和理论值吻合了。

至于Hilbert变换在matlab中的实现,其实很简单,就是把实信号fft变换,然后把负频率部分强制赋0,然后ifft,就得到了y=hilbert(x)。从这个意义上说,两端差距较大,是因为fft以后存在能量扩散,正频率部分存在从负频率扩散而来的能量,因此即使把负频率部分强制赋0,也不能完全保证消除所有的负频率能量。从滤波器的角度来说,hilbert变换实际上是通过一个冲击响应为1/t的滤波器,在前端由于最前面认为是全0,所以滤波存在误差,若采用某些方法对前端数据进行预测(例如镜像方法),可能可以消除一部分误差。

不知道这样解释对不对,请大家指教。

==============================================================================
xray版友给出的例子中fs=1023,总共有1024个点,频率分辨率1023/1024,
x中两个分量的频率10HZ和20HZ都不是1023/1024的整数倍,所以不是整周期采样。
可以把例子中t=0:1/1023:1改为t=1/1023:1/1023:1(频率分辨率1024/1024=1Hz),
比较一下两者的结果会发现后者在两端更为精确,这也验证了我们在帖子
hilbert变换怪现象!中的结论:非整周期采样会造成hilbert变换两端产生比较大的误差,进而导致瞬时频率曲线两端较大
的波动!

                                                                         by zhlong
================================================================================

[ 本帖最后由 zhlong 于 2007-8-21 20:45 编辑 ]

评分

2

查看全部评分

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

本版积分规则

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

GMT+8, 2024-9-21 04:24 , Processed in 0.296306 second(s), 22 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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