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. 苹果商店上架流程_App上架苹果流程及注意事项

    苹果商店上架流程_App上架苹果流程及注意事项 APP上架是:APP应用从提交审核到上架整个过程.目的是让应用展示在APP Store上获取流量及用户 一.IOS上架整个流程 1.申请开发者账号 2. ...

  2. Android WebView 踩坑日记,字体怎么突然变小了???

    背景 最近,端内在做 webView 统一的时候,个性签名中的 WebView 替换为 CustomWebView 之后,发现字体突然变小. 一开始不知道是什么原因,通过二分法查找最近的提交,排查之后 ...

  3. Java基础知识整理,驼峰规则、流程控制、自增自减

    写在开头 本文接着上一篇文章续写哈.[Java基础知识整理,注释.关键字.运算符](https://blog.csdn.net/qq_43506040/article/details/13563332 ...

  4. 自用 IntelliJ IDEA Vim 插件配置

    Prefrence: https://einverne.github.io/post/2020/12/my-idea-vimrc-config.html https://gist.github.com ...

  5. 【LibCurl】HomeBrew 安装 LibCurl & CMake 配置

    LibCurl 在官网中明确指出支持 HomeBrew 进行安装. 那么在 macOS 端的安装就不会想 Win 下需要根据版本进行编译了,方便许多 brew install curl # 安装完成后 ...

  6. 汇编 | CPU物理地址本质理解

    物理地址 我们知道,CPU访问内存单元时,要给出内存单元的地址.所有的内存单元构成的存储空间是一个一维的线性空间,每一个内存单元在这个空间中都有唯一的地址,我们将这个唯一的地址称为物理地址. CPU通 ...

  7. 数论(7):康托展开&逆康托展开

    康托展开可以用来求一个 \(1\sim n\) 的任意排列的排名. 什么是排列的排名? 把 \(1\sim n\) 的所有排列按字典序排序,这个排列的位次就是它的排名. 时间复杂度? 康托展开可以在 ...

  8. var _ I = (*T)(nil)

    学习的时候看到这样一行代码 var _ Codec = (*GobCodec)(nil) 查了一下后,得到该语句的作用为:检查GobCodec这个结构体是否实现了Codec这个接口 空白标识符_代表变 ...

  9. 阿里云 FaaS 架构设计

    摘要:希望通过本系列课程,让大家更深入了解阿里云FaaS架构设计,以及神龙高密部署的FaaS介绍. 本篇内容将从2个部分为读者介绍关于阿里云 FaaS 架构设计和神龙高密部署的 FaaS,希望可以让大 ...

  10. <vue初体验> 基础知识 1、vue的引入和使用体验

    系列导航 <vue初体验> 一. vue的引入和使用体验 <vue初体验> 二. vue的列表展示 <vue初体验> 三. vue的计数器 <vue初体验&g ...