使用xilinx的fir IP核实现LFM信号匹配滤波的详细过程及原理

使用 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: 这是一个关键点。
    • 如果处理复数,通常有两种方式:
      1. Interleaved (交错): I/Q 数据在同一根线上交替传输。
      2. Parallel (并行): 实际上 FIR Compiler 7.2+ 版本更倾向于通过输入数据位宽来控制。例如,如果你设置输入为复数,IP 核可能会生成一个宽总线(如 tdata 为 32位,高16位为 Im,低16位为 Re)。

推荐配置: 在 Vivado 较新版本中,直接在 "Detailed Implementation" 页面将系数指定为 Complex,IP 核会自动处理复数运算架构。


第三步:硬件架构与时序设计

FPGA 内部的处理流程如下:

  1. 输入级: ADC 采集的 I/Q 数据进入 FPGA。
  2. 组帧: 将 I 路和 Q 路数据组合成 AXI-Stream 格式(例如 s_axis_data_tdata)。
    • 如果是复数 FIR,tdata 通常包含 [Im | Re]
  3. 卷积运算: FIR IP 核内部执行大量的乘累加(MAC)操作。
    • 对于复数卷积 (Is+jQs)∗(Ih+jQh)(I_s + jQ_s) * (I_h + jQ_h)(Is+jQs)∗(Ih+jQh),FIR 核会自动展开为 4 次实数乘法和 2 次加减法(或者使用 DSP48 的复数模式)。
  4. 输出级: 输出 m_axis_data_tdata,即为脉冲压缩后的结果。

第四步:仿真与验证

在 Vivado Simulator 中编写 Testbench:

  1. 读取 MATLAB 生成的量化后的 LFM 信号数据(作为激励)。
  2. 通过 AXI-Stream 协议拉高 tvalid,将数据送入 FIR IP 核。
  3. 观察 m_axis_data_tvalid 有效时的输出数据。

结果分析:

  • 输入: 看起来是等幅的正弦波(频率在变)。
  • 输出: 应该看到一个明显的Sinc 函数形状的尖峰(主瓣),这就是脉冲压缩的效果。
  • 检查旁瓣: 检查主瓣与第一旁瓣的高度比(PSLR),如果加了窗,旁瓣应明显低于主瓣。

三、 关键注意事项

  1. 位宽扩展 (Bit Growth):

    • FIR 滤波是乘累加运算,位宽会迅速膨胀。
    • 例如:16位数据 * 16位系数 + 1000次累加。
    • 在 IP 核配置中,务必注意 Output Width 的设置。如果为了节省资源截断输出,要确保截断的是低位(Truncate LSBs),保留高位有效信号。
  2. 复数运算:

    • 如果你的 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+) 处理复数非常方便,建议直接使用复数模式。
  3. 采样率与时钟:

    • 如果数据速率很高(如 > 300MHz),单路 FIR 可能跑不到这么快。此时需要使用 Super Sample Rate (SSR) 技术或多相分解,让多个 FIR 并行工作。

总结

使用 Xilinx FIR IP 实现 LFM 匹配滤波的核心在于:正确生成时间反转并共轭的系数文件 ,以及正确配置 IP 核处理复数数据格式。只要这两步做对,剩下的就是标准的 AXI-Stream 数据流处理。


相关推荐
s1ckrain12 小时前
数字逻辑笔记—同步时序电路
笔记·fpga开发·嵌入式
XINVRY-FPGA12 小时前
XC2C256-7VQG100I Xilinx CoolRunner-II CPLD FPGA
单片机·嵌入式硬件·fpga开发·硬件工程·dsp开发·fpga
黄埔数据分析12 小时前
chatgpt prompt for fpga
fpga开发·prompt
黄埔数据分析12 小时前
不同prompt 对比 async fifo
fpga开发·prompt
聊询QQ:688238861 天前
DENSO机器人二次开发:用C#读取和写入数据
fpga开发
s09071361 天前
ZYNQ7000关于JTAG电路设计注意事项
fpga开发·zynq·硬件设计设计
ARM+FPGA+AI工业主板定制专家1 天前
基于JETSON/RK3588+FPGA+AI农业机器人视觉感知方案
人工智能·计算机视觉·fpga开发·机器人
ARM+FPGA+AI工业主板定制专家1 天前
基于JETSON/RK3588+FPGA+AI商用自动割草机器人方案
人工智能·目标检测·计算机视觉·fpga开发·机器人
我爱C编程1 天前
【硬件片内测试】基于FPGA的完整16QAM软解调测试,含频偏锁定,帧同步,定时点,Viterbi译码,信道,误码统计
fpga开发·16qam·软解调·帧同步·viterbi译码·频偏锁定·定时点