为什么我的线性调频频谱图频率加倍

Why am i getting doubled frequency for chirp spectrogram

我写了这段代码来生成线性 fmcw 线性调频:

def generate_fmcw(BW, Tc, Fs, initial_phase=0, num_chirps=2, delay=0):
        t = np.arange(0, Tc-1/Fs, 1 / Fs)
        nsamples = len(t)
        w = 2 * pi * np.linspace(0, BW, nsamples)
        return np.tile(np.cos(w * (t-delay) + initial_phase), num_chirps)

使用时:

BW = 1e6
Tc = 2e-3
Fs = 2e6
num_chirps = 1

和这个使用 scipypyplot:

的声谱图函数
import matplotlib.pyplot as plt
from scipy import signal

def display_spectrogram(s,fs):
    f, t, Sxx = signal.spectrogram(s, fs,mode='magnitude')
    plt.pcolormesh(t, f, Sxx)
    plt.ylabel('Frequency [Hz]')
    plt.xlabel('Time [sec]')
    plt.show()

我有一些欠采样行为:

a = generate_fmcw(BW, Tc,Fs,num_chirps=1)
display_spectrogram(a,Fs)

undersampled fmcw chirp

但是当我使用 :

Fs = 4e6

我得到了我想要的两倍最大频率(即 BW): double frequency

为什么我会出现这种奇怪的行为?根据奈奎斯特定理,我正在使用正确的采样频率...

要创建线性调频等时变频率,cos 的参数必须是时变频率的积分。另一种说法是:对于函数 θ(t),cos(θ(t)) 的瞬时频率是 θ'(t)(θ(t) 的导数)。您的表达式基本上等同于 c*(t-d)**2 + i,其导数是 2*c*t - c*d,因此频率加倍。解决方案是调整cos的自变量,使表达式的导数为所需的时变频率。

此外,您可能对 scipy.signal.chirp 感兴趣。