使用 Xilinx FIR IP 核实现 LFM(线性调频)信号的匹配滤波是雷达和通信数字信号处理中的经典应用,这一过程通常被称为脉冲压缩。
以下是原理说明及详细的实现步骤。
一、 理论基础:LFM 与匹配滤波
1. 什么是 LFM 信号?
LFM 信号(Chirp 信号)的频率随时间线性变化。其数学表达式为:
s(t)=rect(tT)⋅ejπKt2s(t) = \text{rect}\left(\frac{t}{T}\right) \cdot e^{j\pi K t^2}s(t)=rect(Tt)⋅ejπKt2
其中:
- TTT 是脉冲宽度。
- KKK 是调频斜率 (K=B/TK = B/TK=B/T, BBB 为带宽)。
2. 什么是匹配滤波原理?
匹配滤波器(Matched Filter)能在噪声背景下使输出信噪比(SNR)最大化。
对于输入信号 s(t)s(t)s(t),匹配滤波器的时域冲激响应 h(t)h(t)h(t) 应该是信号的时间反转 和共轭:
h(t)=s∗(Tref−t)h(t) = s^*(T_{ref} - t)h(t)=s∗(Tref−t)
在离散域(FPGA 实现)中,假设采样后的 LFM 序列为 x[n]x[n]x[n],长度为 NNN,则 FIR 滤波器的系数 coeff[n]coeff[n]coeff[n] 应为:
coeff[n]=x∗[N−1−n]coeff[n] = x^*[N-1-n]coeff[n]=x∗[N−1−n]
简单来说: 如果你的发射信号是 [1+j, 2+j, 3-j],那么滤波器的系数应该是 [3+j, 2-j, 1-j](先共轭,再倒序)。

