无线传输信号模拟系统:多径、噪声与多普勒的可控信道仿真 简介面向全国大学生电子设计竞赛备赛群体提供2024年C题“无线传输信号模拟系统”江苏省第一名完整方案。系统以STM32F407ZGT6为控制核心通过DDS生成四路频率与相位相对独立的载波及调制信号并借助单片机DAC偏置、模拟乘法器与加法器完成调幅波生成多径通道额外采用PE4302程控增益器实现精细衰减控制最终合路输出满足指标要求的模拟信号。方案完整覆盖直达与多径传输的硬件设计与软件控制逻辑可帮助理解AM信号模拟链路、运放放大与增益调节等关键环节。资源包共2000个文件约83.75MB以C源码和H头文件为主辅以TXT说明、MD笔记、Python脚本、JSON配置及少量CPP与Shell工具工程结构清晰适合直接导入单片机工程进行研读与二次开发。该资源已有2279人学习浏览属于电赛热门赛题的优质参考对备赛冲刺或无线通信方向的项目实践均有较高借鉴价值。1. 无线传输信号模拟系统不是“信号衰减”是把信道搬进实验台电赛现场拿到C题最容易踩的坑就是把“无线传输信号模拟系统”理解成可调衰减器。信号发生器输出单音加个衰减器再接天线就说完成了信道模拟评委追问一句“多径时延怎么设”当场翻车。这道题的核心在“模拟”而不在“发射”发射端生成已知调制信号经过高斯噪声、多径衰落、多普勒频移三项可配置信道污染接收端解调并测出星座图与误码率形成闭环。这套方案适合正在做电赛课设的A同学也适合想快速搭射频测试台的从业者。全文按总体架构、信道路径、收发链路、调试避坑、验收答辩的顺序铺开。2. 总体架构设计中频注入式信道模拟与射频收发链路的三段划分2.1 系统拓扑发射端、信道模拟器、接收端如何拼接一个典型的无线传输信号模拟系统分成三段。发射端产生基带调制信号经过正交调制上变频到中频信道模拟器是整个系统的核心工作在中频段把多径、噪声和多普勒污染加进信号路径接收端再下变频解调用ADC采样后送进MCU和上位机分析。这样做的理由很直接信道模拟器放在中频段器件选择空间大延迟线、开关矩阵、噪声源和混频器都不需要面对射频段的寄生参数压力。如果整个模拟链路都做在射频段延迟线的插损、开关的隔离度和噪声源的带内平坦度都会成为灾难。拓扑关系可以用下面这个结构来描述发射基带(MCUDAC) - 正交调制 - 中频 - 信道模拟器 - 射频上变频 - 天线 | v 信道模拟器内部中频输入 - 功分器 - 多径支路 \ 噪声支路 - 合路器 - 中频输出 多普勒支路 /三段结构里发射和接收的射频部分可以复用同一块电路板只控制收发切换。信道模拟器独立成一块板方便单独调试和定标。做项目时这种分离还有一个额外好处如果接收端星座图发散可以先用信号源跳过信道模拟器直接注入接收端几十秒就能确定问题出在前端还是后端。2.2 中频还是射频模拟链路预算与器件选择的取舍设计时最先要回答的问题是在哪个频段做信道模拟。放在射频段模拟延迟线要用射频同轴电缆物理长度和插损直接挂钩放在中频段频率通常选70MHz1米同轴对应的时延大约4.5ns通过合理组合可以覆盖几ns到几百ns的多径范围。噪声注入放在中频也有明显好处。射频段想做到-100dBm/Hz量级的平坦噪声源很吃力中频段用噪声二极管加带通滤波器配合LNA和数控衰减器带内平坦度可以控制在±0.5dB以内。多普勒混频同样放在中频实现因为DDS的参考时钟固定输出正弦频率可以精确到1Hz以下不需要担心射频本振相位噪声对频移精度的影响。链路预算要逐级算清楚。发射基带DAC输出幅度约1Vpp经过正交调制器后中频信号电平约-10dBm信道模拟器的多径支路延迟线组插损可能到20dB以上所以每条支路后面都要补一级可调增益放大器。噪声支路的等效注入功率要从-50dBm到-10dBm可调用0到60dB的数控衰减器覆盖步进0.5dB。合路器本身还有3dB左右的插损这部分也要计入总增益否则接收端看到的信噪比会低于设置值。2.3 关键指标定义从时延范围到信噪比调节范围系统的验收指标要在画原理图之前就定下来。这个项目的核心指标有四组多径时延范围0到200ns最小时延步进4.5ns信噪比调节范围0到30dB连续可调多普勒频移0到1kHz分辨率1Hz接收端误码率能在设置不同信道参数时呈现明显变化。指标不是越大越好。时延范围做到500ns意味着延迟线长度要超过110米插损和放大器数量都会翻倍调试难度急剧上升。对常见无线信道来说室内多径时延典型值在50ns量级0到200ns已经覆盖了超短波和短波常见的传播场景。现场验收时评委用频谱仪看频率选择性衰落时延范围不够会直接表现为频谱凹陷位置不对比精度偏差更容易被发现。3. 信道路径实现多径延时、高斯噪声与多普勒频移的可控设计3.1 多径模拟抽头延迟线还是同轴延迟线多径实现有两种主流做法。一种是用Bessel低通滤波器做等效延迟网络级联多个抽头每个抽头输出经过数控衰减器送到合路器另一种是用不同长度的同轴电缆构成延迟线用射频开关切换组合。抽头延迟方案在基带或低中频可行但群时延平坦度对运放一致性要求很高噪声累积也严重。同轴方案更直观延迟时间等于电缆长度除以传播速度1米同轴大约对应4.5ns30米电缆对应135ns。我实际采用同轴方案因为调试时用万用表和频谱仪就能验证每一档延迟是否准确而不用去抠滤波器的群时延曲线。每条延迟线后面加一个数控衰减器做插损补偿另外预留一级增益微调。切换用SPDT射频开关开关时间小于50ns不会在切换瞬间产生肉眼可见的中断。// 延迟线组合选择的伪代码 typedef struct { uint8_t switch_id; // 开关编号 uint16_t delay_ns; // 对应延迟值 int8_t gain_db; // 补偿增益 } DelayLine; DelayLine delay_table[] { {0, 0, 0}, // 直通 {1, 13.5, 3}, // 约3米同轴 {2, 31.5, 6}, // 约7米同轴 {3, 67.5,10}, // 约15米同轴 {4, 135.0,15} // 约30米同轴 }; void set_multipath_profile(int ns) { // 根据目标时延查表同时导通多条支路 for (int i 0; i 5; i) { if (delay_table[i].delay_ns ns) { set_switch(i, ON); set_attenuator(i, 30 - delay_table[i].gain_db); } } }这个查表结构说明一个关键设计多径模拟不是只选一条延迟线而是同时导通多条支路不同支路增益不同才能叠加出多径衰落的效果。如果只选一条接收端看到的只是信号幅度变化那依然等于衰减器起不到模拟多径的作用。衰减器初始值30dB可以按实际插损调整调试时用矢量网络分析仪测每条支路的S21把增益码对应到真实衰减值。3.2 噪声注入雪崩噪声源与数控衰减的功率定标高斯白噪声源的常规实现是利用晶体管基极-发射极反向击穿时的雪崩噪声或者用专用噪声二极管。噪声管输出只有几十微伏需要经过LNA放大到毫伏级才有实用价值。关键是带内平坦度70MHz中频处要加中心频率70MHz、带宽约10MHz的陶瓷滤波器或LC带通确保噪声在这段频谱内接近白噪声。#define NOISE_ATT_MAX 60 // 0-60dB #define NOISE_STEP_DB 0.5 // 0.5dB步进 // 噪声功率定标以合路器输出为参考点 void calibrate_noise_power(void) { float target_noise_power -40.0f; // 目标噪声功率 float read_power read_power_meter(); // 频谱仪读取 if (fabsf(target_noise_power - read_power) 6.0f) { // 误差超过6dB多半是LNA偏置不正常 check_ln_bias(); return; } // 步进0.5dB反复逼近目标值 set_noise_att(att_current (target_noise_power - read_power) / NOISE_STEP_DB); }定标时的读数处理要注意频谱仪噪声读数天然有抖动单次读取可能偏差几个dB。我在代码里做的是连续采样10次取平均RBW固定为100kHzVBW设为10Hz这样定标曲线才稳定。另外定标顺序也很重要先关掉噪声支路校准信号电平和多径增益最后开噪声。顺序反了的话信号路径和噪声路径互相拉扯功率表读数一直在跳。3.3 多普勒频移正交混频设计与频率分辨率多普勒频移的本质是让信号频谱整体搬移一个频率。实现方法是用DDS产生低频正弦信号把待发射信号和这个正弦做乘法产生频谱搬移。如果只做单路混频会产生双边带接收端频谱两侧都有信号判别困难正确做法是I/Q两路正交混频在数学上等效为复数频谱搬移只保留单边带。// DDS频率控制字计算参考时钟100MHz相位累加器32位 uint32_t dds_set_frequency(float hz, float ref_clk_mhz) { uint32_t freq_word (uint32_t)(hz * 4294967296.0f / (ref_clk_mhz * 1e6f)); write_dds_reg(0x2, freq_word); // 频率调谐寄存器 return freq_word; } // 目标多普勒频移10kHz // freq_word 10000 * 4294967296 / 100000000 429496 dds_set_frequency(10000.0f, 100.0f);DDS输出幅度直接影响混频效果幅度过大会产生额外镜像分量幅度过小则频移效果不明显。我在DDS后面加了一级AGC把混频本振幅度稳定在0dBm这样多普勒支路的附加插损基本固定大约8dB由后级放大器统一补偿。频率分辨率方面32位累加器在100MHz参考时钟下理论分辨率约0.023Hz实际系统只要做到1Hz步进就足够因为接收端频谱仪分辨率带宽很难超过1kHz。3.4 合路与隔离避免信号回灌的关键设计三条支路最终要合路合路器选择直接决定系统稳定性。如果直接用功分器反向使用支路间隔离度通常只有20dB噪声支路的信号会回灌到多径支路让延迟线后面的放大器提前饱和。我采用两级合路先让多径支路和噪声支路合路经过一级固定增益放大后再与多普勒支路合路这样支路间隔离度可以拉开到40dB以上。另一条经验是合路点前后都要加匹配衰减器。哪怕多损耗3dB也要保证各支路端口驻波比小于1.5。同轴延迟线本身是50欧姆但开关切换瞬间会产生反射我在每条延迟线末端并联一个50欧姆终端电阻切换时把未用支路对地短路避免开关泄漏影响信号质量。调试时最典型的症状是噪声支路关到最大衰减接收端底噪仍然很高这种情况九成是隔离度不够造成的回灌。4. 收发链路与自动测量从DDS基带生成到星座图误码率分析4.1 发射端基带信号生成与上变频发射端要生成可配置的调制信号我常用MCU的DAC配合定时器中断生成符号流映射成I/Q两路。符号速率不需要太高作为信道模拟系统的演示10k到100k符号每秒足够对应基带带宽几kHz到几十kHz正好落在中频通带内。I/Q数据经过两个DAC之后进入正交调制器调制到70MHz中频。// QPSK符号映射输出I/Q幅度 void qpsk_map(const uint8_t *bits, int16_t *i_out, int16_t *q_out, int len) { for (int i 0; i len; i) { uint8_t d bits[i]; switch (d 0x03) { case 0: i_out[i] 78; q_out[i] 78; break; case 1: i_out[i] 78; q_out[i] -78; break; case 2: i_out[i] -78; q_out[i] 78; break; case 3: i_out[i] -78; q_out[i] -78; break; } } }幅度78对应8位DAC满量程的约60%这个选择是有意的给后面的调制器留出峰值余量。如果用满幅度122经过升余弦滤波后符号点会越界星座图边缘糊掉。基带脉冲成型滤波器用FIR实现常见参数是滚降系数0.5阶数32。FIR系数可以直接查表生成采样率设为符号率的8倍保证滤波后的波形平滑。4.2 接收端零中频解调与ADC采集接收端用正交解调器对接收到信号进行零中频解调输出I/Q两路基带信号经过低通滤波后送ADC采样。ADC采样率要满足至少4倍符号速率比如符号率50k时采样率取200k。采样数据在MCU里做数字下变频、匹配滤波、定时恢复和判决。定时恢复用Gardner算法虽然实现简单但在低信噪比下抖动偏大。我在环路里加了二阶滤波器环路带宽设为符号率的1/100这样在噪声大时锁相更稳。实际调试时先不加信道污染让接收端锁定到一个干净的星座图再逐步加入噪声和多径。如果先加满参数再调环路星座图是花的根本判断不了是环路问题还是信道问题。4.3 上位机参数配置与结果统计系统要能自动测量并显示常规做法是MCU把原始采样点通过串口发给上位机上位机用Python脚本绘制星座图、统计误码率。上位机同时承担参数配置功能时延、噪声功率、多普勒频率三项参数由上位机发送给发射端MCU再由MCU通过控制线配置信道模拟器的开关和衰减器。import serial import numpy as np import matplotlib.pyplot as plt ser serial.Serial(/dev/ttyUSB0, 921600) def configure_channel(delay_ns, noise_power_dbm, doppler_hz): cmd fCFG {delay_ns} {noise_power_dbm} {doppler_hz}\n ser.write(cmd.encode()) def receive_symbols(num_symbols): # 每个符号两个int16共4字节 data ser.read(num_symbols * 4) samples np.frombuffer(data, dtypenp.int16) i_q samples.reshape(-1, 2) return i_q[:, 0] / 32768.0, i_q[:, 1] / 32768.0 configure_channel(50, -20, 100) i, q receive_symbols(2048) plt.scatter(i, q, s1) plt.axis(equal) plt.show()串口配置这个环节经常被忽略默认9600波特率会让2048个符号的传输耗时好几秒星座图刷新卡顿严重。实际设到921600完全没问题MCU的UART够用唯一要注意的是接收缓冲区和DMA的对接避免读串口时只读半包。误码率统计建议用PN9伪随机序列做数据源这样收发两端可以逐比特对齐误码率统计结果可信。5. 调试避坑手册底噪抬升、延迟不生效与星座旋转的排查路径5.1 现象关掉噪声源接收端底噪还是高现象把噪声支路的数控衰减器开到最大接收端频谱上的底噪仍然有-80dBm左右星座图发散。原因这个现象通常不是噪声管的问题而是电源噪声耦合。LNA的供电如果直接用开关电源开关频率的谐波会通过电源引脚进入中频带内在频谱仪上表现为抬高的底噪平台。另一种常见原因是合路器隔离度不够后级放大器的反射信号进入噪声源电路形成自激。解决LNA和DDS芯片的电源都用LDO单独供电LDO前后各加一个磁珠和10uF电容做π型滤波。另外噪声源输出端与合路器之间至少加20dB隔离衰减器防止反射信号回灌。调试时用频谱仪断开合路器单独看噪声支路输出是最快的定位方法。5.2 现象时延档位切换后误码率完全不变现象切换延迟线长度接收端误码率始终为0星座图也没有明显旋转。原因两类可能。第一类是延迟线根本没切入SPDT开关控制电平没有翻转但面板LED显示正常说明控制信号接线错位第二类是时延量太小50k符号率下符号周期20us几十ns的延迟对相位影响只有零点几度判决器自然不敏感。解决先用矢量网络分析仪测信道模拟器的S21切换前后看幅度和相位响应是否有明显变化。S21正常的话就提高符号率到200k以上或用135ns档位做粗调验证系统灵敏度。实际调试时先用135ns档位确认系统响应再逐步缩小时延到31.5ns、13.5ns不要一上来就测最小档。5.3 现象星座图点聚成一团看不出原因现象星座图不是标准的四个点而是每簇变成一个弧形随时间旋转。原因这是零中频接收的经典问题。接收端本振与发射端上变频本振频率并不完全一致残余载波频偏会让星座点持续旋转。多普勒频移开启时这种旋转会叠加得更明显。新手容易把这种现象当成玄学其实频谱搬移的原理非常确定两个晶振的频差就是旋转角速度。解决载波恢复环节必须加我用了Costas环消除残余频偏。环路滤波器带宽取几十赫兹到几百赫兹带宽太大会把噪声踢进星座点带宽太小则锁不住频率突变。现场流程是先不给多普勒频移把Costas环锁定在0频偏附近再逐步加入多普勒频率观察星座图是否保持静止。6. 验收与答辩用一条完整指标链路证明方案能落地6.1 现场验收清单现场评审通常分三块。第一块看参数调节能力上位机能否把噪声功率、多径延迟、多普勒频移独立设置设置后频谱仪读数误差在±1dB以内第二块看信道效果信噪比5dB、时延50ns条件下接收端能否正确解调QPSK符号误码率低于1e-3第三块看稳定性连续运行半小时信号功率漂移小于0.5dB。6.2 答辩时三张图讲清系统原理答辩不要只讲原理框图评委更想看结果。我建议准备三张图第一张是星座图对比无噪声、加噪声、噪声加多径三组并列一眼看出信道污染效果第二张是误码率随信噪比变化曲线和理论曲线放一起证明系统链路底噪控制到位第三张是系统实拍图标注各测试点的电平证明每个模块的实际参数可查。6.3 复盘教训这个项目对我触动最深的是标定顺序。之前我先调好所有支路再去定噪底结果合路器隔离不足噪声回灌导致信号路径增益整体偏大误码率曲线怎么测都合不上理论值。从那以后我每次调试都强制先做合路器隔离测试再标定功率链路线性度最后才碰误码率。留个习惯先隔离、再定标、最后看误码率希望帮到你。本文还有配套的精品资源点击获取