从雷达测速到6G通信:用Python手把手图解OTFS中的Zak变换与脉冲多普勒
从雷达测速到6G通信用Python手把手图解OTFS中的Zak变换与脉冲多普勒在雷达信号处理中脉冲多普勒技术早已成为测速的经典方法。而如今随着6G通信研究的深入一种名为OTFS正交时频空间的新型调制技术正逐渐崭露头角。这两种看似不相关的技术却共享着相似的数学基础——时延-多普勒域的信号处理。本文将带您从熟悉的雷达脉冲多普勒处理出发通过Python代码实现和可视化逐步揭示OTFS中Zak变换的奥秘搭建起从经典雷达到未来通信的认知桥梁。1. 雷达脉冲多普勒处理从时域到多普勒域雷达测速的核心在于检测目标的多普勒频移。传统脉冲雷达通过发射一系列间隔为PRT脉冲重复周期的脉冲信号并接收目标反射的回波。假设我们有一个匀速运动的目标其回波信号可以表示为import numpy as np import matplotlib.pyplot as plt # 参数设置 PRT 1e-3 # 脉冲重复周期1ms N 64 # 脉冲数量 fd 100 # 多普勒频率100Hz # 生成慢时间序列 slow_time np.arange(0, N) * PRT x np.exp(1j * 2 * np.pi * fd * slow_time) # 绘制慢时间信号实部 plt.figure(figsize(10,4)) plt.stem(slow_time*1000, np.real(x), use_line_collectionTrue) plt.xlabel(慢时间 (ms)) plt.ylabel(信号幅度) plt.title(雷达慢时间信号实部) plt.grid(True) plt.show()对慢时间信号做傅里叶变换就能得到多普勒域的信号分布# 计算多普勒谱 X np.fft.fft(x) doppler_bins np.fft.fftfreq(N, PRT) # 绘制多普勒谱 plt.figure(figsize(10,4)) plt.plot(doppler_bins, np.abs(X)) plt.xlabel(多普勒频率 (Hz)) plt.ylabel(幅度) plt.title(脉冲多普勒处理结果) plt.grid(True) plt.xlim(-500, 500) plt.show()关键观察点多普勒分辨率Δf 1/(N×PRT) 15.625Hz峰值位置正好在100Hz处对应目标速度时域采样间隔为PRT而非传统Nyquist采样间隔2. OTFS中的时延-多普勒域与雷达PD的类比OTFS将信息调制在时延-多普勒域的离散格点上这与雷达PD处理有着惊人的相似性。我们可以建立如下对应关系雷达PD概念OTFS对应概念数学表达脉冲重复周期(PRT)时延域格点间隔(T)T 1/Δf脉冲数量(N)时间格点数量(N)N T/τ多普勒分辨率多普勒域格点间隔Δν 1/(NT)慢时间采样Zak变换时间采样x(τ kT)用Python实现OTFS时延-多普勒网格# OTFS网格参数 T 1e-3 # 时延域间隔1ms N 64 # 时间格点数 M 32 # 频率格点数 # 创建时延-多普勒网格 delay_grid np.linspace(0, T, M, endpointFalse) doppler_grid np.fft.fftfreq(N, T) # 可视化网格 plt.figure(figsize(10,6)) plt.scatter(np.tile(delay_grid*1000, N), np.repeat(doppler_grid, M), s50, alpha0.6) plt.xlabel(时延 (ms)) plt.ylabel(多普勒频率 (Hz)) plt.title(OTFS时延-多普勒域网格) plt.grid(True) plt.show()3. Zak变换连接时延与多普勒域的桥梁Zak变换是OTFS的核心数学工具可以看作是一种特殊的傅里叶变换。其定义式为$$ Z_x(\tau, \nu) \sqrt{T} \sum_{k-\infty}^{\infty} x(\tau kT) e^{-j2\pi \nu kT} $$与常规傅里叶变换的关键区别在于时域采样间隔为T类似PRT而非Nyquist间隔变换结果同时是时延τ和多普勒ν的函数具有准周期性Z_x(τmT,νn/T) e^{j2πmνT}Z_x(τ,ν)用Python实现离散Zak变换def zak_transform(x, T, N, M): 离散Zak变换实现 :param x: 输入信号 :param T: 时延域间隔 :param N: 多普勒维度点数 :param M: 时延维度点数 :return: Zak变换结果 Z np.zeros((M, N), dtypecomplex) for m in range(M): tau m * T / M for n in range(N): nu n / (N * T) sum_val 0 for k in range(-10, 10): # 近似无限求和 t tau k * T if 0 t len(x)*T/M: idx int(t * M / T) sum_val x[idx] * np.exp(-1j * 2 * np.pi * nu * k * T) Z[m,n] np.sqrt(T) * sum_val return Z # 测试信号时延0.3T多普勒0.2/T的信号 test_signal np.zeros(M*2, dtypecomplex) for k in range(-10,10): t 0.3*T k*T if 0 t 2*T: idx int(t*M/T) test_signal[idx] np.exp(1j*2*np.pi*0.2/T*t) # 计算Zak变换 Z zak_transform(test_signal, T, N, M) # 可视化 plt.figure(figsize(12,5)) plt.imshow(np.abs(Z), aspectauto, extent[0, 1/T, T, 0], cmapviridis) plt.colorbar(label幅度) plt.xlabel(多普勒频率 ν (Hz)) plt.ylabel(时延 τ (s)) plt.title(Zak变换幅度谱) plt.show()4. 从理论到实践OTFS系统仿真现在我们将上述概念整合构建一个简化的OTFS通信系统仿真。该系统包含以下步骤信息映射将QAM符号映射到时延-多普勒网格Zak变换通过逆Zak变换生成时域信号信道传输模拟时延和多普勒效应接收处理执行Zak变换恢复信息# OTFS系统仿真 def otfs_transmit(symbols, T, N, M): # 逆Zak变换生成时域信号 x np.zeros(M, dtypecomplex) for m in range(M): tau m * T / M for k in range(-5,5): t tau k * T if 0 t T: for n in range(N): nu n / (N * T) x[m] symbols[n,m] * np.exp(1j*2*np.pi*nu*k*T) return x / np.sqrt(N) def otfs_receive(y, T, N, M): # Zak变换恢复符号 symbols_hat np.zeros((N,M), dtypecomplex) for n in range(N): nu n / (N * T) for m in range(M): tau m * T / M sum_val 0 for k in range(-5,5): t tau k * T if 0 t T: idx int(t * M / T) sum_val y[idx] * np.exp(-1j*2*np.pi*nu*k*T) symbols_hat[n,m] np.sqrt(T) * sum_val / N return symbols_hat # 生成随机QAM符号 symbols np.random.randint(0, 4, (N,M)) # 4-QAM symbols (2*symbols - 3) / np.sqrt(2) 1j*(2*symbols - 3) / np.sqrt(2) # 传输过程 x otfs_transmit(symbols, T, N, M) # 模拟信道时延1个采样点多普勒50Hz y np.roll(x, 1) * np.exp(1j*2*np.pi*50*np.arange(M)*T/M) # 接收处理 symbols_hat otfs_receive(y, T, N, M) # 计算误符号率 ser np.mean(np.abs(symbols - symbols_hat) 0.5) print(f误符号率: {ser:.4f})实际OTFS系统会采用更高效的计算方法如通过快速傅里叶变换实现Zak变换这里为了教学目的展示了直接实现。5. 性能分析与比较OTFS vs OFDMOTFS相比传统OFDM在高移动性场景下具有显著优势。我们可以通过仿真比较两者在多普勒信道下的性能def ofdm_transmit(symbols, N_fft): # 简单OFDM调制 return np.fft.ifft(symbols, nN_fft) def ofdm_receive(signal, N_fft): # 简单OFDM解调 return np.fft.fft(signal, nN_fft) # 仿真参数 N_trials 1000 snr_range np.arange(0, 30, 5) ofdm_ser [] otfs_ser [] for snr in snr_range: ofdm_err 0 otfs_err 0 for _ in range(N_trials): # OFDM传输 ofdm_symbols np.random.randint(0, 4, N) # 4-QAM ofdm_symbols (2*ofdm_symbols - 3) / np.sqrt(2) 1j*(2*ofdm_symbols - 3) / np.sqrt(2) x_ofdm ofdm_transmit(ofdm_symbols, N) # 添加噪声和多普勒 noise np.random.randn(N) 1j*np.random.randn(N) noise noise / np.sqrt(2) * 10**(-snr/20) y_ofdm x_ofdm * np.exp(1j*2*np.pi*50*np.arange(N)*T/N) noise symbols_hat_ofdm ofdm_receive(y_ofdm, N) ofdm_err np.mean(np.abs(np.sign(np.real(symbols_hat_ofdm)) - np.real(ofdm_symbols)) 0) # OTFS传输 otfs_symbols np.random.randint(0, 4, (N,M)) otfs_symbols (2*otfs_symbols - 3) / np.sqrt(2) 1j*(2*otfs_symbols - 3) / np.sqrt(2) x_otfs otfs_transmit(otfs_symbols, T, N, M) # 添加噪声和多普勒 noise np.random.randn(M) 1j*np.random.randn(M) noise noise / np.sqrt(2) * 10**(-snr/20) y_otfs np.roll(x_otfs, 1) * np.exp(1j*2*np.pi*50*np.arange(M)*T/M) noise symbols_hat_otfs otfs_receive(y_otfs, T, N, M) otfs_err np.mean(np.abs(otfs_symbols - symbols_hat_otfs) 0.5) ofdm_ser.append(ofdm_err / N_trials) otfs_ser.append(otfs_err / N_trials) # 绘制性能曲线 plt.figure(figsize(10,6)) plt.semilogy(snr_range, ofdm_ser, o-, labelOFDM) plt.semilogy(snr_range, otfs_ser, s-, labelOTFS) plt.xlabel(SNR (dB)) plt.ylabel(误符号率) plt.title(OTFS与OFDM在多普勒信道下的性能比较) plt.grid(True) plt.legend() plt.show()仿真结果显示在高多普勒场景下OTFS相比OFDM具有更稳健的性能。这是因为OTFS将信道时变特性吸收到时延-多普勒域中信息符号在整个帧内经历相同的信道响应接收机可以联合处理整个帧来对抗多普勒效应6. 实际应用中的考量与优化在实际OTFS系统实现中还需要考虑以下关键因素窗函数设计时延和多普勒域都需要加窗减少泄漏常用矩形窗、升余弦窗等窗选择影响系统性能和复杂度# 窗函数对Zak变换的影响 rect_window np.ones(M) rc_window np.sqrt(0.5 * (1 - np.cos(2*np.pi*np.arange(M)/M))) plt.figure(figsize(12,4)) plt.subplot(121) plt.plot(rect_window) plt.title(矩形窗) plt.subplot(122) plt.plot(rc_window) plt.title(升余弦窗) plt.show() # 加窗Zak变换比较 Z_rect zak_transform(test_signal * rect_window, T, N, M) Z_rc zak_transform(test_signal * rc_window, T, N, M) plt.figure(figsize(12,5)) plt.subplot(121) plt.imshow(np.abs(Z_rect), aspectauto, cmapviridis) plt.title(矩形窗Zak变换) plt.subplot(122) plt.imshow(np.abs(Z_rc), aspectauto, cmapviridis) plt.title(升余弦窗Zak变换) plt.show()信道估计导频设计时延-多普勒域稀疏导频估计方法基于压缩感知的稀疏恢复插值技术从导频位置估计整个网格检测算法线性检测MMSE均衡非线性检测消息传递(MP)、近似消息传递(AMP)深度学习基于神经网络的检测器复杂度优化利用FFT加速Zak变换计算稀疏矩阵运算加速信道均衡并行处理架构实现实时处理在实现一个完整的OTFS系统时这些优化技术可以显著提升系统性能并降低实现复杂度。例如使用快速Zak变换算法可以将计算复杂度从O(N²M²)降低到O(NM log NM)。