
2024年电赛C题公布之后我所在的备赛群里第一反应不是兴奋而是懵。“无线传输信号模拟系统”听起来像是通信专业研究生才折腾的东西。等把赛题仔细拆开才发现它要解决的其实就是三件事用DDS把指定频率的载波稳稳造出来把载波按AM或者CW的方式调制好再给信号叠加一个能量化设置的多径效应。说白了最后要交的是一台带信道模拟功能的可编程信号发生器。这篇文章把我从方案选型到调试验收的完整过程梳理出来重点放在DDS频率控制字计算、AM调制指数标定、CW键控电路设计以及最容易翻车的多径叠加链路。内容按“原理 → 实现 → 实测”的顺序走适合正在备赛的同学也适合以后要做信号源、信道模拟器或者射频测试系统的同行参考。1. 先别急着画板把C题拆成四个功能块1.1 题目到底在考什么功夫很多人一拿到题目就想着找现成的DDS模块、现成的AM解调芯片这个思路没错但容易忽略赛题的隐藏要求。C题表面上是“模拟无线传输信号”实际上考核点可以拆成四项第一载波频率能不能做到连续可调、调得准第二AM信号的调制深度能不能精确控制第三CW信号键控时要干净不能拖泥带水第四多径叠加后幅度和时延能不能按设定值复现。这四项里前两项属于信号源基本功第三项考的是开关整形能力第四项才是这个题真正拉开差距的地方。我们队伍一开始就把大部分精力放在DDS和AM上结果两三天就把电路跑通了最后却花了一周去解决多径链路的标定问题。所以建议后来的队伍拿到题目先画功能框图把每一项的验证方法列出来再开始动手。1.2 方案选型DDS芯片还是FPGA内部DDSDDS的实现路线估计每个参赛队伍都会纠结一下。一条路是外挂专用DDS芯片比如AD9834、AD9854、AD9910另一条路是在FPGA内部用Verilog搭一个DDS核再接外部高速DAC。两条路我都试过结论是如果题目对输出频率的要求在几十MHz以下强烈建议用专用DDS芯片省事、可靠、调试时间短。用FPGA做DDS的好处是灵活想加什么调制功能都能在数字域里拼坏处是高速DAC的布局布线、时钟同步、杂散抑制每一项都是坑尤其是比赛这种时间紧张的环境下画板差一点就很容易出问题。专用DDS芯片把相位累加器、波形查找表、DAC全部集成好了我们只需要通过SPI/并口配置寄存器剩下的交给芯片。AD9834的主频做到75MHz频率分辨率28位足够覆盖比赛题目的常规频段AD9854更猛内部双通道、48位频率字适合后面做多径的延迟叠加。1.3 我最终确定的硬件框架最终我采用的框架是“STM32H750主控 AD9834载波源 AD835模拟乘法器做AM 高速模拟开关做CW键控 功分器/衰减器/合路器搭多径链路”。这么选的原因很简单STM32H7系列主频高SPI速度能跑到几十MHz配合DMA和DMAMUX可以高速刷新DDS寄存器为后面做频率跳变和幅度调制留足余地AD9834输出正弦波的质量不错功耗低DIP封装的模块也容易在洞洞板或自制PCB上飞线调试AD835是宽带四象限模拟乘法器带宽远高于题目要求的最高频率做AM调制可以避免用DDS内部寄存器刷新方式带来的更新速率瓶颈。选择模拟乘法器而不是直接用DDS的幅度控制寄存器做AM是我这次最坚持的一个决定。AD9834确实带10位的“peak amplitude”寄存器可以通过单片机快速刷新实现调幅但实际测试下来寄存器更新的建立时间加上SPI传输时间能稳稳跑到的调制信号速率并不高而且幅度更新的毛刺会在包络上留下周期性抖动。外接模拟乘法器之后调制信号走模拟通路天然连续带宽高包络也平滑得多。2. DDS信号生成频率控制字、相位累加器与波形表2.1 先分清两个DDS搜资料的时候一定会发现网上关于DDS的讨论有一大半是ROS2、工业通信里的“Data Distribution Service”也就是数据分发服务协议跟咱们做信号源的“Direct Digital Synthesis”直接数字频率合成完全是两码事。C题里的DDS特指后者是一种用数字方法产生模拟波形的技术。如果看论文优先找关键词“直接数字频率合成”“DDS信号源”“相位累加器”不然很容易被带偏。2.2 DDS的原理与核心计算DDS的工作过程可以这样理解一个相位累加器每个时钟周期累加一次频率控制字累加器的高位当作地址去查一张正弦波形表查出来的幅度值送给DAC变成模拟电压。关键在于改变频率控制字相位累加器增长的速度就不同于是扫过正弦表的速度也就不同输出频率跟着变。频率控制字的计算公式是FTW f_out × 2^N / f_MCLK其中N是相位累加器位数AD9834取28f_MCLK是系统时钟。如果f_MCLK取75MHz想要输出1MHz正弦波那么FTW 1e6 × 2^28 / 75e6 ≈ 3,579,139换算成十六进制就是0x3698B3。这里有两个地方容易错一个是忘记把结果取整后再写寄存器取整误差会带来频率偏差另一个是2^28这个数不能约掉很多同学在这步化简出错过。2.3 滤波与幅度控制把台阶波变平滑DAC直接输出的信号本质上是阶梯波除了目标频率外还会在f_MCLK ± f_out以及更高次谐波处产生镜像频率。这些镜像如果不滤掉后面的AM调制和多径叠加都会把杂散一起带进去频谱上全是毛刺。我在AD9834输出端放了一级简单的7阶椭圆低通滤波器截止频率按最高输出频率的1.5倍设计比如最高输出20MHz就做到30MHz截止。椭圆滤波器过渡带窄能有效压制镜像频谱缺点是通带内有轻微纹波对比赛演示来说完全可接受。幅度控制方面AD9834可以通过外部电阻设置DAC满量程电流一般默认3.5mA左右。如果后面接的乘法器或放大器需要更大的驱动能力最好加一级宽带运放做缓冲比如OPA690或者AD8065。这里提醒一句不要在DDS输出端直接并联电容调幅度那会改变滤波器阻抗特性导致高频段幅度陡降。2.4 实时频率切换与STM32H7双缓冲比赛过程中如果要求模拟“跳频”一类的动态场景DDS频率的更新速度就很重要了。STM32H750的SPI可以跑到40MHz以上写一次AD9834寄存器只需要几十个时钟周期所以理论上能做到微秒量级的频率切换。但问题在于如果主程序里用普通延时函数去控制SPI片选实时性很难保证。我的做法是用定时器触发DMA搬运频率控制字把SPI片选引脚也纳入DMA序列控制这样每次更新频率的时序都完全一致。STM32H7的DMAMUX在这里特别有用它能把定时器事件直接映射成DMA请求不用CPU干预。配合双缓冲区可以在DMA搬运前一组数据的同时让CPU把下一组FTW计算好填入备用缓冲。这套机制表面上看是给DDS写数据实际上是把“信号生成参数更新”这件事变成了流水线作业跳频时波形相位完全连续没有任何停顿感。如果只用普通SPI阻塞发送频率高一点就会出现波形撕裂这在示波器上非常明显。3. AM调制从原理到调制指数的标定3.1 AM信号的两条实现路线AM调制的数学表达是u(t) [U_c m·U_c·cos(Ωt)]·cos(ω_c t)其中U_c是载波幅度m是调制指数Ω是调制信号角频率ω_c是载波角频率。这个公式本质上就是把调制信号加上直流偏置后乘到载波上。实现方式有两条路一是用DDS内部的幅度控制寄存器按调制信号速率刷新二是用外部模拟乘法器。前面已经说过我最终选了AD835做外部乘法。AD835的输出关系是W (X1 - X2)×(Y1 - Y2)/1V Z。做AM时X端接DDS载波Y端接“直流偏置 调制信号”的复合信号Z端接地。需要注意的是AD835的输入幅度不能超过其线性范围载波幅度一般控制在1Vpp以内调制信号叠加直流后也要保证始终大于0否则包络会负向削波产生过调幅失真。3.2 调制指数的计算与实测调制指数m的定义是调幅波包络变化幅度与载波幅度之比。示波器上测量时读取包络最大值U_max和最小值U_min按下式计算m (U_max - U_min) / (U_max U_min)比如载波本身幅度是2Vpp叠加调制信号后包络最大值变成3Vpp最小值变成1Vpp那么调制指数就是(3-1)/(31) 0.5也就是50%。比赛评测时评委很可能设定一个调制深度要求比如“输出AM信号调制指数可调30%到80%可设”这时候就要在固件里做一次反向计算已知期望的m和载波幅度U_c需要的调制信号幅度就是U_Ω m × U_c。然后根据乘法器的增益换算出Y端需要的实际电压摆幅。我在实测里发现AD835的输出存在温度漂移刚开始调好的m0.5放半小时会变成0.52左右。虽然变化不大但为了保险固件里可以加一个自动校准流程用ADC采样输出包络加一个简单的包络检波二极管电路算出实际m值然后闭环修正调制信号增益。这个闭环校准是本赛题AM部分拿高分的关键。3.3 调AM时常踩的几个坑第一个坑是调制信号叠加直流后幅度过大导致乘法器输出饱和。AD835的输出最高也就±2V多一旦饱和包络顶端被削平示波器一眼就看出来但很多同学不知道是乘法器饱和还以为是载波幅度太大。解决方法是把载波和调制信号幅度都控制在AD835推荐的线性范围内宁可小一点后面再加一级放大。第二个坑是包络检波二极管电路的时间常数没选好。如果用1N60和0.1μF电容做检波在载波频率比较低的时候比如100kHz检波输出会跟着载波本身跌落测出来的包络是三角波。解决办法是RC时间常数选在调制周期的1/10和载波周期的10倍之间也就是 1/(10×f_c) ≤ RC ≤ 1/(50×f_Ω) 这个区间这个窗口是存在的但要仔细算。第三个坑更有迷惑性AM输出波形在示波器上看包络正常但接上频谱仪发现载波旁边只有一边有边带。这通常不是AM做错了而是DDS和乘法器之间的信号地存在环路导致相位关系不对一般出现在飞线过长的情况下。把地线缩短、在所有模块共地点用粗铜线连接后问题基本消失。4. CW信号生成别把键控做成噪声源4.1 什么是CW信号、为什么它不是“简单开关”CW在通信里指等幅报也就是Continuous Wave。它的本质是载波的通断键控按键期间输出等幅载波松开期间不输出。严格来说CW是OOK调制的一种特例信息编码在载波包络的有无中常见于莫尔斯电报。很多队伍觉得CW不就是在DDS后面加个开关嘛单片机IO拉高拉低就行。实际一测包络上升沿和下降沿如果太陡频谱上会产生很宽的键控边带听起来就是“咔哒”一声接收端也会产生明显的频带扩展。题目要的是“信号模拟系统”模拟的对象应当接近真实电台的CW信号真实电台的键控波形是经过滤波整形的上升沿和下降沿都有几十毫秒的过渡时间。4.2 键控电路怎么设计最稳我的做法是让DDS常开输出载波在DDS后级用高速模拟开关做通断控制模拟开关的EN引脚由单片机IO控制。选模拟开关时要注意导通电阻和切换速度导通电阻太大会和滤波器阻抗分压导致开通瞬间幅度跳变切换速度太慢则包络沿过缓。我用的是一款低压SPDT模拟开关导通电阻不到1Ω开关时间在20ns以内完全够用。为了把包络修整得更自然我在开关控制端加了一级RC积分电路把单片机输出的方波控制信号变成带斜坡的包络控制信号上升时间大概1毫秒。这样键控出来的CW信号频谱非常干净相邻谱线间隔就是键控速率不会有额外杂散。如果直接让单片机IO去开关模拟开关虽然示波器也能看到方波包络但频谱上就会出现键控click噪声。这是CW部分最值得做的一处打磨。4.3 如何量化验证CW质量验证CW信号好不好不能只靠耳朵听需要两个基本测试。第一是示波器看包络记录一个“点”信号测量上升时间、下降时间、平顶平坦度我测下来上升时间约0.8ms、下降时间约1.1ms平顶幅度波动小于1%。第二是频谱仪看键控边带在CW键控速率10WPM情况下频谱偏移载频1kHz处的功率应比载波低至少40dB这样才说明没有明显的键控杂散。关于CW的速率我写了一个简单的配置函数通过串口或按键轮盘设置每分钟词汇数WPM固件里按WPM计算点时长、划时长和字符间隔。点时长公式是1.2 / WPM秒比如20WPM时一个点为60ms一个划为180ms字符间隔为180ms。这个公式来自国际莫尔斯码标准直接用就行。5. 多径调制这台模拟器最值钱的部分5.1 多径效应在信道里到底干了什么无线电信号从发射机到接收机往往不止走一条路。直射波是一路地面反射、建筑物反射、大气层反射都会形成延迟到达的附加路径。接收端拿到的信号是多路信号的向量和这就叫多径效应。最简单的双径模型可以写成y(t) x(t) a·x(t - τ)也就是主径信号加上一条延迟τ、幅度为a的反射径信号。这个模型在频域对应H(f) 1 a·e^(-j2πfτ)从这个公式能看出多径对频率是“选择性”的。当2πfτ等于2kπ时两条路径同相叠加幅度最大当2πfτ等于(2k1)π时两条路径反相抵消幅度出现凹陷。比如τ设为100ns第一次凹陷就在5MHz第二次在15MHz呈现一种“梳状滤波”效果。题目让做多径调制模拟核心就是把这个频域梳状响应和相应的时域延迟真实还原出来。5.2 用抽头延迟线搭一个多径模拟器多径模拟的硬件实现最经典、最稳定的方法是抽头延迟线结构。信号经过功分器分成两路一路为主径直接通向合路器另一路为延迟径先经过一段同轴电缆延迟线再经过可调衰减器也通向合路器最后合路输出。功分器和合路器我用的是微带结构的二等分功分器频率范围从10MHz到500MHz两路隔离度20dB以上。同轴电缆延迟线的时延按电缆长度算RG58同轴电缆的标称速度因子约0.66电磁波在电缆中的速度是3×10^8×0.66也就是约2×10^8 m/s延迟约5ns/m。如果要模拟200ns延迟就需要40米电缆这在比赛现场非常占地方。我的做法是准备一组长度分别为0.5米、1米、2米、5米、10米的电缆通过拨码开关或继电器切换接入回路组合出10ns到100ns量级的延迟。衰减器用的是PE4302数字步进衰减器通过SPI配置衰减范围0到31.5dB步进0.5dB。用数字衰减的优点是可以程序校准固件里建一张表把设定的衰减值和实测衰减值对应起来最终做到设定误差小于0.3dB。5.3 多径参数的测量与标定多径链路装好之后第一步不是接评委的仪器而是自己先把参数标定出来。我用双通道示波器同时测功分器输入和合路器输出用示波器的延迟时间光标测量主径和延迟径之间的时间差。实测5米RG58电缆产生约25ns延迟10米约50ns和理论计算基本一致。要注意的是电缆两端的SMA接头会额外增加几厘米等效长度精确标定时要把这部分也算进去。幅度标定则用连续波单频信号进行固定频率1MHz先把延迟径衰减器设为31.5dB几乎关断记下输出幅度U0再把衰减器调到0dB记下输出幅度U1。根据双径叠加公式U1 U0×(1a)就可以反推延迟径相对于主径的比例a。我标定出来0dB时a约0.95然后按0.5dB步进建立a值查找表固件里设定“反射径相对电平-6dB”时直接去查找表找对应的衰减器设置值。这一步如果不提前做到现场临时调时间根本不够用。6. 系统联调与问题排查实录与速查表6.1 建议的调试顺序整个系统联调时我的顺序是“DDS单频 → AM调制 → CW键控 → 多径叠加 → 整机联动”。每一步都用一台示波器和一台频谱仪做对照确认前一个模块输出正常再往后接。DDS单频测试时重点看频率是否与设定一致频谱上有没有多余的镜像AM调制测试时看包络对称性和调制指数是否线性CW键控测试时看包络沿和频谱边带多径叠加测试时看频域梳状凹陷位置是否和理论一致。联调过程中不要嫌麻烦每接一个模块就重新测一次频谱基线因为你不知道上一个模块的正常输出在接入下一级后会因为阻抗失配变成什么样子。我就是因为在DDS后直接接了AD835而没重新测频谱结果AM输出一直有奇怪的寄生振荡排查了半天发现是DDS滤波器输出阻抗和AD835输入端没匹配好加了一级缓冲器后就干净了。6.2 高频问题速查表下面这几个问题是我调测中和交流群里其他队伍遇到的典型故障整理成表方便大家直接对照。症状可能原因解决方法DDS输出频率≠设定值频率控制字取整误差、晶振频率偏差用频率计校准主时钟按实际f_MCLK反向计算FTW输出幅度随频率升高明显下降滤波器截止频率过低或运放增益带宽积不够检查滤波器设计换高带宽运放AM包络上下不对称调制信号直流偏置没加对或有负向削波加大直流偏置调低调制信号幅度AM包络有周期抖动用了DDS内部幅度寄存器做调制刷新速率不足改用外部模拟乘法器CW键控伴随“咔哒”声包络沿过陡键控边带过宽在开关控制端加RC斜坡整形多径叠加后高频衰减严重延迟电缆或功分器在目标频率插损过大换用更高带宽的电缆和功分器多径时延和理论值差很多电缆速度因子不是0.66、SMA接头附加延迟用示波器实测标定不要只看理论值合路输出有驻波起伏合路器端口没端接好反射过大检查所有端口的50Ω匹配和连接扭矩6.3 比赛现场的两个保命建议带过比赛的人都知道现场演示和实验室调试完全是两码事。第一个建议是做一套“参数预设矩阵”把题目可能要求的频率、调制深度、多径时延、多径衰减组合成编号比如场景1是1MHz载波加30%AM无多径场景2是5MHz载波加CW键控加200ns多径-6dB衰减做进一个表格存到固件里现场评委念参数直接按编号切换比现场拧衰减器、键盘输入快得多也稳得多。第二个建议是准备一个“快速验证信号链”的测试脚本开机以后按一个键系统自动依次输出1MHz/5MHz/10MHz三个单频并把频率误差打印到屏幕上然后输出调制指数50%的AM信号1秒钟再输出20WPM的CW测试音1秒钟最后切到预设的多径场景。评委看到这一套下来就知道你的系统是完整自洽的印象分能拉高不少。从方案定型到最终提交我们真正花在硬件上的时间其实只有两周多剩下大量时间都耗在标定和排障上。DDS、AM、CW这些模块单独拿出来都不难难的是把它们的指标放到同一套系统里还能互相不干扰。多径部分尤其要提前标定因为它是整个题目里最依赖实测数据、最不能靠“感觉调”的模块。如果你正在备赛建议重点花时间把多径链路的时延-衰减查找表做得细一点这个表做扎实了现场无论评委怎么变着花样出题你都能稳得住。