拓十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

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

AD9833 DDS谐波分析与滤波:从FFT测量到低通滤波器设计

AD9833 DDS谐波分析与滤波:从FFT测量到低通滤波器设计

第一次把AD9833焊到转接板上,SPI打通,频率寄存器写进去,示波器探头往VOUT上一搭,很多人会愣一下——说好的正弦波呢?屏幕上是一根带着台阶感的曲线,边缘毛毛糙糙,顺手打开FFT更扎心:基频旁边竖着好几根尖峰,二次、三次,还有几个叫不上名字的毛刺。这不是芯片坏了,也不是焊接温度把内部DAC烫伤了,这是DDS方案天生自带的一套“谐波交响乐”。

AD9833这颗芯片,便宜、低功耗、三线SPI就能控制,做函数发生器、扫频源、阻抗测量激励源都很方便。但几乎每个第一次用的人都会在波形质量上栽跟头,最后要么把问题归咎于“芯片精度不行”,要么盲目堆一堆滤波器。其实谐波的来源是有规律可循的,可以测量、可以分类、可以估算,也可以在设计阶段就把它压到你能接受的水平。这篇文章就把我从踩坑到摸清门道的完整过程写出来,包括谐波从哪里来、怎么用FFT给谐波“定性”、滤波器该怎么选怎么算,以及整个排查链路里最容易忽略的几个细节。

1. 从一颗0.1Hz起步的DDS芯片讲起:AD9833到底是什么

1.1 三行代码能跑起来的信号源,输出却从来不“教科书”

AD9833是ADI出的一颗直接数字频率合成器芯片,供电2.3V到5.5V都能跑,主时钟最高25MHz,频率寄存器28位,所以在25MHz参考时钟下,理论频率分辨率能到0.1Hz量级。它内部集成了一个10位的DAC,可以输出正弦、三角波、方波三种基本波形,控制只需要三根线的SPI(FSYNC、SCLK、SDATA),所以单片机资源占用非常小。

很多人把这颗芯片当“高级函数发生器”用,觉得只要把频率字写进去,VOUT引脚就应该出来一条干净光滑的正弦曲线。实际上不是。你看到的是一个被DAC离散重建出来的阶梯状信号,阶梯的密度等于主时钟频率除以输出频率,每个台阶上还有毛刺和过冲。如果直接接示波器看,在低频段还能勉强看出正弦轮廓,频率一高到几MHz,波形就开始“脏”得厉害。

这里要先建立一个基本认知:AD9833的输出质量不是由“波形好不好看”决定的,而是由频谱里除了基频之外还剩多少能量决定的。时域上的一点点台阶感,放到频域里可能就是一串可观的谐波和杂散。理解了这一点,后面所有的分析才有意义。

1.2 内部五个环节,每一个都在“制造”麻烦

DDS的工作链路大概是这样的:相位累加器不断累加频率控制字,产生一个线性增长的相位值;这个相位值被截断后去查正弦查找表;查出来的数字幅度送到DAC;DAC输出模拟台阶信号;最后经过外部低通滤波器变成平滑波形。

这五个环节里,至少三个会主动贡献谐波或杂散。相位累加器是28位,但查找表的地址只用了高12位,被丢掉的那16位会周期性累积误差,形成相位截断杂散;DAC本身有积分非线性和差分非线性,会把误差映射成固定的二次、三次谐波;零阶保持输出在频域上有一个sin(x)/x的包络,虽然对高频有衰减,但也会带来镜像混叠问题。

打个比方,DDS的方案本身是“音源干净”,但后面跟着一个离散化的功放,输出端再不做处理的话,喇叭里出来的声音肯定不可能是纯粹的。这个“功放”就是DAC的量化、截断和保持机制。所以你一开始就应该预期:AD9833的裸输出一定是有谐波的,区别只在于多和少、能不能被你的应用接受。

1.3 谐波到底算不算“失真”:先建立一个底层的判断框架

在很多人的直觉里,“谐波”和“失真”是一回事,但对DDS来说,这两者要分开看。谐波是指出现在基频整数倍位置上的能量,比如2MHz主频旁边的4MHz、6MHz;失真则是更广义的概念,包含谐波、非谐波杂散、相位噪声、噪声地板等所有偏离理想信号的东西。

