一维离散希尔伯特变换实现与3瞬属性

前言

希尔伯特变换的意义本文不提,本文的目标是举例说明到底离散傅里叶变换是如何实现的,并编写程序与matlab自带的hilbert函数结果对比,验证我们的实现过程是否正确。

离散希尔伯特变换

原始信号为s(t),其离散希尔伯特变换的定义公式为:

\hat{s}(t) = s(t) * \frac{1}{\pi t}

h(t) = s(t) + i\hat{s}(t)

说明:先让原始信号与\frac{1}{\pi t}信号做卷积,然后一起合并成一个复数信号h(t)

问题:看上去很简单,但这里的卷积不是一般意义上的卷积的操作!
所以:实际中得到h(t)的方法是通过借助离散傅里叶变换DFT来实现的!
因此:本文就用离散傅里叶变换来实现离散希尔伯特变换

手动实现

设原始信号为x(n),总长度一般N = 2^{n}(下标n是从1开始到N),总体实现步骤可分为3步:

  • x(n)做DFT,得到X(k)
  • X(k)进行重组得Z(k)

Z(k)= \begin{cases} X(k) & k = 1 \\ 2 X(k) & k = 1, 2, \cdots, \frac{N}{2} \\ 0 & k = \frac{N}{2} + 1, \frac{N}{2} + 2, \dots, N \end{cases}

  • Z(k)做IDFT得到z(n),然后取其虚部的数zx(n)
  • 最后结果:h(t) = x(n) + izx(n); 是一个复数信号。

相应的matlab程序:

% 说明:
% 定义: H = h(t) * 1/(pi·t) h(t)与1/(pi·t)做卷积, 但是这不是普通意义上的卷积操作
% 实际: 离散希尔伯特变换是借助离散傅里叶变换实现的!! matlab自带的函数也是用fft的

clear ; clc ; 

% x = [2 6 8 -1 12 -7 2 3 2 1 8 3 8 0 3 1];
x = [1 5 7 8 11 8 4 1];  % 还是最好用2^n个
N = length(x);

% 先对原离散信号做离散傅里叶变换
X = fft(x);

% 先是一波重新组合:
Z = [];
Z(1) = X(1);
Z(2:N/2) = 2*X(2:N/2);
Z(N/2+1:N) = 0;
% 然后对重组的结果求IDFT即可:
% 希尔伯特的复数部分: 记得去imag
z = imag(ifft(Z));  

% 原信号x做hilbert后的结果: hx
hx = x + z*j

% matlab自带的函数计算结果对比:
hx_zd = hilbert(x)

结果:

hx =

  1 至 6 列

   1.0000 - 2.4142i   5.0000 - 4.3462i   7.0000 - 2.5355i   8.0000 - 2.7249i  11.0000 + 0.4142i   8.0000 + 4.8462i

  7 至 8 列

   4.0000 + 4.5355i   1.0000 + 2.2249i


hx_zd =

  1 至 6 列

   1.0000 - 2.4142i   5.0000 - 4.3462i   7.0000 - 2.5355i   8.0000 - 2.7249i  11.0000 + 0.4142i   8.0000 + 4.8462i

  7 至 8 列

   4.0000 + 4.5355i   1.0000 + 2.2249i

手动实现正确!

希尔伯特变换的意义

希尔伯特变换的结果是给原始信号x(t)提供了一个幅值、频率不变,但相位平移90°的信号xz(n)
所以,希尔伯特变换是从"时域"到"时域"的变换!只改变了相位,所以又叫90°移相滤波器;
所以,原始信号x(t)与它的希尔伯特变换xz(n)构成正交副。

现在,我们换回到最初的记法:原始信号和它对应的希尔伯特变换信号分别用\hat{s}(t)s(t)表示,那么对应的"解析信号"就可以用这两个东西组成:

g(t) = s(t) + j\hat{s}(t)

对于这个解析信号,我们可以得它的3瞬属性:瞬时振幅、瞬时相位、瞬时频率。

  • 瞬时振幅:A(t) = \sqrt{s^{2}(t) + \hat{s}^{2}(t)}

  • 瞬时相位:\varphi(t) = arctan(\frac{\hat{s}(t)}{s(t)})

  • 瞬时频率:\omega(t) = \frac{d\varphi(t)}{dt}

可以看出,3瞬属性是相互关联的!
瞬时振幅、瞬时相位可以直接求,有意义;
但是瞬时频率直接根据解析信号这么按公式,是没有物理意义的!
并且离散信号,它的瞬时频率求导只能按照"差分"来近似,即:

\omega(t) = \frac{d\varphi(t)}{dt} \approx diff(\varphi(t))./diff(t);

给出matlab的实现程序:

% 根据希尔伯特变换得到3瞬属性: 瞬时振幅、瞬时相位、瞬时频率
% 注意:这里直接得到的瞬时频率无物理意义!!实际中不这么算。

clear ; clc;

x = xlsread('shuju.xlsx');
x = x(1001:1001+1023)';  % 有效数据长必须是2^n,所以我去1024,最后10几个点是0
N = length(x);
fs = 100;          % 采样频率 = 1/采样间隔
tt = (0:N-1)/fs;   % 时间刻度

figure(1);
subplot(2,1,1);
plot(tt,x);
axis([min(tt) max(tt) -inf inf]);
xlabel('时间'); ylabel('振幅'); title('原始信号');

% 这里直接用自带的变换函数了hilbert
h = hilbert(x);
imagh = imag(h);
subplot(2,1,2);
plot(tt,imagh);
axis([min(tt) max(tt) -inf inf]);
title('希尔伯特谱(相位滞后90°)');

figure(2);
% 瞬时振幅/包络: 
dA = abs(h);
subplot(3,1,1);
plot(tt,dA,'r'); % 包络包着原信号
hold on;
plot(tt,x); % 原信号
axis([min(tt) max(tt) -inf inf]);
xlabel('时间'); ylabel('瞬时振幅'); title('3瞬-瞬时振幅');

% 瞬时相位:
dfai = atan(imagh./x);
subplot(3,1,2);
plot(tt,dfai);
axis([min(tt) max(tt) -inf inf]);
xlabel('时间'); ylabel('瞬时相位'); title('3瞬-瞬时相位');

% 瞬时频率: 离散数据只能用"差分/梯度"来近似代替
 df = gradient(dfai)./gradient(tt);  % 梯度代替
% df = diff(dfai)./diff(tt);  % 差分代替

subplot(3,1,3);
plot(tt(1:length(df)),df);
axis([min(tt) max(tt) -inf inf]);
xlabel('时间'); ylabel('瞬时频率'); title('3瞬-瞬时频率');

效果:

图1:原始信号与希尔伯特变换后结果
图2:3瞬属性

3瞬属性中的瞬时频率,很明显可以看出它有很多的"负频率"!这很明显是错误的。
所以,直接根据"解析信号"算瞬时频率是无意义的!
所以,真正做3瞬属性的分析,做原信号的"时频谱"分析,我们用的:
—— 希尔伯特-黄变换。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,496评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,407评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,632评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,180评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,198评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,165评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,052评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,910评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,324评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,542评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,711评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,424评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,017评论 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,668评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,823评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,722评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,611评论 2 353

推荐阅读更多精彩内容