1. 中频采样与数字下变频到底在解决什么问题
第一次接触“中频采样”和“数字下变频”这两个词,很多人会以为这是通信专业研究生的专属课题,离实际工程很远。但只要你拆过一台软件无线电设备、做过雷达信号处理板卡,或者写过FPGA里的DDC模块,就会发现这套东西几乎是现代接收机的标配。它的核心任务说起来很朴素:把天线接收下来的高频信号,经过模拟前端搬到某个中间频率,然后尽快用ADC采样成数字序列,再在数字域里把信号搬到基带,同时把采样率降下来,方便后续解调、识别或测量。
为什么非要绕这么一圈?直接对射频信号采样不行吗?理论上可以,这叫射频采样,但工程上代价太大。假设载波在2.4GHz,按照奈奎斯特采样定理,采样率至少要4.8GHz以上,还得留抗混叠滤波器的过渡带,实际可能要到6GHz甚至更高。这种ADC价格昂贵、功耗惊人,后端FPGA处理这么高的数据率也非常吃力。所以工程上普遍采用折中方案:先用模拟混频把射频搬到几十兆到几百兆的中频,在这个频率上采样,采样率可能只需要几十兆到一两百兆,ADC和FPGA都能承受,这就是中频采样的现实意义。
数字下变频(DDC,Digital Down-Conversion)则是紧接着中频采样之后的数字处理环节。它的输入是ADC送来的中频采样序列,输出是基带的I/Q两路信号,并且采样率通常已经降到了与信号带宽匹配的程度。整个过程包含三个关键动作:数字混频、低通滤波和抽取。数字混频负责把中频搬移到零频附近,低通滤波负责滤除混频产生的高频分量和带外噪声,抽取负责降低采样率、减少后续处理的数据量。这三步环环相扣,任何一步参数没选好,最后解调出来的星座图就会糊成一团。
这套技术适合谁看?如果你是通信、雷达、电子对抗、卫星导航、频谱监测方向的工程师,或者正在做软件无线电、FPGA信号处理、ADC采集卡相关的项目,那这篇文章里的内容你大概率用得上。如果你只是好奇“手机里的信号是怎么被处理的”,也能从里面看到一条完整的信号链路是怎么搭起来的。我会尽量少堆公式,多用工程视角讲清楚每个参数为什么这么选、每个坑是怎么踩出来的。
2. 从模拟中频到数字基带:整体链路的设计思路
2.1 为什么选择中频采样而不是基带采样或射频采样
接收机架构的选择本质上是在性能、成本、功耗和复杂度之间找平衡。基带采样要求I/Q两路模拟混频器把信号直接搬到零频,然后分别采样。这种做法对模拟器件的匹配要求极高,I/Q两路的增益误差和相位误差会直接变成镜像干扰,而且直流偏移和低频闪烁噪声很难处理。射频采样则走向另一个极端,对ADC要求太高,目前只在少数窄带、低频场景下用得起。
中频采样恰好落在中间。它只需要一次模拟混频,把射频搬到一个合适的中频,然后用一个ADC采样。中频的选择有讲究:不能太低,否则镜像频率离得太近,模拟滤波器不好做;也不能太高,否则采样率跟着上去,ADC和数字处理压力增大。常见的中频有70MHz、140MHz、180MHz、240MHz等,这些数值不是随便定的,往往和系统时钟、ADC采样率、滤波器可用带宽都有关系。
注意:中频采样时,采样率的选择必须满足带通采样定理,而不是简单的奈奎斯特低通采样定理。带通采样允许采样率低于信号最高频率的两倍,只要信号带宽落在某个奈奎斯特区之内即可。
2.2 带通采样定理的工程理解与参数计算
带通采样定理的数学表述是:对于一个带宽为B、中心频率为f0的带通信号,采样率fs只要满足fs ≥ 2B,并且f0落在某个合适的区间内,就可以无混叠地恢复信号。具体来说,存在一个整数n,使得:
fs ≥ 2B n·fs - B ≤ f0 ≤ n·fs + B
这个n就是奈奎斯特区的编号。工程上我们通常希望采样率尽量低,但又不能让信号跨在两个奈奎斯特区的边界上,否则滤波器过渡带没法设计。
举个例子:中频f0 = 140MHz,信号带宽B = 20MHz。如果选fs = 80MHz,那么n = 1时,fs - B = 60MHz,fs + B = 100MHz,140MHz不在这个区间;n = 2时,2fs - B = 140MHz,2fs + B = 180MHz,140MHz刚好落在边界上,这很危险,因为滤波器过渡带没有余量。如果选fs = 100MHz,n = 1时区间是80~120MHz,n = 2时区间是180~220MHz,140MHz落在两个区间之间,不满足条件。如果选fs = 120MHz,n = 1时区间是100~140MHz,140MHz又在边界上。选fs = 160MHz,n = 1时区间是140~180MHz,140MHz在边界;n = 2时区间是300~340MHz,也不合适。
实际工程中,我们通常会留20%以上的过渡带余量。比如选fs = 92.16MHz,n = 2时,2fs - B = 164.32MHz,2fs + B = 204.32MHz,140MHz不在里面。选fs = 61.44MHz,n = 2时,2fs - B = 102.88MHz,2fs + B = 142.88MHz,140MHz落在里面,但离上边界只有2.88MHz,余量太小。选fs = 73.728MHz,n = 2时,2fs - B = 127.456MHz,2fs + B = 167.456MHz,140MHz在中间,余量充足。这就是为什么很多通信系统里会出现61.44MHz、73.728MHz、92.16MHz、122.88MHz这类看起来奇怪的采样率——它们往往是系统时钟分频或特定中频优化后的结果。
2.3 DDC在链路中的位置和核心任务
DDC通常实现在FPGA或专用ASIC里,紧跟在ADC后面。它的输入是中频采样序列,输出是基带I/Q样本。整个DDC的核心任务可以拆成三件事:
第一,数字混频。用一个本地振荡器(NCO)产生的复指数信号与输入实信号相乘,把中频分量搬到零频附近。数学上就是乘以exp(-j·2π·f0·n/fs),得到的结果包含零频附近的基带分量和两倍中频附近的高频分量。
第二,低通滤波。混频后的信号里,我们只关心零频附近的那部分,两倍中频附近的分量必须滤掉。这个低通滤波器的截止频率通常设为信号带宽的一半,阻带起始频率则要考虑到抽取后的混叠问题。
第三,抽取。滤波后的信号带宽已经变窄,没必要保持原来的高采样率,可以每隔M个点取一个点,把采样率降到fs/M。抽取倍数M的选择要保证抽取后的采样率仍然大于信号带宽的两倍,同时尽量降低数据率。
这三步的顺序可以调整。常见的有先混频再滤波最后抽取,也有先滤波再混频再抽取,还有把滤波和抽取合并成多相滤波结构的。不同的顺序对应不同的资源消耗和性能表现,后面会详细展开。
3. 数字混频与NCO:把中频搬到零频的关键一步
3.1 数字混频的数学本质与实现方式
数字混频说白了就是两个序列逐点相乘。输入是ADC采样的实信号x[n],NCO产生两路正交序列cos(ω0n)和sin(ω0n),相乘后得到:
I[n] = x[n] · cos(ω0n) Q[n] = -x[n] · sin(ω0n)
这里ω0 = 2π·f0/fs,是数字角频率。I和Q两路合起来就是复基带信号。理想情况下,NCO的频率和输入中频完全一致,混频后信号正好落在零频。如果NCO频率有偏差,信号就会偏离零频,后续低通滤波器可能把它滤掉一部分,导致幅度下降和相位旋转。
实现上,NCO通常用相位累加器加查找表的方式。相位累加器每个时钟周期累加一个频率控制字FTW,累加器的最高几位作为地址去查正弦/余弦表。FTW的计算公式是:
FTW = round(f0 / fs · 2^N)
其中N是相位累加器的位宽。比如fs = 73.728MHz,f0 = 140MHz,N = 32,那么FTW = round(140/73.728 · 2^32) ≈ round(1.8989 · 4294967296) ≈ 8155425792。这个数值直接决定了NCO的输出频率精度。位宽越大,频率分辨率越高,但查找表也越大。工程上常用16位或18位查找表,配合相位抖动或泰勒插值来降低杂散。
提示:NCO的杂散性能直接影响DDC的输出信噪比。如果查找表地址位宽不够,相位截断误差会产生周期性杂散,落在信号带内就很难滤除。选NCO IP核时,一定要看它的SFDR(无杂散动态范围)指标。
3.2 混频器的资源消耗与优化技巧
在FPGA里,一个复数混频器需要四个实数乘法器(x·cos、x·sin、以及可能的符号处理),如果输入是实信号,只需要两个乘法器。对于高采样率场景,乘法器是稀缺资源,需要优化。
一种常见优化是利用对称性。如果NCO频率选为fs/4,那么cos和sin序列会变成0、1、-1的循环,乘法退化成加法和取反,完全不需要乘法器。这就是所谓的“fs/4混频”技巧。很多通信系统故意把中频选在fs/4附近,就是为了省乘法器。比如fs = 73.728MHz,fs/4 = 18.432MHz,如果中频是140MHz,那140/18.432 ≈ 7.6,不是整数倍,没法直接用。但如果选fs = 560MHz,fs/4 = 140MHz,那就完美了。当然560MHz采样率对ADC和FPGA都是挑战,所以实际中会折中。
另一种优化是把混频和滤波合并。在多相滤波结构中,混频可以吸收到滤波器的系数里,相当于对滤波器系数做旋转。这样混频不需要单独的乘法器,但滤波器系数变成复数,资源消耗转移到滤波器上。哪种更省,取决于具体的抽取倍数和滤波器阶数。
3.3 NCO频率字计算与相位截断误差
NCO的频率精度由相位累加器位宽决定。假设位宽是32位,系统时钟100MHz,那么频率分辨率是100MHz/2^32 ≈ 0.023Hz。这个精度远远超过大多数应用需求。但查找表地址通常只取高16位或18位,低位被截断,这就引入了相位截断误差。
相位截断误差的表现是NCO输出频谱上出现杂散,杂散间隔与截断位数有关。如果截断b位,杂散会出现在k·fs/2^b的位置。比如fs = 100MHz,截断14位(即查找表地址16位),杂散间隔是100MHz/2^14 ≈ 6.1kHz。如果信号带宽是20MHz,这些杂散大部分落在带外,可以被低通滤波器滤掉。但如果信号带宽很窄,比如只有几十kHz,那杂散就可能落在带内,影响解调性能。
解决办法有三个:一是增加查找表地址位宽,代价是ROM容量指数增长;二是使用泰勒级数插值,用少量乘法器换精度;三是使用相位抖动,把周期性杂散打散成噪声。工程上常用的是第二种和第三种结合,在资源和性能之间找平衡。
4. 低通滤波与抽取:数据率降下来的核心环节
4.1 低通滤波器的设计指标怎么定
DDC里的低通滤波器不是随便设个截止频率就行,它的指标直接决定了整个接收机的选择性和抗混叠能力。设计时需要明确四个参数:通带截止频率fp、阻带起始频率fst、通带波纹δp、阻带衰减δs。
通带截止频率通常设为信号带宽的一半。比如信号带宽20MHz,fp = 10MHz。阻带起始频率要考虑抽取后的混叠。如果抽取倍数是M,抽取后采样率是fs/M,那么频率高于fs/(2M)的分量会混叠到带内。所以阻带起始频率必须小于fs/(2M)。为了留余量,通常取fst = fs/(2M) - Δf,其中Δf是过渡带宽度。
举个例子:fs = 73.728MHz,信号带宽20MHz,抽取倍数M = 4,抽取后采样率18.432MHz,奈奎斯特频率9.216MHz。通带截止10MHz已经超过了9.216MHz,这不行。所以要么减小信号带宽,要么减小抽取倍数。如果信号带宽实际是16MHz,fp = 8MHz,fst可以取8.5MHz,过渡带0.5MHz。用等波纹设计法,阻带衰减60dB,通带波纹0.1dB,滤波器阶数大概在60~80阶左右。这个阶数在FPGA里用FIR滤波器实现,需要60~80个乘法器,资源消耗不小。
注意:抽取后的奈奎斯特频率必须大于信号带宽,否则带内信号会被混叠破坏。这是DDC设计中最容易犯的错误之一。很多人只记得采样定理要求fs ≥ 2B,却忘了抽取后的采样率也要满足这个条件。
4.2 抽取的两种实现方式:直接抽取与多相滤波
直接抽取最简单:滤波后每隔M个点取一个点。但这样做有个问题——滤波器在抽取前的高采样率下工作,每个时钟周期都要算一次卷积,乘法器利用率很低。比如M = 4,滤波器每输出一个有效点,实际上算了4次,其中3次的结果被丢弃了。
多相滤波解决了这个问题。它把滤波器系数按抽取倍数M分成M组,每组系数对应一个相位。输入数据也按M个一组分块,每组数据分别与对应的系数组做卷积,然后求和。这样每个时钟周期只需要算一次卷积,但卷积长度变成了原来的1/M,乘法器数量也降到原来的1/M。代价是需要M个累加器和一个求和树,但总体资源消耗大幅下降。
多相滤波的数学推导这里不展开,但工程上记住一个结论:抽取倍数越大,多相滤波的优势越明显。M = 2时省一半乘法器,M = 4时省四分之三,M = 8时省八分之七。所以DDC里几乎都用多相结构,除非抽取倍数很小或者资源极度充裕。
4.3 半带滤波器与CIC滤波器的组合策略
在实际DDC中,抽取倍数往往很大,比如从73.728MHz降到1.92MHz,抽取倍数38.4,不是整数。这时候通常分多级抽取,每级抽取2倍或4倍,最后再用一个分数倍抽取器。每一级的滤波器选择有讲究。
第一级通常用CIC(积分梳状)滤波器。CIC不需要乘法器,只需要加减法和寄存器,非常适合高采样率的第一级抽取。但CIC的通带衰减比较大,而且阻带衰减有限,所以后面要跟一个补偿滤波器来修正通带响应。
第二级或第三级用半带滤波器。半带滤波器的系数有一半是零,乘法器数量减半,而且通带和阻带对称,设计起来很方便。半带滤波器适合2倍抽取,多级级联可以实现4倍、8倍、16倍抽取。
最后一级用普通FIR滤波器,负责精确控制通带和阻带,同时完成分数倍抽取。分数倍抽取通常用Farrow结构或多项式插值实现,复杂度较高,但只在低采样率下工作,资源压力不大。
这种“CIC + 半带 + FIR”的组合是DDC里最经典的架构,几乎成了行业惯例。CIC负责粗抽取,半带负责中等抽取,FIR负责精细整形和分数抽取。每一级的抽取倍数和滤波器指标需要联合优化,才能在不浪费资源的前提下达到想要的性能。
5. 完整DDC的FPGA实现与参数计算实例
5.1 系统参数定义与链路预算
假设我们要设计一个用于频谱监测的DDC,输入中频140MHz,信号带宽20MHz,ADC采样率73.728MHz,最终输出基带采样率1.92MHz,输出I/Q两路16位数据。
先算总抽取倍数:73.728MHz / 1.92MHz = 38.4。不是整数,所以需要分数倍抽取。我们可以分解为:38.4 = 4 × 4 × 2.4。前两级各4倍抽取,最后一级2.4倍分数抽取。
第一级:4倍抽取,输入73.728MHz,输出18.432MHz。用CIC滤波器,差分延迟1,级数5,抽取倍数4。CIC的通带衰减在8MHz处大约0.5dB,需要后面补偿。
第二级:4倍抽取,输入18.432MHz,输出4.608MHz。用半带滤波器,通带截止4MHz,阻带起始4.608MHz - 4MHz = 0.608MHz?不对,半带滤波器的阻带起始是fs/2 - fp,这里fs = 18.432MHz,fs/2 = 9.216MHz,fp = 4MHz,阻带起始9.216 - 4 = 5.216MHz。过渡带5.216 - 4 = 1.216MHz,比较宽,半带滤波器容易实现。
第三级:2.4倍分数抽取,输入4.608MHz,输出1.92MHz。用Farrow结构或多项式插值,通带截止0.96MHz,阻带起始1.92MHz - 0.96MHz = 0.96MHz。过渡带很窄,需要高阶FIR滤波器。
5.2 各级滤波器系数生成与定点化
CIC滤波器的系数全是1,不需要生成。但CIC的增益很大,需要右移截位。增益公式是G = (M·D)^N,其中M是抽取倍数,D是差分延迟,N是级数。这里M = 4,D = 1,N = 5,G = 4^5 = 1024。输出需要右移10位,相当于除以1024。右移会引入截断噪声,通常用舍入而不是直接截断。
半带滤波器的系数用MATLAB的fdesign.halfband生成,或者用Python的scipy.signal.firwin配合半带约束。半带滤波器的阶数通常是偶数,系数对称,中间一个系数是0.5,其余偶数位置系数为0。比如31阶半带滤波器,只有16个非零系数。定点化时,系数用16位有符号数表示,范围-1到1,量化步长2^-15 ≈ 3.05e-5。量化误差会导致阻带衰减下降,通常需要仿真验证。
最后一级FIR滤波器用fdesign.decimator生成,指定分数抽取因子2.4。Farrow结构的系数需要单独计算,通常用拉格朗日插值或样条插值。定点化时要注意插值系数的动态范围,避免溢出。
5.3 FPGA资源估算与时序收敛技巧
整个DDC在FPGA里的资源消耗主要包括乘法器、加法器、寄存器和块RAM。粗略估算:
- 混频器:2个实数乘法器(如果不用fs/4技巧)
- CIC:0个乘法器,5个积分器 + 5个梳状器,约20个加法器
- 半带滤波器:16个乘法器(31阶,非零系数16个)
- 最后一级FIR:假设64阶,分数抽取用Farrow结构,约32个乘法器
- NCO:1个查找表(16位地址,16位数据,约1Mb ROM)或CORDIC(约10个乘法器)
总计乘法器约50~60个,对于中等规模FPGA(如Xilinx Artix-7或Intel Cyclone V)完全够用。块RAM主要用于NCO查找表和滤波器系数存储,约2~3个18Kb块。
时序收敛是高速DDC的难点。73.728MHz的时钟周期约13.56ns,在7系列FPGA里,一级乘法器加一级加法器的延迟约3~4ns,所以组合逻辑不能太长。CIC的积分器工作在最高采样率,需要流水线化。半带滤波器和FIR滤波器可以并行处理,但求和树需要平衡。如果时序不满足,可以在关键路径插入寄存器,代价是增加延迟。
提示:CIC滤波器的积分器容易溢出,因为它是累加器。位宽要足够大,通常比输入位宽多log2(G)位。比如输入16位,G = 1024,需要多10位,即26位。实际设计中还会再留2~3位余量,用28位或30位。
6. 常见问题与排查技巧实录
6.1 输出星座图旋转或发散怎么办
这是DDC调试中最常见的问题。星座图旋转通常说明NCO频率有偏差,或者I/Q两路增益不匹配。排查步骤:
第一,检查NCO频率字计算是否正确。用公式FTW = round(f0/fs · 2^N)重新算一遍,确认没有算错。如果NCO频率偏了1kHz,星座图就会以1kHz的速率旋转。
第二,检查I/Q两路是否对称。如果I路和Q路的滤波器系数不一致,或者混频器的cos和sin查找表有幅度差异,就会产生镜像干扰,星座图会发散。可以用一个单频信号输入,观察I/Q两路的幅度是否相等,相位是否差90度。
第三,检查直流偏移。ADC的直流偏移经过混频后会变成零频附近的一个冲激,落在信号带内就是固定方向的误差。可以在混频后加一个直流阻塞滤波器,或者用高通滤波器去掉零频。
6.2 抽取后信号混叠导致误码率升高
混叠的表现是带外信号或噪声折叠到带内,信噪比下降。排查方法:在抽取前用频谱分析仪或FPGA内部的FFT观察滤波后的频谱,确认阻带衰减是否足够。如果阻带衰减不够,可能是滤波器阶数太低,或者定点化量化误差太大。
另一个常见原因是抽取倍数选得太大,导致抽取后的奈奎斯特频率小于信号带宽。比如信号带宽20MHz,抽取后采样率30MHz,奈奎斯特频率15MHz,小于20MHz,必然混叠。这时候要么减小抽取倍数,要么减小信号带宽。
还有一种隐蔽的混叠:CIC滤波器的阻带衰减不够。CIC的阻带衰减随频率增加而改善,但在靠近通带的地方衰减很小。如果信号带宽接近CIC的通带边缘,混叠会很严重。解决办法是在CIC后面加一个补偿滤波器,或者改用更高阶的CIC。
6.3 NCO杂散落在信号带内怎么处理
NCO杂散通常来自相位截断和查找表量化。如果杂散落在信号带内,解调性能会明显下降。处理方法:
第一,增加查找表地址位宽。从16位增加到18位,杂散间隔从fs/2^16降到fs/2^18,杂散更容易被滤掉。代价是ROM容量增加4倍。
第二,使用泰勒插值。在查找表输出后加一级一阶或二阶插值,用少量乘法器换精度。一阶插值可以把杂散降低20dB左右,二阶插值可以降低40dB。
第三,使用相位抖动。在相位累加器的低位加一个伪随机序列,把周期性杂散打散成白噪声。这样杂散不再集中在特定频率,而是均匀分布在频谱上,对信号的影响小很多。
第四,改用CORDIC算法。CORDIC不需要查找表,用迭代旋转计算cos和sin,杂散性能比查找表好,但延迟大、吞吐率低。适合低采样率场景。
6.4 常见问题速查表
| 问题现象 | 可能原因 | 排查方法 | 解决措施 |
|---|---|---|---|
| 星座图旋转 | NCO频率偏差 | 检查FTW计算 | 重新计算频率字 |
| 星座图发散 | I/Q增益或相位不平衡 | 输入单频信号观察I/Q | 校准增益和相位 |
| 信噪比下降 | 抽取混叠 | 观察抽取前频谱 | 减小抽取倍数或提高滤波器阶数 |
| 带内杂散 | NCO相位截断 | 改变NCO频率观察杂散 | 增加查找表位宽或加抖动 |
| 输出溢出 | CIC增益过大 | 检查位宽 | 增加位宽或右移截位 |
| 时序不收敛 | 组合逻辑太长 | 查看时序报告 | 插入流水线寄存器 |
7. 几个容易被忽略的工程细节
7.1 采样时钟抖动对中频采样的影响
ADC的采样时钟抖动会直接转化为采样时刻的误差,表现为信噪比下降。对于中频采样,时钟抖动的要求比基带采样更严格,因为中频频率高,同样的时间抖动对应更大的相位误差。信噪比下降的公式是:
SNR = -20·log10(2π·f0·σt)
其中f0是中频,σt是时钟抖动的RMS值。比如f0 = 140MHz,σt = 1ps,SNR = -20·log10(2π·140e6·1e-12) ≈ -20·log10(8.8e-4) ≈ 61dB。如果σt = 10ps,SNR降到41dB。所以中频采样系统里,时钟源的选择非常关键,通常要用低抖动的晶振或时钟芯片,抖动控制在100fs到1ps之间。
7.2 多通道DDC的同步问题
在相控阵雷达或多通道接收机里,多个DDC通道需要严格同步。同步包括两个方面:采样时钟同步和NCO相位同步。采样时钟同步靠时钟分配网络保证,NCO相位同步靠复位信号或同步脉冲保证。
如果NCO相位不同步,通道间的相位差会随时间变化,导致波束指向漂移。解决办法是用一个公共的同步信号同时复位所有NCO的相位累加器,或者用同一个NCO输出分发到所有通道。后者更简单,但需要确保分发路径的延迟一致。
7.3 定点化过程中的位宽增长与截位策略
DDC链路里,信号每经过一级处理,位宽都会增长。混频后位宽增加1位(乘法结果),CIC后增加log2(G)位,FIR后增加log2(阶数)位。如果不加控制,位宽会迅速膨胀,消耗大量寄存器资源。
截位策略有两种:一种是每级都截位,保持位宽恒定;另一种是只在最后截位,中间保持全精度。前者节省资源但引入截断噪声,后者性能好但资源消耗大。工程上通常折中:在CIC后截位一次,因为CIC增益大,截位噪声相对小;在FIR后截位一次,因为FIR输出就是最终结果。中间级尽量保持全精度。
截位时要用舍入而不是直接截断。直接截断会引入直流偏移,因为负数截断后偏向负无穷。舍入可以用“加0.5再截断”实现,或者用收敛舍入。FPGA里通常用“加半个LSB再右移”的方式,资源消耗很小。
7.4 测试验证:用单频和扫频信号检查DDC性能
DDC设计完成后,必须经过充分测试。最基础的测试是用单频信号输入,观察输出I/Q的幅度和相位。如果输入频率正好等于NCO频率,输出应该是直流;如果输入频率偏了1kHz,输出应该是1kHz的正弦波。通过改变输入频率,可以测量DDC的通带响应和阻带衰减。
扫频测试更全面。用信号发生器从低频到高频扫一遍,记录输出幅度,画出频率响应曲线。重点看通带波纹、阻带衰减和过渡带宽度是否符合设计指标。如果发现某段频率衰减不够,可能是滤波器系数有问题,或者定点化误差太大。
还有一种测试是用宽带噪声输入,观察输出频谱。噪声输入可以同时激励所有频率,用FFT分析输出频谱,可以快速看到整个频带的响应。这种方法比扫频快,但精度稍低。
8. 写在最后的一些个人体会
DDC这东西,理论看起来不复杂,但真正做起来,坑都在细节里。我见过太多人把滤波器阶数算对了、抽取倍数选对了,结果因为NCO频率字少算了一位,或者CIC位宽不够溢出,调试了好几天。也见过有人为了省乘法器,把半带滤波器阶数砍得太狠,结果阻带衰减只有30dB,带外信号全混进来了。
我的经验是,DDC设计一定要留余量。滤波器阶数留20%余量,位宽留2~3位余量,NCO查找表地址留2位余量。这些余量在仿真时可能看不出差别,但在实际信号环境里,就是能不能稳定工作的分界线。另外,定点化仿真一定要做,用MATLAB或Python把定点链路跑一遍,和浮点结果对比,确认信噪比损失在可接受范围内。这一步花的时间,比在FPGA里调试省下来的时间多得多。
最后分享一个小技巧:如果时序实在收敛不了,可以把DDC拆成两级,中间加一个异步FIFO。第一级工作在高速时钟,第二级工作在低速时钟。这样每级的组合逻辑都短,时序容易满足。代价是FIFO的延迟和资源,但比起重新设计架构,这个代价小得多。