AD9833的裸输出里,谐波主要由DAC非线性决定,这部分相对稳定,只要芯片没坏、电源干净,每次测出来的差别不大。非谐波杂散则很“调皮”,它由相位截断产生,会随着你设置的频率字不同而在频谱上到处移动,有时候离主频很近,滤波器根本压不掉。噪声地板则由量化噪声、参考时钟抖动、PCB布局、电源纹波共同决定。

后面的章节会反复用到这个框架:看到频谱上某根峰,先判断它是谐波、是相位截断杂散、还是混叠镜像,然后再决定用滤波器还是改频率字去处理。判断错了,方案就全错了。

2. 别急着滤波,先做一次规范的FFT测量给谐波“定性”

2.1 示波器FFT的设置习惯:窗函数、平均次数和RBW

很多人在示波器上随便按一下FFT按钮,看到几根峰就开始调滤波器,这是最要命的工作方式。示波器的FFT不是给你看的“大概图”,它的读数是否可信,完全取决于你设置得对不对。

我习惯的做法是:AD9833输出端接50欧终端电阻,再用同轴电缆进示波器,探头用×10挡并先做补偿校准。FFT模式下,窗函数选汉宁窗(Hanning)或者平顶窗(Flat Top),点数拉到示波器支持的最大值,比如1M点以上,平均次数开16到64次。这样做的原因是,AD9833的谐波和杂散往往比较微弱,如果只用单次FFT,噪声地板会很高,很多-50dBc级别的分量会被淹没。

RBW这个概念也要有数。示波器FFT的频率分辨率取决于采样率和FFT点数,点数越多,越能分辨离得很近的两根峰。相位截断杂散经常出现在离主频只有几百赫兹或者几kHz的地方,如果RBW太粗,你会看到一根粗粗的“山包”,还以为就是一个普通谐波,实际上里面藏着好几根尖峰。

还有一个硬限制要提前知道:普通8位示波器的ADC有效位数有限,FFT动态范围一般也就45到55dB。也就是说,低于-50dBc的分量读数可信度已经不高,-60dBc以下基本就是噪声底。想认真评估谐波,最好用12位以上高分辨率示波器、频谱仪,或者把信号接到高分辨率ADC上做软件FFT。我用很多次8位示波器测谐波,测出来的二次谐波数值每次都不一样,后来才明白是示波器自身动态范围太差。

2.2 谐波、杂散、噪声地板怎么区分

做FFT测量时,基频峰值先归一化成0dB,然后观察其他分量。判断规则其实很简单:出现在2f、3f、4f这些基频整数倍位置上的,叫谐波;不出现在整数倍位置上的,叫非谐波杂散;那些铺满整个底部的、上下浮动很大的,是噪声地板。

THD(总谐波失真)是把所有谐波能量加起来和基频比;SFDR(无杂散动态范围)是看整段频谱里除了基频之外最高的那根峰,不管是谐波还是杂散,比基频低多少dB。对AD9833来说,SFDR通常比THD更值得关注,因为相位截断杂散往往比高次谐波更扎眼。

我实测下来,AD9833在几百kHz到1MHz输出频段,二次谐波典型在-45到-50dBc,三次谐波在-50到-55dBc,再高次的谐波量级就小很多了。非谐波杂散的位置和幅度则和频率控制字强相关,有些频率字下杂散能到-50dBc,换个频率字可能就掉到-60dBc以下。所以你在网上看到的“AD9833失真只有-XXdB”这类说法,脱离测量条件和频率字去谈,没有任何参考价值。

2.3 时域波形能告诉你的和不能告诉你的

经常有人贴示波器时域截图问我:“这个波形是不是谐波太大?”说实话,光看时域波形很难判断谐波严重程度。一个带阶梯感的波形,可能谐波只有-45dBc;一个看起来挺圆润的波形,可能因为滤波器把高次压了,但二次谐波仍然很大。人眼对正弦波形的“圆润度”判断,和频谱里的THD数值并不是线性对应关系。

