推导在这里——您可以为一些样本数或采样率选择任何tmin
、、tmax
和fmin
。fmax
N
我们将代码调整到最后一行以重新缩放phi
以结束为的整数倍2π产生零相位;这具有轻推的效果,fmin
并且fmax
略微或很大程度上取决于所有其他参数 - 请参见此处。
仅强制啁啾结束为零相位的替代变体将通过减法精确保留fmin
和fmax
。强制所有,零相位在tmin
和tmax
不改变fmin
并且fmax
是不可能的。
使用余弦和正弦获取参数:
代码
import numpy as np
import matplotlib.pyplot as plt
def _lchirp(N, tmin=0, tmax=1, fmin=0, fmax=None):
fmax = fmax if fmax is not None else N / 2
t = np.linspace(tmin, tmax, N, endpoint=True)
a = (fmin - fmax) / (tmin - tmax)
b = (fmin*tmax - fmax*tmin) / (tmax - tmin)
phi = (a/2)*(t**2 - tmin**2) + b*(t - tmin)
phi *= (2*np.pi)
return phi
def lchirp(N, tmin=0, tmax=1, fmin=0, fmax=None, zero_phase_tmin=True, cos=True):
phi = _lchirp(N, tmin, tmax, fmin, fmax)
if zero_phase_tmin:
phi *= ( (phi[-1] - phi[-1] % (2*np.pi)) / phi[-1] )
else:
phi -= (phi[-1] % (2*np.pi))
fn = np.cos if cos else np.sin
return fn(phi)
#%%######################################################################
f0 = 7000
f1 = 17000
samplerate = 192000
T = .0013
N = int(samplerate * T)
tmin = 0
tmax = T
t = np.linspace(tmin, tmax, N, endpoint=True)
for zero_phase_min in (True, False):
for cos in (True, False):
x = lchirp(N=int(samplerate * T), tmin=tmin, tmax=tmax, fmin=f0, fmax=f1,
zero_phase_tmin=zero_phase_min, cos=cos)
plt.plot(t, x)
plt.title("cos={}, zero_phase_tmin={}".format(cos, zero_phase_min),
weight='bold', fontsize=17, loc='left')
plt.show()