当前位置: 首页 > news >正文

希尔伯特变换分析及应用

概述

希尔伯特变换是信号处理中一种常用的手段。常常用来作为信号的相位调整手段,但每次变换只能相位偏移90°。且希尔伯特变换只能近似应用于窄带信号。对于任意给定 t t t时刻,通过希尔伯特变换运算后的结果只能存在一个频率值,即只能处理任何时刻为单一频率的信号。对于一个非平稳的数据序列,希尔伯特变换得到的结果很大程度上失真,所以应用希尔伯特变换要特别谨慎。

正文

数学定义是:

设有一个实函数 X ( t ) X(t) X(t),其希尔伯特变换记作 X ^ ( t ) \hat{X}(t) X^(t)(或记作 H [ X ( t ) ] H\left[X(t)\right] H[X(t)]

X ^ ( t ) = H [ X ( t ) ] = 1 π ∫ − ∞ ∞ X ( τ ) t − τ d τ \hat{X}(t)=H\left[X(t)\right]=\frac{1}{\pi}\int_{-\infty}^{\infty}\frac{X(\tau)}{t-\tau}d\tau X^(t)=H[X(t)]=π1tτX(τ)dτ

反变换为:

X ( t ) = H − 1 [ X ^ ( t ) ] = − 1 π ∫ − ∞ ∞ X ^ ( τ ) t − τ d τ X(t)=H^{-1}\left[\hat{X}(t)\right]=-\frac{1}{\pi}\int_{-\infty}^{\infty}\frac{\hat{X}(\tau)}{t-\tau}d\tau X(t)=H1[X^(t)]=π1tτX^(τ)dτ

与卷积的概念相比较,可以发现,上面的Hilbert变换的表达式实际上就是将原始信号和一个信号做卷积的结果。这个用来卷积的信号就是 h ( t ) = 1 π t h(t)=\frac{1}{\pi{t}} h(t)=πt1

所以对 h ( t ) h(t) h(t) F F T FFT FFT可以得到:

H ( j w ) = F { h } ( w ) = − j s g n ( w ) H(jw)=F\{h\}(w)=-jsgn(w) H(jw)=F{h}(w)=jsgn(w)

或者

s g n ( w ) = { 1 , w > 0 0 , w = 0 − 1 , w < 0 } sgn(w)=\left\{\begin{matrix}1,w>0\\0,w=0\\-1,w<0\end{matrix}\right\} sgn(w)= 1,w>00,w=01,w<0

其中 F F F是傅里叶变换, j j j是虚数单位, w w w是频率。

从频域上看, s g n ( w ) sgn(w) sgn(w)即将原始信号的正频率部分乘以 − j -j j,负频率部分乘以 j j j,也就是说,在保持幅度不变的情况下,可以将信号正频率部分相位偏移 − π 2 -\frac{\pi}{2} 2π,负频率相位偏移 π 2 \frac{\pi}{2} 2π

所以希尔伯特转换步骤为:

(1)将原始信号进行傅里叶变换

(2)将转换后的信号分为正频率部分和负频率部分,正频率信号数据**{ 将虚部数据换到实部,将实部数据乘以-1换到虚部},负频率信号数据{将虚部数据乘以-1换到实部,将实部数据换到虚部}**

(3)将交换后的数据进行傅里叶反变换得到最终结果

如下图所示:
在这里插入图片描述

实验结果

本实验基于STM32F429,移植ARM_DSP库,使用实数fft变换函数。

C代码参考:

arm_rfft_fast_init_f32(&S, TEST_LENGTH_SAMPLES);
for(i=0; i<1024; i++)
{
	testInput_f32[i] = sin(2*3.1415926f*50*i/1024);
}
//正变换
ifftFlag = 0; 
arm_rfft_fast_f32(&S, testInput_f32, testOutput_f32, ifftFlag);
for(i=0; i<512; i++)
{
	fft_tmp.real[i] = testOutput_f32[2*i];
	fft_tmp.ima[i] = testOutput_f32[2*i + 1];
}
//hilbert 
for(i=0;i<512;i++)
{
	hilbert_tmp.real[i] = fft_tmp.ima[i];
	hilbert_tmp.ima[i] = -fft_tmp.real[i];
}
for(i=0;i<512;i++)
{
	testInput_f32[2*i] = hilbert_tmp.real[i];
	testInput_f32[2*i + 1] = hilbert_tmp.ima[i];
}
//反变换
ifftFlag = 1;
arm_rfft_fast_f32(&S, testInput_f32, fft_iout, ifftFlag);

由于点数太多,所以仅显示250个点。实验结果如下:
在这里插入图片描述

总结

这样就完成了希尔伯特变换在信号处理上的应用。

相关文章:

  • Redis安装,性能优化
  • 多线程(进阶)
  • 基于affine+sift特征提取的图像配准算法matlab仿真
  • 【DLY-310端子排型电流继电器】
  • STM32:GPIO输入(硬件部分)(内含实验现象+按键介绍+传感器模块介绍+硬件电路)
  • 【XGBoost】第 5 章:XGBoost 揭幕
  • Spring声明式基于注解的缓存(3-精进篇)
  • 怎么入门网络安全,学这两类证书就够了NISP或CISP
  • 探究MYSQL之索引
  • Linux环境搭建与登陆
  • WEB自动化测试(5)—— Cypress-元素交互
  • 图片速览 Deep Clustering for Unsupervised Learning of Visual Features
  • HCIA网络基础9-VRP文件系统管理
  • springboot整合mycat实现读写分离
  • iOS 16 SwiftUI 4.0 列表(List)项分隔线变短的原因及解决
  • el-input获取焦点 input输入框为空时高亮 el-input值非法时
  • HTML-表单
  • iOS 系统授权开发
  • Javascript编码规范
  • SegmentFault 社区上线小程序开发频道,助力小程序开发者生态
  • Synchronized 关键字使用、底层原理、JDK1.6 之后的底层优化以及 和ReenTrantLock 的对比...
  • tensorflow学习笔记3——MNIST应用篇
  • 构造函数(constructor)与原型链(prototype)关系
  • 聚类分析——Kmeans
  • 聊聊flink的BlobWriter
  • 前端路由实现-history
  • 如何胜任知名企业的商业数据分析师?
  • 入口文件开始,分析Vue源码实现
  • MiKTeX could not find the script engine ‘perl.exe‘ which is required to execute ‘latexmk‘.
  • #Z0458. 树的中心2
  • (C++17) std算法之执行策略 execution
  • (Oracle)SQL优化技巧(一):分页查询
  • (翻译)Quartz官方教程——第一课:Quartz入门
  • (转)jdk与jre的区别
  • .L0CK3D来袭:如何保护您的数据免受致命攻击
  • .net web项目 调用webService
  • .net 获取url的方法
  • .net 中viewstate的原理和使用
  • .NetCore实践篇:分布式监控Zipkin持久化之殇
  • .NET正则基础之——正则委托
  • .NET中两种OCR方式对比
  • /proc/vmstat 详解
  • ::前边啥也没有
  • @modelattribute注解用postman测试怎么传参_接口测试之问题挖掘
  • @NestedConfigurationProperty 注解用法
  • [100天算法】-每个元音包含偶数次的最长子字符串(day 53)
  • [bzoj1006]: [HNOI2008]神奇的国度(最大势算法)
  • [CareerCup] 14.5 Object Reflection 对象反射
  • [codeforces] 25E Test || hash
  • [CodeForces-759D]Bacterial Melee
  • [Contiki系列论文之2]WSN的自适应通信架构
  • [docker] Docker的数据卷、数据卷容器,容器互联
  • [JS入门到进阶] 7条关于 async await 的使用口诀,新学 async await?背10遍,以后要考!快收藏
  • [Linux] PXE批量装机
  • [Linux]创建新用户并授予root权限