时域里真正有用的信息是两类:一是波形边缘有没有明显振铃和过冲,这通常指向输出级阻抗不匹配、探头补偿不对、或者后级放大器带宽不足;二是波形有没有叠加周期性毛刺,这可能来自数字串扰、电源反冲或者接地环路。这些问题在频域里表现为宽带噪声或某些固定频率尖峰,但在时域里更容易定位到电路层面。

想看谐波对时域的具体影响,有个好办法:把输出信号同时采进高分辨率ADC,在DSP里把理想正弦减掉,剩下的误差波形就是谐波和杂散的时域总和。误差波形如果是周期性的,说明以谐波为主;如果是随机起伏的,说明噪声地板占比大。这个方法比肉眼盯示波器靠谱得多。

3. 实测波形里的谐波来源:相位截断、DAC非线性与sinc滚降

3.1 相位截断杂散:频率字一变,尖峰就跟幽灵一样到处跑

AD9833的相位累加器是28位的,但查表只用了高12位,低16位在累加过程里不断被“截掉”。这些被截掉的相位误差并不是随机的,它有固定周期,周期跟频率控制字和2的16次方之间的公约数有关。于是频谱上就会冒出一根或几根非谐波杂散峰,位置离主频非常近,有时候甚至近到普通滤波器根本分不开。

我最早在这个坑里绕了很久。用1MHz输出时频谱很干净,把频率字改成对应2.37MHz,频谱上突然多了一根离主频只有几十kHz的尖峰,怎么加滤波器都滤不掉。后来才明白,这不是滤波器的问题,而是相位截断杂散随着频率控制字变化“跑”了。

处理办法有两个方向。第一个方向是选择频率控制字,让截断误差周期变长,杂散能量被摊薄到更多频点上,单根峰的幅度就会降下来。简单说就是别选那种让低16位频繁归零的频率字。第二个方向是使用芯片内部的三角波模式,相位截断杂散会以一种更平均的方式分散开,代价是波形本身就变成三角波了,需要后级再接整形电路,一般应用用不上。

3.2 DAC非线性决定了二次、三次谐波的下限

AD9833内部是10位DAC。理论上10位量化对应的信噪比大约是62dB,但这只是理想量化噪声,不包含DAC本身的非线性误差。实际芯片里的DAC,积分非线性(INL)和差分非线性(DNL)是主要失真的来源。INL误差里奇对称的成分会贡献三次、五次奇数谐波,DNL误差更像一种逐点跳变,容易贡献二次、四次偶数谐波。

所以你会看到一个很典型的现象:二次谐波和三次谐波是AD9833裸输出的“常驻嘉宾”,幅度稳定,不太随频率字变化。提高输出频率时,DAC的建立时间和毛刺能量开始变明显,谐波比例会进一步抬升,尤其是接近十几MHz输出时,裸输出波形几乎已经看不出正弦的样子了。

这里有个容易误解的地方:很多人以为降低主时钟频率能让谐波变小,其实不一定。DAC的非线性是固定比例存在的,谐波相对基频的比例主要由DAC特性决定,不太受绝对频率影响。反而主时钟越高,sinc包络在带内的滚降越平缓,高次镜像离得越远,后级滤波器会好做一点。当然AD9833的主时钟上限是25MHz,能调的余地也不大。

3.3 零阶保持与sin(x)/x滚降:天然压制与混叠风险并存

DDS的DAC输出是零阶保持的,也就是每个时钟周期输出一个电压值,保持到下一个周期。这个过程中的频域响应是sin(πf/fMCLK)/(πf/fMCLK)的形状,在fMCLK的整数倍处有零点,对高频分量本来是有衰减作用的。

问题是,这个衰减在频率不太高的时候很有限。半采样率处,也就是fMCLK/2,衰减只有约3.9dB,根本不够用。真正麻烦的是镜像分量:输出f0时,DAC会在fMCLK±f0、2×fMCLK±f0等位置产生镜像频谱,这些镜像如果不被外部LPF滤除,一旦进入后级非线性器件(比如放大器、比较器、ADC前端),就可能互相混频,折回带内“伪装”成谐波或者杂散。

