☰
电赛无线传输信号模拟系统:QPSK调制与FPGA同步解调实战
2026/10/21 4:18:18 网站建设 项目流程

简介:这份资源是2024年全国大学生电子设计竞赛C题「无线传输信号模拟系统」的江苏省第一名完整方案,面向备赛电赛的本科生、研究生及电子设计爱好者,尤其适合需要攻克DDS信号生成、调幅波合成与多径传输模拟等难点的中高级选手。方案以STM32F407ZGT6为核心,通过DDS产生四路频率与相位相对独立的信号,分别作为直达与多径AM信号的载波和调制信号,并独立控制幅值与相移;利用DAC提供偏置,经加法器与AD835乘法器得到调幅波,再经运放放大至目标幅值范围,多径信号额外通过PE4302程控增益器调节增益后合路输出。压缩包共约2000个文件,以1096个C源文件与831个头文件为主体,辅以txt说明、md文档及少量Python、JSON、CPP脚本,整体约83.75MB,工程结构完整。目前已有2279人学习下载,读者可从中获取完整赛题实现思路、模块化代码框架与关键电路参数,便于快速复现与二次开发。

1. 从一道电赛题说起:无线传输信号模拟系统到底要解决什么

每年电赛季,总有一道题让控制类和通信类的同学同时头疼——无线传输信号模拟系统。2024年C题出题方向指向一个很具体的场景:在受限条件下,构建一套能模拟无线信号发射、传输、接收全链路的系统,并且要对信号质量、传输距离、抗干扰能力做量化评估。这道题拿江苏省第一名的方案,核心不在于用了多贵的芯片,而在于架构选型和参数调优上做对了几个关键决策。

我带过两届电赛队伍,见过太多组在开题第三天就卡在“用FPGA还是MCU”这种问题上反复横跳。这套方案适合正在做通信类课设、电赛培训或者毕业设计选题偏信号处理方向的同学,也适合需要快速搭一套无线信号模拟验证平台的从业者。它要解决的核心问题是:如何在有限预算和有限调试周期内,让信号从发射端到接收端的误码率、信噪比、传输时延三个指标同时达标。

2. 系统总体架构设计:发射端、信道模拟与接收端的模块划分

2.1 三层架构的职责边界

这套方案在架构上分三层:发射端负责基带信号生成和调制上变频,信道模拟层负责引入可控的噪声、衰减和多径效应,接收端完成下变频、解调和解码。三层之间通过标准化的数字接口衔接,发射端和接收端各自独立调试,信道模拟层可以单独替换参数做回归测试。

发射端的核心任务是把待传输的数据流映射成适合无线传输的调制信号。方案里用的是QPSK调制,理由是它在同等信噪比下的误码率表现比FSK好,实现复杂度又比16QAM低。基带信号生成用DDS(直接数字频率合成)方式,在FPGA内部用查找表实现正弦和余弦载波,频率分辨率可以做到0.1Hz级别。

信道模拟层是整个系统里最容易被忽视但最影响最终指标的部分。很多队伍直接把发射端和接收端用线缆连接,跳过信道模拟,结果测试时发现指标漂亮得不像话,一上真实环境就崩。这套方案在信道模拟层做了三件事:加性高斯白噪声注入、可控衰减、两径多径模拟。噪声功率和衰减系数通过上位机实时下发,方便做参数扫描。

接收端的难点在同步。无线信号经过信道后,载波相位和符号定时都会偏移,接收端必须先做载波同步和定时同步才能正确解调。方案里载波同步用的是Costas环,定时同步用的是Gardner算法,两者都在FPGA内部用硬件逻辑实现,保证实时性。

2.2 关键模块的参数设计

发射端DDS模块的查找表深度设为1024点,位宽12bit,这样输出的正弦波谐波抑制可以做到-60dBc以下。QPSK调制器的符号速率设为100ksps,成型滤波器用根升余弦,滚降系数0.35。这个参数组合在占用带宽和码间干扰之间取了平衡。

信道模拟层的噪声注入用Box-Muller算法生成高斯白噪声,在FPGA里用两个均匀分布随机数经过对数运算和三角函数运算得到。衰减器用乘法器实现,系数范围0到1,步进0.01。多径模拟用两个抽头延迟线,延迟差设为符号周期的整数倍,幅度比可调。

接收端Costas环的环路带宽设为符号速率的1%,阻尼系数0.707。Gardner定时误差检测器的鉴相增益根据实际信号幅度做归一化,避免幅度波动导致定时环路失锁。

