希尔伯特变换-matlab仿真

2023-11-25 18:30

本文主要是介绍希尔伯特变换-matlab仿真,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

希尔伯特变换(hilbert transform)简介

在信号处理中我们常见的有傅里叶变换,用来分析频域信息,还有拉普拉斯变换和z变换,用于系统分析系统响应。短时傅里叶分析和小波分析用于时频分析。希尔伯特变换似乎听到的比较少。我因为最近在做信号幅度提取的时候看到可以用希尔伯特变换来提取包络,所以才了解到了希尔伯特变换,网上的资料很多,对它的介绍也很多,我对它的了解有限,只是知道它可以做IQ调制,也可以提取信号分包络。我觉得作为工科生,就应该本着实用主义的原则,很多公式和定理的证明是数学家的事情,我们只需要懂怎么用,把这些已有的信号处理的工具用好就行了。写这篇博客主要是为了总结、归纳和记录,如果能够恰好帮助到需要的朋友,那就更好了。
严谨一点,还是先给出公式吧。希尔伯特的数学定义如下:
设有一个实值函数 x ( t ) x(t) x(t),其希尔伯特变换记作 X ( t ) X(t) X(t)
X ( t ) = H [ x ( t ) ] = 1 π ∫ − ∞ ∞ x ( τ ) t − τ d τ X(t)=H[x(t)]=\frac{1}{\pi}\int_{-\infty}^{\infty}\frac{x(\tau)}{t-\tau}d\tau X(t)=H[x(t)]=π1tτx(τ)dτ
通过上面的式子可以看出来,其实希尔伯特变换就是对信号做了一下卷积,这个被卷积的信号的单位脉冲响应为:
h ( t ) = 1 π t h(t)=\frac{1}{\pi t} h(t)=πt1
我们都知道,时域做卷积,相当于对信号进行滤波,而这个滤波器的响应函数就是上面的 h ( t ) h(t) h(t)
我们对 h ( t ) h(t) h(t)做傅里叶变换,可以得到:
H ( j ω ) = − j s g n ( ω ) H(j\omega)=-jsgn(\omega) H()=jsgn(ω)
s g n ( ⋅ ) sgn(\cdot) sgn()函数是符号函数,也就是说这个滤波器对原始信号的正频率部分进行了 − π / 2 -\pi/2 π/2的相移,而对负频率部分进行了 π / 2 \pi/2 π/2的相移。
希尔伯特变换的本质就是进行了一种特殊的卷积。

matlab希尔伯特变换函数

在matlab中,实现希尔伯特变换也是非常的简单,只需要一行代码y=hilbert(x),我们要搞懂它的输入输出是什么,首先要知道它的输入信号必须得是实数类型的,希尔伯特变换的实部和虚部仅仅是相位差 π / 2 \pi/2 π/2,希尔伯特变换的幅度即为信号的包络,对于正弦波而言那就是一条直线,下面是一个简单的仿真:

%% 希尔伯特变换仿真
% 主要内容:点频信号生成、希尔伯特变换
% Author: huasir 2023.11.25
fs = 20e3; % 采样频率;
dt = 1/fs; %采样时间间隔
fc = 1e3; %频率
T = 10e-3;
t = 0:dt:T-dt;
x = cos(2*pi*fc*t); %生成正弦波信号
X = hilbert(x); %对x进行希尔伯特变换
%% 分别绘制正弦信号、希尔伯特变换的实部、虚部、幅度
figure;
subplot(3,1,1);
plot(t,x,t,imag(X));
legend('x','imag(X)');
xlabel('t/s');
title('原始信号和希尔伯特变换的虚部')
subplot(3,1,2);
plot(t,real(X));
legend('real(X)');
xlabel('t/s');
title('希尔伯特变换的实部')
subplot(3,1,3);
plot(t,x,t,abs(X));
legend('abs(X)');
xlabel('t/s');
title('原始信号和希尔伯特变换的幅度')

绘制出的图像如下:
希尔伯特变换的结果

图1 希尔伯特变换结果

由上图也验证了希尔伯特变换的效果,它的幅度就是信号的包络,我们可以通过这个方法进行包络提取;

下面是一个调幅信号采用希尔伯特变换进行包络提取的例子

%% 希尔伯特变换仿真
% 主要内容:调幅生成、希尔伯特变换
% Author: huasir 2023.11.25@BeiJing
fs = 100e3; % 采样频率;
dt = 1/fs; %采样时间间隔
fc = 10e3; %载波频率
f = 100; %调制信号
T = 10e-3;
t = 0:dt:T-dt;
x = cos(2*pi*fc*t).*cos(2*pi*f*t); %生成正弦波信号
X = hilbert(x); %对x进行希尔伯特变换
%% 分别绘制正弦信号、希尔伯特变换的实部、虚部、幅度
figure;
subplot(2,1,1);
plot(t,x,t,imag(X));
legend('x','imag(X)');
xlabel('t/s');
title('原始信号和希尔伯特变换的虚部')
subplot(2,1,2);
plot(t,real(X));
legend('real(X)');
xlabel('t/s');
title('希尔伯特变换的实部')
figure;
plot(t,x,t,[1;-1]*abs(X));
legend('x','abs(X)');
xlabel('t/s');
title('原始信号和包络')

