如何基于频率与时间数组绘制FMCW雷达的锯齿线性调频波形?
生成GNU Radio兼容的锯齿波线性调频信号
之前用正弦波生成信号时,高频分量表现不够清晰,现在打算改用锯齿波。由于要在GNU Radio中制作自定义模块,无法使用scipy.signal.sawtooth或signal.chirp这类第三方库函数,只能基于基础库实现。
以下是我之前用于生成正弦线性调频信号的代码(仅在f0、f1为低频值时正常运行):
import numpy as np import matplotlib.pyplot as plt from math import pi chirp_duration = 60e-6 f0 = 1e6 f1 = 3e6 no_samp = 1001 rcs = 0.0377 f_step = (f1-f0)/no_samp rf_axis = np.linspace(f0, f1, int(f_step)) rt_axis = np.linspace(0, chirp_duration, int(f_step)) # rchirp = np.cos(2 * np.pi * rf_axis * rt_axis) plt.figure(figsize=(12, 3)) plt.xlabel("Time") plt.ylabel("Frequency") plt.title('Received Chirp') plt.plot(rt_axis, rf_axis) plt.show()
锯齿波线性调频信号实现方案
要生成符合需求的锯齿波信号,核心是构造随时间线性增长的相位,再对2π取模得到周期性跳变的相位,最后通过余弦函数转换为时域信号。这种实现仅依赖NumPy,完全适配GNU Radio环境:
import numpy as np import matplotlib.pyplot as plt from math import pi # 参数配置 chirp_duration = 60e-6 # 调频持续时间 f0 = 1e6 # 起始频率 f1 = 3e6 # 终止频率 no_samp = 1001 # 采样点数 rcs = 0.0377 # 雷达截面积(当前示例未使用) # 生成均匀采样的时间轴 rt_axis = np.linspace(0, chirp_duration, no_samp) # 计算扫频斜率:频率随时间的变化率 freq_slope = (f1 - f0) / chirp_duration # 构造线性增长的相位,对2π取模实现锯齿波相位特性 # 相位公式:φ(t) = 2π*(f0*t + 0.5*slope*t²),取模后相位在[0,2π)周期跳变 total_phase = 2 * pi * (f0 * rt_axis + 0.5 * freq_slope * rt_axis**2) sawtooth_phase = np.mod(total_phase, 2 * pi) # 生成锯齿波线性调频信号 sawtooth_chirp = np.cos(sawtooth_phase) # 绘制瞬时频率曲线(验证扫频线性度) instant_freq = f0 + freq_slope * rt_axis plt.figure(figsize=(12, 3)) plt.xlabel("时间 (s)") plt.ylabel("频率 (Hz)") plt.title("锯齿波线性调频信号瞬时频率") plt.plot(rt_axis, instant_freq) plt.show() # 绘制时域波形 plt.figure(figsize=(12, 3)) plt.xlabel("时间 (s)") plt.ylabel("幅度") plt.title("锯齿波线性调频信号时域波形") plt.plot(rt_axis, sawtooth_chirp) plt.show()
关键说明
- 时间轴修正:原代码中通过
f_step计算采样点数的逻辑存在错误((f1-f0)/no_samp数值过小,会导致采样点数异常),改为直接用no_samp生成均匀时间轴,保证采样点数准确。 - 相位取模:对线性增长的相位取
2π模,模拟锯齿波的周期性相位跳变,让信号高频分量更突出,解决原正弦波的问题。 - 环境兼容性:全程仅使用NumPy和基础数学库,无第三方依赖,可直接移植到GNU Radio自定义模块中。
内容的提问来源于stack exchange,提问作者Raj Patil
相关产品推荐
相关产品推荐