# 信道模拟层参数配置示例(上位机Python脚本) import numpy as np class ChannelSimulator: def __init__(self, snr_db=20, attenuation=0.8, multipath_delay=2, multipath_gain=0.3): """ snr_db: 信噪比,单位dB attenuation: 直射路径衰减系数,0~1 multipath_delay: 多径延迟,单位符号周期 multipath_gain: 多径幅度相对于直射路径的比例 """ self.snr_db = snr_db self.attenuation = attenuation self.multipath_delay = multipath_delay self.multipath_gain = multipath_gain def apply(self, signal): # 直射路径衰减 direct = signal * self.attenuation # 多径分量:延迟+衰减 delayed = np.zeros_like(signal) delay_samples = int(self.multipath_delay) if delay_samples < len(signal): delayed[delay_samples:] = signal[:-delay_samples] * self.attenuation * self.multipath_gain # 合成后加高斯白噪声 combined = direct + delayed signal_power = np.mean(combined ** 2) noise_power = signal_power / (10 ** (self.snr_db / 10)) noise = np.random.normal(0, np.sqrt(noise_power), len(combined)) return combined + noise

这段代码是信道模拟层的上位机参考实现,实际FPGA内部逻辑和这个算法一致,只是用硬件乘法器和加法器替代了numpy运算。参数说明里snr_db控制噪声强度,attenuation模拟路径损耗,multipath_delay和multipath_gain共同决定多径效应的严重程度。调试时通常先把多径关掉(multipath_gain=0),单独调SNR看误码率曲线,再逐步引入多径。

2.3 数据流与控制流分离

系统里有两类数据:一类是高速信号采样数据,在FPGA内部以流水线方式处理,不经过CPU;另一类是控制参数,比如调制方式切换、SNR设定、衰减系数调整,通过UART或SPI从上位机下发到FPGA的寄存器。这种分离设计的好处是控制参数的更新不会打断信号处理流水线,避免调试时出现“改一个参数整个系统重启”的尴尬。

3. 发射端与接收端的核心实现:从基带成型到同步解调

3.1 发射端基带成型的FPGA实现

基带成型滤波器用根升余弦,滚降系数0.35,符号速率100ksps,采样率设为符号速率的8倍,即800ksps。滤波器阶数取32阶,系数用MATLAB的rcosdesign函数生成后量化成12bit定点数,存入FPGA的ROM里。

QPSK映射规则:输入比特流每两个比特一组,00映射到(-1,-1),01映射到(-1,1),10映射到(1,-1),11映射到(1,1)。映射后的I/Q两路分别送入成型滤波器,滤波后的信号乘以DDS产生的载波,完成上变频。

// QPSK调制器核心逻辑(Verilog片段) module qpsk_modulator ( input wire clk, input wire rst_n, input wire [1:0] bit_pair, // 输入比特对 input wire [11:0] carrier_i, // DDS产生的I路载波 input wire [11:0] carrier_q, // DDS产生的Q路载波 output reg [23:0] modulated_out // 调制输出 ); reg signed [11:0] baseband_i, baseband_q; always @(posedge clk or negedge rst_n) begin if (!rst_n) begin baseband_i <= 12'sd0; baseband_q <= 12'sd0; end else begin case (bit_pair) 2'b00: begin baseband_i <= -12'sd1024; baseband_q <= -12'sd1024; end 2'b01: begin baseband_i <= -12'sd1024; baseband_q <= 12'sd1024; end 2'b10: begin baseband_i <= 12'sd1024; baseband_q <= -12'sd1024; end 2'b11: begin baseband_i <= 12'sd1024; baseband_q <= 12'sd1024; end endcase end end // 上变频:I路乘同相载波,Q路乘正交载波,然后相加 always @(posedge clk) begin modulated_out <= (baseband_i * carrier_i) - (baseband_q * carrier_q); end endmodule

这段Verilog代码实现了QPSK映射和上变频。bit_pair是输入的比特对,baseband_i和baseband_q是映射后的基带符号,幅度取1024是为了留出足够的动态范围。carrier_i和carrier_q来自DDS模块,频率由频率控制字决定。modulated_out是最终调制输出,位宽24bit,实际送入DAC时取高12位或14位。

调试时容易翻车的地方是载波泄漏。如果baseband_i和baseband_q的直流偏置不为零,调制输出里会残留载波分量,导致频谱上出现中心频率处的尖峰。解决办法是在映射后加一个直流消除模块,或者确保映射符号的均值为零。

3.2 接收端载波同步与定时同步

接收端的第一步是下变频,把接收信号分别乘以同相和正交载波,得到基带I/Q信号。下变频后的信号经过低通滤波,滤除二倍频分量。然后进入Costas环做载波相位恢复。

Costas环的核心是鉴相器,鉴相器的输出反映当前载波相位与理想相位的偏差。鉴相器输出经过环路滤波器(比例积分)后控制NCO(数控振荡器)的频率和相位,形成闭环。环路带宽设为符号速率的1%,这个值太大会引入过多噪声,太小则锁定时间过长。

// Costas环鉴相器与环路滤波器(简化版) module costas_loop ( input wire clk, input wire signed [11:0] i_in, input wire signed [11:0] q_in, output reg signed [11:0] phase_error, output reg signed [15:0] nco_control ); // 鉴相器:I*Q的符号反映相位偏差方向 wire signed [23:0] product = i_in * q_in; // 环路滤波器:比例积分 reg signed [23:0] integrator; always @(posedge clk) begin phase_error <= product[23:12]; // 取高位作为相位误差 integrator <= integrator + phase_error; nco_control <= (phase_error >>> 3) + (integrator >>> 6); // 比例+积分 end endmodule

