做ADC/DAC相关开发,最容易被绕进去的就是DDC、DUC、采样率、数据率这一堆概念。尤其是刚从单片机裸采模式切到高速采集系统时,很多人会问:为什么ADC明明是1G采样率,输出到FPGA里面数据率却只有100M?为什么同样的DAC,别人能输出中心频率500M的信号,我这边只能出个几十M的正弦波?这些问题看着是软件配置问题,根子上其实是概念没串起来。我做了几年混合信号链路设计,踩过不少坑,这篇就把这几个概念一次性说清楚,顺带把工程上怎么计算、怎么避坑也讲透。
这套知识不只是做通信基带的人需要,凡是涉及软件无线电、频谱仪、波形发生器、数据采集卡、雷达中频处理的人,都会碰到。看完这篇,你至少能自己算出系统需要多大的传输带宽,能看懂DDC/DUC的配置参数到底在调什么,也能在PCB布局和时钟设计上少走几轮改板的弯路。
1. 先把名字搞清楚:DDC、DUC、采样率、数据率到底在说什么
1.1 采样率和数据率,很多人一开始就搞混了
采样率是ADC或者DAC在单位时间内对模拟信号采样的次数,单位是SPS(Samples Per Second),也可以写成Hz。注意,这里的“Hz”指的是每秒采样多少个点,不是信号的频率。比如一个ADC标称1GSPS,意思是每秒采集10亿个样本点。
数据率是单位时间内从ADC输出或者送入DAC的数据量,单位是bit/s(bps),工程上更常用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,插值提速,再把零频信号搬移到中频,最后以高采样率送给DAC,DAC把数字信号恢复成模拟波形。
这套链路里,采样率、数据率、DDC/DUC的值都要匹配好,任何一环不匹配,要么丢数据,要么频谱镜像,要么信号带外噪声超标。后面各章就逐个拆开讲。
2. 采样率的选择:不是越高越好,也不是越低越省
2.1 奈奎斯特定理怎么用:从实信号到复信号
采样率选择的理论基础是奈奎斯特定理:采样率必须大于信号最高频率的两倍,才能无混叠地恢复信号。对实信号来说,信号带宽是正频率那一侧,从0到f_max,所以采样率必须大于2倍f_max。
但你要是做过接收机,会看到一种用法:输入信号中心频率500MHz,带宽20MHz,ADC采样率才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采样率1GSPS,12bit,片内或FPGA内做抽取倍数为32的DDC,那么I/Q各路的输出采样率是1GHz/32=31.25MHz,也就是3125万样本/秒。如果I/Q各自量化位宽是16bit,那I/Q两路合计数据率是31.25M×16×2=1000Mbps,也就是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×12bit=19.2Gbps,JESD204B输出线速率为每通道约21.5Gbps(考虑8b/10b编码开销)。这个速率普通的FPGA SerDes是能收,但后续处理资源消耗非常大。
FPGA里先做DDC,把中心频率在1.2GHz、带宽50MHz的信号搬移到基带,抽取倍数设为16,这样输出采样率是100MHz。I/Q各16bit,数据率变成100M×16×2=3.2Gbps。相比原始的19.2Gbps,降低了6倍。如果有多个通道,可以在DDC输出后再做一次通道化的信道化滤波,把50MHz带宽分成多个子带,每个子带再降低数据率,后续检测算法压力会进一步减小。
5.3 数据率太高怎么办:JESD204B、LVDS、并行CMOS选哪个
不同数据率对应不同的传输接口方案。低速场景,比如几十MSPS、12bit以内,并行CMOS接口足够,优点是简单、延迟低,缺点是引脚多、只能短距离传输。中速场景,几十到几百MSPS,LVDS是常见选择,差分信号抗干扰能力好,引脚数也比并行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的采样时钟如果没做好,后面软件里怎么调都补不回来。设计早期就要把时钟抖动预算算清楚,而不是等板子回来实测不合格再去救。时钟抖动这个坑,我见过太多团队在上面反复翻车,浪费了好几版改板周期。
最后再分享一个实用技巧:设计调试过程中,每次修改寄存器或者滤波器系数,都要记录下修改前后的频谱截图和数据率计算表。很多怪问题不是当场出现的,是某个参数改完之后隔几个时钟周期才爆出来的。没有记录,排查起来就是大海捞针;记录齐全,基本都能顺着链路逐级回退找到根因。