表现在实测里就是:你给AD9833输出直接接一个高带宽放大器,本来裸输出频谱还能接受的,放大之后突然多出很多莫名其妙的尖峰。这就是放大器二次非线性把镜像混叠回带内了。所以AD9833后面最好紧跟一个低通滤波器,不只是为了压谐波,更是为了把镜像频谱挡在放大器之前。

3.4 方波模式下的“谐波”是另一回事

AD9833通过控制寄存器的MODE位和OPBITEN位,可以输出方波。严格来说方波是由内部比较器把DAC输出整形得到的,或者直接从比较器输出引脚取出。方波频谱天然包含基频的奇数倍分量,二次、四次等偶数次反而很小,这和正弦模式下“二次谐波最大”的情况完全不同。

如果在实测里发现频谱是奇次谐波一串一串的,那你首先该怀疑的不是DAC非线性,而是芯片是不是被配置成了方波模式。我遇到过不止一次:复位寄存器顺序写错,MODE位被意外置1,示波器上看着是个有点方、又有点尖的波形,FFT打开奇次谐波一大片,排查了半天还以为是芯片坏了。

三角波模式也一样,三角波的频谱是奇次谐波按1/n²衰减,看起来也像一串谐波。所以做谐波分析之前,先确认控制寄存器的配置,确定当前到底在输出哪种波形。这个步骤最简单,但也最容易被忽略。

4. 把谐波按下去的硬件手段:从单极点RC到高阶椭圆滤波器

4.1 先定需求再选拓扑:你只需要带内干净,不是要“最陡”

很多人一上来就翻出“七阶椭圆滤波器”方案,把板子堆得密密麻麻,最后发现群延迟大得离谱,波形过冲严重,反而得不偿失。滤波器设计的第一步应该是问自己:输出频率范围是多少?带内平坦度要求多少?谐波想压到多少dBc以下?对相位失真敏感不敏感?

比如我的一个实际项目,只需要输出0.1到1MHz的正弦,要求二次谐波低于-60dBc,对相位不太敏感。那我的目标就很明确:在2MHz处提供大约15到20dB的额外衰减,同时在1MHz以内保持幅度误差小于0.5dB。这个需求四到五阶的巴特沃斯或椭圆低通就足够了,没必要上高阶。

如果输出频率是变化的扫描信号,比如从1kHz扫到10MHz,那固定截止频率的LPF就不行了,你需要按频段切换滤波器,或者只用宽带滤波加“谐波反正离得远”的思路。AD9833作为一片低成本芯片,通常不会去做太复杂的跟踪滤波,所以最实用的方案是把输出频段限定在一个较窄范围内,针对这个范围优化滤波器。

4.2 单极点RC:便宜,但是只适合低频和要求不高的场景

最简单的输出滤波就是一只电阻加一只电容,构成一阶RC低通,截止频率f_c=1/(2πRC)。它的衰减斜率是每倍频程6dB,在谐波只比基频高一倍频程时,对二次谐波的额外衰减就6dB上下,这在很多时候是不够的。

我的用法是把RC当作DAC后面的第一级粗滤波,目的是先把那些高频镜像和毛刺压掉一部分,再进有源滤波器。比如截止频率放在1.5MHz左右,用150欧串680pF电容,既能挡一部分采样毛刺,又不会对1MHz以内信号造成太大衰减。后续有源级再去处理谐波。

RC还有一个好处是能改善后级运放的驱动条件。DAC输出阻抗偏高,直接接有源滤波器会拉偏截止频率,先串一个电阻隔离一下,后级运放输入端看到的是相对稳定的源阻抗。这个细节在Sallen-Key拓扑里特别重要,因为Sallen-Key对源阻抗敏感。

4.3 四到五阶有源/LC滤波器:把二次谐波再压20dB的设计实例

当RC不够用的时候,我会搭Sallen-Key有源低通。Sallen-Key用运放加RC构成二阶节,两个二阶节级联就是四阶,三个二阶节就是六阶。设计时可以用TI的FilterPro、ADI的Filter Wizard这类工具直接生成元件值,自己查归一化系数表也行,但手工算容易出错,工具生成再仿真验证是最高效的。