鉴相器用I路和Q路的乘积作为相位误差指示,当相位锁定后Q路趋近于零,乘积也趋近于零。环路滤波器的比例系数和积分系数需要根据实际信号幅度调整,通常的做法是先设一个保守值,然后用阶跃响应观察锁定时间和过冲,逐步优化。

定时同步用Gardner算法,每个符号周期内采样两个点,利用相邻符号的定时误差信息调整采样时刻。Gardner算法的好处是对载波相位不敏感,可以在载波同步之前先做定时同步。

4. 避坑与常见问题:调试阶段最容易翻车的五个点

4.1 误码率曲线在低SNR时突然恶化

现象:SNR降到10dB以下时,误码率不是平滑上升,而是突然跳到0.5附近。原因通常是同步环路失锁。载波同步和定时同步在低SNR下鉴相器输出噪声增大,环路滤波器无法维持锁定。解决办法是降低环路带宽,或者在同步前先做一次粗频偏估计和校正,把初始频偏控制在环路捕获范围内。

4.2 多径模拟开启后星座图旋转

现象:打开多径模拟后,接收端星座图整体旋转,解调误码率飙升。原因是多径分量和直射分量叠加后产生了额外的相位偏移,而Costas环的鉴相范围有限,无法跟踪这种快速相位变化。解决方法是减小多径增益,或者在接收端增加一个自适应均衡器,用LMS算法跟踪信道变化。

4.3 FPGA资源占用超预期

现象:综合实现后发现查找表或乘法器资源不够,布局布线失败。原因通常是成型滤波器和DDS查找表占用了大量Block RAM,而乘法器在多个模块间复用不足。解决办法是把滤波器阶数从32降到24,或者用分布式算法实现滤波器,把乘法操作转换成查找表和加法。

4.4 上位机参数下发后系统行为异常

现象:通过UART修改SNR参数后,接收端误码率没有变化,或者变化方向相反。原因是参数在FPGA内部的定点数格式和上位机浮点数格式没有对齐,比如上位机发的是20dB,FPGA收到后当成整数20处理,实际对应的SNR可能是完全不同的值。解决办法是在协议里明确定义定点数格式,比如SNR用Q8.8格式,上位机发送前先做格式转换。

4.5 测试时指标达标但答辩演示翻车

现象:实验室里测误码率、信噪比都符合要求,答辩现场演示时信号中断或指标明显下降。原因通常是现场电磁环境复杂,引入了额外的干扰,或者演示时线缆连接松动导致信号衰减。解决办法是准备一套备用的参数配置,现场快速切换到更鲁棒的调制方式(比如从QPSK切到BPSK),同时用屏蔽线缆和磁环减少外部干扰。

5. 验收与答辩:怎么证明这套系统真的达标

验收阶段的核心是拿出可复现的测试数据和清晰的指标对比。我一般会准备三组数据:第一组是不同SNR下的误码率曲线,从0dB到20dB,步进2dB,每个点测至少10万个符号;第二组是不同多径延迟下的星座图,直观展示均衡器的工作效果;第三组是传输时延的统计分布,用示波器抓发射端和接收端的同步信号,测量从发射到接收的端到端延迟。

答辩时评委最常问的问题是“为什么选这个参数”和“如果换一个场景这套系统还能不能用”。第一个问题需要你提前准备好参数扫描的数据,比如滚降系数从0.2到0.5的误码率对比,证明0.35是折中后的最优选择。第二个问题需要你说明系统的可重构性,比如调制方式可以通过寄存器切换,信道模型参数可以实时下发,这样就能适配不同的传输场景。

验收指标测试条件达标要求实测结果
误码率SNR=10dB,QPSK,无多径≤1e-33.2e-4
误码率SNR=10dB,QPSK,多径延迟2符号≤1e-26.8e-3
传输时延端到端,含同步≤5ms2.3ms
频率分辨率DDS输出≤1Hz0.1Hz
谐波抑制发射端输出≥40dBc52dBc

这张表是验收时贴在展板上的核心数据,每一项都有对应的测试截图和原始数据文件。评委如果质疑某个数据,可以直接调出原始文件复现。

答辩演示的流程通常控制在8到10分钟。前2分钟讲系统架构和选型理由,中间4分钟演示实时传输和参数调整,最后2分钟展示测试数据和指标对比。演示时我会提前把上位机界面调好,确保一键切换参数,避免现场敲命令。另外准备一个“故障注入”环节,主动展示系统在SNR恶化时的鲁棒性,这比只展示理想条件下的性能更能打动评委。

从那以后我每次带队伍做通信类项目,都强制要求验收前跑一遍完整的参数扫描,把所有边界条件都测到。因为答辩现场评委不会只问你正常情况,他们一定会问“如果……会怎样”。希望帮到你。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询