跳到主要内容

第21章 信号处理算法实现:MATLAB/Python仿真框架搭建、核心算法代码解析

返回课程目录:FMCW激光雷达技术课程(公开版)

一、课程概述

本课程模块聚焦于FMCW(调频连续波)激光雷达信号处理算法的仿真实现。通过搭建MATLAB/Python仿真框架,深入解析从原始中频信号到目标距离、速度信息的完整处理链条。重点涵盖相干探测原理、抗干扰技术以及直接速度测量的算法核心。

【原文此处有示意图,图片内容见源资料对应页面】

二、仿真框架总体架构

一个完整的FMCW激光雷达信号处理仿真框架包含以下核心模块,采用模块化设计便于理解与扩展。

软件架构图

【原文此处有示意图,图片内容见源资料对应页面】

模块名称功能描述关键输出
信号生成生成线性调频连续波(LFM)发射信号,模拟本振信号。Tx信号, LO信号
信道模拟模拟目标反射、延时、多普勒频移、加性噪声与干扰。Rx回波信号
信号处理执行去噪、混频、滤波、FFT、CFAR检测、峰值配对等核心算法。距离、速度、点云
可视化绘制时频域信号、频谱图、距离-速度热图、检测结果。图表与动画

三、核心算法代码解析(Python示例)

以下以Python为例,展示关键算法的实现片段。MATLAB版本思路类似,语法不同。

1. FMCW信号生成

import numpy as np

def generate_fmcw_signal(T, B, fs, fc):
"""
生成FMCW发射信号(线性调频)
参数:
T: chirp持续时间 (秒)
B: 扫频带宽 (Hz)
fs: 采样率 (Hz)
fc: 载波中心频率 (Hz)
返回:
t: 时间向量
tx: 发射信号 (复数形式,便于处理相位)
"""
t = np.arange(0, T, 1/fs) # 时间轴
slope = B / T # 调频斜率
phase = 2 * np.pi * (fc * t + 0.5 * slope * t**2) # 瞬时相位
tx = np.exp(1j * phase) # 复数信号,exp(j*phase)
return t, tx

# 示例调用
T_chirp = 50e-6 # 50微秒
Bandwidth = 300e6 # 300 MHz
Fs = 500e6 # 500 MHz采样率
Fc = 77e9 # 77 GHz (毫米波典型频率)
t, tx_signal = generate_fmcw_signal(T_chirp, Bandwidth, Fs, Fc)

2. 相干混频与中频(IF)信号提取

def coherent_mixing(tx, rx, delay_samples, doppler_freq):
"""
模拟相干混频过程,生成中频信号。
参数:
tx: 发射信号
rx: 接收信号(模拟含延时与多普勒)
delay_samples: 目标延时对应的采样点数
doppler_freq: 多普勒频率 (Hz)
返回:
if_signal: 中频信号
"""
# 模拟回波信号:延时 + 多普勒频移
rx_delayed = np.roll(tx, delay_samples) # 简单延时模拟
# 施加多普勒频移 (相位变化)
t_vector = np.arange(len(tx)) / Fs
doppler_phase = 2 * np.pi * doppler_freq * t_vector
rx_with_doppler = rx_delayed * np.exp(1j * doppler_phase)

# 加入高斯白噪声
noise_power = 0.01 # 噪声功率
noise = np.sqrt(noise_power/2) * (np.random.randn(len(tx)) + 1j*np.random.randn(len(tx)))
rx_with_noise = rx_with_doppler + noise

# 相干混频:发射信号共轭与回波信号相乘
if_signal = tx.conj() * rx_with_noise
return if_signal

# 假设目标距离对应20个采样点延时,速度产生5kHz多普勒
if_sig = coherent_mixing(tx_signal, tx_signal, delay_samples=20, doppler_freq=5e3)

3. 距离维FFT与CFAR检测

def range_fft_and_cfar(if_signal, fft_size, guard_cells, training_cells, threshold_factor):
"""
执行距离维FFT并应用CFAR(单元平均)检测。
"""
# 1. 加窗并做FFT
window = np.hamming(len(if_signal))
if_windowed = if_signal * window
range_fft = np.fft.fft(if_windowed, fft_size)
range_profile = np.abs(range_fft[:fft_size//2]) # 取单边谱

# 2. 一维CFAR检测
num_cells = len(range_profile)
cfar_threshold = np.zeros(num_cells)
for i in range(num_cells):
# 排除保护单元和当前检测单元
low_idx = max(0, i - guard_cells - training_cells)
high_idx = min(num_cells, i + guard_cells + training_cells)
training_set = np.concatenate([range_profile[low_idx:i-guard_cells],
range_profile[i+guard_cells+1:high_idx]])
if len(training_set) > 0:
noise_level = np.mean(training_set)
cfar_threshold[i] = noise_level * threshold_factor
else:
cfar_threshold[i] = 0

# 3. 检测峰值
detections = range_profile > cfar_threshold
peak_indices = np.where(detections)[0]
return range_profile, cfar_threshold, peak_indices

# 调用示例
range_profile, threshold, peaks = range_fft_and_cfar(
if_sig, fft_size=1024, guard_cells=2, training_cells=10, threshold_factor=3.5
)

四、关键参数与性能指标

仿真中需要关注的核心参数及其对系统性能的影响。

参数符号物理意义典型值/范围影响
B扫频带宽100 MHz - 4 GHz距离分辨率 ΔR = c/(2B)
TcChirp持续时间10 µs - 100 µs最大不模糊距离,速度分辨率
fsADC采样率> 2B最大可测距离
λ激光波长905 nm, 1550 nm多普勒灵敏度,大气衰减
SNR信噪比10 dB - 30 dB检测概率与虚警概率

【原文此处有示意图,图片内容见源资料对应页面】

五、仿真实验步骤建议

  1. 环境搭建:安装Python (NumPy, SciPy, Matplotlib) 或 MATLAB。
  2. 单目标仿真:生成单chirp,模拟单个静止/运动目标,验证距离/速度测量基本流程。
  3. 多目标仿真:引入多个具有不同距离和速度的目标,测试算法的分辨能力。
  4. 抗干扰测试:在回波中加入同频干扰信号或噪声,测试CFAR等算法的鲁棒性。
  5. 性能评估:定量分析测距误差、速度误差与信噪比(SNR)的关系。
  6. 可视化扩展:绘制距离-速度2D谱(通过慢时间维FFT),生成动态点云图。

通过以上步骤,学习者可以系统地掌握FMCW激光雷达信号处理从理论到仿真的全过程,为后续的硬件实现和算法优化打下坚实基础。