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. 如何构建面向海量数据、高实时要求的企业级OLAP数据引擎?

    在字节跳动各产品线飞速成长的过程中,对数据分析能力也提出了更高的要求,现有的主流数据分析产品都没办法完全满足业务要求.因此,字节跳动在ClickHouse引擎基础上重构了技术架构,实现了云原生环境的部 ...

  2. MongoDB 占用CPU资源过高

    情况如下 db.currentOp() 发现有全表扫描 将 Collscan 对应的 Collection 建索引 db.Table1.createIndex({"DataTime" ...

  3. 【django-vue】七牛云上传视频 搜索接口 支付宝sdk二次封装 下单接口 前端支付页面 支付成功回调接口

    目录 上节回顾 课程详情接口 choice字段 今日内容 1 文件存储 1.1 七牛云上传文件 2 搜索导航栏 2.1 Header.vue 3 搜索接口 4 搜索页面 5 支付宝支付介绍 5.1 支 ...

  4. 【源码系列#06】Vue3 Diff算法

    专栏分享:vue2源码专栏,vue3源码专栏,vue router源码专栏,玩具项目专栏,硬核推荐 欢迎各位ITer关注点赞收藏 Vue2 Diff算法可以参考此篇文章[Vue2.x源码系列08]Di ...

  5. Grafana--双Y轴

    grafana版本:6.5.2 背景:同一面板里想展示各实例与集群在一段时间范围内,平均每秒执行命令数,但是由于数值差异太大,曲线图抖动不明显,实例的更近乎于一条直线,所以设置双Y轴,可更直观的展示线 ...

  6. 活动回顾|阿里云 Serverless 技术实战与创新上海站回放&PPT下载

    5月27日"阿里云 Serverless 技术实战与创新"上海站圆满落幕.活动现场邀请了来自阿里云 一线技术专家,分享当前 Serverless 趋势和落地实践过程中的挑战和机遇: ...

  7. 通过部署流行 Web 框架掌握 Serverless 技术

    大家好,我是霍大侠,本篇我们通过学习部署流行 Web 框架,如 Spring Boot,Express,Web IDE,让你掌握 Serverless 函数计算架构和技术,领略弹性并发.高可用的好处. ...

  8. gitlab安装,移库,升级

    概述 最近因为机房原因,需要把我们的本地代码库做移库操作. 针对gitlab的安装升级操作重新进行了梳理,记录一下. 环境 CENTOS6 CENTOS7 gitlab-ce-8.14.2 GITLA ...

  9. php开发中常见的漏洞点(一) 基础sql注入

    前言 本系列为小迪2022的学习笔记,仅用于自我记录. 正文 在一般情况下,一个网站的首页大致如下 在上方存在着各种各样的导航标签.链接.而一般情况下网站的导航会用参数进行索引的编写,比如id.pag ...

  10. 12_前K个高频元素

    前K个高频元素 给你一个整数数组 nums 和一个整数 k ,请你返回其中出现频率前 k 高的元素.你可以按 任意顺序 返回答案.347.力扣题目链接 示例 1: 输入: nums = [1,1,1, ...