二、 实现详细步骤
整个过程分为三个主要阶段:系数生成 (MATLAB) -> IP 核配置 (Vivado) -> 硬件仿真 (FPGA)。
第一步:使用 MATLAB 生成系数 (.coe 文件)
FPGA 无法直接理解复数公式,我们需要将系数离散化并量化为定点数。
matlab
% MATLAB 生成 LFM 系数代码示例
clear; clc;
% 1. 参数设置
fs = 100e6; % 采样率 100MHz
T = 10e-6; % 脉冲宽度 10us
B = 20e6; % 带宽 20MHz
K = B/T; % 调频斜率
N = round(T*fs); % 采样点数
t = (0:N-1)/fs; % 时间轴
% 2. 生成 LFM 信号
s = exp(1j * pi * K * t.^2);
% 3. 生成匹配滤波器系数 (时间反转 + 共轭)
% 注意:加窗(如 Hamming)可以抑制旁瓣,但会损失主瓣宽度
h = conj(fliplr(s)) .* hamming(N)';
% 4. 量化 (定点化) - 假设使用 16-bit
data_width = 16;
scale_factor = 2^(data_width-1) - 1;
h_fi = round(h * scale_factor);
% 5. 导出 .coe 文件 (Xilinx FIR Compiler 格式)
% 注意:FIR Compiler 对于复数系数,通常要求交错排列 (Real, Imag, Real, Imag...)
fid = fopen('lfm_coeffs.coe', 'w');
fprintf(fid, 'Radix=10;\n');
fprintf(fid, 'CoefData=\n');
% 将实部和虚部交错写入
for i = 1:N
fprintf(fid, '%d,\n', real(h_fi(i)));
fprintf(fid, '%d,\n', imag(h_fi(i)));
end
fclose(fid);
注意: 这里的
.coe文件格式取决于你在 Vivado FIR Compiler 中选择的系数结构。对于复数滤波器,通常建议直接在 IP 核中选择 "Coefficients represent Complex data"。
第二步:Vivado FIR Compiler IP 核配置
在 Vivado 中添加 FIR Compiler IP 核,并进行如下配置:
1. Filter Options (滤波器选项)
- Filter Type: Single Rate (通常用于匹配滤波)。
- Filter Coefficients: 选择 "Vector" 或直接加载刚才生成的
.coe文件。
2. Channel Specification (通道规格)
- Number of Paths: 1 (单路信号)。
- Input Sampling Frequency: 根据系统时钟设置(例如 100 MHz)。
- Clock Frequency: 系统时钟(例如 100 MHz)。
3. Implementation (实现细节)
- Coefficient Options:
- Coefficient Structure: Inferred (自动推断) 或 Non-Symmetric (非对称)。LFM 匹配滤波器通常是非对称的。
- Coefficient Type: Signed Binary。
- Quantization: Integer (因为我们在 MATLAB 里已经量化过了)。
- Width: 16 (根据 MATLAB 脚本设置)。
- Data Path Options:
- Input Data Type: Signed Binary。
- Input Width: 16 (输入 ADC 数据的位宽)。
- Output Rounding Mode: Truncate_LSBs (截断) 或 Convergent_Rounding (收敛舍入,更精确)。
4. Interface (接口)
- Data Channel: 勾选 TREADY 以支持 AXI-Stream 流控。
- Data Structure: 这是一个关键点。
- 如果处理复数,通常有两种方式:
- Interleaved (交错): I/Q 数据在同一根线上交替传输。
- Parallel (并行): 实际上 FIR Compiler 7.2+ 版本更倾向于通过输入数据位宽来控制。例如,如果你设置输入为复数,IP 核可能会生成一个宽总线(如
tdata为 32位,高16位为 Im,低16位为 Re)。
- 如果处理复数,通常有两种方式:
推荐配置: 在 Vivado 较新版本中,直接在 "Detailed Implementation" 页面将系数指定为 Complex,IP 核会自动处理复数运算架构。
第三步:硬件架构与时序设计
FPGA 内部的处理流程如下:
- 输入级: ADC 采集的 I/Q 数据进入 FPGA。
- 组帧: 将 I 路和 Q 路数据组合成 AXI-Stream 格式(例如
s_axis_data_tdata)。- 如果是复数 FIR,
tdata通常包含[Im | Re]。
- 如果是复数 FIR,
- 卷积运算: FIR IP 核内部执行大量的乘累加(MAC)操作。
- 对于复数卷积 (Is+jQs)∗(Ih+jQh)(I_s + jQ_s) * (I_h + jQ_h)(Is+jQs)∗(Ih+jQh),FIR 核会自动展开为 4 次实数乘法和 2 次加减法(或者使用 DSP48 的复数模式)。
- 输出级: 输出
m_axis_data_tdata,即为脉冲压缩后的结果。
第四步:仿真与验证
在 Vivado Simulator 中编写 Testbench:
- 读取 MATLAB 生成的量化后的 LFM 信号数据(作为激励)。
- 通过 AXI-Stream 协议拉高
tvalid,将数据送入 FIR IP 核。 - 观察
m_axis_data_tvalid有效时的输出数据。
结果分析:
- 输入: 看起来是等幅的正弦波(频率在变)。
- 输出: 应该看到一个明显的Sinc 函数形状的尖峰(主瓣),这就是脉冲压缩的效果。
- 检查旁瓣: 检查主瓣与第一旁瓣的高度比(PSLR),如果加了窗,旁瓣应明显低于主瓣。
三、 关键注意事项
-
位宽扩展 (Bit Growth):
- FIR 滤波是乘累加运算,位宽会迅速膨胀。
- 例如:16位数据 * 16位系数 + 1000次累加。
- 在 IP 核配置中,务必注意 Output Width 的设置。如果为了节省资源截断输出,要确保截断的是低位(Truncate LSBs),保留高位有效信号。
-
复数运算:
- 如果你的 IP 核版本较老不支持直接复数输入,你需要实例化 两个 FIR 滤波器(分别处理实部和虚部)或者自己设计交叉相乘累加的逻辑:
Yreal=Xreal∗Hreal−Ximag∗HimagY_{real} = X_{real}*H_{real} - X_{imag}*H_{imag}Yreal=Xreal∗Hreal−Ximag∗Himag
Yimag=Xreal∗Himag+Ximag∗HrealY_{imag} = X_{real}*H_{imag} + X_{imag}*H_{real}Yimag=Xreal∗Himag+Ximag∗Hreal - 现在的 Xilinx FIR Compiler (7.2+) 处理复数非常方便,建议直接使用复数模式。
- 如果你的 IP 核版本较老不支持直接复数输入,你需要实例化 两个 FIR 滤波器(分别处理实部和虚部)或者自己设计交叉相乘累加的逻辑:
-
采样率与时钟:
- 如果数据速率很高(如 > 300MHz),单路 FIR 可能跑不到这么快。此时需要使用 Super Sample Rate (SSR) 技术或多相分解,让多个 FIR 并行工作。
总结
使用 Xilinx FIR IP 实现 LFM 匹配滤波的核心在于:正确生成时间反转并共轭的系数文件 ,以及正确配置 IP 核处理复数数据格式。只要这两步做对,剩下的就是标准的 AXI-Stream 数据流处理。