尧图网络科技YAOTU DIGITAL 获取报价
获取报价
首页 / 资讯中心 / 文章详情

中频采样与数字下变频:FPGA实现带通采样及抽取滤波链路设计

发布时间:2026/9/29 20:57:41

资讯中心
01
ARTICLE

中频采样与数字下变频:FPGA实现带通采样及抽取滤波链路设计

中频采样与数字下变频:FPGA实现带通采样及抽取滤波链路设计
1. 从射频到基带中频采样到底在解决什么问题搞过软件无线电或者雷达接收链路的人大概率都绕不开一个经典架构选择射频信号下来之后到底是在射频直接采样还是先搬到中频再采样这个问题我在不同项目里反复遇到过每次选型都得重新算一遍账。中频采样与数字下变频这套组合拳本质上解决的是一个很朴素的矛盾——ADC的采样率上限和信号带宽需求之间的冲突。先说背景。按照奈奎斯特采样定理要无失真地恢复一个信号采样率至少得是信号最高频率的两倍。假设你有一个中心频率2.4GHz、带宽20MHz的射频信号如果直接对这个射频信号采样理论上采样率得超过4.8GHz。这个量级的ADC不仅贵得离谱功耗和散热也是灾难。但如果你先把射频信号通过模拟混频搬到一个较低的中频比如70MHz或者140MHz这时候信号的中心频率降下来了带宽还是20MHz你只需要一个采样率略高于140MHz的ADC就能搞定。这就是中频采样存在的第一个理由用模拟混频换取ADC采样率的降低。但中频采样还有第二个更精妙的地方叫做带通采样。这个概念很多人第一次接触会觉得反直觉。假设中频信号中心频率70MHz带宽20MHz信号实际占据的频谱范围是60MHz到80MHz。按照低通采样的思路采样率得大于160MHz。但带通采样定理告诉我们只要采样率满足特定条件用远低于信号最高频率的采样率也能无混叠地采到这个带通信号。具体来说如果信号带宽为B中心频率为f0采样率fs满足2B ≤ fs ≤ 2f0/(m)这样的关系m取满足条件的整数就能实现频谱搬移式的采样。比如上面这个例子选fs50MHz信号会被搬到12.5MHz附近依然完整保留20MHz带宽的信息。这里有个关键点容易被忽略带通采样不是没有代价的。采样之后信号的频谱会以fs为周期进行延拓如果参数选得不好延拓出来的频谱副本会和原始频谱重叠产生混叠。所以选采样率的时候必须画频谱图验证不能拍脑袋。我一般会先在纸上把信号频谱、采样频率、各次谐波的位置都标出来确认没有重叠再往下走。那数字下变频又是在干什么ADC采样之后你拿到的是一个实信号序列频谱关于零频对称正负频率各有一半。但通信或者雷达处理真正关心的是基带复信号也就是I/Q两路。数字下变频的核心任务就是把中频上的带通信号搬到零频附近同时产生正交的I/Q两路并且通过抽取滤波把采样率降下来减轻后续处理压力。整个过程用数字方式实现避免了模拟混频器的本振泄漏、I/Q不平衡等一堆麻烦事。所以这套架构的完整链路是射频信号 → 模拟混频搬到中频 → ADC带通采样 → 数字下变频混频抽取滤波→ 基带I/Q信号 → 后续解调或脉压处理。每一步都有它的道理缺一不可。适合阅读这篇内容的人应该是对FPGA信号处理有一定了解、正在做接收机链路设计、或者想搞清楚软件无线电底层原理的工程师。如果你之前只是调用过现成的IP核没自己算过参数、没踩过混叠的坑那接下来的内容应该能帮你把这条链路真正吃透。2. 带通采样的参数计算别让混叠毁掉你的链路2.1 采样率选择的约束条件推导带通采样的采样率选择不是随便挑一个大于两倍带宽的数就行。我见过太多人在这里翻车包括我自己早期做的一个项目当时选了个自认为很安全的采样率结果频谱搬移之后发现边带刚好压在一起信噪比直接掉了十几个dB。后来老老实实把公式推了一遍才搞明白问题出在哪。带通采样定理的完整表述是这样的对于一个带宽为B、最高频率为fH的带通信号如果采样率fs满足fs ≥ 2B保证带宽信息不丢失存在整数m使得 2fH/m ≤ fs ≤ 2fL/(m-1)其中fL是信号最低频率fH是最高频率m取满足条件的正整数。这个公式看起来有点绕但实际操作的时候可以换个思路先确定你希望信号被搬到哪个频率位置然后反推采样率。举个实际例子。假设中频信号中心频率140MHz带宽20MHz所以fL130MHzfH150MHz。我想让采样后的信号落在20MHz到40MHz这个区间中心30MHz那么采样率应该选多少信号搬移后的中心频率f_if和原始中心频率f0、采样率fs的关系是f_if |f0 - k·fs|其中k是某个整数。代入f0140MHzf_if30MHz如果k1则fs110MHz如果k2则fs55MHz。验证一下55MHz是否满足带通采样条件2B40MHz ≤ 55MHz且2fH/m ≤ fs ≤ 2fL/(m-1)取m52×150/5602×130/46560 ≤ 55不成立。取m62×150/6502×130/55250 ≤ 55 ≤ 52不成立。所以55MHz不行。再试110MHzm2时2×150/21502×130/1130130 ≤ 110不成立。m3时2×150/31002×130/2130100 ≤ 110 ≤ 130成立。所以110MHz是可行的。这个计算过程看起来繁琐但实际做几次就有感觉了。我通常会在Excel里拉一个表把可能的m值和对应的采样率范围都列出来然后从中挑一个和ADC器件支持的采样率最接近的值。2.2 采样后频谱搬移的直观理解很多人对带通采样的频谱搬移感到困惑觉得信号怎么就从140MHz跑到30MHz去了。其实用一句话就能解释清楚采样就是在频域上把原始频谱以fs为周期进行复制粘贴。原始信号在140MHz附近采样之后它的频谱副本会出现在140±n·fs的位置上。你只需要找到其中一个落在低频区域的副本那就是你想要的。还是用上面的例子fs110MHz原始信号在130到150MHz。采样后频谱副本出现在130-11020MHz 到 150-11040MHz这就是我们要的130110240MHz 到 150110260MHz130-220-90MHz 到 150-220-70MHz负频率对应正频率的镜像可以看到20到40MHz这个副本完整保留了20MHz的带宽信息而且和别的副本没有重叠。这就是带通采样的精髓用低采样率把高频信号折叠到低频同时保证折叠后的频谱不重叠。但这里有个坑如果信号本身不是理想的带通信号比如带外有噪声或者杂散这些成分也会被折叠进来。所以中频滤波器的作用非常关键必须在ADC之前把带外成分滤干净。我一般会在中频放大器后面加一个声表滤波器或者LC带通滤波器把带外抑制做到40dB以上这样折叠进来的噪声才不会影响灵敏度。2.3 采样时钟抖动对信噪比的影响选好了采样率接下来要关注的是采样时钟的质量。ADC的信噪比不仅取决于量化位数还和采样时钟的抖动密切相关。时钟抖动会导致采样时刻偏离理想位置对于高频信号来说这个偏差会被放大。具体的关系可以用这个公式估算SNR_jitter -20·log10(2π·f·σ_t)其中f是信号频率σ_t是时钟抖动的RMS值。假设你的中频信号在140MHz时钟抖动是1ps RMS那么SNR_jitter -20·log10(2π×140e6×1e-12) ≈ -20·log10(8.8e-4) ≈ 61dB。如果你用的是12位ADC理论SNR大约是74dB但时钟抖动把实际SNR限制到了61dB。如果时钟抖动恶化到10psSNR直接掉到41dB12位ADC就浪费了。所以选中频采样方案的时候时钟源的选择和PCB布局的走线质量必须重视。我一般会选相位噪声指标好的晶振或者时钟芯片比如-150dBc/Hz10kHz偏移这种级别的。PCB上时钟走线要远离数字信号线尽量走差分包地处理。这些细节看起来不起眼但实测的时候差别很大。3. 数字下变频的FPGA实现从混频到抽取的完整链路3.1 数字混频把中频信号搬到零频ADC采样之后你拿到的是实信号序列假设采样率110MHz信号中心在30MHz。数字下变频的第一步是混频也就是把这个30MHz的信号搬到零频。做法很简单把ADC数据分别乘以cos(2π·30e6·n/110e6)和-sin(2π·30e6·n/110e6)得到I路和Q路。在FPGA里实现这个乘法通常用查找表或者CORDIC算法生成正余弦值。查找表的做法是把一个周期的正余弦波形量化成N个点存到ROM里然后用一个相位累加器控制读取地址。相位累加器的位宽决定了频率分辨率比如32位累加器时钟110MHz频率分辨率就是110e6/2^32 ≈ 0.0256Hz完全够用。这里有个实际的问题NCO数控振荡器的输出频率必须和ADC采样率相干否则混频之后会有残余的频率偏差。所谓相干就是NCO频率和采样率之比是有理数而且最好能整除。比如采样率110MHzNCO频率30MHz110/3011/3不是整数比但相位累加器每3个采样点走11个周期还是能保证相位连续。如果NCO频率是27.5MHz110/27.54正好整除相位累加器每4个点走一个完整周期实现起来更简单。混频之后的信号是复数形式I路和Q路各一路。这时候信号的频谱已经从30MHz搬到了零频附近正频率部分在0到10MHz负频率部分在-10到0MHz。但注意由于输入是实信号I路和Q路是相关的不是独立的。真正要得到独立的I/Q还需要后面的低通滤波和抽取。3.2 抽取滤波降采样率同时保留有用信号混频之后信号带宽还是20MHz但采样率还是110MHz数据率太高后续处理吃不消。这时候需要抽取也就是每隔M个点取一个把采样率降到110/M MHz。但直接抽取会出问题如果抽取后的采样率不满足奈奎斯特条件信号会混叠。所以在抽取之前必须先低通滤波把信号带宽限制到新的奈奎斯特频率以内。假设我要把采样率降到27.5MHz抽取因子M4。新的奈奎斯特频率是13.75MHz而信号带宽是20MHz从-10到10MHz超过了13.75MHz。所以不能直接抽4倍得先滤波把带宽限制到13.75MHz以内。但这样会损失信号带宽不行。那怎么办答案是用多级抽取先滤掉一部分抽一次再滤再抽。实际工程中常用的结构是CIC滤波器加半带滤波器再加FIR滤波器。CIC滤波器适合大倍数抽取不需要乘法器但通带不平坦需要后级补偿。半带滤波器系数对称有一半是零乘法器用量少适合2倍抽取。FIR滤波器可以做成任意响应但资源消耗大一般放在最后一级做精细整形。我做过的一个项目中采样率110MHz信号带宽20MHz目标是把采样率降到27.5MHz。方案是第一级CIC抽取2倍采样率降到55MHz第二级半带滤波器抽取2倍降到27.5MHz。CIC的通带衰减在10MHz处大约是0.5dB半带滤波器在10MHz处也有约0.5dB衰减加起来1dB左右可以接受。如果对通带平坦度要求更高可以在最后加一个小的补偿FIR。3.3 多相滤波结构资源优化的关键技巧抽取滤波器的直接实现有个问题如果先滤波再抽取滤波器在每个采样点都要算一遍但抽取之后只保留M个点中的一个意味着M-1个点的计算被浪费了。多相滤波结构就是来解决这个问题的。多相滤波的思路是把滤波器的系数按照抽取因子M分成M组每组系数对应一个相位。输入数据也按照M的节奏分配给不同的相位分支每个分支只计算自己那一路的卷积最后把M个分支的输出按顺序拼接起来。这样计算量降到了原来的1/M资源消耗大幅降低。具体实现的时候假设滤波器有N个抽头抽取因子M那么每个多相分支有N/M个抽头。输入数据以M为周期轮流进入各个分支每个分支的输出就是该分支系数和对应输入数据的卷积。最后用一个M选一的并串转换把各路输出合成一路。这个结构在FPGA里实现起来很自然因为FPGA本来就擅长并行处理。我一般会用移位寄存器组来缓存输入数据然后用M个并行的乘加单元同时计算各分支的输出。如果资源紧张也可以只用一个乘加单元分时复用但那样时钟频率得跑得更高。4. 实测中容易踩的坑与排查思路4.1 频谱出现镜像I/Q不平衡的排查数字下变频之后理想情况下正频率和负频率应该完全分开频谱上只看到一边。但实际调试的时候经常会在另一边看到一个镜像分量幅度可能只比主信号低20到30dB。这个镜像就是I/Q不平衡造成的。I/Q不平衡的来源有几个一是NCO产生的正余弦幅度不一致二是I路和Q路的滤波器系数有差异三是混频之后的增益不一致。排查的时候可以逐级看先在混频输出接一个频谱仪或者用FPGA的ILA抓数据做FFT看I路和Q路的幅度是否一致然后看滤波器的频率响应是否对称最后看NCO的查找表精度是否够。解决I/Q不平衡的办法最直接的是提高NCO查找表的精度和滤波器的对称性。如果硬件已经定了也可以在数字域做校正比如用一个复数滤波器来补偿幅度和相位误差。我一般会在设计阶段就把NCO的查找表做到16位以上滤波器系数用对称结构这样镜像抑制能做到50dB以上。4.2 输出频谱出现杂散时钟泄漏与量化噪声另一个常见问题是输出频谱上有莫名其妙的杂散。有一次我调一个链路发现输出在某个特定频率上总有一个小尖峰换了采样率就消失换回来又出现。后来查了半天发现是采样时钟的谐波和NCO频率混频产生的。这种杂散的根源是时钟泄漏。ADC的采样时钟会通过电源或者地平面耦合到模拟输入端和信号一起被采样。如果时钟频率的某个谐波刚好落在信号带内就会产生固定的杂散。解决办法一是改善时钟的屏蔽和滤波二是在数字域用陷波器把已知的杂散频率滤掉。量化噪声也是杂散的来源之一。ADC的量化误差不是白噪声而是和输入信号相关的确定性误差会产生谐波失真。如果输入信号幅度太接近满量程谐波失真会恶化。我一般会把输入信号幅度控制在满量程的-6dB到-12dB之间留足够的余量。4.3 抽取滤波器通带边缘衰减过大抽取滤波器的通带边缘衰减是个容易被忽视的问题。CIC滤波器的频率响应是sinc函数在通带边缘衰减很明显。如果信号带宽刚好到通带边缘衰减可能达到3dB甚至更多导致信号幅度不一致。解决这个问题有两个思路一是让滤波器的通带比信号带宽宽一些比如信号带宽20MHz滤波器通带做到25MHz这样20MHz处的衰减就很小了二是加补偿滤波器把CIC的sinc衰减补回来。补偿滤波器的系数可以用MATLAB的firls函数设计让它的频率响应和CIC的衰减相反。我一般会先用MATLAB把整个抽取链路的频率响应仿真一遍看看通带波动和阻带衰减是否满足要求。如果通带波动超过0.5dB就加补偿如果阻带衰减不够就增加滤波器阶数或者换更高级的滤波器结构。5. 从仿真到上板我的调试流程与经验5.1 MATLAB仿真先把算法跑通再写RTL我见过不少人直接上手写Verilog结果调了半天发现算法本身就有问题。我的习惯是先在MATLAB里把整个链路仿真一遍包括信号生成、带通采样、数字混频、抽取滤波最后看频谱和星座图是否正常。MATLAB仿真的好处是可以快速试错改个参数几秒钟就能看到结果比在FPGA里改代码再综合快得多。仿真的时候要注意几点一是采样率要设成和实际一致二是要加入噪声和时钟抖动模型三是要用定点数仿真而不是浮点数因为FPGA里是定点运算。定点数的位宽选择很关键位宽不够会导致量化噪声大位宽太大浪费资源。我一般会先用浮点仿真确认算法正确然后逐步降低位宽看性能恶化到什么程度找到一个平衡点。5.2 FPGA上板调试ILA抓数据做FFT算法仿真通过之后接下来是写RTL、综合、上板。上板之后第一件事是用ILA抓ADC的原始数据做一次FFT看看频谱对不对。如果频谱和MATLAB仿真不一致那说明ADC配置或者时钟有问题。确认ADC数据正确之后再逐级抓混频输出、滤波输出看每一级的频谱是否符合预期。ILA抓数据的深度有限一般只能抓几千个点做FFT的频率分辨率不够高。如果需要更精细的频谱分析可以把数据通过UART或者以太网传到上位机用MATLAB或者Python做离线分析。我一般会在FPGA里加一个数据缓存模块把需要分析的数据存到RAM里然后慢慢往外传。5.3 资源与时序的平衡数字下变频链路在FPGA里占的资源不少尤其是FIR滤波器乘法器用量很大。如果FPGA资源紧张可以考虑几个优化方向一是用时分复用的方式共享乘法器二是用CSD编码或者分布式算法减少乘法器数量三是降低滤波器阶数或者用更高效的滤波器结构。时序方面高速采样率下比如110MHz以上乘加运算的流水线设计很关键。我一般会把乘法和加法分成多级流水确保每级之间的逻辑延迟不超过时钟周期。如果时序不满足可以插入额外的寄存器但会增加延迟。延迟增加会影响整个链路的实时性需要权衡。6. 几个值得关注的扩展方向6.1 多通道幅相一致性校准如果你做的是相控阵或者多通道接收机数字下变频之后还需要关注各通道之间的幅相一致性。不同通道的ADC、混频器、滤波器不可能完全一致会导致波束形成的时候旁瓣升高。校准的方法是在每个通道注入一个已知的参考信号测量各通道的幅度和相位差异然后在数字域补偿。6.2 自适应滤波在数字下变频中的应用如果干扰信号很强而且频率会变化固定系数的滤波器就不够用了。这时候可以用自适应滤波比如LMS算法让滤波器系数根据输入信号自动调整把干扰抑制掉。自适应滤波的计算量比固定滤波大不少但在FPGA里用并行结构实现也是可行的。6.3 高采样率下的JESD204B接口当采样率超过200MHz的时候传统的并行LVDS接口走线太多PCB布局困难。JESD204B接口用高速串行链路传输ADC数据线数少同步机制完善适合高采样率多通道的应用。但JESD204B的调试比LVDS复杂需要配置链路参数、做同步测试上手门槛高一些。我在实际项目里用JESD204B的时候最头疼的是链路同步问题。有时候链路能建立但数据不对查半天发现是SYSREF信号的时序不满足要求。后来学乖了每次上电都先读JESD204B的状态寄存器确认链路同步、帧同步、多帧同步都正常了再往下走。这个习惯帮我省了不少调试时间。最后分享一个小技巧数字下变频链路里的NCO频率、抽取因子、滤波器系数这些参数最好做成寄存器可配置的而不是写死在RTL里。这样调试的时候可以通过上位机动态修改不用每次都重新综合。我一般会用一个SPI或者UART接口来配置这些参数配合上位机软件调试效率能提高好几倍。
02
RELATED NEWS

相关资讯

更多网站建设与数字化升级内容

03
WHY YAOTU

想打造同款高转化官网?

懂行业、懂生意,从建站到增长一站式陪跑

◈

场景化定制

不做模板站,围绕你的业务场景量身设计,小众不撞款。

◐

营销型架构

以转化目标组织内容与路径,让官网真正带来询盘。

▲

全周期服务

设计、开发、运营、运维一体,上线只是开始。

免费获取你的建站方案

留下需求,专属顾问 24 小时内为你输出方案建议。