资讯动态

中频采样与数字下变频DDC的FPGA实现与工程调试指南

发布时间:2026/9/29 20:53:03 来源:尧图企业网站定制
1. 中频采样与数字下变频到底在解决什么问题第一次接触“中频采样”和“数字下变频”这两个词很多人会以为这是通信专业研究生的专属课题离实际工程很远。但只要你拆过一台软件无线电设备、做过雷达信号处理板卡或者写过FPGA里的DDC模块就会发现这套东西几乎是现代接收机的标配。它的核心任务说起来很朴素把天线接收下来的高频信号经过模拟前端搬到某个中间频率然后尽快用ADC采样成数字序列再在数字域里把信号搬到基带同时把采样率降下来方便后续解调、识别或测量。为什么非要绕这么一圈直接对射频信号采样不行吗理论上可以这叫射频采样但工程上代价太大。假设载波在2.4GHz按照奈奎斯特采样定理采样率至少要4.8GHz以上还得留抗混叠滤波器的过渡带实际可能要到6GHz甚至更高。这种ADC价格昂贵、功耗惊人后端FPGA处理这么高的数据率也非常吃力。所以工程上普遍采用折中方案先用模拟混频把射频搬到几十兆到几百兆的中频在这个频率上采样采样率可能只需要几十兆到一两百兆ADC和FPGA都能承受这就是中频采样的现实意义。数字下变频DDCDigital Down-Conversion则是紧接着中频采样之后的数字处理环节。它的输入是ADC送来的中频采样序列输出是基带的I/Q两路信号并且采样率通常已经降到了与信号带宽匹配的程度。整个过程包含三个关键动作数字混频、低通滤波和抽取。数字混频负责把中频搬移到零频附近低通滤波负责滤除混频产生的高频分量和带外噪声抽取负责降低采样率、减少后续处理的数据量。这三步环环相扣任何一步参数没选好最后解调出来的星座图就会糊成一团。这套技术适合谁看如果你是通信、雷达、电子对抗、卫星导航、频谱监测方向的工程师或者正在做软件无线电、FPGA信号处理、ADC采集卡相关的项目那这篇文章里的内容你大概率用得上。如果你只是好奇“手机里的信号是怎么被处理的”也能从里面看到一条完整的信号链路是怎么搭起来的。我会尽量少堆公式多用工程视角讲清楚每个参数为什么这么选、每个坑是怎么踩出来的。2. 从模拟中频到数字基带整体链路的设计思路2.1 为什么选择中频采样而不是基带采样或射频采样接收机架构的选择本质上是在性能、成本、功耗和复杂度之间找平衡。基带采样要求I/Q两路模拟混频器把信号直接搬到零频然后分别采样。这种做法对模拟器件的匹配要求极高I/Q两路的增益误差和相位误差会直接变成镜像干扰而且直流偏移和低频闪烁噪声很难处理。射频采样则走向另一个极端对ADC要求太高目前只在少数窄带、低频场景下用得起。中频采样恰好落在中间。它只需要一次模拟混频把射频搬到一个合适的中频然后用一个ADC采样。中频的选择有讲究不能太低否则镜像频率离得太近模拟滤波器不好做也不能太高否则采样率跟着上去ADC和数字处理压力增大。常见的中频有70MHz、140MHz、180MHz、240MHz等这些数值不是随便定的往往和系统时钟、ADC采样率、滤波器可用带宽都有关系。注意中频采样时采样率的选择必须满足带通采样定理而不是简单的奈奎斯特低通采样定理。带通采样允许采样率低于信号最高频率的两倍只要信号带宽落在某个奈奎斯特区之内即可。2.2 带通采样定理的工程理解与参数计算带通采样定理的数学表述是对于一个带宽为B、中心频率为f0的带通信号采样率fs只要满足fs ≥ 2B并且f0落在某个合适的区间内就可以无混叠地恢复信号。具体来说存在一个整数n使得fs ≥ 2B n·fs - B ≤ f0 ≤ n·fs B这个n就是奈奎斯特区的编号。工程上我们通常希望采样率尽量低但又不能让信号跨在两个奈奎斯特区的边界上否则滤波器过渡带没法设计。举个例子中频f0 140MHz信号带宽B 20MHz。如果选fs 80MHz那么n 1时fs - B 60MHzfs B 100MHz140MHz不在这个区间n 2时2fs - B 140MHz2fs B 180MHz140MHz刚好落在边界上这很危险因为滤波器过渡带没有余量。如果选fs 100MHzn 1时区间是80~120MHzn 2时区间是180~220MHz140MHz落在两个区间之间不满足条件。如果选fs 120MHzn 1时区间是100~140MHz140MHz又在边界上。选fs 160MHzn 1时区间是140~180MHz140MHz在边界n 2时区间是300~340MHz也不合适。实际工程中我们通常会留20%以上的过渡带余量。比如选fs 92.16MHzn 2时2fs - B 164.32MHz2fs B 204.32MHz140MHz不在里面。选fs 61.44MHzn 2时2fs - B 102.88MHz2fs B 142.88MHz140MHz落在里面但离上边界只有2.88MHz余量太小。选fs 73.728MHzn 2时2fs - B 127.456MHz2fs B 167.456MHz140MHz在中间余量充足。这就是为什么很多通信系统里会出现61.44MHz、73.728MHz、92.16MHz、122.88MHz这类看起来奇怪的采样率——它们往往是系统时钟分频或特定中频优化后的结果。2.3 DDC在链路中的位置和核心任务DDC通常实现在FPGA或专用ASIC里紧跟在ADC后面。它的输入是中频采样序列输出是基带I/Q样本。整个DDC的核心任务可以拆成三件事第一数字混频。用一个本地振荡器NCO产生的复指数信号与输入实信号相乘把中频分量搬到零频附近。数学上就是乘以exp(-j·2π·f0·n/fs)得到的结果包含零频附近的基带分量和两倍中频附近的高频分量。第二低通滤波。混频后的信号里我们只关心零频附近的那部分两倍中频附近的分量必须滤掉。这个低通滤波器的截止频率通常设为信号带宽的一半阻带起始频率则要考虑到抽取后的混叠问题。第三抽取。滤波后的信号带宽已经变窄没必要保持原来的高采样率可以每隔M个点取一个点把采样率降到fs/M。抽取倍数M的选择要保证抽取后的采样率仍然大于信号带宽的两倍同时尽量降低数据率。这三步的顺序可以调整。常见的有先混频再滤波最后抽取也有先滤波再混频再抽取还有把滤波和抽取合并成多相滤波结构的。不同的顺序对应不同的资源消耗和性能表现后面会详细展开。3. 数字混频与NCO把中频搬到零频的关键一步3.1 数字混频的数学本质与实现方式数字混频说白了就是两个序列逐点相乘。输入是ADC采样的实信号x[n]NCO产生两路正交序列cos(ω0n)和sin(ω0n)相乘后得到I[n] x[n] · cos(ω0n) Q[n] -x[n] · sin(ω0n)这里ω0 2π·f0/fs是数字角频率。I和Q两路合起来就是复基带信号。理想情况下NCO的频率和输入中频完全一致混频后信号正好落在零频。如果NCO频率有偏差信号就会偏离零频后续低通滤波器可能把它滤掉一部分导致幅度下降和相位旋转。实现上NCO通常用相位累加器加查找表的方式。相位累加器每个时钟周期累加一个频率控制字FTW累加器的最高几位作为地址去查正弦/余弦表。FTW的计算公式是FTW round(f0 / fs · 2^N)其中N是相位累加器的位宽。比如fs 73.728MHzf0 140MHzN 32那么FTW round(140/73.728 · 2^32) ≈ round(1.8989 · 4294967296) ≈ 8155425792。这个数值直接决定了NCO的输出频率精度。位宽越大频率分辨率越高但查找表也越大。工程上常用16位或18位查找表配合相位抖动或泰勒插值来降低杂散。提示NCO的杂散性能直接影响DDC的输出信噪比。如果查找表地址位宽不够相位截断误差会产生周期性杂散落在信号带内就很难滤除。选NCO IP核时一定要看它的SFDR无杂散动态范围指标。3.2 混频器的资源消耗与优化技巧在FPGA里一个复数混频器需要四个实数乘法器x·cos、x·sin、以及可能的符号处理如果输入是实信号只需要两个乘法器。对于高采样率场景乘法器是稀缺资源需要优化。一种常见优化是利用对称性。如果NCO频率选为fs/4那么cos和sin序列会变成0、1、-1的循环乘法退化成加法和取反完全不需要乘法器。这就是所谓的“fs/4混频”技巧。很多通信系统故意把中频选在fs/4附近就是为了省乘法器。比如fs 73.728MHzfs/4 18.432MHz如果中频是140MHz那140/18.432 ≈ 7.6不是整数倍没法直接用。但如果选fs 560MHzfs/4 140MHz那就完美了。当然560MHz采样率对ADC和FPGA都是挑战所以实际中会折中。另一种优化是把混频和滤波合并。在多相滤波结构中混频可以吸收到滤波器的系数里相当于对滤波器系数做旋转。这样混频不需要单独的乘法器但滤波器系数变成复数资源消耗转移到滤波器上。哪种更省取决于具体的抽取倍数和滤波器阶数。3.3 NCO频率字计算与相位截断误差NCO的频率精度由相位累加器位宽决定。假设位宽是32位系统时钟100MHz那么频率分辨率是100MHz/2^32 ≈ 0.023Hz。这个精度远远超过大多数应用需求。但查找表地址通常只取高16位或18位低位被截断这就引入了相位截断误差。相位截断误差的表现是NCO输出频谱上出现杂散杂散间隔与截断位数有关。如果截断b位杂散会出现在k·fs/2^b的位置。比如fs 100MHz截断14位即查找表地址16位杂散间隔是100MHz/2^14 ≈ 6.1kHz。如果信号带宽是20MHz这些杂散大部分落在带外可以被低通滤波器滤掉。但如果信号带宽很窄比如只有几十kHz那杂散就可能落在带内影响解调性能。解决办法有三个一是增加查找表地址位宽代价是ROM容量指数增长二是使用泰勒级数插值用少量乘法器换精度三是使用相位抖动把周期性杂散打散成噪声。工程上常用的是第二种和第三种结合在资源和性能之间找平衡。4. 低通滤波与抽取数据率降下来的核心环节4.1 低通滤波器的设计指标怎么定DDC里的低通滤波器不是随便设个截止频率就行它的指标直接决定了整个接收机的选择性和抗混叠能力。设计时需要明确四个参数通带截止频率fp、阻带起始频率fst、通带波纹δp、阻带衰减δs。通带截止频率通常设为信号带宽的一半。比如信号带宽20MHzfp 10MHz。阻带起始频率要考虑抽取后的混叠。如果抽取倍数是M抽取后采样率是fs/M那么频率高于fs/(2M)的分量会混叠到带内。所以阻带起始频率必须小于fs/(2M)。为了留余量通常取fst fs/(2M) - Δf其中Δf是过渡带宽度。举个例子fs 73.728MHz信号带宽20MHz抽取倍数M 4抽取后采样率18.432MHz奈奎斯特频率9.216MHz。通带截止10MHz已经超过了9.216MHz这不行。所以要么减小信号带宽要么减小抽取倍数。如果信号带宽实际是16MHzfp 8MHzfst可以取8.5MHz过渡带0.5MHz。用等波纹设计法阻带衰减60dB通带波纹0.1dB滤波器阶数大概在60~80阶左右。这个阶数在FPGA里用FIR滤波器实现需要60~80个乘法器资源消耗不小。注意抽取后的奈奎斯特频率必须大于信号带宽否则带内信号会被混叠破坏。这是DDC设计中最容易犯的错误之一。很多人只记得采样定理要求fs ≥ 2B却忘了抽取后的采样率也要满足这个条件。4.2 抽取的两种实现方式直接抽取与多相滤波直接抽取最简单滤波后每隔M个点取一个点。但这样做有个问题——滤波器在抽取前的高采样率下工作每个时钟周期都要算一次卷积乘法器利用率很低。比如M 4滤波器每输出一个有效点实际上算了4次其中3次的结果被丢弃了。多相滤波解决了这个问题。它把滤波器系数按抽取倍数M分成M组每组系数对应一个相位。输入数据也按M个一组分块每组数据分别与对应的系数组做卷积然后求和。这样每个时钟周期只需要算一次卷积但卷积长度变成了原来的1/M乘法器数量也降到原来的1/M。代价是需要M个累加器和一个求和树但总体资源消耗大幅下降。多相滤波的数学推导这里不展开但工程上记住一个结论抽取倍数越大多相滤波的优势越明显。M 2时省一半乘法器M 4时省四分之三M 8时省八分之七。所以DDC里几乎都用多相结构除非抽取倍数很小或者资源极度充裕。4.3 半带滤波器与CIC滤波器的组合策略在实际DDC中抽取倍数往往很大比如从73.728MHz降到1.92MHz抽取倍数38.4不是整数。这时候通常分多级抽取每级抽取2倍或4倍最后再用一个分数倍抽取器。每一级的滤波器选择有讲究。第一级通常用CIC积分梳状滤波器。CIC不需要乘法器只需要加减法和寄存器非常适合高采样率的第一级抽取。但CIC的通带衰减比较大而且阻带衰减有限所以后面要跟一个补偿滤波器来修正通带响应。第二级或第三级用半带滤波器。半带滤波器的系数有一半是零乘法器数量减半而且通带和阻带对称设计起来很方便。半带滤波器适合2倍抽取多级级联可以实现4倍、8倍、16倍抽取。最后一级用普通FIR滤波器负责精确控制通带和阻带同时完成分数倍抽取。分数倍抽取通常用Farrow结构或多项式插值实现复杂度较高但只在低采样率下工作资源压力不大。这种“CIC 半带 FIR”的组合是DDC里最经典的架构几乎成了行业惯例。CIC负责粗抽取半带负责中等抽取FIR负责精细整形和分数抽取。每一级的抽取倍数和滤波器指标需要联合优化才能在不浪费资源的前提下达到想要的性能。5. 完整DDC的FPGA实现与参数计算实例5.1 系统参数定义与链路预算假设我们要设计一个用于频谱监测的DDC输入中频140MHz信号带宽20MHzADC采样率73.728MHz最终输出基带采样率1.92MHz输出I/Q两路16位数据。先算总抽取倍数73.728MHz / 1.92MHz 38.4。不是整数所以需要分数倍抽取。我们可以分解为38.4 4 × 4 × 2.4。前两级各4倍抽取最后一级2.4倍分数抽取。第一级4倍抽取输入73.728MHz输出18.432MHz。用CIC滤波器差分延迟1级数5抽取倍数4。CIC的通带衰减在8MHz处大约0.5dB需要后面补偿。第二级4倍抽取输入18.432MHz输出4.608MHz。用半带滤波器通带截止4MHz阻带起始4.608MHz - 4MHz 0.608MHz不对半带滤波器的阻带起始是fs/2 - fp这里fs 18.432MHzfs/2 9.216MHzfp 4MHz阻带起始9.216 - 4 5.216MHz。过渡带5.216 - 4 1.216MHz比较宽半带滤波器容易实现。第三级2.4倍分数抽取输入4.608MHz输出1.92MHz。用Farrow结构或多项式插值通带截止0.96MHz阻带起始1.92MHz - 0.96MHz 0.96MHz。过渡带很窄需要高阶FIR滤波器。5.2 各级滤波器系数生成与定点化CIC滤波器的系数全是1不需要生成。但CIC的增益很大需要右移截位。增益公式是G (M·D)^N其中M是抽取倍数D是差分延迟N是级数。这里M 4D 1N 5G 4^5 1024。输出需要右移10位相当于除以1024。右移会引入截断噪声通常用舍入而不是直接截断。半带滤波器的系数用MATLAB的fdesign.halfband生成或者用Python的scipy.signal.firwin配合半带约束。半带滤波器的阶数通常是偶数系数对称中间一个系数是0.5其余偶数位置系数为0。比如31阶半带滤波器只有16个非零系数。定点化时系数用16位有符号数表示范围-1到1量化步长2^-15 ≈ 3.05e-5。量化误差会导致阻带衰减下降通常需要仿真验证。最后一级FIR滤波器用fdesign.decimator生成指定分数抽取因子2.4。Farrow结构的系数需要单独计算通常用拉格朗日插值或样条插值。定点化时要注意插值系数的动态范围避免溢出。5.3 FPGA资源估算与时序收敛技巧整个DDC在FPGA里的资源消耗主要包括乘法器、加法器、寄存器和块RAM。粗略估算混频器2个实数乘法器如果不用fs/4技巧CIC0个乘法器5个积分器 5个梳状器约20个加法器半带滤波器16个乘法器31阶非零系数16个最后一级FIR假设64阶分数抽取用Farrow结构约32个乘法器NCO1个查找表16位地址16位数据约1Mb ROM或CORDIC约10个乘法器总计乘法器约50~60个对于中等规模FPGA如Xilinx Artix-7或Intel Cyclone V完全够用。块RAM主要用于NCO查找表和滤波器系数存储约2~3个18Kb块。时序收敛是高速DDC的难点。73.728MHz的时钟周期约13.56ns在7系列FPGA里一级乘法器加一级加法器的延迟约3~4ns所以组合逻辑不能太长。CIC的积分器工作在最高采样率需要流水线化。半带滤波器和FIR滤波器可以并行处理但求和树需要平衡。如果时序不满足可以在关键路径插入寄存器代价是增加延迟。提示CIC滤波器的积分器容易溢出因为它是累加器。位宽要足够大通常比输入位宽多log2(G)位。比如输入16位G 1024需要多10位即26位。实际设计中还会再留2~3位余量用28位或30位。6. 常见问题与排查技巧实录6.1 输出星座图旋转或发散怎么办这是DDC调试中最常见的问题。星座图旋转通常说明NCO频率有偏差或者I/Q两路增益不匹配。排查步骤第一检查NCO频率字计算是否正确。用公式FTW round(f0/fs · 2^N)重新算一遍确认没有算错。如果NCO频率偏了1kHz星座图就会以1kHz的速率旋转。第二检查I/Q两路是否对称。如果I路和Q路的滤波器系数不一致或者混频器的cos和sin查找表有幅度差异就会产生镜像干扰星座图会发散。可以用一个单频信号输入观察I/Q两路的幅度是否相等相位是否差90度。第三检查直流偏移。ADC的直流偏移经过混频后会变成零频附近的一个冲激落在信号带内就是固定方向的误差。可以在混频后加一个直流阻塞滤波器或者用高通滤波器去掉零频。6.2 抽取后信号混叠导致误码率升高混叠的表现是带外信号或噪声折叠到带内信噪比下降。排查方法在抽取前用频谱分析仪或FPGA内部的FFT观察滤波后的频谱确认阻带衰减是否足够。如果阻带衰减不够可能是滤波器阶数太低或者定点化量化误差太大。另一个常见原因是抽取倍数选得太大导致抽取后的奈奎斯特频率小于信号带宽。比如信号带宽20MHz抽取后采样率30MHz奈奎斯特频率15MHz小于20MHz必然混叠。这时候要么减小抽取倍数要么减小信号带宽。还有一种隐蔽的混叠CIC滤波器的阻带衰减不够。CIC的阻带衰减随频率增加而改善但在靠近通带的地方衰减很小。如果信号带宽接近CIC的通带边缘混叠会很严重。解决办法是在CIC后面加一个补偿滤波器或者改用更高阶的CIC。6.3 NCO杂散落在信号带内怎么处理NCO杂散通常来自相位截断和查找表量化。如果杂散落在信号带内解调性能会明显下降。处理方法第一增加查找表地址位宽。从16位增加到18位杂散间隔从fs/2^16降到fs/2^18杂散更容易被滤掉。代价是ROM容量增加4倍。第二使用泰勒插值。在查找表输出后加一级一阶或二阶插值用少量乘法器换精度。一阶插值可以把杂散降低20dB左右二阶插值可以降低40dB。第三使用相位抖动。在相位累加器的低位加一个伪随机序列把周期性杂散打散成白噪声。这样杂散不再集中在特定频率而是均匀分布在频谱上对信号的影响小很多。第四改用CORDIC算法。CORDIC不需要查找表用迭代旋转计算cos和sin杂散性能比查找表好但延迟大、吞吐率低。适合低采样率场景。6.4 常见问题速查表问题现象可能原因排查方法解决措施星座图旋转NCO频率偏差检查FTW计算重新计算频率字星座图发散I/Q增益或相位不平衡输入单频信号观察I/Q校准增益和相位信噪比下降抽取混叠观察抽取前频谱减小抽取倍数或提高滤波器阶数带内杂散NCO相位截断改变NCO频率观察杂散增加查找表位宽或加抖动输出溢出CIC增益过大检查位宽增加位宽或右移截位时序不收敛组合逻辑太长查看时序报告插入流水线寄存器7. 几个容易被忽略的工程细节7.1 采样时钟抖动对中频采样的影响ADC的采样时钟抖动会直接转化为采样时刻的误差表现为信噪比下降。对于中频采样时钟抖动的要求比基带采样更严格因为中频频率高同样的时间抖动对应更大的相位误差。信噪比下降的公式是SNR -20·log10(2π·f0·σt)其中f0是中频σt是时钟抖动的RMS值。比如f0 140MHzσt 1psSNR -20·log10(2π·140e6·1e-12) ≈ -20·log10(8.8e-4) ≈ 61dB。如果σt 10psSNR降到41dB。所以中频采样系统里时钟源的选择非常关键通常要用低抖动的晶振或时钟芯片抖动控制在100fs到1ps之间。7.2 多通道DDC的同步问题在相控阵雷达或多通道接收机里多个DDC通道需要严格同步。同步包括两个方面采样时钟同步和NCO相位同步。采样时钟同步靠时钟分配网络保证NCO相位同步靠复位信号或同步脉冲保证。如果NCO相位不同步通道间的相位差会随时间变化导致波束指向漂移。解决办法是用一个公共的同步信号同时复位所有NCO的相位累加器或者用同一个NCO输出分发到所有通道。后者更简单但需要确保分发路径的延迟一致。7.3 定点化过程中的位宽增长与截位策略DDC链路里信号每经过一级处理位宽都会增长。混频后位宽增加1位乘法结果CIC后增加log2(G)位FIR后增加log2(阶数)位。如果不加控制位宽会迅速膨胀消耗大量寄存器资源。截位策略有两种一种是每级都截位保持位宽恒定另一种是只在最后截位中间保持全精度。前者节省资源但引入截断噪声后者性能好但资源消耗大。工程上通常折中在CIC后截位一次因为CIC增益大截位噪声相对小在FIR后截位一次因为FIR输出就是最终结果。中间级尽量保持全精度。截位时要用舍入而不是直接截断。直接截断会引入直流偏移因为负数截断后偏向负无穷。舍入可以用“加0.5再截断”实现或者用收敛舍入。FPGA里通常用“加半个LSB再右移”的方式资源消耗很小。7.4 测试验证用单频和扫频信号检查DDC性能DDC设计完成后必须经过充分测试。最基础的测试是用单频信号输入观察输出I/Q的幅度和相位。如果输入频率正好等于NCO频率输出应该是直流如果输入频率偏了1kHz输出应该是1kHz的正弦波。通过改变输入频率可以测量DDC的通带响应和阻带衰减。扫频测试更全面。用信号发生器从低频到高频扫一遍记录输出幅度画出频率响应曲线。重点看通带波纹、阻带衰减和过渡带宽度是否符合设计指标。如果发现某段频率衰减不够可能是滤波器系数有问题或者定点化误差太大。还有一种测试是用宽带噪声输入观察输出频谱。噪声输入可以同时激励所有频率用FFT分析输出频谱可以快速看到整个频带的响应。这种方法比扫频快但精度稍低。8. 写在最后的一些个人体会DDC这东西理论看起来不复杂但真正做起来坑都在细节里。我见过太多人把滤波器阶数算对了、抽取倍数选对了结果因为NCO频率字少算了一位或者CIC位宽不够溢出调试了好几天。也见过有人为了省乘法器把半带滤波器阶数砍得太狠结果阻带衰减只有30dB带外信号全混进来了。我的经验是DDC设计一定要留余量。滤波器阶数留20%余量位宽留2~3位余量NCO查找表地址留2位余量。这些余量在仿真时可能看不出差别但在实际信号环境里就是能不能稳定工作的分界线。另外定点化仿真一定要做用MATLAB或Python把定点链路跑一遍和浮点结果对比确认信噪比损失在可接受范围内。这一步花的时间比在FPGA里调试省下来的时间多得多。最后分享一个小技巧如果时序实在收敛不了可以把DDC拆成两级中间加一个异步FIFO。第一级工作在高速时钟第二级工作在低速时钟。这样每级的组合逻辑都短时序容易满足。代价是FIFO的延迟和资源但比起重新设计架构这个代价小得多。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