运放选型很关键。如果截止频率在1.5MHz,运放的增益带宽积最好在20MHz以上,避免运放自己在2MHz附近又贡献几个dB的衰减。我用过AD8066、OPA836这类高速运放,也用过OPA2140这类11MHz的,后者在低增益配置下也能工作,但相位裕量要仔细看仿真结果。

滤波阶数的估算可以这样做:二次谐波在2f位置,比基频高一倍频程,一阶RC给约6dB衰减,二阶节给约12dB,三阶约18dB,四阶约24dB,当然这是在频率远离截止点后的近似。实际过渡带要按滤波器类型查表,所以我建议用工具仿真确认。比如前面那个需求:滤波前二次谐波-45dBc,想做到-60dBc,需要额外压15dB。我用一个截止1.5MHz的四阶巴特沃斯,在2MHz处仿真大约给10dB多一点衰减,前面再串一级RC粗滤,加起来就到15到20dB了。仿真结果和实测基本吻合。

高频应用里也可以直接做无源LC滤波器,比如五阶切比雪夫或椭圆,用绕线电感和C0G电容。LC适合频率更高、信号更大的场景,但电感寄生电容、源阻抗和负载阻抗都会影响实际响应,必须用网络分析仪或至少用示波器扫频验证。有源滤波器的好处是响应比较稳定、不依赖负载,坏处是运放本身会引入噪声和新的失真。

4.4 别忘了输出偏置、端接和后级缓冲

AD9833的VOUT输出是以AVDD/2为直流偏置的,交流幅度在空载、5V供电下大约0.6Vp-p量级,供电电压低时幅度更小。这个信号直接进后级电路前,通常需要经过隔直电容,再在后级设置合适的直流工作点。

隔直电容和后级输入阻抗也构成一个高通滤波器,这个低频截止点别忽略。比如电容取1μF,后级输入阻抗10kΩ,低频截止约16Hz,对普通音频/低频应用够用,但如果你要输出几Hz的低频正弦,这个组合就会压低输出幅度。

端接问题经常被忽视。AD9833输出引脚本身的驱动能力很弱,如果你用50欧同轴线直接连示波器,线缆和示波器输入阻抗会形成分压,输出幅度直接掉一半以上,波形形状也会变差。正确做法是输出端先经过一个缓冲放大器,再用同轴传输,或者接受“幅度损失”并用高阻探头测量。做谐波测量时,尽量保持负载条件一致,不然滤波前的读数和滤波后的读数没有可比性。

5. 一套能落地的排查流程:从SPI初始化到FFT读数的完整链路

5.1 SPI初始化的顺序错了,波形从一开始就是脏的

谐波分析的第一步不是看FFT,而是确认AD9833的配置流程正确。很多网上的示例代码顺序不对,最容易犯的错误是:没有先把RESET位置1就写频率寄存器,写完频率字之后又没有清RESET位,导致芯片一直处于复位状态,或者频率字只写入了一半。

我常用的初始化顺序是:FSYNC拉高,延时,写控制寄存器(RESET=1),写FREQ0频率寄存器的低14位,再写高14位,最后写控制寄存器清RESET(RESET=0),让芯片开始正常工作。两个16位帧之间,FSYNC必须经历一次完整的拉高再拉低,不能连续拉低写两个帧。

给一段简化的GPIO模拟SPI代码做参考,具体寄存器值以你手头的数据手册为准:

