Python计算脉冲的上边带谱

2024-04-19 18:01:21 发布

您现在位置:Python中文网/ 问答频道 /正文

我寻求一种数值方法来计算时变信号V(t)的边带谱,使用:

Spectrum of the phase of a pulse

Phi definition

我试着先用希尔伯特变换得到上边带 Single side band definition

import numpy as np
import matplotlib.pyplot as plt
from scipy.signal import hilbert, chirp
def ltrain(x, c, amp, gamma):
    """ Return lorentzian pulse train at x0 with HWHM sigma """    
    fittrain = np.array(np.ones(len(x))*+c)   
    for li in range(1,500,1):
        fittrain += np.array(amp/(1+ (np.power(((x-((li-200)*1/6))/(0.5*gamma)),2))))
    fitmin = np.min(fittrain)
    return fittrain-fitmin
popt = [-0.6131588,   1.40610615,  0.07610384]

duration = 1.0
fs = 10000.0
samples = int(fs*duration)
t = np.arange(samples) / fs

fitfn = ltrain(t, popt[0],popt[1], popt[2])
signal = fitfn
#signal = np.cos(24*t)
analytic_signal = hilbert(signal)
amplitude_envelope = np.abs(analytic_signal)
instantaneous_phase = np.unwrap(np.angle(analytic_signal))
instantaneous_frequency = (np.diff(instantaneous_phase) / (2.0*np.pi) * fs)
fig = plt.figure()
ax0 = fig.add_subplot(111)
ax0.plot(t, analytic_signal, label='Analytical signal')
hilbert_trafo = np.imag(analytic_signal)
ax0.plot(t, hilbert_trafo, label='Hilbert Transform')
#ax0.plot(t, np.real(analytic_signal), label='Original Signal')
ax0.plot(t, (signal)/(hilbert_trafo), label='x(t)/x_H (t)')
ax0.set_ylim([-2,2])
#ax0.plot(t, instantaneous_phase, label='Instantanous Phase')
#ax0.plot(t, amplitude_envelope, label='Envelope')
ax0.set_xlabel("Time")
ax0.legend()
plt.tight_layout()

我想使用python函数(如hilbert变换的FFT)或通过直接数值求解二重积分来获得任意周期脉冲的边带谱(在本例中,f>;0为指数衰减,否则我定义的脉冲为0)。 其结果应该是这样的绘图或曲线(左绘图时间,右绘图频率分量在第一exp(-i phi(t))公式的频谱上定义): Upper sideband of a Lorentzian pulse


Tags: importsignalplotnppltfslabelanalytic