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

[学习] Hilbert变换:从数学原理到物理意义的深度解析与仿真实验(完整实验代码)

Hilbert变换:从数学原理到物理意义的深度解析与仿真实验

文章目录

  • Hilbert变换:从数学原理到物理意义的深度解析与仿真实验
    • 一、数学原理
    • 二、作用与物理意义
      • 1.构造解析信号
      • 2.相位移动特性
      • 3.应用场景
    • 三、仿真实验
      • 实验1:正弦信号的Hilbert变换
      • 实验2:调幅信号的Hilbert变换
    • 四、结论

Hilbert变换是信号处理领域中一项经典而强大的工具,广泛应用于瞬时频率分析、调制解调、相位提取等场景。本文将从数学原理出发,结合物理意义与实际应用,通过Python仿真实验直观展示其作用,并提供完整代码供读者复现。


一、数学原理

Hilbert变换的核心是将一个实值信号 x(t)x(t)x(t) 映射为与其正交的信号 x^(t)\hat{x}(t)x^(t),其数学定义为:
x^(t)=H{x(t)}=1π∫−∞∞x(τ)t−τdτ\hat{x}(t) = \mathcal{H}\{x(t)\} = \frac{1}{\pi} \int_{-\infty}^{\infty} \frac{x(\tau)}{t - \tau} d\tau x^(t)=H{x(t)}=π1tτx(τ)dτ
该积分是Cauchy主值积分,在频域中可等效为对原信号的傅里叶变换乘以因子 −j⋅sgn(f)-j\cdot\text{sgn}(f)jsgn(f)(其中 sgn(f)\text{sgn}(f)sgn(f) 是符号函数,fff 为频率),再通过逆傅里叶变换得到结果:
X^(f)=−j⋅sgn(f)X(f)\hat{X}(f) = -j\cdot\text{sgn}(f)X(f) X^(f)=jsgn(f)X(f)
通过将原信号与其Hilbert变换结果组合,可构造解析信号(Analytic Signal):
z(t)=x(t)+jx^(t)z(t) = x(t) + j\hat{x}(t) z(t)=x(t)+jx^(t)
解析信号的频谱仅包含正频率分量(负频率分量被抑制),这一特性使其成为分析非平稳信号(如调制信号)的关键工具。


二、作用与物理意义

1.构造解析信号

解析信号 z(t)z(t)z(t) 的实部是原信号 x(t)x(t)x(t),虚部是其Hilbert变换 x^(t)\hat{x}(t)x^(t)。通过解析信号,可以提取信号的瞬时幅度(Instantaneous Amplitude)和瞬时相位(Instantaneous Phase):

  • 瞬时幅度:A(t)=∣z(t)∣A(t) = |z(t)|A(t)=z(t)
  • 瞬时相位:ϕ(t)=arg⁡(z(t))\phi(t) = \arg(z(t))ϕ(t)=arg(z(t))

2.相位移动特性

Hilbert变换的本质是对信号的所有频率成分进行90度相位移动

  • 正弦信号 sin⁡(ωt)\sin(\omega t)sin(ωt) 变换后为 cos⁡(ωt)\cos(\omega t)cos(ωt)(相位超前90度);
  • 余弦信号 cos⁡(ωt)\cos(\omega t)cos(ωt) 变换后为 −sin⁡(ωt)-\sin(\omega t)sin(ωt)(相位滞后90度)。

3.应用场景

  • 调制信号分析:提取调幅(AM)或调频(FM)信号的包络或瞬时频率;
  • 单边带调制(SSB):通过抑制负频率分量实现高效信号传输;
  • 瞬时频率估计:在非平稳信号(如生物信号、机械振动)中,计算局部频率特性。

三、仿真实验

实验1:正弦信号的Hilbert变换

目标:验证Hilbert变换的相位移动特性,并构造解析信号。

代码

import numpy as np
import matplotlib.pyplot as plt
from scipy.signal import hilbert# 参数设置
fs = 1000            # 采样率
t = np.linspace(0, 1, fs, endpoint=False)  # 时间范围[0,1)s
f = 5                # 正弦信号频率# 生成原始信号(正弦波)
x = np.sin(2 * np.pi * f * t)# 计算Hilbert变换(虚部为解析信号的正交分量)
z = hilbert(x)       # 解析信号
x_hat = np.imag(z)   # Hilbert变换结果# 绘制图形
plt.figure(figsize=(12, 8))# 原始信号与Hilbert变换结果
plt.subplot(3, 1, 1)
plt.plot(t, x, label='$x(t) = \sin(2\pi ft)$')
plt.plot(t, x_hat, label='$\hat{x}(t) = \mathcal{H}\{x(t)\}$')
plt.title('原始信号与Hilbert变换结果')
plt.xlabel('时间 [s]')
plt.ylabel('幅值')
plt.legend()
plt.grid()# 解析信号的实部与虚部
plt.subplot(3, 1, 2)
plt.plot(t, np.real(z), label='实部(原信号)')
plt.plot(t, np.imag(z), label='虚部(正交信号)')
plt.title('解析信号的实部与虚部')
plt.xlabel('时间 [s]')
plt.ylabel('幅值')
plt.legend()
plt.grid()# 解析信号的幅度与相位
plt.subplot(3, 1, 3)
plt.plot(t, np.abs(z), label='瞬时幅度 $A(t)$')
plt.plot(t, np.unwrap(np.angle(z)), label='瞬时相位 $\phi(t)$')
plt.title('解析信号的幅度与相位')
plt.xlabel('时间 [s]')
plt.ylabel('幅值/弧度')
plt.legend()
plt.grid()plt.tight_layout()
plt.show()

