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)}=π1?∫?∞∞?t?τx(τ)?dτ
該積分是Cauchy主值積分,在頻域中可等效為對原信號的傅里葉變換乘以因子 ?j?sgn(f)-j\cdot\text{sgn}(f)?j?sgn(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)=?j?sgn(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πfm?t));
- 瞬時頻率接近理論值(載波頻率 + 調制頻率的影響),驗證了Hilbert變換在非平穩信號分析中的有效性。
- 其結果如下圖:
四、結論
Hilbert變換通過構造解析信號,將實值信號擴展到復數域,從而實現了對信號瞬時屬性的提取。其數學原理基于頻域相位移動,物理意義是抑制負頻率分量并保留正頻率分量。通過仿真實驗可見,Hilbert變換在正弦信號分析中表現為相位平移,在調幅信號中則能精準提取包絡和瞬時頻率,是信號處理中不可或缺的工具。
附注:以上代碼使用 scipy.signal.hilbert
直接計算解析信號,其內部通過快速傅里葉變換(FFT)實現,避免了直接計算Cauchy主值積分的復雜性。
研究學習不易,點贊易。
工作生活不易,收藏易,點收藏不迷茫 :)