What's The Hilbert Transform

简单地说,希尔伯特变换的物理意义为:把信号的所有频率分量的相位推迟90度,这样原信号和变换后信号可以视为一组IQ正交信号,在数字域正交化,可以做很多事情。

有一篇文章写的不错:《希尔伯特变换的物理意义》,这篇文章简单地说明了变换后、变换前之间信号的物理意义,并且可以推出原信号的顺时幅度、顺时相位、顺时频率信息,值得一看。这里仅列出一些后文需要用到的公式。

还有一篇讲解调PM的,也可以看看:Phase demodulation via Hilbert transform: Hands-on

记:

原信号\(s(t)=A(t)\sin (\varphi(t))\)

其中\(A(t)\)为瞬时幅值,\(\varphi(t)\)为瞬时相位

吉尔伯特变换后,有\(\hat{s}(t)=\mathcal{H} \left | s(t) \right |\)

则有\(A(t)=\sqrt{\hat{s}^{2}(t) + s^{2}(t)}\),\(\varphi(t)=\arctan \frac{\hat{s}(t)}{s(t)}\),需要四象限反正切

Demodulation via Hilbert Transform

希尔伯特变换用于单边带调制的案例很多,但是既然希尔伯特变换能单独求出幅值、相位信息,甚至可以认为希尔伯特变换前后结果就是一组IQ信号,那么就可以试着将其用于解调系统。

注意:希尔伯特变换不是因果的,即对于实时解调来说不应该使用希尔伯特变换,如果先采很长时间,之后解调,则希尔伯特变换对于t<0(和t>t_sample)的非因果效应不是很影响主要信号,下文会展示该影响

以调频信号为例,其瞬时相位为

\[\varphi(t)=\omega _0t+m_f\sin(\omega _st)
\]

其中\(\omega _s\)为调制信号角频率

设载波100k,调制信号10k,fm频偏5k

对于已调信号,有:



姑且不管右侧时域波形,左侧FM调制频谱更清楚一些。

对信号进行希尔伯特变换后,求出瞬时相位\(\varphi(t)=\arctan \frac{\hat{s}(t)}{s(t)}\),差分后得到基带调制信号:



可以看到解调信号时域两端出现干扰,并且具有较大直流分量,这是非因果带来的问题。可以对原信号两端补零减少影响,大家可以动手试一试,这里不再赘述。

Matlab Program

