Calculate phase difference between two general signals (e.g. HbO and Hb) using Hilbert transform

1 min read

In a recent fNIRS journal club (vedio recorded here), Dr. Tong talked about their work on the phase difference between oxy and deoxy Hb, and its relationship with participants’ age. This article is a demo of how to use Hilbert transform to calculate the phase difference between two signals, and whether it’s valid if the signals contain a wide range of frequencies.

Tool: We use MatLab’s hilbert function to calculate the instant phase of a signal. The code can be found in the end of this article.

Case 1: single frequency

Here we tried the simplest case: x and y are single frequency signals with phase difference pi/2, as demonstrated in the figure below. We expect that the calculated phase difference is close to pi/2 or 1.57.

As expected, the phase difference is pi/2! Hilbert transform is doing well in picking up the phase difference! It is noted, however, the calculation is more robust in the middle of the signal.

Case 2: 2 frequencies

What about more complex signals? If x and y both contains two frequencies, each with phase difference pi/2, will Hilbert transform find the correct value?

Yes. It turns out Hilbert transform works for two-frequency signals as well.

Case 3: a lot of frequencies

In this case we generated x and y each with 50 random frequencies. The resulted signals are essentially random:

Again, Hilbert transform found the correct phase difference, pi/2:

People may argue that in such a wide-band case the “phase difference” is not meaningful. However, if the phase difference for each frequency is similar, then it is reasonable to say that the phase difference between the overall signals exists and is that value.

Code (MatLab)

Update: in the original version I shift phase manually (and contains an error!). Now we use unwrap and wrapToPi, suggested by Yafeng Pan, which is easier to use and produce the correct phase shift. Thank Yafeng!

% Demo of Hilbert transform to calculate phase difference between two
% signals
% Xu Cui 2021/6/7

% single frequency
t = [0:0.01:100];
x = sin(t);
y = sin(t+pi/2);
figure; plot(t, x, t, y);
legend('x','y');

xh = hilbert(x);
yh = hilbert(y);

xphase = unwrap(angle(xh));
yphase = unwrap(angle(yh));

figure; plot(t, xphase, t, yphase,'.');

phase_diff = wrapToPi(xphase-yphase);
figure; plot(t, phase_diff, '.');

% 2 frequencies
t = [0:0.01:100];
x = sin(t) + sin(2*t);
y = sin(t+pi/2) + sin(2*t+pi/2);
figure; plot(t, x, t, y);
legend('x','y');

xh = hilbert(x);
yh = hilbert(y);

xphase = unwrap(angle(xh));
yphase = unwrap(angle(yh));

figure; plot(t, xphase, t, yphase,'.');

phase_diff = wrapToPi(xphase-yphase);
figure; plot(t, phase_diff, '.');

% a lot of frequencies
t = [0:0.01:100];
x = zeros(size(t));
y = zeros(size(t));
frequency = rand(1,50)*10;
for ii=1:length(frequency)
    f = frequency(ii);
    x = x + sin(f*t);
    y = y + sin(f*t+pi/2);
end

figure; plot(t, x, t, y);
legend('x','y');

xh = hilbert(x);
yh = hilbert(y);

xphase = unwrap(angle(xh));
yphase = unwrap(angle(yh));

figure; plot(t, xphase, t, yphase,'.');

phase_diff = wrapToPi(xphase-yphase);
figure; plot(t, phase_diff, '.');


Receive email notification via email 博客有新内容通知我
文献鸟,永远不错过新文献!

Don't want to miss new papers in your field? Check out Stork we developed:


第二十六期 fNIRS Journal Club 视频

来自上海精神卫生中心的胡志善博士为大家介绍了一篇他们去年发表的综述(静息态近红外在研究发育的应用)。视频如下: Youtube:https://youtu.be/C7xIRrBUhhg Youku: https://v.youku.com/v_show/id_XNTgzNTQ5ODg3Mg==.html
Xu Cui
4 sec read

第二十六期 fNIRS Journal Club 通知 2022/1/15,10:00am

来自上海精神卫生中心的胡志善博士将为大家介绍具体一篇他们去年发表的综述(静息态近红外在研究发育的应用)。热烈欢迎大家参与讨论。 时间: 北京时间2022年1月15日上午10:00地点: https://zoom.com房间号: 897 8179 5073密码: 333858 胡博士要讲解的文章如下: Hu, Liu, Dong, Niu (2020) Applications of Resting-State fNIRS in the Developing Brain: A Review...
Xu Cui
6 sec read

第二十五期 fNIRS Journal Club 视频

来自华东师范大学的胡银莹博士为大家介绍了具体如何计算和验证超扫描实验中脑间同步性,并分享做fNIRS实验相关方面的应用经验。视频如下: Youtube:https://youtu.be/xI_6wKd06io Youku:上传后被youku屏蔽,原因不详。
Xu Cui
3 sec read

Leave a Reply

Your email address will not be published. Required fields are marked *