ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

从采样率到DDC/DUC:数字中频信号链中的数据率优化与FPGA工程实践

从采样率到DDC/DUC:数字中频信号链中的数据率优化与FPGA工程实践 说实话做硬件和FPGA的人迟早都得跟这一串词打交道ADC、DAC、DDC、DUC、采样率、数据率。我第一次接触数字中频接收机项目时看到链路图上一堆缩写以为是什么黑魔法后来才发现它们解决的都是同一个核心问题模拟信号进了数字世界之后数据量太大、搬不动、处理不了得想办法在最合适的位置上“减负”或者“提速”。这篇文章就把这几个概念放在一条完整的信号链里讲清楚适合刚接触软件无线电、数字中频处理或者被FPGA接口时序折腾到头秃的工程师参考。采样率、数据率、DDC、DUC这四个词单独拆开都好理解放在一起就容易绕。我尽量用项目里的真实场景把它们串起来讲清楚从前端ADC采完样之后到数据真正能送进解调器或者DAC之前那一大段“看不见的搬运和加工”到底发生了什么。1. 采样率和数据率不是一回事先把这个最基础的公式装进脑子很多人一开始把采样率和数据率混着说其实它们是两个维度完全不同的东西。ADC的采样率Sample Rate通常写作fs指的是每秒对模拟信号采多少个点单位是SPSSamples 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价值的钥匙。再补一个常见误区采样率高不代表每个采样点的有效信息量都那么大。比如你的信号带宽只有2MHzADC用100MSPS在采这意味着每个采样点之间强相关信息冗余极大。采样率的本质是“时间分辨能力”数据率的本质是“传输/处理压力”这两个参数可以在数字域里解耦——这正是DDC和DUC存在的意义。2. 为什么好好的一段数字信号非要搬个家DDC和DUC诞生的工程背景上一节说了一个现象ADC出来数据率可能非常高但信号有效带宽往往没那么宽。更根本的问题是接收机或者发射机的工作频率不一定落在基带。我们先回想一下传统的超外差模拟接收机链路天线进来一个射频信号先用低噪声放大器放大再跟本振做模拟混频落到一个较低的中频IF经模拟带通滤波器选频之后再送到后面的解调电路。这种做法在模拟域做了很多事但模拟器件有温漂、本振泄漏、镜像干扰、I/Q幅度相位失配等一连串问题调试起来相当考验运气。数字中频接收机的思路是另一条路射频信号先经过模拟下变频到某个中频然后直接用ADC在这个中频上采样采完的数字信号里包含完整的频谱信息之后所有“搬频”和“滤波”动作都在数字域完成。这时DDCDigital Down Converter数字下变频器就登场了它的任务有两步一是把中心频率落在某个中频位置的信号搬到零中频基带二是把不需要的高频分量滤掉同时把采样率降下来从而把数据率降到后端处理模块能接受的程度。那发射端呢DAC要产生一个中心频率可能非常高的中频或者射频信号总不能直接拿基带的低速数据流去驱动DAC。DUCDigital Up Converter数字上变频器做的是相反的事先把低速基带I/Q信号通过内插把采样率拉高再用数控振荡器把频谱搬到期望的载频位置最后送给DAC产生模拟信号。这样可以省掉好几级模拟混频和滤波器让发射链路的大部分频率搬移工作都发生在数字域模拟部分只需要处理一小段干净的目标信号。打个比方DDC和DUC像是一个数字域里的“频谱搬运工”搬家的代价是计算量和滤波器设计收益是系统灵活性大幅提升、模拟器件数量大幅减少、温度漂移和本振泄漏问题得到有效控制而且只要改动软件里的频点配置一套硬件就能覆盖很宽的频段范围。软件无线电SDR能做得那么灵活底层靠的就是这一对数字变频器。说到这里你需要记住一点DDC不是“一个芯片”DUC也不只是“一段代码”它们更像是一组多速率信号处理流程的名字。搞清楚这组流程里的细节才能真正理解为什么ADC/DAC的采样率和系统数据率可以解耦也才能在设计里做出合理的资源取舍。3. 解构DDC数字下变频的三大动作混频、抽取、滤波DDC内部基本由三块组成数控振荡器NCO加数字混频器、抽取滤波器组、以及最后的输出整形/转格式逻辑。这里面的每一步都决定了最终数据率是多少。3.1 NCO加混频把中频信号搬到基带NCONumerically Controlled Oscillator实质上就是一个数字本振它通过相位累加器查正弦表生成本地参考信号。数字混频器把ADC采进来的数字信号跟NCO产生的正弦和余弦序列相乘得到I路和Q路两路基带信号。这里的核心就是ADC采进来的实信号经过混频之后频谱从原来的中频位置被搬到了零频附近同时产生了一个“差频”和“和频”分量后面滤波会把和频分量滤掉。NCO输出频率的计算公式是f_out (FCW / 2^N) × fclk其中FCW是频率控制字N是相位累加器位宽fclk是NCO工作时钟。比如fclk100MHzN32想输出25MHz本振FCW就是25M × 2^32 / 100M ≈ 1.0737e9。这个频率要设置得很准否则搬移完的基带信号中心频率会偏移后续解调就会出问题。这里面有个实际项目很容易踩的坑ADC的采样率是fsNCO频点并不是简单地等于“中频频率”本身。因为带通采样会把高频信号折叠到第一奈奎斯特区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位宽16bitDDC抽取因子D50那么输出采样率是2MSPSI/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目标信号带宽5MHzADC采样率选80MSPS位宽14bit。后面FPGA里用DDC把中频信号搬到基带再滤出这5MHz的信号。先看ADC输出的原始数据率80M × 14 1.12Gbps这是一条相当高的数字流直接用CMOS接口会占用大量引脚高速SerDes都嫌浪费。再看信号带宽5MHz理论上基带采样率只需要10MSPS就能完整保留信息奈奎斯特最低要求。那么DDC的抽取因子可以选D8输出采样率正好是10MSPS。I/Q两路都按14bit算DDC输出总数据率是10M × 14 × 2 280Mbps和前面的1.12Gbps相比降低了四倍。如果信号带宽再窄一些比如2MHzD16输出采样率5MSPS总数据率只有140Mbps。整个解调器、均衡器、帧同步模块的处理时钟和存储深度需求都会显著下降FPGA资源预算可以留出很大余量。我一般会把这个链路做成一张表方便在不同方案间对比链路节点采样率(MSPS)位宽(bit)通道/支路数据率(Mbps)说明ADC输出801411120中频采样数据流DDC混频后8014I/Q2240两路数据同时存在DDC抽取滤波后1014I/Q280输出给基带处理后端解调输入1014I/Q280与DDC输出一致实际工程里做FPGA链路预算时表的最后一行还有可能继续降采样比如符号速率只有1MSymbol/s抽取到2MSPS甚至更低。每降一次数据率再缩一半。这就是为什么DDC是接收机里最值得精打细算的部分——它决定了后面所有模块的带宽压力。选型方面也有一个经验如果用的是集成射频收发机芯片比如AD9361这类内部自带DDC/DUC的器件抽取倍数是按内部配置组合给的灵活度有限但胜在链路已经调通适合快速出原型。如果自己用FPGA做DDC/DUCXilinx和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_in100MHz时算下来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有效位数。ENOBEffective 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资源不够”的问题会瞬间清晰。
返回列表