结果分析

  • 原始正弦信号的Hilbert变换结果为余弦信号(相位超前90度);
  • 解析信号的幅度恒为1(正弦信号的包络),相位为 2πft2\pi ft2πft,符合理论预期。
  • 其结果如下图:

在这里插入图片描述


实验2:调幅信号的Hilbert变换

目标:分析调幅信号的瞬时幅度与相位,验证包络提取能力。

代码

# 参数设置
f_carrier = 50       # 载波频率
f_mod = 5            # 调制频率
t = np.linspace(0, 1, fs, endpoint=False)# 生成调幅信号(AM)
x = (1 + 0.5 * np.sin(2 * np.pi * f_mod * t)) * np.sin(2 * np.pi * f_carrier * t)# 计算Hilbert变换与解析信号
z = hilbert(x)
x_hat = np.imag(z)
A = np.abs(z)
phi = np.unwrap(np.angle(z))# 绘制图形
plt.figure(figsize=(12, 8))# 原始调幅信号与Hilbert变换结果
plt.subplot(3, 1, 1)
plt.plot(t, x, label='调幅信号')
plt.plot(t, x_hat, label='Hilbert变换结果')
plt.title('调幅信号与Hilbert变换结果')
plt.xlabel('时间 [s]')
plt.ylabel('幅值')
plt.legend()
plt.grid()# 解析信号的瞬时幅度(包络)
plt.subplot(3, 1, 2)
plt.plot(t, A, label='瞬时幅度(包络)')
plt.plot(t, (1 + 0.5 * np.sin(2 * np.pi * f_mod * t)), label='理论包络', linestyle='--')
plt.title('调幅信号的瞬时幅度与理论包络对比')
plt.xlabel('时间 [s]')
plt.ylabel('幅值')
plt.legend()
plt.grid()# 瞬时相位与瞬时频率
instantaneous_frequency = np.diff(phi) / (2 * np.pi * (1/fs))  # 瞬时频率计算
plt.subplot(3, 1, 3)
plt.plot(t[1:], instantaneous_frequency, label='瞬时频率')
plt.plot(t, f_carrier + 0.5 * f_mod * np.cos(2 * np.pi * f_mod * t), label='理论瞬时频率', linestyle='--')
plt.title('调幅信号的瞬时频率与理论值对比')
plt.xlabel('时间 [s]')
plt.ylabel('频率 [Hz]')
plt.legend()
plt.grid()plt.tight_layout()
plt.show()

结果分析

  • Hilbert变换结果(虚部)为调幅信号的正交分量;
  • 瞬时幅度 A(t)A(t)A(t) 完整还原了调幅信号的包络(1+0.5sin⁡(2πfmt)1 + 0.5\sin(2\pi f_m t)1+0.5sin(2πfmt));
  • 瞬时频率接近理论值(载波频率 + 调制频率的影响),验证了Hilbert变换在非平稳信号分析中的有效性。
  • 其结果如下图:

在这里插入图片描述


四、结论

Hilbert变换通过构造解析信号,将实值信号扩展到复数域,从而实现了对信号瞬时属性的提取。其数学原理基于频域相位移动,物理意义是抑制负频率分量并保留正频率分量。通过仿真实验可见,Hilbert变换在正弦信号分析中表现为相位平移,在调幅信号中则能精准提取包络和瞬时频率,是信号处理中不可或缺的工具。

附注:以上代码使用 scipy.signal.hilbert 直接计算解析信号,其内部通过快速傅里叶变换(FFT)实现,避免了直接计算Cauchy主值积分的复杂性。


研究学习不易,点赞易。
工作生活不易,收藏易,点收藏不迷茫 :)


http://www.dtcms.com/a/289543.html

相关文章:

  • 平安车管家|中国平安车管家入职测评16PF瑞文IQ测评答题攻略及真题题库
  • 嵌入式系统内核镜像相关(十七)
  • AI 的广泛应用是否会削弱人的思考能力和创造力?
  • GaussDB select into和insert into的用法
  • 字符串处理
  • MySQL学习----Explain
  • 关于堆的判断
  • 【工具变量】A股上市公司企业合作文化数据集(2007-2023年)
  • 测试中的bug
  • adb常用命令
  • 5.1.4习题精讲
  • RocketMQ核心编程模型
  • Python基础-列表
  • 氛围编码(Vice Coding)的工具选择方式
  • 攻防世界-web习题-unseping-flag获取详解、总结
  • snmp攻击
  • 【CUDA进阶】Tensor Core实战教程(下)
  • 【JS逆向基础】数据库之redis
  • TypeScript环境安装和操作
  • 将 VHD/VHDX 转换为物理磁盘
  • 无 sudo 权限的环境下将 nvcc (CUDA Toolkit) 安装到个人目录 linux
  • 虚拟地址空间
  • rman清理归档
  • 2024年全国青少年信息素养大赛Scratch编程挑战赛 小低组初赛
  • 【JDK内置工具】常用工具和实战指令
  • 贝叶斯分类器的相关理论学习
  • 力扣面试150(34/150)
  • 人脸识别:AI 如何精准 “认人”?
  • Florence2-通用表征完成多种视觉任务的视觉基础模型
  • 最新轻量美化表白墙系统源码v2.0 带后台版 附搭建教程