我们来讲一下Python实现希尔伯特变换的示例代码攻略。
什么是希尔伯特变换
希尔伯特变换是一种非常常用且重要的信号处理方法,它可以将实数信号转换成复数信号。复数信号可以用于计算信号的频谱,而实数信号则不行。希尔伯特变换可以被用于多种领域,如音频处理、通信等。
如何实现希尔伯特变换
Python实现希尔伯特变换可以通过以下几步来实现:
1、加载需要的库和数据
要实现该变换,首先需要导入Python所需的库 -- numpy
和 scipy
。同时生成一个实数信号 x
用于后续处理。
import numpy as np
import scipy.signal as sig
# Create an example signal, containing a 5Hz sine wave and 100Hz noise.
fs = 1000 # Sample rate
duration = 1 # seconds
samples = int(fs*duration)
t = np.arange(samples) / fs
noise = 0.5 * np.random.randn(samples)
x = np.sin(2*np.pi*5*t) + noise
2、使用hilbert
函数做希尔伯特变换
接下来我们需要调用hilbert
函数,该函数可以将实数信号转换成复数信号。然后可以通过复数信号计算希尔伯特变换。
# Apply Hilbert transform
analytic_signal = sig.hilbert(x)
amplitude_envelope = np.abs(analytic_signal)
3、示例说明一
下面我们来看一个示例,展示如何对信号计算希尔伯特变换后的频域能量。
# Plot the results
import matplotlib.pyplot as plt
# Compute the frequency response of the Hilbert filter.
hilbert_tf = np.imag(sig.hilbert(np.identity(samples)))
hilbert_f = np.fft.fftfreq(samples) * fs
hilbert_H = np.abs(np.fft.fft(hilbert_tf))
# Filter the signal with a low-pass filter to show the envelope
lpf = np.ones(samples)
lpf[int(samples/2):] = 0
signal_lpf = np.fft.ifft(np.fft.fft(lpf) * np.fft.fft(x))
analytic_signal_lpf = sig.hilbert(signal_lpf)
amplitude_envelope_lpf = np.abs(analytic_signal_lpf)
plt.figure(1, figsize=(14, 8))
plt.plot(t, x, label='signal')
plt.plot(t, amplitude_envelope, label='envelope')
plt.plot(t, amplitude_envelope_lpf, label='envelope (LPF)')
plt.legend()
plt.grid()
plt.figure(2, figsize=(14, 8))
plt.plot(hilbert_f[:samples//2], hilbert_H[:samples//2])
plt.xlabel('Frequency [Hz]')
plt.ylabel('Magnitude')
plt.title('Hilbert transform frequency response')
plt.grid()
plt.show()
上面的示例中,首先使用hilbert
函数计算实数信号的希尔伯特变换,然后计算了信号在不同频率下的能量。
4、示例说明二
下面我们再来看一个示例,展示如何将一个实数信号转化为复数信号,以便计算信号的频谱。
import matplotlib.pyplot as plt
# Generate an example signal
fs = 1000
samples = int(1.0 * fs)
t = np.linspace(0, 1, samples)
x = np.sin(2*np.pi*50*t) + 0.1*np.sin(2*np.pi*100*t)
# Apply Hilbert transform
analytic_signal = sig.hilbert(x)
# Plot the results
plt.figure(figsize=(12,5))
plt.subplot(1,2,1)
plt.plot(t, x)
plt.plot(t, np.imag(analytic_signal))
plt.ylabel('Amplitude')
plt.xlabel('Time (s)')
plt.title('Signal and Hilbert transform')
plt.subplot(1,2,2)
plt.magnitude_spectrum(analytic_signal, Fs=fs)
plt.xlim([0, 200])
plt.ylabel('Magnitude')
plt.title('Frequency response')
plt.tight_layout()
plt.show()
上面的示例中,我们生成了一个信号,然后使用hilbert
函数计算出了信号的希尔伯特变换,最后画出来信号在频域中的响应。
参考代码来自于 Scipy Cookbook。
这就是Python实现希尔伯特变换的示例代码攻略,希望对你有所帮助。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python实现希尔伯特变换(Hilbert transform)的示例代码 - Python技术站