阶段 0 啁啾结束

信息处理 Python 唧唧喳喳
2022-02-01 12:15:17

我希望啁啾在零阶段结束。啁啾时间或结束频率可能略有不同。

现在我正在检查 maplot 输出。我在声卡的输出端观察到同样的事情。

在这个解决方案中,啁啾并不总是在零相位结束。

帮助找到解决方案。

谢谢您的帮助。安德鲁

from pylab import *
import numpy as np
from scipy.signal import chirp

f0 = 7000
f1 = 17000
samplerate = 192000
T = 0.0013
T = np.ceil(T*f1)/f1 # new T
t = np.arange(0, int(T*samplerate)) / samplerate
w = chirp(t, f0=f0, f1=f1, t1=T,phi=270, method='linear')
   
fig, ax = subplots(figsize=(6,1))
ax.set_title("Chirp ")
ax.plot(w) 
show() 
2个回答

推导在这里——您可以为一些样本数或采样率选择任何tmin、、tmaxfminfmaxN

我们将代码调整到最后一行以重新缩放phi以结束为的整数倍2π产生零相位;这具有轻推的效果,fmin并且fmax略微或很大程度上取决于所有其他参数 - 请参见此处

仅强制啁啾结束为零相位的替代变体将通过减法精确保留fminfmax强制所有,零相位在tmintmax不改变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()

对于线性啁啾,您可以通过稍微“轻推”较高频率来做到这一点。我不认为 Python 中的构建函数支持,所以你必须自己手动完成。

假设我们有一个带有 N 个样本的啁啾和归一化的开始和结束频率ω0ω0

那么频率作为时间的函数是

ω[n]=ω0+(ω1ω0)nN

为了得到我们需要整合的阶段

ϕ[n]=k=0nω[k]=ω0n+(ω1ω0)n22N

为了获得无缝的啁啾声,您希望相位为n=N是的整数倍2π. 我们得到

ϕ[N]=N2(ω1+ω0)

所以你需要找到最接近的整数倍2π然后重新计算上限频率。

ϕclean=2πround(ϕ[N]2π)

ωclean=2ϕcleanNω0

你的扫荡终于变成了

x[n]=sin(ω0n+(ωcleanω0)n22N)