希尔伯特变换简单理解:对实数信号进行数学变换得到一个新的实数信号
变换目标:输出信号是输入信号90°相移后的版本
在时域实现信号90°相移,根据傅里叶变换时移特性可以得到频域响应,希尔伯特变换在频域定义如下:
希尔伯特变换器的作用:
将输入信号经过希尔伯特变换器后得到输出信号,输入信号作为实部,输出信号作为虚部合成解析信号,对解析信号做Fourier变换,可以消除负频率部分,使用python仿真如下:
import numpy as np
import matplotlib.pyplot as plt
from scipy.fftpack import fft
n = np.arange(-6.28,6.29,0.1)
income_signal_sin = np.sin(2*np.pi*n)
Hilbert_signal = np.sin(2*np.pi*n + np.pi/2)
analytic_signal = income_signal_sin +1j * Hilbert_signal
analytic_signal_FFT = fft(analytic_signal)
income_signal_FFT = fft(income_signal_sin)
plt.subplot(211)
plt.plot(n,abs(income_signal_FFT)*2/len(n))
plt.xlabel('output bins')
plt.ylabel('abs(signal)')
plt.title('income signal FFT')
plt.grid(which='both', axis='both')
plt.subplot(212)
plt.plot(n,abs(analytic_signal_FFT)*2/len(n))
plt.xlabel('output bins')
plt.ylabel('abs(signal)')
plt.title('analytic signal FFT')
plt.grid(which='both', axis='both')
plt.tight_layout()
plt.show()
对上式做Fourier逆变换,可以得到时域的系统函数:
h(t) = [1 - cos(πt/T)] (T为采样周期)
因为在计算机中只能有离散形式,所以上式在仿真中不具备可实现性,现在 ,令t = n*T,(T为采样周期;n为整数),可以得到希尔伯特变换在时域的离散形式:
h(n) = 2*sin(πn/2)*sin(πn/2)/πn (T归一化处理)
由于在硬件上实现,只能有限个样值,采用窗函数截断,由于吉布斯效应,可以看到在频域出现抖动。`
使用python仿真如下:
def Hilbert(fs = 1, N = 60):
t = np.arange(-N/2, N/2 + 1, 0.01)
ht = (1 - np.cos(fs * np.pi * t)) / (np.pi * t)
n = np.arange(-N/2, N/2 + 1,1)
h = (fs *(1 - np.cos(np.pi*n)))/(np.pi * n)
h[30] = 0
Xk = fft(h,128)
plt.subplot(311)
plt.scatter(n/fs,h)
plt.plot(t,ht)
plt.grid(which='both', axis='both')
plt.xlabel('n')
plt.title('Hilbert')
plt.subplot(312)
plt.plot(np.arange(0,len(Xk),1),abs(Xk))
plt.xlabel('output bins')
plt.ylabel('abs(Xk)')
plt.grid(which='both', axis='both')
plt.subplot(313)
plt.plot(np.arange(0,len(Xk),1),np.unwrap(np.angle(Xk)))
plt.xlabel('output bins')
plt.ylabel('angle')
plt.grid(which='both', axis='both')
plt.tight_layout()
return 0
def main():
Hilbert()
plt.show()
if __name__ == '__main__':
main()