ARTICLE DETAIL

资讯详情

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

中频采样与数字下变频:原理、参数设计与FPGA实现要点

中频采样与数字下变频:原理、参数设计与FPGA实现要点 中频采样和数字下变频DDC这两个词搞软件无线电、雷达接收机、通信物理层的人天天都在碰。但说实话能把这两个东西真正讲透、用好的工程师比想象中少。很多人一开始都搞混过以为中频采样就是拿一个高速ADC对着中频信号咔咔采就行了数字下变频就是混频加滤波。理论上是这么回事但实际做起来镜像抑制、抽取滤波、增益分配、杂散控制一环扣一环每一环都能把你折腾到怀疑人生。这篇文章就围绕“中频采样与数字下变频”这条主线把原理拆开揉碎讲清楚为什么这么干、参数怎么定、代码怎么写、坑在哪里。不管你是刚接触SDR的学生还是正在做接收机工程的硬件工程师都能从里面找到点能直接拿去用的东西。1. 中频采样的原理与核心思路1.1 为什么要把采样放在中频而不是基带传统的模拟接收机是天线进来射频信号经过一级一级的模拟混频先把信号搬到很低的中频甚至基带再用ADC去采样。这种架构的问题很明显模拟链路太长了每一级混频都会引入非线性失真和噪声而且本振LO泄漏、镜像干扰在模拟域很难彻底滤干净整机的一致性也差。中频采样的思路反过来——ADC不再放在基带而是直接采样中频信号。它的核心依据是带通采样定理也叫欠采样。这地方很多新手容易晕总觉得采样率必须大于信号最高频率的两倍。那是低通采样也就是基带采样。对于中频信号来说信号本身是窄带的只是它的载波频率中心频率很高。带通采样利用的是频谱的周期性搬移特性让ADC用一个相对较低的采样率就能把高频窄带信号“折叠”到低频区间并且不产生频谱混叠。举个具体的例子。假设中频是70MHz信号带宽是10MHz那么信号实际占用的频率范围是65MHz到75MHz。如果用低通采样的思路采样率得做到150MHz以上甚至更高ADC的压力一下就上去了。但用带通采样取采样率Fs56MHz根据带通采样公式可以计算出信号会被搬移到以14MHz为中心的位置正好落在第一奈奎斯特区内整个10MHz带宽的信息完整保留下来。采样率从150MHz降到56MHzADC的成本、功耗、后续FPGA的数据处理压力全都下来了。1.2 带通采样的频谱搬移规律这里要真正理解带通采样到底是怎么实现“不混叠”的。信号在频域是中心频率为f0、带宽为B的窄带谱线。采样相当于在频域把原始频谱以Fs为周期做无限复制。如果Fs选得合适那么这些复制出的频谱之间就不会重叠原始频谱落在哪个奈奎斯特区Nyquist Zone它就会在数字域被映射到从0到Fs/2的频段内一个确定的位置。选Fs有两类约束。第一类是防混叠约束也就是频谱复制之后不能互相重叠数学上要求采样率Fs至少大于2B这是窄带信号的奈奎斯特率。第二类是搬移位置约束要求必须满足信号中心频率f0落在某个整数奈奎斯特区的中部采样之后搬移到的数字中频f_IF要满足0到Fs/2的值域约束。实际操作中工程师一般会给出一个公式f0 n × Fs ± f_IFn取合适的整数f_IF就是搬移后的数字中频。这个公式很好用不管n取几算出来的采样率都能保证信号落在基带以内的一个可控位置。但必须注意带通采样并不是“免费午餐”它对模拟前端的抗混叠滤波器要求很高因为镜频信号一旦和有用信号一起进入ADC混叠之后就没有办法再分开了。1.3 抗混叠滤波器的必要性与设计思路采样前的模拟滤波器往往是整个链路成败的关键但恰恰是很多人忽略的地方。采样定理的前提是信号严格带限带宽之外的噪声和干扰一旦进到ADC就会折叠进有用频带内而且折进来之后是去不掉的。这类折叠噪声在频谱上表现为“噪声底抬高一片”严重时直接把灵敏度打掉好几个dB。我在实际项目中中频采样前的抗混叠滤波器一般用LC带通滤波器或者声表滤波器。LC滤波器的优势是调试灵活适合带宽大、带外抑制要求不太极端的场景声表滤波器的矩形系数好但匹配和温度稳定性要仔细考虑。选择的关键指标有三个通带带宽尽量贴近信号带宽、带外抑制至少30dB以上、带内波动控制在0.5dB以内。带内波动这一点经常被忽略它直接恶化接收机的矢量误差幅度EVM对QAM这类高阶调制来说是致命的。2. 数字下变频的架构与核心模块2.1 数字下变频解决了什么问题ADC把中频信号采进来之后数据速率很高信号却还停留在一个中频位置上这时候要做两件事把信号从数字中频搬移到基带然后降低数据速率减轻后端处理负担。数字下变频就是完成这两件事的一套数字信号处理链路。你完全可以把DDC理解成一个“数字超外差接收机”数控振荡器NCO扮演本振的角色数字混频器代替模拟混频器CIC抽取滤波器和FIR滤波器则完成模拟中频链路里滤波器的工作。整个搬移过程在数字域进行好处是本振频率精确可调没有模拟本振的相位噪声和频率漂移镜像抑制也彻底了——因为数字混频是严格正交的幅度相位误差可以控制在极低水平。DDC的标准信号链是ADC数据进来先经过混频器乘以NCO产生的正交本振分出I/Q两路两路信号各自经过CIC抽取滤波器做第一级降速和第二级滤波再由FIR滤波器做整形补偿最后经过抽取降低数据率输出基带I/Q数据。这条链路的每个环节都有讲究任何一个参数没算对信号质量都会出问题。2.2 NCO与混频的坐标旋转本质NCO本质上是离散相位累加器加一个正弦查找表。它输出cos和sin两路正交本振频率控制字决定了本振频率。很多人问为什么要I/Q两路因为单路实信号混频之后频谱是对称的正负频率重叠在一起信息混淆。I/Q两路分别乘以cos和sin就能保留信号的完整相位信息也就是复信号。复信号的好处是能区分正负频率频谱不再对称这样后续通过抽取就能把频带搬正信息和镜像分离清晰。调NCO频率有个很实用的技巧。若采样率Fs100MHz想生成一个10MHz的本振相位累加器的位宽常用32位那么频率控制字就是FTW f_LO × 2^32 / Fs 10e6 × 2^32 / 100e6 429,496,730这个值就是NCO相位累加器每周期要加的步进。频率分辨率大约为Fs/2^32也就是0.023Hz完全够用。实际调试时你会发现NCO相位累加器溢出那一刻存在一个固有的相位截断误差会引入很小的杂散几乎不可能完全消除只能通过增加相位累加器位宽和抖动dithering来把它压到噪声底以下。这点在做高动态范围接收机时特别值得注意。2.3 CIC抽取滤波性价比最高的第一级CIC滤波器是DDC里最有意思的模块。它只用加法器和延迟器不需要乘法器就能实现很大的抽取倍数和窄带滤波。原理也很好理解——它就是滑动求和等效于一个一阶的梳状滤波器和一阶积分器级联。CIC滤波器的频率响应是sinc形状主瓣窄、旁瓣衰减慢所以单级CIC的阻带性能很差工程上通常用5到7级的级联。级联CIC有一个非常明显的代价通带内的幅度衰减会变得很严重。CIC的幅频响应在通带边缘掉落的幅度与级数成正比。所以CIC之后必须接一个补偿FIR滤波器把通带内的凹陷补偿回来。很多人做DDC反正信号也不要了才想起来补偿这是不对的。正确做法是一开始就要把CIC的抽取倍数、级数和补偿FIR的阶数一起协同设计。还有一点必须提醒CIC滤波器的增益等于抽取倍数N的M次方其中M是级数。这是个大数。如果抽取倍数是32级联5级那增益就是32的5次方约3300万倍。在定点数实现时如果不小心就会溢出。所以CIC内部要预留足够的位宽或者在每一级之后做算术右移来截位。这个增益分配问题是我见过DDC设计中出错最多的环节。2.4 FIR整形滤波器最后的精度担当FIR滤波器是DDC链路里精度最高的环节。它负责完成三件精细活第一将CIC带来的通带衰减补偿回来第二完成最终的匹配滤波和整形第三把带外噪声和镜像彻底滤干净。FIR设计有窗函数法、等纹波法、最小二乘法工程上最常用的是等纹波法因为同样阶数下它能得到最小的通带纹波和阻带衰减。设计FIR时主要关注三个参数阶数、通带波纹、阻带衰减。以采样率56MHz、信号带宽10MHz、过渡带1MHz为例用等纹波法设计一个低通滤波器阻带衰减60dB大概需要80阶左右。阶数太高资源开销大阶数太低带外抑制不够。实际工程中我一般先在Matlab里用designfir或者fdatool把参数扫一遍保存系数然后落进FPGA最后在板上实测带外抑制。3. 参数计算与落地方案全过程3.1 一个完整的参数设计案例我拿一个真实的项目案例来拆解一遍。任务设计一个中频70MHz、信号带宽10MHz的数字接收机前端要求输出基带I/Q数据速率为5MHz。第一步定采样率。利用带通采样公式f0 2 × Fs f_IF选n2令f_IF14MHz则70MHz 2 × Fs 14MHz → Fs 28MHz不对这里算出来是28MHz虽然满足带通采样条件但采样率太接近信号带宽的两倍了抗混叠滤波器很难做。工程上更稳妥的选择是让ADC采样率尽量高一些留出滤波余量。我们重新选n3要求f_IF14MHz70MHz 3 × Fs 14MHz不对这里的“”方向取决于你使用的奈奎斯特区让我用更严谨的表达70MHz 3 × Fs / 2 f_IF 这种写法容易混。我们直接用防混叠和搬移约束来选要求信号带宽10MHz采样率至少是2×10MHz 20MHz。中频70MHz处在3.5倍的20MHz位置让信号在第三奈奎斯特区。若Fs40MHz那么信号频谱在采样后搬移的位置满足f_IF | 70MHz - n × Fs |找n使得f_IF在0到20MHz之间。70 - 2×40 -10取绝对值10MHz。也就是说采样率40MHz时信号被搬移到10MHz的数字中频落在第一奈奎斯特区一切正常。第二步确定DDC的抽取倍数。ADC采样率40MHz期望输出数据率5MHz总抽取倍数为40/5 8。这个抽取倍数由CIC和FIR共同分担。我习惯让CIC做整数抽取4FIR做2倍抽取。这样CIC的负担轻FIR的过渡带也好设计。第三步设计CIC参数。输入40MHz抽取4倍输出10MHz级数选5级。CIC的增益为G_CIC 4^5 1024这个增益要在CIC内部通过移位方式分配掉否则10MHz输出数据的位宽会爆炸。设ADC数据位宽16位CIC输出要限制在18位以内那就需要做大约7比特的算术右移。具体移位量在具体实现时可以通过仿真看最大幅值来确定不能拍脑袋。第四步设计补偿FIR。输入10MHz输出进行2倍抽取后为5MHz。CIC在10MHz输出数据率下的通带边缘是2.5MHz它的通带衰减约几个dB补偿FIR要设计成相反形状的幅度响应。同时FIR还要完成低通滤波截止频率2.5MHz过渡带从2.5MHz到5MHz阻带衰减60dB。我用等纹波法设计出来的阶数在29阶左右非常轻量。3.2 FPGA实现要点与代码结构在FPGA里实现DDC我有两个习惯一个是所有乘法都用DSP48硬核NCO和FIR都要确保资源映射正确另一个是每一级滤波之后都要做个定点仿真对齐拿Matlab浮点结果当基准逐点比对。有些工程师习惯直接上板看星座图其实风险很大因为一旦信号链里有错位排查起来非常耗时。先把数据流用仿真对齐板子上大概率一次通过。我用Verilog实现过这套链路关键模块包括NCO例化直接调Xilinx DDS IP、混频器两个乘法器I路乘cosQ路乘sin注意定点位宽扩展、CIC抽取滤波器五级级联积分梳状、FIR补偿滤波器调用FIR Compiler IP。混频之后数据位宽会扩展到大约32位然后进CIC之前要做一个位宽截取。这个截取点的选择会影响无杂散动态范围我一般会在混频输出保留足够的MSB位数宁可多留2比特给后续处理留余量也不要在这里省位宽。NCO配置参数也要注意输出频率设为本振频率10MHz频率控制字按公式计算初始相位清零输出宽度16位。补偿FIR的系数通过COE文件导入IP核滤波结构选半并行或者全并行完全看资源余量。3.3 从Matlab到FPGA的仿真验证流程我每次设计DDC都是先在Matlab里搭一个完整的浮点模型把中频信号源生成、NCO混频、CIC抽取、FIR补偿全流程跑通记录各个节点的波形和时间序列。然后写定点模型把量化效应叠加进去跟浮点结果对比。最后拿同一段信号灌进FPGA仿真或者用ILA抓实际运行数据比对FPGA输出和Matlab基准输出的误差。这个流程看起来多了一道步骤但实际上是最省时间的。因为CIC的位宽截取、FIR的系数量化、混频器的乘法舍入每一个环节的误差都会积累。直接上板的话出问题了你根本不知道是哪个环节的量化不够回头检查一遍的时间够你把整个仿真流程跑两遍了。4. 常见问题与排查技巧实录4.1 频谱杂散大的真实排查经历有一次调试一个中频采样接收机输入一个干净的单载波信号输出频谱在远离载波的位置出现了一个明显的杂散幅度只比主信号低45dB左右。按照指标杂散至少要低于60dB。这个杂散并不是整数倍频用频谱仪逐级测模拟前端也测不出来说明问题出在数字域。排查过程是这样的先检查NCO的相位截断。我用的是32位相位累加器、输出用高16位查表相位截断噪声的理论杂散电平大概在-55dB左右加上抖动之后应该能压更低。但实测杂散并没有被压下去。继续查结果发现是混频器的乘法位宽不够。混频器输出做了截位截断误差里边混入了NCO的量化噪声两者不是独立随机的而是在特定频点上产生了相关性聚集形成了杂散。把混频器输出位宽从16位扩到24位再截断杂散立刻降到了-70dB以下。这个坑很有代表性也算给后来人提个醒数字信号处理里截位点的选择直接决定了杂散底而截位误差跟输入的量化误差如果存在相关性就不是简单加噪声的问题而是会产生确定性杂散。要避免就得让每个节点的位宽足够宽把截断误差跟信号本身去相关。或者做抖动dithering也是一个方法但通常扩位宽更直接有效。4.2 CIC溢出和频率响应凹陷的修复有同行调CIC输出时遇到波形乱跳的问题我一看就猜到是CIC内部溢出了。CIC的特性是高增益5级级联、抽取4倍中间节点位宽不够肯定要出事。很多IP核配置向导会给你自动计算最小位宽但那个最小位宽是保证“不溢出”并不保证“量化噪声足够低”。要是只按最小位宽来做输出信噪比会明显变差。更麻烦的一个坑是CIC通带凹陷。我见过有人在信号带宽较大的场景里没加补偿滤波器结果星座图上的点全部往外扩散EVM直接超标。CIC的幅频响应是sinc形状通带边缘跌幅可能到几个dB这个衰减对解调来说完全不可接受。补偿滤波器的设计要跟整个链路的幅频响应一起看不是说随便搞个FIR高音提升一下就行。补偿的目的是让CIC补偿FIR的级联响应在整个信号带宽内尽量平坦波动控制在0.1dB级别。做这个设计时先用Matlab把CIC幅频特性画出来然后逆向设计补偿滤波器的幅频特性正向验证平坦度直到达标。4.3 DDC参数调试速查表整理一份我在调试中经常对照的速查表给大家参考现象可能原因处理方向输出频谱有镜像抽取前未滤干净或I/Q幅度不平衡检查FIR截止频率、检查I/Q增益是否对齐星座图发散变形CIC通带凹陷未补偿或定时偏差增加补偿FIR、检查符号同步环杂散靠近主信号NCO相位截断或混频截位过紧加抖、扩位宽、调整截断位置输出噪声底抬高抗混叠滤波器带宽太宽加严带通滤波、检查ADC驱动信号丢失或波形乱跳CIC溢出或位宽配置不足重算增益预算、扩中间位宽输出速率不对抽取倍数配置错误核对CIC和FIR的抽取参数这张表其实覆盖了DDC调试里八成以上的问题。说到底大部分问题要么出在“频域没分干净”要么出在“位宽不够”。把这两点抓住了DDC调试基本就成功了大半。5. 工具链与工程化的几点心得5.1 用对工具能省一半力气做DDC设计我的工具链是固定的Matlab/Simulink做算法验证和浮点参考Vivado做FPGA工程ChipScope或ILA做片上实时观测。有些人喜欢直接用System Generator我个人的看法是可以用来快速原型验证但到了量产项目还是建议手写RTL因为可控性更好综合结果也能优化得更透。当然新手入门用SysGen快速跑通流程完全没问题等理解了数据通路再回头学RTL会容易很多。Matlab里设计滤波器我都是直接用Filter Designer工具参数设完后导出系数为系数文件。有一个细节值得一提导出的系数是浮点小数FPGA里要用定点数实现系数位宽一般选16位或者18位系数量化本身会稍微抬高阻带底噪但在设计滤波器的时候预留几个dB的余量就能吞掉这个误差。5.2 用“带宽语言”看整个接收链路我做了几年接收机最大的体悟就是把整个链路当成一个“带宽生意”来看。中频采样负责把模拟世界的高频窄带信号“搬运”到数字世界DDC负责把这个窄带信号从数字中频搬到基带同时丢掉不需要的带宽、降低数据率。每一步的核心都在带宽的取舍抗混叠滤波器舍弃模拟域的带外宽带噪声CIC舍弃中间的数据率宽度FIR舍弃频域残留的镜像和带外干扰。理解了这个逻辑你在配置每个参数的时候心里就有数了而不是死记公式。对我个人来说中频采样和数字下变频这套技术最迷人的地方就是它把接收机的体积、功耗、一致性问题用一个精巧的数字信号处理流程给化解掉了。现在哪怕是几百块钱的软件无线电设备里面用的也是这套原理。理解了它等于看懂了大半个现代接收机的骨架。希望这篇文章能帮你把这个骨架搭起来无论是做学术研究还是工程项目都能少走点弯路。
返回列表