clear;
clc;
tic;
f0 = 100e3; %载波
f1 = 10e3; %调制信号
L = 1e6; %采样长度
tmax = 1e-1; %采样时间
t = linspace(0, tmax, L);
fs = L / tmax;
df = 5e3; %频移量
mf = df / f0; %调频度 %%%%S
phi_t = 2 * pi * f0 .* t + mf * sin(2 * pi * f1 .* t);
s = sin(phi_t); %调频信号 figure(1)
subplot(1, 2, 2);
plot(t, s);
xlabel("t/s")
ylabel("S(t)")
title("The Wave of S(t)") w = hamming(L); %加窗
Y = fft(1.414 * s .* w'); %我拿Hann的补偿系数乘上去了,大家可以查查Hamming的系数是多少
P2 = abs(Y / L);
P1 = P2(1:L / 2 + 1);
P1(2:end - 1) = 2 * P1(2:end - 1);
f = fs * (0:(L / 2)) / L;
P1 = db(P1);
subplot(1, 2, 1);
plot(f, P1)
title("Single-Sided Amplitude Spectrum of S(t)")
xlabel("f/Hz")
ylabel("|P1(f)|/dB")
xlim([f0 -100e3 f0 +100e3]);
ylim([-100 0]); %%%%希尔伯特变换
y_t = hilbert(s); %这里其实可以加一个Hann窗或补0,减少信号两端出现混叠
phi = unwrap(angle(y_t)); %matlab的hilbert实部为原信号,虚部为变换信号
s_demod = diff(phi);
L = L - 1; %差分函数会使长度-1
t2 = linspace(0, tmax, L); figure(2)
clf;
subplot(1, 2, 2);
plot(t2, s_demod);
xlabel("t/s")
ylabel("E(t)")
title("The Wave of S_d(t)") w = hamming(L);
Y = fft(1.414 * s_demod .* w');
P2 = abs(Y / L);
P1 = P2(1:L / 2 + 1);
P1(2:end - 1) = 2 * P1(2:end - 1);
f = fs * (0:(L / 2)) / L;
P1 = db(P1);
subplot(1, 2, 1);
plot(f, P1)
title("Single-Sided Amplitude Spectrum of S_d(t)")
xlabel("f/Hz")
ylabel("|P1(f)|/dB")
xlim([f1 -10e3 f1 +10e3]);
ylim([-100 0]); toc;
fprintf('\n 用时:%f s \n', toc);

希尔伯特变换用于解调系统——以解调调频信号为例,FM Demodulation的更多相关文章

  1. Supervisor – 用于 Unix 系统的进程监控工具

    Supervisor 是一个客户端/服务端模式的系统,使用户能够监视和控制 UNIX 操作系统的进程.Supervisor 为你提供一个地方来启动,停止和监视进程.进程可以单独或成组的形式控制.您还可 ...

  2. [离散时间信号处理学习笔记] 10. z变换与LTI系统

    我们前面讨论了z变换,其实也是为了利用z变换分析LTI系统. 利用z变换得到LTI系统的单位脉冲响应 对于用差分方程描述的LTI系统而言,z变换将十分有用.有如下形式的差分方程: $\displays ...

  3. Linux下分割、合并PDF(pdftk),用于Linux系统的6款最佳PDF页面裁剪工具

    Linux下分割.合并PDF(pdftk),用于Linux系统的6款最佳PDF页面裁剪工具 Linux下分割.合并PDF(pdftk) pdftk http://www.pdflabs.com/doc ...

  4. Unix系统编程()信号:概念和概述

    这篇将一口气学完信号的基本概念,但是有很多的细节,所以篇幅较长,请做好心理准备. (他大爷的,一口气没有学完,太懒了) 有以下主题: 各种不同信号及其用途 内核可能为进程产生信号的环境,以及某一进程向 ...

  5. Linux系统编程——进程间通信:信号中断处理

    什么是信号? 信号是 Linux 进程间通信的最古老的方式.信号是url=474nN303T2Oe2ehYZjkrggeXCaJPDSrmM5Unoh4TTuty4wSgS0nl4-vl43AGMFb ...

  6. 2016-04-25-信息系统实践手记5-CACHE设计一例

    layout: post title: 2016-04-25-信息系统实践手记5-CACHE设计一例 key: 20160425 tags: 业务 场景 CACHE 系统分析 系统设计 缓存 modi ...

  7. Linux系统编程之----》信号

    "===信号========================================================================================= ...

  8. 轻松应对并发问题,简易的火车票售票系统,Newbe.Claptrap 框架用例,第一步 —— 业务分析

    Newbe.Claptrap 框架非常适合于解决具有并发问题的业务系统.火车票售票系统,就是一个非常典型的场景用例. 本系列我们将逐步从业务.代码.测试和部署多方面来介绍,如何使用 Newbe.Cla ...

  9. Linux下用于查看系统当前登录用户信息 w命令

    作为系统管理员,你可能经常会(在某个时候)需要查看系统中有哪些用户正在活动.有些时候,你甚至需要知道他(她)们正在做什么.本文为我们总结了4种查看系统用户信息(通过编号(ID))的方法. 1. 使用w ...

  10. Linux下用于查看系统当前登录用户信息的4种方法

    1. 使用w命令查看登录用户正在使用的进程信息 w命令用于显示已经登录系统的用户的名称,以及他们正在做的事.该命令所使用的信息来源于/var/run/utmp文件.w命令输出的信息包括: 用户名称 用 ...

随机推荐

  1. HBuilderX获取iOS证书的打包步骤

    简介: 目前app开发,很多企业都用H5框架来开发,而uniapp又是这些h5框架里面最成熟的,因此hbuilderx就成为了开发者的首选.然而,打包APP是需要证书的,那么这个证书又是如何获得呢? ...

  2. 9月活动回顾(免费领取PPT)|火山引擎DataLeap、ByteHouse多位专家带来DataOps、实时计算等前沿技术分享!

    更多技术交流.求职机会,欢迎关注字节跳动数据平台微信公众号,回复[1]进入官方交流群   在上月举行的火山引擎开发者社区 Meetup 第12期暨超话数据专场<数智化转型背景下的火山引擎大数据技 ...

  3. PPT 求职应聘:如何制作人物介绍

    PPT 求职应聘:如何制作人物介绍 单人展示

  4. Kubernetes(K8S) Pod 介绍

    Pod 是 k8s 系统中可以创建和管理的最小单元, 是资源对象模型中由用户创建或部署的最小资源对象模型, 也是在 k8s 上运行容器化应用的资源对象, 其他的资源对象都是用来支撑或者扩展 Pod 对 ...

  5. SQL SERVER数据分组后取第一条数据——PARTITION BY

    MySQL 数据分组后取第一条数据 SQL SERVER (mssql) 数据分组后取第一条数据 SQL 如下 找状态=1的数据,按 HospitalId,DeptId 组合并倒序排序,每组里面取第一 ...

  6. Mysql--编译安装5.7版本

    1 安装环境 1)清除以往mysql残留痕迹(新机不用) yum erase mariadb mariadb-server mariadb-libs mariadb-devel -y userdel ...

  7. 区间DP练习题题解

    算法讲解:Here AcWing 282. 石子合并 (模板) 题目链接:Here const int N = 310; int a[N], s[N]; int dp[N][N]; void solv ...

  8. 如何做一次完美的 ABTest?

    本文首发于 vivo互联网技术 微信公众号 链接:https://mp.weixin.qq.com/s/mO5MdwG7apD6RzDhFwZhog作者:DuZhimin 越来越多的公司都在尝试 AB ...

  9. 十、docker镜像的分层

    系列导航 一.docker入门(概念) 二.docker的安装和镜像管理 三.docker容器的常用命令 四.容器的网络访问 五.容器端口转发 六.docker数据卷 七.手动制作docker镜像 八 ...

  10. freeswitch修改mod_sofia模块并上报自定义头域

    概述 在之前的文章中,我们介绍了如何使用fs的event事件机制来获取呼叫的各种信息. 这些event事件一般都是底层模块定义好的,其中的各种信息已经很完备了,日常的开发需求都可以满足. 但是,总有一 ...