void ad9833_write(uint16_t reg) { FSYNC_HIGH(); delay_us(1); FSYNC_LOW(); for (int i = 15; i >= 0; i--) { SCLK_LOW(); SDATA = (reg & (1 << i)) ? 1 : 0; SCLK_HIGH(); } FSYNC_HIGH(); } void ad9833_set_freq(uint32_t freq_reg) { ad9833_write(0x2100); // B28=1, RESET=1,配置为先写低14位再写高14位 ad9833_write(0x4000 | (freq_reg & 0x3FFF)); // FREQ0低14位 ad9833_write(0x4000 | ((freq_reg >> 14) & 0x3FFF)); // FREQ0高14位 ad9833_write(0x2000); // 清RESET,开始输出 }

写完配置后,用示波器DC耦合先看直流偏置是否在AVDD/2附近,再用AC耦合看波形。如果偏置不对或者输出幅度异常小,先查供电、去耦和MODE配置,别急着分析谐波。

5.2 一个小型“判决表”:从FFT峰的位置反推谐波来源

FFT测出来之后,按下面的思路快速归类,能少走很多弯路:

FFT现象可能原因验证手段处理方向
二次谐波明显高于三次谐波DAC差分非线性或电源耦合看电源纹波,换干净电源加强供电去耦,后级加LPF
三次谐波异常高DAC积分非线性或后级放大削波降低输出幅度,查后级工作点检查信号链电平,确保没进入非线性区
尖峰位置不在整数倍频点相位截断杂散换频率字,比较杂散位置变化调整频率控制字,摊薄杂散能量
高频输出时波形迅速劣化sinc滚降叠加混叠镜像对比低频和中频输出频谱提高后级滤波器阶数,降低使用频率上限
时域波形带振铃过冲阻抗不匹配或探头补偿不对校准探头,检查端接加缓冲输出,规范测量
频谱出现方波特征的奇次谐波序列芯片被配置成方波模式读回控制寄存器状态修正MODE和OPBITEN位

这张表看起来简单,但每条我都实际踩过。尤其是“后级放大削波”这个原因,经常被忽略:AD9833输出幅度本来不大,但后级运放如果供电电压不足或者增益设得过高,输出进入削波区,三次谐波会瞬间暴涨。这时候你拼命加滤波器是没用的,信号已经失真,回不去了。

5.3 滤波前后的实测数据:能压到什么程度

我在一个输出0.1到1MHz的测试板上记录过一组典型数据,滤波前直接测VOUT,再测经过“RC粗滤+四阶有源低通”之后的输出,归一化到基频0dB:

测量点二次谐波三次谐波带内最高非谐波杂散
VOUT裸输出-45 dBc-51 dBc-48 dBc
滤后输出-62 dBc-67 dBc-60 dBc

数据是在特定频率字和特定板卡布局下的实验结果,不是芯片保证值,但趋势很明确:二次谐波从-45dBc压到-62dBc,三级谐波从-51dBc到-67dBc,整体SFDR从44dBc提到了60dBc左右。这个水平对于多数激励源、扫频源应用已经完全够用。

如果你需要更低的谐波,光靠无源滤波很难再往下走,可以考虑在后级加一个低失真正弦整形电路,或者干脆用更高性能的DDS芯片。但对AD9833这个价位和应用定位来说,能把SFDR做到60dBc已经是非常实用的状态了。

5.4 布局、电源、接地这些“场外因素”反而最影响谐波

最后说几个和电路板布局相关的经验。AD9833的模拟电源和数字电源最好分开走线,在引脚附近各放一组1μF加0.1μF的去耦电容,0.1μF的陶瓷电容尽量贴近VCC引脚。地线采用单点连接,模拟地和数字地不要大面积混在一起,否则DAC输出里会看到不少数字串扰毛刺。

REF引脚或者CAP/2.5V引脚的外接电容也不要随意改动,按数据手册推荐值接。我用过一次“手边没有正好容值”的电容,随手换了一个,输出波形就多了一根低频抖动分量,测出来还以为是芯片坏了,查了老半天才定位到是内部稳压器不稳定。

测量时还要注意示波器探头的接地点。夹子线太长会在高频形成环路天线,把环境里的噪声带进来。最好用接地弹簧或者尽量短的接地方式,近距离测VOUT。做FFT时用平均和多点采样,能显著压掉随机噪声,让谐波和杂散的读数更稳定。

把AD9833用好了,很多仪器项目都能省下一笔不小的DDS模块费用。谐波不是这颗芯片的缺陷,而是DDS工作原理决定的固有属性。你只需要学会测它、认它、滤它,就能在成本和信号质量之间找到最舒服的那个平衡点。

返回列表