【语音信号处理五】希尔伯特黄变换
【参考资料】
【1】https://www.cnblogs.com/qiweiwang/archive/2010/12/20/1911736.html
【2】https://zhuanlan.zhihu.com/p/74413218
【3】https://www.pianshen.com/article/9161269068/
【4】《希尔伯特变换与信号的包络_瞬时相位和瞬时频率》 https://wenku.baidu.com/view/9aa65710580216fc700afd57.html
1. 概述
所谓HHT 希尔伯特黄变换是将信号进行EMD分解,将分解完的每个IMF分量用Hibert变换得到其瞬时频谱,最终进行信号的时频分析。因此在本笔记中重点记录hilbert变换和EMD分解。
2. Hilbert变换与瞬时频率
2.1 复信号的定义
已知有欧拉公式:
e j θ = c o s θ + j s i n θ e^{j \theta} = cos \theta + j sin \theta ejθ=cosθ+jsinθ
由公式 θ = ω t = 2 π T t \theta = \omega t = \dfrac{2 \pi}{T}t θ=ωt=T2πt 得到下述复变函数公式:
e j ω = c o s ω t + j s i n ω t e^{j\omega} = cos \omega t + j sin \omega t ejω=cosωt+jsinωt 从而反推得到:
c o s ω t = e j ω + e − j ω cos \omega t = e^{j\omega} + e^{-j\omega} cosωt=ejω+e−jω
由于上面和式中如果根据欧兰公式展开,其虚部是互相抵消的,因此我们可以将实信号表示成:
c o s ω t = R e s { e j ω } cos \omega t = Res\{ e^{j\omega} \} cosωt=Res{ejω} ,即 e j ω e^{j\omega} ejω 这个信号的实部,此时我们称为 e j ω e^{j\omega} ejω为其复信号
2.2 实信号和复信号的频谱关系
推导详见【参考文献4】,结论为:
称 q ( t ) q(t) q(t)为 x ( t ) x(t) x(t)的复信号,其中 Q ( f ) Q(f) Q(f)和 X ( f ) X(f) X(f)分别为其频谱,这有:
Q ( f ) = { 2 Q ( f ) f > 0 0 f < 0 Q(f)=\left\{ \begin{aligned} 2Q(f)& & f > 0 \\ 0 & & f < 0 \end{aligned} \right. Q(f)={2Q(f)0f>0f<0
针对这种关系,我们可以定义一个滤波器,其频谱为 H 1 ( f ) = { 2 f > 0 0 f < 0 H_1(f)=\left\{ \begin{aligned} 2 & & f > 0 \\ 0 & & f < 0 \end{aligned} \right. H1(f)={20f>0f<0
同时得到其对应的时间函数: h 1 ( t ) = δ ( t ) + i 1 π t h_1(t) = \delta(t) + i \dfrac{1}{\pi t} h1(t)=δ(t)+iπt1
备注:这步不知道怎么推出来的?
2.3 Hilbert变换的定义
由2.2存在公式(频域的乘法为时域的卷积),我们有:
q ( t ) = h 1 ( t ) ∗ x ( t ) q(t) = h_1(t) * x(t) q(t)=h1(t)∗x(t)
q ( t ) = ( δ ( t ) + i 1 π t ) ∗ x ( t ) q(t) = (\delta(t) + i \dfrac{1}{\pi t}) * x(t) q(t)=(δ(t)+iπt1)∗x(t) 得到
q ( t ) = x ( t ) + i 1 π t ∗ x ( t ) q(t) = x(t) + i \dfrac{1}{\pi t} * x(t) q(t)=x(t)+iπt1∗x(t)
令 x ~ ( t ) = 1 π t ∗ x ( t ) = 1 π ∫ − ∞ ∞ x ( τ ) t − τ d τ \widetilde{x}(t) = \dfrac{1}{\pi t} * x(t) = \dfrac{1}{\pi} \int_{-\infty}^{\infty} \dfrac{x(\tau)}{t - \tau} d \tau x (t)=πt1∗x(t)=π1∫−∞∞t−τx(τ)dτ
我们称 x ~ ( t ) \widetilde{x}(t) x (t) 为Hilbert变换
这里的Hilbert变换相当于做了一个滤波,频谱滤波为: H 1 ( f ) = { i f > 0 − i f < 0 H_1(f)=\left\{ \begin{aligned} i & & f > 0 \\ -i & & f < 0 \end{aligned} \right. H1(f)={i−if>0f<0
举例:
2.4 解析信号、包络、瞬时相位和瞬时频谱
利用实信号 x ( t ) x(t) x(t)及其hilbert变换 x ~ ( t ) \widetilde{x}(t) x (t)构成一个解析信号:
q ( t ) = x ( t ) + x ~ ( t ) q(t) = x(t) + \widetilde{x}(t) q(t)=x(t)+x (t)
假设有一工程中常用的窄带信号:
x ( t ) = a ( t ) c o s ( ω t + φ ( t ) ) x(t) = a(t) cos(\omega t + \varphi(t)) x(t)=a(t)cos(ωt+φ(t)) 及其hilbert变换 x ~ ( t ) = a ( t ) s i n ( ω t + φ ( t ) ) \widetilde{x}(t) = a(t) sin(\omega t + \varphi(t)) x (t)=a(t)sin(ωt+φ(t))推导详见参考文献4 略
我们令 θ ( t ) = ω t + φ ( t ) \theta(t) = \omega t + \varphi(t) θ(t)=ωt+φ(t) 则有如下一些核心定义:
包络: e ( t ) = x ( t ) 2 + x ~ ( t ) 2 e(t) = \sqrt{x(t)^2 + \widetilde{x}(t)^2} e(t)=x(t)2+x (t)2
瞬时相位: θ ( t ) = a r c t g x ~ ( t ) x ( t ) \theta(t) = arctg \dfrac{\widetilde{x}(t)}{x(t)} θ(t)=arctgx(t)x (t)
瞬时频率: u ( t ) = d θ ( t ) d t = d d t a r c t g x ~ ( t ) x ( t ) u(t) = \dfrac{d \theta (t)}{dt} = \dfrac{d}{dt} arctg \dfrac{\widetilde{x}(t)}{x(t)} u(t)=dtdθ(t)=dtdarctgx(t)x (t) 是瞬时相位的导数
备注:F(t) = sin(2πft + φ):f就是频率;2πft + φ 就是相位;对时间的导数就是2πf,频率是相位的变换速度
2.5 python代码
import numpy as np
import pylab as pl
import scipy.signal as signal
import matplotlib.pyplot as plt
from scipy import fftpack
import math
from tftb.processing import inst_freqt = np.arange(0, 0.1, 1/20000.0)
x = 4*t*np.sin(2*np.pi*200*t + 3.0) + 0.1
hx = fftpack.hilbert(x)
e = np.sqrt(x**2 + hx**2)
u1, _ = inst_freq(hx)t = []
for i in range(len(x)):t.append(math.atan(hx[i]/x[i]))u = []
for i in range(len(t)-1):u.append(t[i+1] - t[i])plt.figure(figsize=(10,7))
plt.subplot(3, 1, 1)
plt.plot(x,'r') #hilbert变换
plt.subplot(3, 1, 1)
plt.plot(hx,'g') #hilbert变换
plt.subplot(3, 1, 1)
plt.plot(e,'b') #包络曲线
plt.subplot(3, 1, 2)
plt.plot(t,'r') #瞬时相位
plt.subplot(3, 1, 3)
plt.plot(u,'r') #瞬时频率
plt.show()
备注:这里是按照自己的理解去实现离散Hilbert变换的瞬时相位和频率,但和 inst_freq 似乎不太对???
3. 经验模态分解EMD分解
3.1 EMD分解的基本步骤:
步骤1:
- 找出原始信号 x ( t ) x(t) x(t)局部极大值,用三次B样条构筑上包络曲线
- 找出原始信号 x ( t ) x(t) x(t)局部极小值,用三次B样条构筑下包络曲线
步骤2:
- 计算上包络曲线和下包络曲线的均值 m 1 m_1 m1
- 计算原始曲线与包络均值的差: h 1 = x ( t ) − m 1 h_1 = x(t) - m_1 h1=x(t)−m1
步骤3:
- 判断 h 1 h_1 h1是否满足IMF条件
备注:IMF条件需要满足两点:
2.1 经过分解得到的时间序列,其极值点数量与过0点数量相差不超过1个
2.2 经过插值方式拟合的极值包络线在分析时间序列内的均值为0
- 如果不满足IMF条件,这重复步骤1、步骤2,使得k步迭代后的 h 1 , k ( t ) h_{1,k}(t) h1,k(t)作为第一个IMF分量 c 1 ( t ) = h 1 , k ( t ) c_1(t)=h_{1,k}(t) c1(t)=h1,k(t)
步骤4:
- 计算剩余信号 r 1 ( t ) = x ( t ) − c 1 ( t ) r_1(t) = x(t) - c_1(t) r1(t)=x(t)−c1(t)
步骤5:
- 针对剩余信号 r ( t ) r_(t) r(t)重复步骤1~3,求得其余的IMF分量 r ( t ) … r N ( t ) r_(t) \dots r_{N}(t) r(t)…rN(t)
- 最终原始信号被分解为IMF分量和剩余信号的和,即 x ( t ) = ∑ n = 1 N c n ( t ) + r N ( t ) x(t) = \sum_{n=1}^N c_n(t) + r_N(t) x(t)=∑n=1Ncn(t)+rN(t)
备注:在其他资料中,步骤3的k步迭代是否满足IMF条件,采用公式:
要求SD的值在0.2~0.3之间
3.2 python代码
import pyhht
from pyhht.visualization import plot_imfst = np.arange(0, 0.1, 1/20000.0)
x = 4*t*np.sin(2*np.pi*200*t + 3.0) + 0.1
decomposer = pyhht.emd.EMD(x)
imfs = decomposer.decompose()
plot_imfs(x, imfs)
【语音信号处理五】希尔伯特黄变换相关推荐
- 信号处理:希尔伯特黄变换
目录: 目录: 前言 简介 基本原理 经验模态分解 希尔伯特变换 特点 (1)HHT能分析非线性非平稳信号. (2)HHT具有完全自适应性. (3)HHT不受Heisenberg测不准原理制约--适合 ...
- 经验模式分解(EMD)及希尔伯特-黄变换(HHT)简介及matlab实现
本文介绍过程涉及到两个链接工具包,可以自己网上搜索下载,以下提供了网盘下载的地址,因为作者主要做语音方面工作,所以后面的说明主要以说话人识别为例.(链接:https://pan.baidu.com/s ...
- 【信号处理】Matlab实现希尔伯特-黄变换
1 内容介绍 1998年,Norden E. Huang(黄锷:中国台湾海洋学家)等人提出了经验模态分解方法,并引入了Hilbert谱的概念和Hilbert谱分析的方法,美国国家航空和宇航局(NASA ...
- 希尔伯特-黄变换(HHT)的前世今生——一个从瞬时频率讲起的故事
一.来自小X的疑问 从前有一个国家,叫做实国(一维国度),里边有个叫小X的小人儿. 小X是一根线段,他每天最爱做的事情就是跳舞. 因为小X的舞姿十分稳定,同伴们都说他的头部跳出了频率为1hz的正弦曲线 ...
- 量化择时:基于经验模态分解的希尔伯特-黄变换(二)算法
量化择时:基于经验模态分解的希尔伯特-黄变换 part2部分是算法的介绍,抛开代码部分,其实就是所有人都能看得懂字面解释 Part2算法 在了解了基础的数理知识和学习了将实信号转换为复信号的处理方法之 ...
- 量化择时:基于经验模态分解的希尔伯特-黄变换(一)数理
量化择时:基于经验模态分解的希尔伯特-黄变换 这部分内容打算分成四个部分,分别是数理.算法.实操和机器学习部分,做完一个part就发一个part. Part1数理 将时间序列的股价日指数转换为信号形式 ...
- 声音信号希尔伯特黄变换
要求:把去噪后的信号(已有)希尔伯特黄变换得到 经验模态分解的结果 瞬时频率图 希尔伯特谱 clear all close all [y,Fs]=audioread('output.wav'); x ...
- MATLAB希尔伯特黄变换HHT
这两天在学习希尔伯特黄变换,也就是HHT,趁着学习的劲赶紧整理整理,用的是MATLAB进行编程,所用到的工具箱便是EMD工具箱,链接如下,请自行下载. 希尔伯特黄变换HHT_HHT-电信代码类资源-C ...
- 希尔伯特黄变换(Hilbert-Huang)原理、HHT求时频谱、边际谱,及MATLAB(2018rb)实现
目录 1. 经验模态分解: 2. 希尔伯特变换: 3. 方法缺陷: 4. MATLAB(2018rb版本)实现和探讨 ##边际谱 [若觉文章质量良好且有用,请别忘了点赞收藏加关注,这将是我继续分享的动 ...
- 希尔伯特黄变换python实现
希尔伯特变换可以从: https://zhuanlan.zhihu.com/p/128092836 https://www.cnblogs.com/hdu-zsk/p/4799470.html 等博客 ...
最新文章
- php protected 的继承,14 PHP 类的继承 [public protected private] parent 构造方法 析构方法 重写 最终类和方法 设计模式...
- 算法笔记--数列分块
- 企业组织机构代码验证JavaScript版和Java版 - 修正版V20090214
- 怎么通过java去调用并执行shell脚本以及问题总结
- Java高并发编程详解系列-线程池原理自定义线程池
- GIS概念的总结(一)什么是GIS
- python queue函数_Python模块:queue
- Drupal开发时如何使用远端图片减轻工作量
- 软件的接口设计图_软件工程中的分析、设计与实例
- 公交车座位的坐垫设计成可替换,冬夏两用
- 辅助功能性代码,研究和记录代码。
- 字符串常量池(StringTable)总结
- ISO 28000供应链安全管理简述及标准
- linux安装taskctl乱码,TASKCTL常见问题和解决方法(FAQ)
- 文本挖掘系列之文本信息抽取
- 班得瑞[Bandari]音乐介绍
- Matplotlib自定义图例(多张独立图共享图例)
- 【测验6 编程题】: 组合数据类型 (第6周)
- 音乐、音效素材库,好听的BGM都在这~
- php百度大脑,百度大脑和图灵机器人制作一个简单的自动聊天机器人【PHP代码】...
热门文章
- 【Java 数据结构 算法】宁可累死自己, 也要卷死别人 5 栈
- 垃圾回收算法(新生代——复制,老年代——标记清除)
- 学生喜欢在计算机教室上课翻译成英语,远程教室,long-distance classroom,音标,读音,翻译,英文例句,英语词典...
- 前端导出Excel实践指南
- 用html制作3d旋转正方形相册
- Docker - 使用可视化工具管理docker
- 期货交易所行业2019Q2研究报告 | TokenInsight
- AGL UCB 14 平台发布增加 Flutter 更新;在 Automotive Linux 峰会和 CES 上提供演示
- 怎么在服务器把项目复制在本地,本地项目怎么复制到云服务器上
- 2024华为校招面试真题汇总及其解答(一)