ARTICLE DETAIL

资讯详情

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

ADC/DAC链路核心概念:DDC、DUC、采样率与数据率全解析

ADC/DAC链路核心概念:DDC、DUC、采样率与数据率全解析 做ADC/DAC相关开发最容易被绕进去的就是DDC、DUC、采样率、数据率这一堆概念。尤其是刚从单片机裸采模式切到高速采集系统时很多人会问为什么ADC明明是1G采样率输出到FPGA里面数据率却只有100M为什么同样的DAC别人能输出中心频率500M的信号我这边只能出个几十M的正弦波这些问题看着是软件配置问题根子上其实是概念没串起来。我做了几年混合信号链路设计踩过不少坑这篇就把这几个概念一次性说清楚顺带把工程上怎么计算、怎么避坑也讲透。这套知识不只是做通信基带的人需要凡是涉及软件无线电、频谱仪、波形发生器、数据采集卡、雷达中频处理的人都会碰到。看完这篇你至少能自己算出系统需要多大的传输带宽能看懂DDC/DUC的配置参数到底在调什么也能在PCB布局和时钟设计上少走几轮改板的弯路。1. 先把名字搞清楚DDC、DUC、采样率、数据率到底在说什么1.1 采样率和数据率很多人一开始就搞混了采样率是ADC或者DAC在单位时间内对模拟信号采样的次数单位是SPSSamples Per Second也可以写成Hz。注意这里的“Hz”指的是每秒采样多少个点不是信号的频率。比如一个ADC标称1GSPS意思是每秒采集10亿个样本点。数据率是单位时间内从ADC输出或者送入DAC的数据量单位是bit/sbps工程上更常用MB/s或者Gbps。它和采样率的关系很简单数据率 采样率 × 单样本位宽 × 通道数如果做复数处理还得乘以2。这么一乘很多人才意识到麻烦来了一个12bit、1GSPS的ADC光数据输出就是12Gbps普通并行CMOS接口根本扛不住所以才需要用JESD204B之类的高速串行接口。很多人把采样率和数据率混为一谈其实是把“模拟采样”和“数字传输”两个环节没分开。ADC内部完成的是模拟到数字的转换每个样本点变成一串二进制码采样率描述的是这个转换发生的快慢数据率描述的是这些二进制码搬运出去的速度。换个直白的说法采样率是“每秒包多少个饺子”数据率是“每秒把多少斤饺子搬上车”两者不是一回事。1.2 DDC和DUC是干什么的DDC全称Digital Down Converter数字下变频。DUC全称Digital Up Converter数字上变频。这两个名字里都有“变频”但本质上它们不是简单的频率搬移而是采样率变换和频率变换的组合。在接收链路里ADC采样到的往往是中频信号比如70MHz或者140MHz。希望后端FPGA或者DSP处理的是基带信号频率越低、数据率越小越好。DDC干的事情就是把中频信号搬移到零频附近然后通过抽取滤波把数据率降下来让后端处理器轻松点。在发射链路里则反过来。DAC要输出中频或者射频信号但FPGA里DDS或者基带处理产生的数据率往往不够高而且信号在零频附近。DUC干的事情就是把基带信号通过插值滤波把采样率抬上去再把信号搬移到期望的中频然后交给DAC输出。所以DDC和DUC本质上是一对互逆操作一个负责接收端“降速搬频”一个负责发射端“提速搬频”。理解了这一点后面看原理框图就顺了。1.3 一条链路串起所有概念用一个完整的收发链路来串联这些概念会清楚很多天线收到射频信号经过LNA放大、混频器下变频到中频再经过抗混叠滤波器进入ADC。ADC以某一个采样率对中频信号采样输出高速并行数据。这时候数据率通常很高进入FPGA后先接入DDC模块DDC把信号频谱从某个中频搬到零频再做抽取降速这样送到后端解调器的数据率就大大降低了。发射方向完全对称FPGA里的基带信号先经过DUC插值提速再把零频信号搬移到中频最后以高采样率送给DACDAC把数字信号恢复成模拟波形。这套链路里采样率、数据率、DDC/DUC的值都要匹配好任何一环不匹配要么丢数据要么频谱镜像要么信号带外噪声超标。后面各章就逐个拆开讲。2. 采样率的选择不是越高越好也不是越低越省2.1 奈奎斯特定理怎么用从实信号到复信号采样率选择的理论基础是奈奎斯特定理采样率必须大于信号最高频率的两倍才能无混叠地恢复信号。对实信号来说信号带宽是正频率那一侧从0到f_max所以采样率必须大于2倍f_max。但你要是做过接收机会看到一种用法输入信号中心频率500MHz带宽20MHzADC采样率才250MHz。这不违反奈奎斯特定理吗不违反因为这里用的是带通采样或者说欠采样。带通采样允许采样率在2倍信号带宽以上而不是2倍最高频率以上前提是信号本身是窄带的并且频谱搬移后不会和别的频段重叠。这就引出第二个关键点数字系统里面信号不一定非要表示成实信号。IQ两路、每路都是实数合在一起就是一个复信号。复信号的频谱可以只占据正频率一侧所以复信号采样时采样率和信号带宽的关系是采样率大于信号带宽即可不需要大于两倍带宽。这也是为什么DDC输出通常是I/Q两路数据率直接减半因为复数表示天然利用了频谱的对称性。2.2 过采样和欠采样为什么发射端反而喜欢高采样率在实际系统里ADC的采样率选择往往是一个折中。采样率太高数据率爆炸后端存储和处理压力剧增采样率太低抗混叠滤波器的过渡带设计极其痛苦。碰到的真实案例曾经做一个1MHz带宽的中频采集按照奈奎斯特最低要求选择2.5MHz采样率模拟端的抗混叠滤波器要做得很陡峭五阶椭圆滤波器都压不住带外噪声最后还是老老实实提高到10MHz采样滤波器一阶RC就够用虽然数据率多了四倍但整体设计难度下降了一个数量级。这就是过采样带来的工程红利。在DAC发射端过采样同样重要。如果DAC的采样率只比输出信号最高频率高一点点那么DAC输出端对镜像抑制滤波器的要求会非常苛刻。但如果DAC采样率远高于信号频率镜像频率离有用信号很远用一个简单的低通或者带通滤波器就能滤干净成本和设计难度都大幅降低。欠采样则主要用于接收端窄带信号的高频数字化比如直接采样中频甚至射频。省掉了一级模拟混频器简化了链路但是会引入噪声折叠的问题对ADC前面的抗混叠滤波器要求高同时对时钟抖动更加敏感。2.3 采样率变化引起的数据率膨胀问题ADC的输出数据率在大多数情况下会和采样率成正比。如果一个ADC固定12bit、1GSPS数据率就是12Gbps。如果只想要其中20MHz带宽的信号直接把这12Gbps全送到FPGA里大部分算力都浪费在噪声和带外信号上了。DDC的价值就在这里先混频把关心的频段搬到零频再用低通滤波器滤掉带外部分最后抽取降速。抽取系数是100的话数据率就从12Gbps降到120Mbps。遇到过一个真实案例一个多通道采集系统4片ADC并行每片1GSPS/14bit不做DDC直接把数据全部存下来DDR3的带宽被吃干榨净而且里面真正有用的信号带宽只有5MHz。后来改成每通道先做DDC抽取把数据率降到20MSPS左右存储压力下降了50倍后端分析程序跑起来也流畅了很多。所以DDC的核心价值不只是把频率搬下来更是把“没有信息量的带宽”扔掉让数据率匹配实际需要的信号带宽。3. DDC是怎么工作的混频、NCO、抽取滤波3.1 数字下变频的基本框架DDC的标准结构包含三大部分数控振荡器NCO、混频器、抽取滤波器组。输入是中频数字信号输出是I/Q两路基带信号数据率由抽取倍数决定。工作流程是这样的NCO产生本振信号输出cos和sin两路正交分量输入的实数中频信号分别和cos、sin相乘得到I路和Q路的混频结果混频后的信号频谱被搬移到零频附近但同时也包含了高频分量所以需要通过低通滤波器滤除滤波后的数据再经过抽取器每隔D个点取一个点数据率降为原来的1/D。这个过程中混频器是频率搬移低通滤波器是抗混叠滤波抽取器是降速。三者配合才完整实现“数字下变频”。为什么不直接在数字域用带通滤波器把要的频段滤出来然后再搬到零频顺序不同结果是一样的但工程实现上先混频再低通更简单因为低通滤波器设计比带通滤波器容易得多而且NCO的频率分辨率做得很灵活可以精确对准任意中心频率。3.2 NCO与混频为什么要把信号搬到零中频NCO全称Numerically Controlled Oscillator数字控制振荡器。它的本质是一个相位累加器加一个正余弦查找表输入频率控制字输出对应频率的正余弦序列。频率精度可以做得很高32位相位累加器的情况下如果系统时钟是100MHz频率分辨率大约是0.023Hz足够精细。NCO输出和输入信号相乘从时域看是两个序列对应相乘从频域看是频谱卷积实现频谱搬移。如果NCO频率和输入信号的中心频率完全一致搬移后信号的中心正好落在DC这就是零中频方案。这里有一个工程细节必须注意NCO的频率控制字一旦设定理论上输出频谱是一条干净的谱线但实际实现中由于相位截断和幅度量化会产生杂散。相位累加器位数大、查找表深度够杂散就低。一般要求较高的系统NCO的杂散要控制在-90dBc以下这就要靠加抖动dithering或者更高精度的查找表来实现。混频器本身在数字域就是乘法器没有什么取舍空间但要注意数据位宽的增长。两个12bit数据相乘结果是24bit如果不做截位直接累加位宽一路涨上去后端资源和存储都是问题。所以每级滤波器之后都要做合理的截位处理截位策略直接影响最终信噪比和杂散。3.3 抽取滤波器先滤波再抽取顺序不能反抽取是每隔D个点保留一个点如果先抽取再滤波会在抽取过程中把高频分量折叠到低频造成混叠这个时候再滤波已经救不回来了。所以正确的顺序是先低通滤波把不需要的高频分量干掉再做抽取。抗混叠滤波器的截止频率必须低于抽取后采样率的一半这样才能确保抽取后没有频谱混叠。抽取滤波器的实现有几种方式。最简单的是FIR低通滤波器然后每隔D个点输出一次经典但乘法资源消耗较大。工程上更常用级联积分梳状滤波器CIC作为第一级抽取因为CIC不需要乘法器只用加法器和延迟器特别适合大倍数抽取比如抽取倍数大于8甚至大于32的场景。CIC的缺点是通带不够平坦带内容易有下垂所以后面往往还要接一级FIR补偿滤波器把通带拉平。遇到过CIC参数没配好导致信号幅度严重失真的情况。CIC的增益会随着抽取倍数和级数急剧上升如果中间级没做好位宽扩展和溢出保护信号直接削顶。解决方法是按照公式估算CIC增益给中间寄存器留足余量输出再做归一化。3.4 DDC输出数据率到底怎么算DDC输出的数据率计算公式很简单输出数据率 ADC采样率 / 抽取倍数。但因为是I/Q两路总数据率要乘以2同时字长按输出位宽算。举个例子ADC采样率1GSPS12bit片内或FPGA内做抽取倍数为32的DDC那么I/Q各路的输出采样率是1GHz/3231.25MHz也就是3125万样本/秒。如果I/Q各自量化位宽是16bit那I/Q两路合计数据率是31.25M×16×21000Mbps也就是125MB/s。可以看到相比ADC原始输出的12Gbps数据率降了12倍这个量级FPGA处理起来就轻松多了。做系统设计的时候可以根据这个公式倒推目标信号带宽是多少DDC输出采样率就至少要是信号带宽的2倍复信号理论下限是1倍带宽但实际工程一般留1.2到2倍余量输出采样率定了抽取倍数就定了抽取倍数定了滤波器阶数和计算量就能估出来。整个链路的数据率预算就这么顺下来了。4. DUC是怎么工作的插值、滤波、上变频4.1 数字上变频的结构DUC的结构是DDC的镜像对称输入低采样率的基带I/Q信号经过插值滤波器把采样率提高到DAC要求的值再经过NCO混频把信号搬移到中频最后输出给DAC。插值和抽取刚好反过来抽取是隔D取一插值是相邻点之间插入D-1个零。但直接补零会产生镜像频谱所以插值之后必须接低通滤波器滤除镜像分量。这个过程也解释了为什么DUC里一定要放滤波器不是可有可无的东西。DUC输出端的采样率通常就等于DAC的采样率。比如DAC工作时钟是500MHz输入DUC的基带数据是50MHz那么插值倍数就是10倍。DAC按照500MHz的速率把数字序列变成模拟波形由于镜像频谱已经被插入滤波器滤掉输出就能得到干净的中频信号。4.2 半带滤波器和CIC滤波器怎么选DUC里面的插值滤波器最常用的是半带滤波器Half-Band Filter和CIC滤波器。半带滤波器有一个特点约一半的系数为零所以乘法器资源消耗减少一半非常适合2倍插值的场景。如果插值倍数是2的幂次就可以级联多个半带滤波器比如8倍插值就是3级半带滤波器串联每一级负责2倍插值。如果插值倍数更大或者非2的幂次比如3倍、5倍、7倍半带滤波器就不适用了这时候用CIC插值滤波器更合适。CIC插值滤波器和CIC抽取滤波器一样不需要乘法器结构对称但存在通带下垂的问题所以需要在CIC后面加一级FIR补偿滤波器。实际工程项目里的建议是2倍插值用半带滤波器大倍数插值用CIC加FIR补偿的组合。如果对带外抑制要求不高甚至可以用CIC单独完成插值但这样输出频谱的带外噪声会比较明显发射信号可能会过不了频谱模板。4.3 DUC输出数据率和DAC采样率的匹配DUC输出数据和DAC之间的接口理论上只要数据率匹配就行。但工程上还有几个细节要注意。第一个是位宽匹配。DUC输出的数据位宽要和DAC输入口位宽一致不一致时要么截位要么补零。截位会带来信噪比损失补零则会白白浪费DAC的动态范围。所以FPGA里DUC的最终输出级要根据DAC的有效位数做合理的饱和和截位处理。第二个是时序对齐。DAC通常要求数据在时钟上升沿或者下降沿稳定有效如果FPGA和DAC之间有走线延迟差异需要用IO延时或者FPGA内部的输出寄存器把每个bit对齐否则会出现数据建立保持时间不够输出波形出现毛刺或乱码。第三个是模式选择。现代DAC往往支持两种接口模式并行数据和带内帧同步、JESD204B串行数据。高速DAC基本都用JESD204B了这时候DUC输出就不光是数据还要组织成JESD204B帧格式加入控制位和校验位。做DUC的时候要把这部分开销也算进链路预算里。5. 数据率的工程计算与传输带宽估算5.1 从采样率到数据率一个公式走天下工程上数据率的计算不复杂关键是理清楚每一级的变化。级联链路中每一级的采样率、位宽、通道数都可能不同逐级相乘就能得到每一级接口上的数据率。我习惯用一张简单的表来做链路预算每一行代表一级处理列分别是采样率、位宽、I/Q路数、通道数最后一列是数据率。逐级往下填哪里成了瓶颈一目了然。设计评审的时候这表一亮基本没人会质疑数据链路算没算清楚。一个常见的隐藏问题是FPGA内部总线位宽和接口位宽不一致。比如内部用64bit总线但接口是32bit需要在内部做位宽转换和缓存。如果没做异步FIFO跨时钟域处理数据就会乱。所以数据率计算还必须考虑时钟域ADC送过来的数据和FPGA内部处理时钟往往不是一个频率缓存深度要按最大突发长度来预估。5.2 真实系统举例1GSPS ADC数据率怎么一步步降下来拿一个用ADC12DJ3200双通道、每通道1.6GSPS、12bit做雷达中频采集的项目举例。ADC原始输出数据率单通道1.6G×12bit19.2GbpsJESD204B输出线速率为每通道约21.5Gbps考虑8b/10b编码开销。这个速率普通的FPGA SerDes是能收但后续处理资源消耗非常大。FPGA里先做DDC把中心频率在1.2GHz、带宽50MHz的信号搬移到基带抽取倍数设为16这样输出采样率是100MHz。I/Q各16bit数据率变成100M×16×23.2Gbps。相比原始的19.2Gbps降低了6倍。如果有多个通道可以在DDC输出后再做一次通道化的信道化滤波把50MHz带宽分成多个子带每个子带再降低数据率后续检测算法压力会进一步减小。5.3 数据率太高怎么办JESD204B、LVDS、并行CMOS选哪个不同数据率对应不同的传输接口方案。低速场景比如几十MSPS、12bit以内并行CMOS接口足够优点是简单、延迟低缺点是引脚多、只能短距离传输。中速场景几十到几百MSPSLVDS是常见选择差分信号抗干扰能力好引脚数也比并行CMOS少一半但走线长度依然受限。高速场景超过1Gbps的数据率主流方案就是JESD204B。它是基于SerDes的串行接口一个通道就能跑几Gbps通道数可以做lane的合并。JESD204B的优势是引脚极大减少支持多芯片同步内建确定性延迟机制非常适合多通道同步采集系统。但代价是链路建立过程复杂需要配置寄存器、做时钟对齐、处理错误报告调试难度比并行接口高不少。选择接口方案的时候除了看数据率还得看是否有同步要求。多片ADC严格同步时JESD204B的SYSREF信号设计和PCB等长布线会占掉很大一部分调试时间这项成本经常在项目初期被低估。6. 硬件上要注意的坑时钟抖动、电源噪声与PCB布局6.1 时钟抖动对ADC/DAC信噪比的影响很多人调完DDC/DUC参数发现信噪比上不去第一反应是改滤波器系数实际上问题很可能出在采样时钟上。ADC的采样时钟抖动会在采样点上引入时间不确定性体现在频谱上就是噪声抬高直接恶化信噪比。时钟抖动ADC的退化很简单SNR劣化幅度约等于2π×f_in×t_jitter其中f_in是输入信号的频率t_jitter是采样时钟的RMS抖动。同样一个1ps抖动的时钟采样100MHz信号时影响忽略不计采样1GHz信号时理论上能引入约25dB的SNR恶化这是致命的。所以高速ADC采样时钟必须选低抖动时钟源比如专用的时钟芯片或OCXO。有些工程师喜欢用FPGA的PLL输出做ADC采样时钟做低速系统没问题做高速系统就不建议了FPGA的PLL抖动通常在几百飞秒到几皮秒级别会直接限制系统动态范围。无源晶振虽然便宜但抖动和频率稳定度都比较差只适合低速非精密系统。实际选型还有个折中时钟芯片的抖动越低功耗和价格越高。需要根据系统目标SNR反推允许的最大抖动再做选型而不是盲目买最贵的。6.2 电源噪声怎么侵入信号链路ADC/DAC对电源噪声非常敏感。电源上的纹波会通过芯片内部的基准、比较器、输出驱动级耦合到信号通路表现为输出频谱上的杂散和噪声平底上升。尤其是开关电源的开关频率谐波很容易在ADC输出频谱里看到频率甚至能精确对应到开关管频率。经验性的做法是ADC/DAC的模拟电源优先用LDO不要直接用DCDC。DCDC负责把压差大、转换效率要求高的场景处理好后面再串一级LDO给模拟电路供电电源抑制比会好很多。用LDO也要注意输出电容和PCB上去耦电容的组合LDO本身有环路带宽限制对高频纹波的抑制能力有限还是需要靠高频去耦电容。电源分区上模拟电源和数字电源要分开走尽量不要共用同一片铜皮。如果空间受限必须公地也要保证数字地和模拟地在ADC的地焊盘下方单点相连不要让数字电流流过模拟电路的地回路。6.3 PCB布局三个要点地平面分割、去耦电容、时钟走线PCB布局这块我从几个高采样率项目中总结了三个最关键的要点其他的按参考设计抄就行。地平面分割是第一重点。ADC/DAC的模拟地和数字地在低频段可以直接共用一个完整的地平面但在高频段完整地平面比分隔地更好。过分割反而会导致回流电流被迫绕路形成地环路天线。正确做法是模拟部分和数字部分布置在芯片两侧地平面不分割只通过芯片下方的焊盘自然形成低阻抗回流路径。去耦电容是第二重点。每个电源引脚放置0.1uF和0.01uF高频电容再在芯片周围放2-4个10uF储能电容。电容必须靠近电源引脚放置走线要先过电容再到电源引脚不要先到引脚再串到电容否则去耦效果大打折扣。时钟走线是第三重点。采样时钟线不能和数字数据线平行走尤其不能靠得太近。时钟线尽量走内层两侧用地包围形成隔离。时钟线到ADC时钟引脚的距离越短越好尽量避免过孔和拐弯。如果需要多个ADC共享同一参考时钟要保证时钟分路器的各输出到ADC的走线等长否则通道间会有固定相位差影响同步。6.4 数据漂移和ADC端口保护的两个工程经验数据漂移是很多人调ADC时很头疼的问题表现是零点或者满幅值缓慢变化不稳定。排查方向一般是三个温漂、基准源漂移、输入共模电压不稳定。温度变化引起的漂移是物理特性选低温漂基准和低温度系数电阻能明显改善。输入共模电压不稳定往往是因为前端驱动放大器输出共模不对需要看ADC的数据手册对输入共模的要求加一个共模反馈电路或者隔直电容解决。ADC端口保护也别忽视。ADC的输入引脚很脆弱静电或者过压很容易打坏。输入端要加TVS管和串联限流电阻。TVS管的结电容会影响高频信号所以高速场景要选低结电容型号串接的限流电阻取值不能太大否则和ADC内部采样电容形成RC低通会限制输入带宽。有一个项目ADC刚上电就坏了好几片后来查出来是前端运放的电源先于ADC建立瞬间把高电压灌进了ADC输入端。解决方式是加电源时序控制或者用先限幅再进ADC的保护电路。7. 常见问题排查与经验7.1 频谱上出现杂散先查哪里ADC输出频谱出现异常杂散排查顺序不要乱最容易判断的先查耗时间的放后面。先后做四个方向的排查采样时钟是否干净、输入信号是否过载、电源上是否有异常的开关噪声、FPGA接收侧有没有丢bit或者时序错位。采样时钟的问题用频谱仪直接看时钟源的相位噪声最直接。输入过载则可以通过减小输入信号幅度来快速判断如果减小幅度后杂散消失说明信号链路上某级饱和了。电源问题可以拿示波器看模拟电源纹波重点看是否有和杂散频率一致的波动。FPGA时序问题则用ILA抓原始数据看是否有跳码也有可能是LVDS或JESD204B的均衡参数没调好。排查杂散时有个技巧把杂散的频率换算成和采样率、输入频率的关系。如果杂散频率等于输入信号和本振频率的混频产物那是混频器或DDC的镜像抑制问题如果杂散频率等于采样时钟谐波和输入信号之和或差那就是模拟前端非线性的谐波失真。按频率关系分门别类方向能少走一半。7.2 不知道采样率的情况下怎么根据已知频率求频谱收到过很多私信问不知道ADC采样率怎么算信号频率这个问题单独抛出来很容易让人懵但实际上是要区分几种情况。如果已知输出序列和真实信号的频率关系可以用过零检测或者FFT的峰值bin反推先对采集的离散序列做FFT找峰值对应的bin序号k那么信号的数字频率就是k/N归一化频率真实的模拟频率f_signal和采样率f_sample的关系就是f_signal k/N × f_sample。前提是采样率已知。如果采样率未知但已知一个参考信号的频率那就可以用已知频率信号来校准采样率。用同一个ADC采集已知频率为f_ref的信号测出它在FFT的bin位置k_ref那么采样率f_sample f_ref × N / k_ref。这个方法校准精度取决于FFT点数和窗函数加窗后精度能到千分之一左右。还有一种情况是采样率未知、信号频率也未知只能通过多组不同采样率下测得的混叠频率来反推。先用采样率f1得到一个混叠频率再换采样率f2得到另一个用最小公倍数和差频关系列出方程求解。这个方法很费劲能用前面两个方法就不要用第三个。7.3 滤波函数怎么选移动平均、中值滤波、一阶低通做ADC数据采集免不了写软件滤波。不管是单片机上的裸代码还是FPGA里的滤波器都要先想清楚要滤掉的是什么类型的噪声。移动平均适合滤除白噪声和周期性噪声缺点是通带不太平坦阶数越高滞后越大。中值滤波适合滤除脉冲型毛刺比如工业现场电磁干扰导致的偶发跳变一个窗口内取中值能干净利落干掉孤立毛刺但对高斯噪声效果一般。一阶低通滤波也叫指数平均实现最简单代码就一行y y_prev alpha×(x - y_prev)alpha越小滤波越强、响应越慢。实际使用中建议两级组合先做一次中值滤波去掉脉冲毛刺再做一次移动平均或者一阶低通平滑剩下的高斯噪声。这样既不会因为毛刺把平均值拉偏又能把噪声底压下去。还有一点就是滤波会引入延时如果是实时闭环控制要评估滤波延时可接受不能为了平滑把系统相位裕量吃掉。硬实时系统里我一般优先用移动平均因为FIR的群延迟是固定的不做浮点也能用整数移位实现。一阶低通虽然更平滑但相位特性会随频率变化闭环系统里容易引入不稳定因素。8. 写在最后的小经验整套ADC/DAC链路做下来我最大的体会是先画链路图再动手。不要一上来就对着寄存器手册配置参数先把信号从模拟输入到ADC到DDC到后处理或者反过来从FPGA到DUC到DAC到模拟输出每一级的采样率、位宽、数据率、接口格式全部标清楚。哪里匹配不上哪里是瓶颈一目了然。另一个比较重要的经验是时钟是整个系统的心脏。ADC/DAC的采样时钟如果没做好后面软件里怎么调都补不回来。设计早期就要把时钟抖动预算算清楚而不是等板子回来实测不合格再去救。时钟抖动这个坑我见过太多团队在上面反复翻车浪费了好几版改板周期。最后再分享一个实用技巧设计调试过程中每次修改寄存器或者滤波器系数都要记录下修改前后的频谱截图和数据率计算表。很多怪问题不是当场出现的是某个参数改完之后隔几个时钟周期才爆出来的。没有记录排查起来就是大海捞针记录齐全基本都能顺着链路逐级回退找到根因。
返回列表