输出图像入下:
在这里插入图片描述

图2 调幅信号希尔伯特变换的实部和虚部

在这里插入图片描述

图3 调幅信号采用希尔伯特变换的包络提取

这篇关于希尔伯特变换-matlab仿真的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/424334

相关文章

C++变换迭代器使用方法小结

《C++变换迭代器使用方法小结》本文主要介绍了C++变换迭代器使用方法小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录1、源码2、代码解析代码解析:transform_iterator1. transform_iterat

基于UE5和ROS2的激光雷达+深度RGBD相机小车的仿真指南(五):Blender锥桶建模

前言 本系列教程旨在使用UE5配置一个具备激光雷达+深度摄像机的仿真小车,并使用通过跨平台的方式进行ROS2和UE5仿真的通讯,达到小车自主导航的目的。本教程默认有ROS2导航及其gazebo仿真相关方面基础,Nav2相关的学习教程可以参考本人的其他博客Nav2代价地图实现和原理–Nav2源码解读之CostMap2D(上)-CSDN博客往期教程: 第一期:基于UE5和ROS2的激光雷达+深度RG

matlab读取NC文件(含group)

matlab读取NC文件(含group): NC文件数据结构: 代码: % 打开 NetCDF 文件filename = 'your_file.nc'; % 替换为你的文件名% 使用 netcdf.open 函数打开文件ncid = netcdf.open(filename, 'NC_NOWRITE');% 查看文件中的组% 假设我们想读取名为 "group1" 的组groupName

利用matlab bar函数绘制较为复杂的柱状图,并在图中进行适当标注

示例代码和结果如下:小疑问:如何自动选择合适的坐标位置对柱状图的数值大小进行标注?😂 clear; close all;x = 1:3;aa=[28.6321521955954 26.2453660695847 21.69102348512086.93747104431360 6.25442246899816 3.342835958564245.51365061796319 4.87

C# double[] 和Matlab数组MWArray[]转换

C# double[] 转换成MWArray[], 直接赋值就行             MWNumericArray[] ma = new MWNumericArray[4];             double[] dT = new double[] { 0 };             double[] dT1 = new double[] { 0,2 };

Verybot之OpenCV应用二:霍夫变换查找圆

其实我是想通过这个程序来测试一下,OpenCV在Verybot上跑得怎么样,霍夫变换的原理就不多说了,下面是程序: #include "cv.h"#include "highgui.h"#include "stdio.h"int main(int argc, char** argv){cvNamedWindow("vedio",0);CvCapture* capture;i

perl的学习记录——仿真regression

1 记录的背景 之前只知道有这个强大语言的存在,但一直侥幸自己应该不会用到它,所以一直没有开始学习。然而人生这么长,怎就确定自己不会用到呢? 这次要搭建一个可以自动跑完所有case并且打印每个case的pass信息到指定的文件中。从而减轻手动跑仿真,手动查看log信息的重复无效低质量的操作。下面简单记录下自己的思路并贴出自己的代码,方便自己以后使用和修正。 2 思路整理 作为一个IC d

文章解读与仿真程序复现思路——电力自动化设备EI\CSCD\北大核心《考虑燃料电池和电解槽虚拟惯量支撑的电力系统优化调度方法》

本专栏栏目提供文章与程序复现思路,具体已有的论文与论文源程序可翻阅本博主免费的专栏栏目《论文与完整程序》 论文与完整源程序_电网论文源程序的博客-CSDN博客https://blog.csdn.net/liang674027206/category_12531414.html 电网论文源程序-CSDN博客电网论文源程序擅长文章解读,论文与完整源程序,等方面的知识,电网论文源程序关注python

libsvm在matlab中的使用方法

原文地址:libsvm在matlab中的使用方法 作者: lwenqu_8lbsk 前段时间,gyp326曾在论坛里问libsvm如何在matlab中使用,我还奇怪,认为libsvm是C的程序,应该不能。没想到今天又有人问道,难道matlab真的能运行libsvm。我到官方网站看了下,原来,真的提供了matlab的使用接口。 接口下载在: http://www.csie.ntu.edu.

Matlab/Simulink中PMSM模型的反电动势系数和转矩系数

Matlab/Simulink中PMSM模型的反电动势系数和转矩系数_matlab pmsm-CSDN博客