资讯详情

中频采样与数字下变频DDC:原理、FPGA实现与调试指南

📅 2026/9/29 20:52:44 | 华诺云谱 👁 阅读
中频采样与数字下变频DDC:原理、FPGA实现与调试指南
1. 从射频到基带中频采样与数字下变频到底在解决什么问题做软件无线电、雷达信号处理或者通信基带开发的人迟早会撞上“中频采样”和“数字下变频”这两个词。我第一次接触是在一个短波接收机的项目里当时前端射频芯片输出的信号中心频率在几十兆赫兹带宽只有几百千赫兹如果直接送到ADC采样采样率要求高得离谱数据量大到后端DSP根本吃不消。后来前辈丢给我一句话“先采中频再在数字域把它搬到零频附近。”这就是中频采样加数字下变频DDC的核心思路。简单说中频采样是把射频信号先通过模拟混频搬到一个不太高的固定中频比如70MHz、140MHz或者更低的几十兆赫兹然后在这个中频上直接进行模数转换。数字下变频则是在ADC之后用数字的方式把信号从那个中频位置搬移到基带零频附近同时完成滤波和抽取把数据率降下来。这一套组合拳解决的核心矛盾是ADC的采样率、后端处理能力和信号带宽之间的不匹配。为什么不在射频直接采样因为射频频率太高ADC的采样率和模拟带宽很难同时满足而且功耗和成本会飙升。为什么不在模拟域做下变频模拟混频器有本振泄漏、镜像干扰、直流偏移、温漂等问题而且一旦硬件定型灵活性极差。数字下变频把这些脏活累活搬到数字域用算法换硬件用灵活性换成本这就是它最朴素的工程逻辑。这套技术适合谁如果你在做软件无线电、雷达接收机、频谱监测、卫星通信终端或者任何需要把高频窄带信号搬到基带处理的场景中频采样加DDC几乎是绕不开的基本功。哪怕你用的是现成的ADCFPGA方案理解DDC内部的混频、滤波、抽取每一步在干什么对调试和优化都至关重要。下面我就按实际项目里的思路把这件事从头到尾拆一遍。2. 中频采样的核心原理与参数选择2.1 带通采样定理为什么中频采样能突破奈奎斯特限制很多人第一次听说中频采样时会疑惑奈奎斯特说采样率要大于信号最高频率的两倍那中频70MHz的信号岂不是要140MHz以上的采样率其实奈奎斯特原定理针对的是基带信号对于带通信号有带通采样定理也叫欠采样或亚采样。只要采样率满足特定条件就能用远低于两倍最高频率的采样率完成无混叠采样。带通采样的条件可以这样理解设信号中心频率为f0带宽为B采样率为fs。要保证采样后频谱搬移不产生混叠fs需要满足fs ≥ 2B保证带宽内信息不丢失 并且存在整数n使得 2f0/(2n1) ≤ fs ≤ 2(f0-B/2)/n 的某个区间内实际工程中更常用的简化判断是采样率大于两倍带宽且采样后的频谱搬移位置落在合适区间。举个例子中心频率70MHz、带宽2MHz的信号理论上采样率只要大于4MHz就有可能无混叠采样但实际会选择让采样后信号落在第一或第二奈奎斯特区方便后续DDC处理。我试过用40MHz采样率去采70MHz中频、2MHz带宽的信号采样后频谱搬移到30MHz和110MHz等位置其中30MHz那个镜像就是我们需要的中频搬移结果。这里的关键是采样率的选择要和DDC的混频频率配合不能随便选。2.2 采样率、中频频率与奈奎斯特区的配合关系实际选采样率时我一般按这几个步骤走确定信号带宽B这是最硬的约束采样率必须大于2B通常留20%到50%余量。确定中频f0由前端模拟混频决定常见的有70MHz、140MHz、21.4MHz等。选择奈奎斯特区让采样后的信号落在第一或第二奈奎斯特区避免高阶区的频谱反转和幅度衰减问题。计算采样后频率采样后信号频率为 |f0 - k*fs|k为整数取最小的那个结果。验证无混叠检查信号带宽内的所有频率分量采样后是否落在0到fs/2之间且不重叠。举个实际例子。假设中频f070MHz带宽B2MHz我选fs40MHz。采样后信号频率为 |70 - 40| 30MHz落在第一奈奎斯特区0到20MHz之外实际上30MHz在第二奈奎斯特区20到40MHz采样后等效频率为40-3010MHz。这个10MHz就是DDC需要搬移的频率。如果选fs36MHz|70-36|34MHz等效频率为36-342MHzDDC混频频率就是2MHz更接近基带后续滤波压力更小。注意采样率不是越高越好。采样率越高ADC功耗越大数据量越大FPGA的DDC资源消耗也越大。在满足无混叠和DDC处理需求的前提下尽量选低采样率。2.3 抗混叠滤波器放在哪里模拟前端还是数字域中频采样之前模拟前端必须有一个抗混叠滤波器。这个滤波器的作用是限制输入信号的带宽防止带外噪声和干扰在采样后混叠到有用频带内。很多人会问DDC里不是有数字滤波器吗为什么还要模拟滤波原因是数字滤波器在ADC之后它只能处理已经采样后的信号。如果采样前有带外强干扰采样后它会混叠到带内数字滤波器再厉害也分不清哪个是有用信号哪个是混叠进来的干扰。所以模拟抗混叠滤波器是必须的通常是一个LC滤波器或者声表滤波器带宽略大于信号带宽带外抑制要足够。我在一个项目里遇到过ADC前端的抗混叠滤波器带宽设得太宽结果附近一个强广播电台的信号混叠进来DDC后的星座图完全散掉。后来把滤波器带宽从10MHz收紧到3MHz问题立刻消失。这个坑让我记住模拟抗混叠滤波器的带宽要贴着信号带宽设计不能图省事留太宽。3. 数字下变频的三大核心环节混频、滤波、抽取3.1 数字混频把中频信号搬到零频附近数字下变频的第一步是混频也就是把采样后的中频信号乘以一个本地振荡信号把它搬到零频附近。数学上就是y(n) x(n) * exp(-j2pif_ddcn/fs)其中f_ddc是DDC的混频频率也就是采样后中频的等效频率。展开成实部和虚部就是I(n) x(n) * cos(2pif_ddcn/fs) Q(n) -x(n) * sin(2pif_ddcn/fs)这里就引出了I/Q的概念。I是同相分量Q是正交分量两者合起来构成复基带信号。为什么要用复信号因为实信号的频谱是对称的正负频率各有一半混频后会产生镜像干扰。用复混频乘以复指数可以把负频率分量去掉只保留正频率分量镜像抑制理论上可以做到无限大。实际实现时NCO数控振荡器产生正弦和余弦查找表或者用CORDIC算法实时计算。查找表的位数决定了SFDR无杂散动态范围我一般用16位以上的相位累加器和14位以上的幅度量化这样SFDR能到80dB以上。如果资源紧张可以用CORDIC但要注意迭代次数和精度之间的权衡。实操心得NCO的相位累加器位数很关键。位数太少混频后的频谱会有明显的杂散。我试过用12位相位累加器结果在-60dBc左右出现杂散后来加到24位杂散降到-90dBc以下。FPGA里多几个寄存器的事别在这里省。3.2 低通滤波滤掉混频产生的高频分量混频之后信号频谱被搬移了但同时也产生了和频分量。比如原来在10MHz的信号混频频率也是10MHz混频后一个分量搬到零频另一个分量搬到20MHz。低通滤波器的作用就是滤掉那个20MHz的高频分量只保留零频附近的有用信号。这个低通滤波器的设计有几个关键参数通带截止频率略大于信号带宽的一半比如信号带宽2MHz通带截止频率设1.2MHz左右。阻带起始频率要低于混频后高频分量的位置比如20MHz-1MHz19MHz所以阻带可以从2MHz开始。阻带衰减决定了能抑制多少高频分量一般要求60dB以上。通带纹波影响信号带内的平坦度通常要求0.1dB以内。在FPGA里实现低通滤波器最常用的是FIR滤波器。FIR的好处是线性相位可以保证信号波形不失真。阶数取决于过渡带宽度和阻带衰减要求。我用过一个经验公式阶数N ≈ 阻带衰减(dB) / (22 * 过渡带宽度(归一化))。比如要60dB衰减过渡带从1.2MHz到2MHz归一化过渡带为0.8MHz/fs如果fs40MHz归一化过渡带0.02N≈60/(22*0.02)≈136阶。这个阶数在FPGA里用对称结构可以省一半乘法器68个乘法器对中低端FPGA来说可以接受。如果资源更紧张可以用CIC滤波器加半带滤波器的组合。CIC适合大抽取比的粗滤波半带滤波器适合2倍抽取的精滤波。这个组合在DDC里非常经典后面讲抽取时会详细说。3.3 抽取降低数据率的关键一步抽取就是每隔M个点取一个点把采样率降到原来的1/M。为什么要抽取因为低通滤波后信号带宽已经限制在B以内根据奈奎斯特定理采样率只要大于2B就够了。原来fs可能是40MHz信号带宽2MHz抽取20倍后采样率变成2MHz刚好大于22MHz4MHz不对2MHz小于4MHz会混叠。所以抽取倍数要满足fs/M ≥ 2B即M ≤ fs/(2B)。40MHz/(22MHz)10所以最多抽取10倍采样率降到4MHz。抽取不能随便抽必须在低通滤波之后。如果先抽取再滤波高频分量会混叠到带内再也滤不掉了。所以顺序永远是混频 → 低通滤波 → 抽取。抽取之后如果还需要进一步降采样率可以重复“滤波抽取”的过程。实际工程中抽取通常分多级完成。比如总共要抽取10倍可以第一级抽取5倍第二级抽取2倍。这样每一级的滤波器过渡带可以放宽阶数降低总资源反而更省。这就是多相分解和多级抽取的思想。注意抽取倍数M不一定是整数比。有时候需要分数倍抽取比如抽取2.5倍这时候要用Farrow结构或者多项式插值。分数倍抽取在符号同步里很常见但在DDC里一般用整数倍就够了。4. 完整DDC链路的设计与FPGA实现要点4.1 链路参数计算从射频指标到FPGA配置假设一个实际场景射频信号中心频率433MHz带宽200kHz前端混频到中频21.4MHzADC采样率选40MHz。我们来算一遍DDC的参数。第一步确定采样后中频等效频率。21.4MHz对40MHz取模21.4MHz落在第一奈奎斯特区0-20MHz之外第二奈奎斯特区20-40MHz之内。等效频率为40-21.418.6MHz。所以DDC混频频率f_ddc18.6MHz。第二步确定抽取倍数。信号带宽200kHz采样率40MHz理论上最大抽取倍数M ≤ 40MHz/(2200kHz)100。但实际要考虑滤波器过渡带不能取满。我一般取理论值的70%到80%所以M取64或80。取64的话输出采样率625kHz大于2200kHz400kHz有余量。第三步设计低通滤波器。通带截止频率100kHz信号带宽一半阻带起始频率要低于混频后高频分量的位置。混频后高频分量在18.618.637.2MHz不对混频后和频分量在f_ddcf_signal其中f_signal是信号在采样后的频率偏移。信号中心在18.6MHz带宽200kHz所以和频分量在37.2MHz附近。但采样率只有40MHz37.2MHz超过奈奎斯特频率20MHz会混叠到40-37.22.8MHz。所以阻带要从2.8MHz-100kHz2.7MHz开始。过渡带从100kHz到2.7MHz归一化过渡带2.6MHz/40MHz0.065。要60dB衰减FIR阶数N≈60/(22*0.065)≈42阶。这个阶数很友好。第四步多级抽取设计。64倍抽取可以分成三级第一级抽取8倍第二级抽取4倍第三级抽取2倍。第一级滤波器过渡带最宽阶数最低后面各级过渡带相对更窄但因为采样率降低了归一化过渡带反而可能更宽。具体每级的滤波器参数需要逐级计算这里不展开但思路是前级粗后级精总资源最省。4.2 FPGA资源估算与滤波器结构选择在FPGA里实现DDC资源主要消耗在乘法器、块RAM和逻辑单元上。以Xilinx 7系列为例一个18x18的乘法器是一个DSP48 slice。FIR滤波器的乘法器数量取决于阶数和对称性。如果FIR阶数是42利用对称性可以省一半乘法器需要21个乘法器。三级抽取总共可能需要2110536个乘法器左右。对于中等规模的FPGA比如Artix-7 200T有740个DSP48这个消耗完全可以接受。如果资源更紧张可以用DA算法分布式算法或者CSD编码来减少乘法器。DA算法把乘法变成查找表和累加适合小位宽系数的场合。CSD编码把系数中非零位减少从而减少加法次数。我试过用CSD编码把系数中非零位从50%降到20%乘法器数量直接减半。块RAM主要用来存NCO查找表和滤波器系数。NCO查找表如果用一个周期正弦波16位幅度、12位相位需要4096*16bit64Kbit一个18Kb的块RAM就够。滤波器系数如果是对称的只需要存一半42阶存21个系数每个16位不到1Kbit。4.3 时序约束与流水线设计DDC链路是高速数据流处理时序收敛是关键。混频、滤波、抽取每一级都要考虑流水线。我的经验是混频级NCO查表和复数乘法可以并行但要注意相位累加器的进位链不能太长。如果采样率高相位累加器要分段流水。滤波级FIR滤波器天然适合流水线每个乘法累加可以插入寄存器。但要注意对称结构的加法树平衡否则时序会卡在加法树上。抽取级抽取就是降采样可以用使能信号控制每M个时钟取一个数。注意抽取后的数据率降低后续处理时钟可以相应降低但跨时钟域要处理好。实操心得我习惯在每一级之间加一个FIFO或者寄存器缓冲这样每一级可以独立优化时序不会互相拖累。虽然多了一点延迟但时序收敛容易得多。在高速采样下这点延迟完全可以接受。5. 常见问题排查与调试技巧实录5.1 频谱出现镜像I/Q不平衡的排查与校正DDC调试中最常见的问题就是频谱出现镜像。理想情况下复混频后负频率被完全抑制但实际中I和Q两路存在幅度和相位不平衡导致镜像抑制比有限。镜像抑制比公式IRR(dB) 10log10((1 2Acos(φ) A^2) / (1 - 2A*cos(φ) A^2))其中A是幅度比φ是相位误差。如果幅度误差0.1dB相位误差1度IRR大约40dB。如果幅度误差1dB相位误差5度IRR只有20dB左右。排查方法输入一个单音信号观察DDC输出频谱。如果镜像抑制比低于预期先检查I/Q两路的增益是否一致再检查NCO的正弦和余弦查找表是否严格正交。我遇到过一次NCO的余弦表比正弦表少了一个点导致相位误差镜像抑制比只有25dB。后来把两个表长度对齐IRR立刻到60dB以上。校正方法可以在数字域加一个I/Q校正矩阵实时估计幅度和相位误差并补偿。也可以用盲校正算法比如基于高阶累积量的方法。如果要求不高出厂前校准一次把校正系数存在寄存器里就行。5.2 输出信噪比恶化滤波器阶数和量化位宽的影响另一个常见问题是DDC输出信噪比不如预期。原因可能有两个滤波器阶数不够或者量化位宽太小。滤波器阶数不够会导致阻带衰减不足高频分量和噪声混叠到带内。我一般用MATLAB或者Python先仿真看滤波器的频率响应是否满足要求。如果阻带衰减只有40dB而系统要求60dB那就得增加阶数或者换滤波器类型。量化位宽的影响更隐蔽。ADC的输出位宽、混频后的位宽、滤波器系数的位宽、累加器的位宽每一级都可能引入量化噪声。我的经验是ADC之后至少保留12位有效位混频后扩展到16位滤波器系数用16位累加器用32位。如果累加器位宽不够滤波后的信号会截断信噪比恶化。我试过用24位累加器结果在输出信噪比要求80dB时不够换成32位后达标。5.3 抽取后频谱混叠滤波器过渡带设计陷阱抽取后频谱混叠是新手最容易踩的坑。原因通常是滤波器过渡带设计得太宽或者抽取倍数选得太大。举个例子信号带宽200kHz采样率40MHz抽取64倍后采样率625kHz。如果滤波器通带截止频率设200kHz信号带宽阻带起始频率设400kHz过渡带从200kHz到400kHz。抽取后400kHz以上的分量会混叠到625-400225kHz落在信号带内0-200kHz之外225kHz大于200kHz所以不混叠。但如果阻带起始频率设300kHz抽取后300kHz混叠到625-300325kHz还是不混叠。但如果阻带起始频率设250kHz抽取后250kHz混叠到625-250375kHz仍然不混叠。等等这里的关键是抽取后的奈奎斯特频率是625/2312.5kHz。只要阻带起始频率大于312.5kHz混叠后的频率就落在312.5kHz以上不会进入0-200kHz的信号带。所以阻带起始频率要大于抽取后奈奎斯特频率。我一般把阻带起始频率设在抽取后奈奎斯特频率的1.1倍以上留10%余量。这样即使滤波器过渡带有点偏差也不会混叠。5.4 常见问题速查表问题现象可能原因排查方法解决方案频谱出现镜像I/Q幅度或相位不平衡输入单音测镜像抑制比校正I/Q增益和相位检查NCO正交性输出信噪比低滤波器阶数不够或量化位宽不足仿真滤波器响应检查各级位宽增加阶数扩展累加器位宽抽取后混叠滤波器过渡带太宽或抽取倍数太大检查阻带起始频率与抽取后奈奎斯特频率关系收紧过渡带减小抽取倍数混频后频谱不对NCO频率计算错误核对采样后中频等效频率重新计算f_ddc检查奈奎斯特区时序不收敛流水线不足或加法树不平衡看时序报告找关键路径插入寄存器平衡加法树输出有直流偏移混频器本振泄漏或ADC偏移观察零频分量加高通滤波器或直流消除模块最后分享一个小技巧调试DDC时我习惯先用MATLAB或Python把整条链路仿真一遍把每一级的频谱都画出来。仿真通过后再写FPGA代码这样能省掉大量调试时间。仿真时特别注意定点量化效应用fixed-point工具箱或者手动模拟截断和舍入。我见过太多人仿真用浮点上板用定点结果性能差一大截回头查半天才发现是量化位宽的问题。6. 从DDC到后续处理数据接口与系统集成DDC输出的是复基带I/Q数据采样率已经降到适合后端处理的水平。接下来通常要做符号同步、信道估计、解调等。这里的关键是数据接口的设计。如果DDC在FPGA里实现输出I/Q数据可以通过AXI-Stream接口送给DSP或者ARM。数据位宽一般是16位I加16位Q共32位。如果后端处理能力有限还可以进一步抽取或者打包成帧。我做过一个项目DDC输出625kHz采样率的I/Q数据通过DMA送到ARM Cortex-A9在Linux用户空间做解调。数据率是625k*4字节2.5MB/sDMA完全能扛住。但如果采样率更高比如5MHz数据率20MB/s就需要考虑用FPGA内部的硬核处理器或者专用DSP协处理器。系统集成时还要注意时钟域。ADC采样时钟、FPGA处理时钟、后端接口时钟可能不同。DDC内部一般用ADC采样时钟或者它的分频输出到后端时要跨时钟域。我一般用异步FIFO做跨时钟域缓冲深度不用太大512就够了但要注意FIFO的读写使能和满空标志。另外DDC的配置寄存器混频频率、抽取倍数、滤波器系数最好通过总线接口比如AXI-Lite暴露给软件这样可以在运行时动态调整。我试过把混频频率做成可配置的结果在跳频通信里非常方便软件改一个寄存器就能切换信道不用重新综合FPGA。这个内容后续还可以这样扩展如果你要做多通道DDC比如相控阵雷达或者MIMO接收机可以把多个DDC通道并行放在FPGA里共享NCO或者各自独立。资源消耗会线性增长但现代FPGA的DSP资源足够支撑几十个通道。另一个方向是可变带宽DDC通过动态重配置滤波器系数和抽取倍数适应不同带宽的信号。这些在实际系统里都很常见值得深入折腾。
📝

华诺云谱内容团队

资深建站顾问 · 行业研究员

10年+企业数字化服务经验,专注智能建站、SEO优化与品牌营销,持续输出建站技巧、行业洞察与营销干货,已帮助5000+企业实现数字化增长。

你可能需要的服务

订阅华诺云谱资讯周报

每周一封,精选建站技巧、SEO与营销干货,直达邮箱。已有 8,000+ 企业主订阅,助你少走弯路。

↑