说实话,做硬件和FPGA的人,迟早都得跟这一串词打交道:ADC、DAC、DDC、DUC、采样率、数据率。我第一次接触数字中频接收机项目时,看到链路图上一堆缩写,以为是什么黑魔法,后来才发现它们解决的都是同一个核心问题:模拟信号进了数字世界之后,数据量太大、搬不动、处理不了,得想办法在最合适的位置上“减负”或者“提速”。这篇文章就把这几个概念放在一条完整的信号链里讲清楚,适合刚接触软件无线电、数字中频处理,或者被FPGA接口时序折腾到头秃的工程师参考。
采样率、数据率、DDC、DUC这四个词,单独拆开都好理解,放在一起就容易绕。我尽量用项目里的真实场景把它们串起来,讲清楚从前端ADC采完样之后,到数据真正能送进解调器或者DAC之前,那一大段“看不见的搬运和加工”到底发生了什么。
1. 采样率和数据率不是一回事,先把这个最基础的公式装进脑子
很多人一开始把采样率和数据率混着说,其实它们是两个维度完全不同的东西。ADC的采样率(Sample Rate,通常写作fs)指的是每秒对模拟信号采多少个点,单位是SPS(Samples Per Second),比如100MSPS就是每秒采1亿次。数据率(Data Rate)指的是这些采样点转换成比特之后,每秒需要传输或者存储多少位,单位是bps,比如1Gbps。
它们之间差着一个“位宽”的系数,而且这个系数往往不是字面上的ADC位数那么简单,实际算起来至少有四层:
- 单个采样的位宽:一个14bit的ADC,每个采样点就是14比特,这是最直观的系数。
- 通道数:双通道同时采样,数据率直接翻倍。
- I/Q双路系数:数字下变频输出I路和Q路两路数据,每路都带着完整的信息,后面处理时这两路都必须保留,所以总数据率会再乘一个2。
- 接口上的额外开销(有时容易被忽略):高速ADC普遍用JESD204B这类串行接口输出数据,协议本身会带控制字节、尾随位和同步开销,有效数据率还要乘一个链路层系数(类似8b/10b或者64b/66b编码后的冗余)。工程上估算时不能假装这部分不存在,否则布线层数和FPGA引脚数量都会算错。
所以ADC输出数据率的估算公式可以写成:
数据率(bps) = 采样率(SPS) × 单通道位宽(bit) × 通道数 × I/Q双路系数 × 链路编码开销
举一个实际例子:某双通道14bit ADC,工作在250MSPS,直接输出单通道数据率就是250M × 14 = 3.5Gbps,双通道就是7Gbps。这个量级的数据流已经不是很轻松的LVDS信号能搞定的了,所以现在主流方案都会考虑用JESD204B SerDes接口、高速串行收发器,或者干脆在芯片内部就先做DDC降速。
那么普普通通一路窄带信号,为什么非要把数据率搞得这么高?这个问题才是理解DDC和DUC价值的钥匙。
再补一个常见误区:采样率高,不代表每个采样点的有效信息量都那么大。比如你的信号带宽只有2MHz,ADC用100MSPS在采,这意味着每个采样点之间强相关,信息冗余极大。采样率的本质是“时间分辨能力”,数据率的本质是“传输/处理压力”,这两个参数可以在数字域里解耦——这正是DDC和DUC存在的意义。
2. 为什么好好的一段数字信号非要搬个家?DDC和DUC诞生的工程背景
上一节说了一个现象:ADC出来数据率可能非常高,但信号有效带宽往往没那么宽。更根本的问题是,接收机或者发射机的工作频率不一定落在基带。
我们先回想一下传统的超外差模拟接收机链路:天线进来一个射频信号,先用低噪声放大器放大,再跟本振做模拟混频,落到一个较低的中频(IF),经模拟带通滤波器选频之后,再送到后面的解调电路。这种做法在模拟域做了很多事,但模拟器件有温漂、本振泄漏、镜像干扰、I/Q幅度相位失配等一连串问题,调试起来相当考验运气。
数字中频接收机的思路是另一条路:射频信号先经过模拟下变频到某个中频,然后直接用ADC在这个中频上采样,采完的数字信号里包含完整的频谱信息,之后所有“搬频”和“滤波”动作都在数字域完成。这时DDC(Digital Down Converter,数字下变频器)就登场了,它的任务有两步,一是把中心频率落在某个中频位置的信号搬到零中频基带,二是把不需要的高频分量滤掉,同时把采样率降下来,从而把数据率降到后端处理模块能接受的程度。
那发射端呢?DAC要产生一个中心频率可能非常高的中频或者射频信号,总不能直接拿基带的低速数据流去驱动DAC。DUC(Digital Up Converter,数字上变频器)做的是相反的事:先把低速基带I/Q信号通过内插把采样率拉高,再用数控振荡器把频谱搬到期望的载频位置,最后送给DAC产生模拟信号。这样可以省掉好几级模拟混频和滤波器,让发射链路的大部分频率搬移工作都发生在数字域,模拟部分只需要处理一小段干净的目标信号。
打个比方,DDC和DUC像是一个数字域里的“频谱搬运工”,搬家的代价是计算量和滤波器设计,收益是系统灵活性大幅提升、模拟器件数量大幅减少、温度漂移和本振泄漏问题得到有效控制,而且只要改动软件里的频点配置,一套硬件就能覆盖很宽的频段范围。软件无线电(SDR)能做得那么灵活,底层靠的就是这一对数字变频器。
说到这里你需要记住一点:DDC不是“一个芯片”,DUC也不只是“一段代码”,它们更像是一组多速率信号处理流程的名字。搞清楚这组流程里的细节,才能真正理解为什么ADC/DAC的采样率和系统数据率可以解耦,也才能在设计里做出合理的资源取舍。
3. 解构DDC数字下变频的三大动作:混频、抽取、滤波
DDC内部基本由三块组成:数控振荡器NCO加数字混频器、抽取滤波器组、以及最后的输出整形/转格式逻辑。这里面的每一步都决定了最终数据率是多少。
3.1 NCO加混频:把中频信号搬到基带
NCO(Numerically Controlled Oscillator)实质上就是一个数字本振,它通过相位累加器查正弦表生成本地参考信号。数字混频器把ADC采进来的数字信号跟NCO产生的正弦和余弦序列相乘,得到I路和Q路两路基带信号。这里的核心就是:ADC采进来的实信号经过混频之后,频谱从原来的中频位置被搬到了零频附近,同时产生了一个“差频”和“和频”分量,后面滤波会把和频分量滤掉。
NCO输出频率的计算公式是:
f_out = (FCW / 2^N) × fclk
其中FCW是频率控制字,N是相位累加器位宽,fclk是NCO工作时钟。比如fclk=100MHz,N=32,想输出25MHz本振,FCW就是25M × 2^32 / 100M ≈ 1.0737e9。这个频率要设置得很准,否则搬移完的基带信号中心频率会偏移,后续解调就会出问题。
这里面有个实际项目很容易踩的坑:ADC的采样率是fs,NCO频点并不是简单地等于“中频频率”本身。因为带通采样会把高频信号折叠到第一奈奎斯特区(0到fs/2之间),比如ADC采样率80MSPS、中频70MHz的信号,采样后实际出现在10MHz这个位置。NCO应该设在10MHz而不是70MHz,如果按70MHz去配,出来的不是基带信号,而是一个错位的乱频谱。我见过有人在这里调了一整天,最后发现是NCO配错了频率。
3.2 抽取:为什么每N个点留一个就能降低数据率,但不能硬抽
抽取是多速率信号处理里最核心的一步。假设输入采样率是fs,抽取因子是D,输出采样率就是fs/D。直观理解就是每D个采样点里保留一个、丢掉D-1个,数据率自然降下来了。
但抽取不能硬来。直接丢点会导致频谱混叠:输入信号里本来位于输出采样率一半以外的频率分量,会被折叠进保留的频段里,成为无法滤除的干扰。所以抽取前必须先经过抗混叠滤波器,把不需要的带外信号和噪声滤干净,再做抽取。在DDC的典型实现里,这个滤波器不是只有一级,而是一个三级结构:
- 第一级通常是CIC滤波器,结构简单,适合做大的抽取倍数,比如从几十倍到上百倍的抽取,但是它的通带不平坦,带外抑制能力弱,通常配合后面的补偿滤波器使用。
- 第二级是半带滤波器,专门做2倍抽取,通带和过渡带设计得对称,算力效率很高,适合逐级降采样。
- 第三级是一般FIR滤波器,用来做精细的带宽整形和补偿CIC带来的通带滚降。
为什么要这么分层?因为如果一个FIR滤波器要同时实现大的抽取倍数和好的抗混叠性能,阶数会高到FPGA里的乘法器扛不住,延迟和资源都不可接受。CIC不需要乘法器,半带滤波器系数有一半是零,FIR只负责最后一点精雕细琢,三级搭配是几十年来数字中频设计的经典方案。
3.3 DDC输出数据率的实际估算
直接算一组数。设ADC采样率100MSPS,位宽16bit,DDC抽取因子D=50,那么输出采样率是2MSPS,I/Q两路各2MSPS,总数据率:
2M × 16 × 2 = 64Mbps
而ADC直接输出的原始数据率是100M × 16 = 1.6Gbps。DDC一次把数据率压了将近25倍,FPGA后续解调、同步、均衡模块处理的数据量就完全不是一个量级了。
这里有个容易被忽略的细节:抽取后单路信号“采样率”降到了接近信号带宽的两倍,但数据率里面始终带着I和Q两个通道,所以基带数据率仍然是2×采样率×位宽。如果你负责接口设计,只算了单路数据率,那I/Q两路的数据线分配就全错了。
4. DUC数字上变频是DDC的镜像,但它的坑不太一样
DUC的内部动作跟DDC正好反过来,核心也是三件事:内插、滤波、搬频。
4.1 内插和镜像抑制:把采样率拉高的第一道坎
DUC的输入是低速的基带I/Q信号,比如每路10MSPS。目标是把采样率变成80MSPS去驱动DAC。第一步就是内插:在两个采样点之间插入L-1个零值。插零本身不改变频谱形状,但会让原始基带频谱在输出采样率fs_out的整数倍位置产生一系列镜像副本,这些镜像不滤掉,DAC重构出来的模拟信号就会带着一坨刺眼的杂散。
所以内插之后紧接着就是镜像抑制滤波器,通常也是多级实现,每级做2倍或3倍内插。滤波器的作用是把原始采样率整数倍处的镜像一个一个滤掉,最终只留下目标频段内的频谱。这里面最容易出问题的是内插前就得先做带宽限制:基带信号本身的带宽必须小于内插后采样率的一半,否则内插之后镜像会和原信号重叠,再好的滤波器也救不回来。
实际操作里,DUC链路前端通常先有一个插值滤波器或成形滤波器把信号带宽约束住,再进入正式的内插流水线。
4.2 上变频搬移:把基带信号搬到中频
内插把采样率提上去之后,下一步就是用NCO加数字混频把信号频谱从零频搬到期望的中频或射频位置。这个动作和DDC的混频本质相同,但方向相反:DDC是向下搬再到基带,DUC是向上搬到中频。
搬完之后,多数DUC还会把I/Q两路合并成一路实信号输出给DAC,合并方式是把I路乘余弦、Q路乘正弦之后相加。这一步信号从复信号变成实信号,频谱上会变成关于奈奎斯特频率对称的形式,所以DAC输出之后需要在模拟域再加一级带通滤波器,把负频率镜频和带外杂散滤掉。
4.3 DUC里的数据率变化
同样用具体数字算一遍。输入I/Q各10MSPS,每路16bit,数据率是10M × 16 × 2 = 320Mbps。内插8倍之后采样率变成80MSPS,单路实信号数据率变成80M × 16 = 1.28Gbps。看起来数据率反而被拉高了,但这正是DUC的意义:把DAC需要的、时间分辨率足够高的数字序列造出来,才能在模拟域重构出中心频率和目标带宽都正确的信号。
DUC和DDC坑的方向也不一样。DDC的坑主要在NCO频率设置和抽取前滤波不干净导致的混叠;DUC的坑则主要集中在内插滤波器设计不当导致镜像抑制不够、以及I/Q两路不平衡在中频位置产生本振泄漏。所以调DUC时,频谱仪往往比示波器更管用——看带外镜像,一下就能判断滤波器设计有没有到位。
5. 把采样率、DDC、DUC、数据率放进一条真实链路里算一遍
前面分开讲了每个模块,这一节把它们完整串起来。假设一个典型的数字中频接收机:
- 模拟前端把射频信号下变频到中频70MHz;
- 目标信号带宽5MHz;
- ADC采样率选80MSPS,位宽14bit。
- 后面FPGA里用DDC把中频信号搬到基带,再滤出这5MHz的信号。
先看ADC输出的原始数据率:80M × 14 = 1.12Gbps,这是一条相当高的数字流,直接用CMOS接口会占用大量引脚,高速SerDes都嫌浪费。
再看信号带宽5MHz,理论上基带采样率只需要10MSPS就能完整保留信息(奈奎斯特最低要求)。那么DDC的抽取因子可以选D=8,输出采样率正好是10MSPS。I/Q两路都按14bit算,DDC输出总数据率是:
10M × 14 × 2 = 280Mbps
和前面的1.12Gbps相比,降低了四倍。如果信号带宽再窄一些,比如2MHz,D=16,输出采样率5MSPS,总数据率只有140Mbps。整个解调器、均衡器、帧同步模块的处理时钟和存储深度需求都会显著下降,FPGA资源预算可以留出很大余量。
我一般会把这个链路做成一张表,方便在不同方案间对比:
| 链路节点 | 采样率(MSPS) | 位宽(bit) | 通道/支路 | 数据率(Mbps) | 说明 |
|---|---|---|---|---|---|
| ADC输出 | 80 | 14 | 1 | 1120 | 中频采样数据流 |
| DDC混频后 | 80 | 14 | I/Q | 2240 | 两路数据同时存在 |
| DDC抽取滤波后 | 10 | 14 | I/Q | 280 | 输出给基带处理 |
| 后端解调输入 | 10 | 14 | I/Q | 280 | 与DDC输出一致 |
实际工程里做FPGA链路预算时,表的最后一行还有可能继续降采样,比如符号速率只有1MSymbol/s,抽取到2MSPS甚至更低。每降一次,数据率再缩一半。这就是为什么DDC是接收机里最值得精打细算的部分——它决定了后面所有模块的带宽压力。
选型方面也有一个经验:如果用的是集成射频收发机芯片(比如AD9361这类内部自带DDC/DUC的器件),抽取倍数是按内部配置组合给的,灵活度有限,但胜在链路已经调通,适合快速出原型。如果自己用FPGA做DDC/DUC,Xilinx和Intel的FIR Compiler、CIC Compiler、NCO IP都是现成的,可以自由组合抽取倍数和带宽,灵活性高但调试工作量也大,尤其是多级滤波器的级联参数要反复验算。
6. 概念之外的几个深坑:时钟抖动、电源噪声和有效位数
从概念回落到电路上,最后聊几个测试和调试时特别容易犯迷糊的点。这些坑和数据率、采样率看着不直接相关,实际上影响非常大。
6.1 采样时钟抖动对高频信号的SNR是灾难
ADC采样时钟不是理想脉冲,它存在孔径抖动(aperture jitter),会让每次采样的时间点有微小随机偏差。输入信号频率越高,同样的时间误差对应的相位误差越大,输出SNR越低。工程上有个简化公式:
SNR(dB) ≈ 20log10(1 / (2π × f_in × t_jitter))
如果时钟抖动是100fs,输入信号f_in=100MHz时,算下来SNR理想上限约84dB;但f_in上升到1GHz时,同样的抖动把SNR压到约64dB,直接掉了20dB。这还没考虑时钟本身的相位噪声和电源耦合进来的毛刺。
所以凡是涉及高中频采样或DAC重构高频信号的设计,采样时钟的选型和布局都不能马虎:时钟源尽量用低相位噪声的晶振/锁相环,时钟线要短、要包地、要远离数字数据线,最好走专用参考时钟层。我见过一个项目,ADC本身选的型号很好,但时钟布线跨了分割平面,导致输出频谱里多出好几个近端杂散,折腾了很久才发现是布局的问题。
6.2 电源噪声和PCB布局怎么影响链路而不是只影响理论
ADC/DAC供电噪声会直接调制到采样/重构的信号上,表现为杂散和底噪抬升。实际布局里我常用的做法是:
- 模拟电源和数字电源物理分开铺铜,模拟地/数字地在ADC下方单点连接,不要形成地环路;
- ADC/DAC的AVDD和DVDD引脚各自接独立的LDO输出,避免开关电源纹波直接串进来;
- 参考电压引脚的去耦电容要尽可能靠近器件,一般放0.1uF加1uF/10uF组合,走线短而粗;
- 高速数字数据线不要跟采样时钟并行走,垂直穿层也比平行好;
- DAC输出的模拟信号走线尽量短,后级滤波器的接地要干净。
这些不是玄学,是真正能决定你看到的是标称位数还是ENOB的项目经验。
6.3 ENOB不等于标称位数:数据率按多少算才合理
芯片手册上写14bit,不代表高频输入下你还能有14bit的SINAD有效位数。ENOB(Effective Number of Bits)是实测的有效位数,跟输入频率强相关:
ENOB = (SINAD(dB) - 1.76) / 6.02
一颗标称14bit的ADC在10MHz输入下ENOB可能有12.5bit,但如果拿到500MHz输入下,ENOB可能掉到10bit。做链路预算时如果按标称14bit去算信噪比和动态范围,系统性能预期会严重失真。我一般会在方案设计阶段就直接查器件手册里的ENOB曲线,按实际使用频点的ENOB来算数据率和动态范围,这样到了整机联调阶段就不会因为某个指标差几个dB而到处怀疑。
用ENOB去做数据率估算也是一个道理:既然有效位数可能只有10~12bit,那DDC输出的位宽保留太多其实也不一定有意义,反而增加FPGA资源浪费。省下来的乘法器和BRAM留给后面的处理算法才是更划算的取舍。
一点个人经验
这几个概念看起来枯燥,但把它们放在一条链路里想清楚之后,很多硬件和FPGA的沟通问题都能提前化解。我踩过不少坑,最大的一个体会是:拿到一个新方案,先算出每个节点的数据率,再定FPGA的接口、存储和时钟方案,往往能避开一多半后期返工。DDC和DUC不是万能的,但采样率、位宽、抽取/内插倍数一旦匹配好,整套系统的数据流就像调好的流水线一样顺滑。建议你用本文里的表格模板,把自己的参数代进去算一遍,很多“为什么这里数据率这么高”“为什么这块FPGA资源不够”的问题会瞬间清晰。