请教关于 matlab 的hilbert 函数
如果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 编辑 ]
回复 #1 营生 的帖子
help hilbertExample:
% Xr = ;
% X = hilbert(Xr)
% produces X= such that Xi=imag(X)= is the
% Hilbert transform of Xr, and Xr=real(X)=.
回复 #2 zhlong 的帖子
zhlong总是以例服人[ 本帖最后由 zhangnan3509 于 2007-6-26 16:22 编辑 ] 非常非常的感谢
回复 #3 zhangnan3509 的帖子
呵呵,不明白版主的意思。我太愚钝了,:@L俺觉得别的解释不如 公式或例子 来得直接。
回复 #5 zhlong 的帖子
没什么,觉得你的方式很好,讲半天理,不如一个例子更清楚,所以应该是以例服人,我打错了。另外楼主 这个问题还不完全属于HHT吧,这样的分类不合适。 原帖由 zhangnan3509 于 2007-6-26 16:22 发表 http://www.chinavib.com/forum/images/common/back.gif没什么,觉得你的方式很好,讲半天理,不如一个例子更清楚,所以应该是以例服人,我打错了。另外楼主 这个问题还不完全属于HHT吧,这样的分类不合适。
目的是hht,分类要不是hht就是其他了
回复 #7 营生 的帖子
hilbert不一定是只做HHT,单就这问题,还是分作其他的好。 原帖由 zhlong 于 2007-6-26 16:13 发表 http://www.chinavib.com/forum/images/common/back.gifhelp hilbert
Example:
% Xr = ;
% X = hilbert(Xr)
% produces X= such that Xi=imag(X)= 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) 我也试了一下,好像存在一个负号问题,即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)) 原帖由 zhlong 于 2007-6-26 22:23 发表 http://www.chinavib.com/forum/images/common/back.gif
我也试了一下,好像存在一个负号问题,即hilbert()函数得到的数值是理论值的负数,不知道为什么。还有就是前面几个数值和理论值相差比较大,中间都还蛮吻合的,应该是数值计算的问题。
有知道的朋友请指点一 ...
这个问题一早被我们注意到了,我的一个同学也搞了一些改进,好像准备投稿了,到时候大家留意吧
回复 #11 eight 的帖子
是hilbert这个函数的程序问题么?其实就差一个负号,所以我们在做EMD中用到这个函数也没出什么乱子哈。 原帖由 zhlong 于 2007-6-26 23:41 发表 http://www.chinavib.com/forum/images/common/back.gif
是hilbert这个函数的程序问题么?
其实就差一个负号,所以我们在做EMD中用到这个函数也没出什么乱子哈。
恩,matlab的库函数 hilbert 在两端误差比较大,我的同学提出了一种改进,效果好像还可以
回复 #13 eight 的帖子
嗯,对的对的,我也发现末端的数据效果也不好!希望早点看到你同学的大作! 原帖由 zhlong 于 2007-6-26 22:23 发表 http://www.chinavib.com/forum/images/common/back.gif我也试了一下,好像存在一个负号问题,即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 编辑 ]
页:
[1]
2