简介《软件无线电》课程综合实验报告完整Word文档面向通信工程、电子信息等专业学生可用于课程设计、实验报告参考或软件无线电入门学习。报告基于XSRP软件无线电平台依次设计并验证了码分多址、正交频分复用、时分双工长期演进三种典型无线通信系统码分多址部分实现宽带码分多址物理层流程涉及传输信道编码、循环冗余校验、交织、正交可变扩频因子扩频与加扰正交频分复用部分着重子载波分配、保护间隔与循环前缀的插入时分双工长期演进部分涵盖时分双工、资源块分配、多入多出技术及调度机制。各实验均包含系统设计原理、程序框图解读、设备连接、参数配置与功能验证并给出详细结果分析与结论。资源包为1个docx文档大小约4.88MB内容完整、结构清晰可直接作为实验报告模板或自学参考。目前已吸引467人学习下载适合需要掌握XSRP平台与Labview实验方法、理解无线通信物理层链路的读者。1. 三个项目连起来就是一张通信物理层的完整实习课表拿到一块XSRP板卡大多数人第一反应是翻例程而不是想清楚先做哪个项目。如果把基于XSRP的CDMA通信系统设计、基于XSRP的OFDM通信系统设计、基于XSRP的TD-LTE物理层链路协议实现这三个标题放在一起看会发现它们是刻意排过难度阶梯的CDMA把扩频与伪码同步讲透OFDM把多载波调制与符号同步讲透TD-LTE则把前两者的子集——OFDM、资源映射、信道编码——串进一条完整的协议链路里。它们的共同点在于必须跑在真实的射频前端和FPGA基带处理上不能只在仿真器里自我满足。这篇文章适合手里有一块XSRP平台、想在实训或毕业设计里把教材公式变成频谱仪上真实信号的人下面的做法都是踩过坑之后整理出来的。2. 先搭公共地基XSRP的硬件分工、开发环境与工程结构2.1 平台资源怎么分射频前端、FPGA和CPU各管哪一段XSRP这类软件无线电平台的典型结构是“射频收发芯片 FPGA 嵌入式CPU”三段式。射频前端负责射频信号与模拟中频之间的上下变频FPGA负责采样率较高的实时基带处理CPU负责协议状态机、控制面和低速数据交织。三个项目对这个结构的利用方式差异很大CDMA系统设计里码片速率通常在几十兆码片每秒以下扩频解扩、匹配滤波、RAKE合并都能在FPGA里用一条流水线做完CPU只在启动时写寄存器OFDM系统设计里FFT/IFFT成了FPGA里最占用资源的核心算子CPU要参与符号定时的调度TD-LTE物理层链路协议实现则完全不同它必须把传输块级别的CRC、编码、速率匹配放到CPU侧FPGA负责OFDM调制解调和资源网格映射。我一般会先画一张数据流图标出每一级数据的位宽和吞吐率再决定哪些模块放在哪一侧。做这类项目最实用的一条经验是凡是逐样本运算的放FPGA凡是按传输块处理的放CPU。把这条分界线画清楚后面调试才能做到定位快。如果一开始就把TD-LTE的物理层链路上所有处理全塞进FPGA逻辑资源很快耗尽编译直接失败还得拆回来重做这种返工最费时间。2.2 环境跑通的最小步骤与板卡自检拿到新板卡我习惯按“设备枚举、加载比特流、射频自检”三步走。不同厂商XSRP的具体命令名不一样但流程是通用的用一套示意命令表示如下# 1. 枚举设备确认板卡被系统识别 xsrp_util list # 2. 加载基带比特流这一步把FPGA逻辑配置进去 xsrp_util load -b baseband_top.bit -c 0 # 3. 查询射频收发器锁定状态确认本振都锁定 xsrp_util rf get lock # 4. 设置中心频率为2.4GHz后续三个项目都从这一频点起步 xsrp_util rf set freq 2400000000第一步看不到设备绝大多数情况是USB驱动没装对或网口IP没有配对第二步失败问题集中在比特流版本和板卡芯片型号不一致第三步最值得做射频芯片锁定后读回的状态寄存器里只要有一个LOSS位被置位后面所有频谱异常都不用查先把时钟源解决掉。这个自检习惯帮过我一个大忙某次调TD-LTE链路时发射功率始终低十几dB折腾了一整天最后检查发现是外接10MHz时钟参考根本没接好射频前端在自由振荡频率上工作能出声已经算给面子。2.3 工程目录设计与IQ数据格式约定三个项目如果共用一套工程目录项目间的复用成本会低很多。我常用的结构如下proj_baseband/ ├── rtl/ # FPGA源文件调制、滤波、同步主体 ├── src/ # CPU侧源码寄存器配置、协议状态机 ├── sim/ # 基带仿真脚本EDA工具链可直接加载 ├── host/ # 上位机数据采集与可视化脚本 └── bitstream/ # 编译产物IQ数据格式建议在第一个项目就定死16位有符号整数I和Q交错存储最前面加2字节帧头。之后所有项目都遵守这个约定。之所以要把AD采到的12位或14位数据立刻升到16位是为了避免后续滤波、相关、FFT运算中的截位造成EVM恶化。从AD采样进入FPGA后还要第一时间做直流偏置校准这个步骤忽略的话频谱中间会出现一个强直流分量OFDM的DC子载波位置正好会把这个分量直接映射到零频看起来很像是固定频点的窄带干扰。3. CDMA与OFDM并列落地扩频同步与多载波同步的两套调试法3.1 为什么这两个系统要搭着做一对矛盾的两种极端CDMA和OFDM看似不相关实际是同一对矛盾的两个极端。CDMA把窄带信号扩展到很宽的频带依靠扩频增益对抗窄带干扰OFDM把宽带信道切成一堆窄带子载波依靠循环前缀对抗多径。对应到XSRP的调试上CDMA看相关峰OFDM看星座图CDMA的失败往往表现为峰消失或模糊OFDM的失败往往表现为星座点旋转或弥散。我一般要求自己先在接收端把基带信号dump到上位机用Python离线分析把同步参数调明白后再移植回FPGA这样可以避免在板卡上反复试错烧时间。3.2 CDMA发射链路Gold码生成、扩频与脉冲成型CDMA基带信号的核心是扩频码。教学用CDMA系统通常用Gold码由两个m序列按位异或生成周期可选127、511或1023码片速率与符号速率的比值就是扩频因子。XSRP上常见做法是把码片速率设为采样速率的整数分之一这样扩频码与采样时钟天然对齐后续匹配滤波省掉一次重采样。生成Gold码的示意代码如下import numpy as np # 简化版m序列生成器7级移位寄存器长度为127 def mseq(init, taps, length): reg init 0x7F out [] for _ in range(length): out.append(reg 1) # 抽头位置做奇偶校验得到反馈比特 fb bin(reg taps).count(1) 1 reg ((reg 1) | (fb 6)) 0x7F return out # 两个m序列采用不同的本原多项式抽头异或得到Gold码 seq_a mseq(0b1010101, 0b10000011, 127) seq_b mseq(0b1001001, 0b10001001, 127) gold [a ^ b for a, b in zip(seq_a, seq_b)] print(fGold码长度: {len(gold)})这段代码里taps决定了m序列的反馈抽头位置init千万不能设成全0否则移位寄存器永远输出0相关峰无论如何都搜不到。生成Gold码后数据比特与码片逐位异或完成扩频然后通过根升余弦滤波器做脉冲成型。滚降系数我一般取0.22如果设成接近0频谱利用率高但时域波形拖尾变长码同步会变得困难。3.3 CDMA接收链路滑动相关、门限判定与RAKE合并发射端做好后紧接着写接收端匹配滤波器。滑动相关是把接收基带信号与本地Gold码逐码片相乘并累加当本地码相位与发送端对齐时会出现尖峰相关窗长度为一个码周期。FPGA里用移位寄存器实现Python里校验算法时直接做卷积# 滑动相关找峰本地码翻转后与接收信号卷积 local_rev gold[::-1] corr np.convolve(rx, np.array(local_rev, dtypefloat), modefull) # 找峰并设置门限thr取平均幅值的倍数 thr 10 for i in range(len(gold), len(corr) - len(gold)): window corr[i - len(gold) // 2: i len(gold) // 2] if corr[i] np.max(window) and corr[i] thr * np.mean(np.abs(corr)): peaks.append(i)参数thr我常取8到12倍平均幅值太小会有大量虚警太大会漏掉低信噪比下的真实峰。RAKE合并针对多径信道把多个超过门限的相关峰按强度加权相加延迟差小于一个码片周期的峰不能分开必须合并成一路。XSRP上RAKE支路数与码片速率有关码片速率越高可分辨的径越多。参数推荐值说明码片速率1.2288 Mcps与采样率保持整数倍关系符号速率19.2 ksps扩频因子为64Gold码周期127 / 1023越长抗干扰越好同步越慢滚降系数0.22根升余弦脉冲成型3.4 OFDM发射链路IFFT、循环前缀与子载波映射OFDM的核心是把符号流并行地放到若干个正交子载波上发射。XSRP上我通常用512点或1024点FFT有效子载波取60%到80%边缘子载波置零作为保护带宽。资源网格在内存里是一块按“子载波序号 × OFDM符号序号”二维寻址的复数数组IFFT前先完成频域填充import numpy as np Nfft 512 # FFT点数 Ncp 36 # 常规CP长度约7%开销 N_used 300 # 实际使用子载波数 mod_order 2 # QPSK每符号2比特 data_bits np.random.randint(0, 2, N_used * mod_order) # QPSK映射0/1比特映射为复数星座点 qpsk (data_bits[0::2] * 2 - 1) 1j * (data_bits[1::2] * 2 - 1) grid np.zeros(Nfft, dtypecomplex) # 左右各放150个子载波中间索引256留作DC子载波并置零 grid[106:256] qpsk[0:150] grid[257:407] qpsk[150:300] # 频域转时域注意IFFT前用ifftshift搬移零频 freq np.fft.ifftshift(grid) sym np.fft.ifft(freq) * Nfft tx np.concatenate([sym[-Ncp:], sym])循环前缀长度要看信道最大时延扩展室内环境36个采样点够用室外多径严重时建议加大到64甚至128代价是约12%的吞吐率损失。DC子载波位置必须置零否则会引入自干扰。ifftshift这一步很多人会漏直接对原始grid做IFFT会让输出时域波形被整体搬移频谱上表现为形似“左右翻转”的错位。3.5 OFDM接收链路符号定时、频偏估计与信道均衡OFDM接收第一步是找符号边界。用CP相关法接收信号延迟Nfft点后与自身共轭相乘在每个窗口内叠加取模峰值位置就是符号起始。第二步做载波频偏估计小数倍频偏用CP相关的相位提取整数倍频偏用导频互相关的峰值位置判断。# CP相关法估计符号定时接收信号与其延迟Nfft的副本做共轭相关 corr rx[:Ncp] * np.conj(rx[Nfft:Nfft Ncp]) metric np.abs(np.sum(corr)) # 小数倍频偏由相关结果的相位提取换算到Hz frac_freq np.angle(np.sum(corr)) / (2 * np.pi) * sampling_rate / Nfft频偏不校正的后果是OFDM所有子载波正交性被破坏星座图呈现旋转——这是XSRP上最常见的翻车现场通常要先定位板卡参考时钟源差异再谈算法。信道均衡用插入导频子载波的方式接收端用LS估计信道响应再在频域做线性插值得到所有子载波的信道估计值。导频开销取8%到10%每12个子载波插入一个导频即可满足多数室内场景。4. TD-LTE物理层链路协议上板帧结构、同步信道与传输链路4.1 用一张参数表锁定目标带宽与采样率TD-LTE比前两个项目复杂在它没有自由设计空间帧结构、同步信道位置、编码方式和资源映射都由3GPP 36.211系列标准指定XSRP只是载体设计空间只剩实现方式。教学环境里跑最小配置就够了用5MHz带宽采样率选7.68MHz资源块数量25个子载波间隔15kHzFFT点数512。这张表先定死后面所有代码都围绕它展开项目参数值换算依据系统带宽5 MHz25个RB1 RB12子载波子载波间隔15 kHz有效子载波300个FFT点数512采样率与子载波间隔的比值采样率7.68 MHzFFT点数 × 子载波间隔常规CP长度36 / 512每时隙7个OFDM符号这里不实现全部配置先把常规CP框架下的公共部分做通再扩展特殊子帧。CP配置判断错了后面PSS同步全是错的这是TD-LTE项目里最隐蔽的初始坑。4.2 PSS/SSS下行同步生成、发送与接收下行同步信号在TD-LTE里位于子帧0和子帧5的中间OFDM符号PSS用ZC序列SSS用两个m序列交织。最小实现可以先只做PSS小区ID从PSS能区分3种可能对应ZC根序列u取25、29、34。PSS生成代码如下import numpy as np # PSS序列生成ZC根序列N62u由小区ID组决定 u 25 # 对应小区ID组0 n np.arange(62) pss np.exp(-1j * np.pi * u * n * (n 1) / 63) # 放置到频域中间62个子载波两侧留空 grid np.zeros(512, dtypecomplex) grid[225:287] pss # 加CP后形成时域发送符号 sym np.fft.ifft(np.fft.ifftshift(grid)) tx_pss np.concatenate([sym[-36:], sym])接收端做三件事把收到的时域信号与本地三种u值的PSS做滑动相关找最大峰得到符号定时在相邻OFDM符号间隔做差分相关得到整数频偏再用CP相关法估计小数频偏。这一步做完下行帧结构就有了第一时间参考点后续才能定位SSS和PBCH。小区搜索流程我习惯先在Python仿真里跑通再映射到FPGA因为板卡上一旦有干扰PSS峰值会淹没在噪声里先用离线数据验证算法稳定性再上板可以省掉大量调参时间。4.3 传输信道处理链CRC、咬尾卷积码与速率匹配物理层链路的核心是“传输块如何变成带CRC保护的编码比特”这一串处理。TD-LTE下行共享信道在5MHz最小配置下用咬尾卷积码码率1/3约束长度7三个生成多项式分别是133、171、165八进制。这段处理链的工程顺序如下传输块附加CRC24A校验位码块分段后做1/3咬尾卷积编码子块交织、比特收集和比特选择完成速率匹配加扰序列按RNTI和小区ID初始化QPSK或16QAM调制映射。这里有三个容易搞错的地方。咬尾初始化必须用输入序列的最后6比特填移位寄存器填错则译码端头尾性能很差速率匹配里的冗余版本可以只实现RV0但要保留RV切换的接口否则后续做HARQ重传时要推翻重写加扰序列的初始化值与RNTI和小区ID绑定这个值错了会表现为误码率始终接近50%看起来像随机噪声实际是种子错位。4.4 资源网格映射参考信号、PDCCH与PDSCH共处一个子帧一个下行子帧内同时要放参考信号RS、控制信道PDCCH和数据信道PDSCH。XSRP上我习惯先把一个子帧的资源网格定义成二维复数数组第一维是子载波序号第二维是OFDM符号序号然后按规则填充每个时隙的第1个和第5个OFDM符号放小区专用参考信号频域位置由小区ID模3决定PDCCH占用每个子帧的前1到3个OFDM符号承载DCI剩余RE按调制阶数和RB数分配给PDSCH。这个映射规则最大的坑是“先确定映射才能算能传多少比特”顺序搞反会导致接收端译码失败。我建议把资源分配函数做成参数表驱动而不是硬编码这样切换带宽或CP配置时只改表不碰逻辑。填充完成后每个OFDM符号单独做512点IFFT、加CP、拼帧再按DAC的时序要求发给射频端。XSRP的常见做法是让DAC固定工作在较高采样率基带侧只改变数字上变频的插值倍数这样能避开发射频点切换带来的模拟滤波器带宽不一致问题。4.5 收端反向链路从天线口到传输块的完整顺序接收端是发射端的逆过程但顺序不能完全反着来原因是必须先把同步和信道估计恢复出来才能解资源网格。完整顺序是PSS/SSS同步 → OFDM符号定时 → 去CP FFT → 参考信号提取 → 信道估计与均衡 → PDCCH盲检获取DCI → PDSCH解调 → 解扰 → 解速率匹配 → 维特比译码 → CRC校验。我一般会把这张流程表打印出来每走一步记录一个中间状态尤其是均衡后星座图的EVM要低于10%否则后面误码率不可能达标。维特比译码在教学项目里可以直接在CPU上用现成代码FPGA只负责把软比特送上来这样调试期数据和软件能对得上等到链路跑通了再考虑把译码器下沉到FPGA里。5. 常见问题排查XSRP上跨三个项目的五类翻车现场5.1 频谱边缘塌陷模拟前端带宽与数字抽取没对齐现象发射端明明给出了标准带宽信号接收端FFT后的频谱两侧幅度明显下降甚至像是被切了一刀。原因数字下变频里的抽取滤波器截止频率小于信号带宽的边带把有用信号边缘削掉了而模拟前端的带宽反而是够的。解决把模拟前端带宽、AD采样率、数字抽取比画成一张信号链表逐级核算每一级滤波器的通带边界信号有效带宽不要超过采样率除以抽取比后的0.4倍。修正滤波器系数后频谱立刻恢复这个坑能解释一大半“发射看着正常、接收频谱异常”的问题。5.2 CDMA相关峰消失载波频偏让伪码失步现象环回直连能收到功率但滑动相关始终看不到尖峰频谱上能看到展宽的码片谱。原因CDMA伪码同步对频偏极敏感2.4GHz频点下参考晶振偏差20ppm实际频偏约48kHz一个码片周期内相位旋转就超过了整周本地码与发送码失去相关性。解决在相关捕获前加一级粗频偏估计取前后两个半码片周期的信号做差分相关反正切得到频偏后补偿回基带同时让本地PN码发生器的时钟与AD采样时钟同源。这两步做完相关峰基本一次就能搜到。5.3 OFDM星座图旋转残余频偏没被跟踪现象星座点围绕原点旋转成圆环能看出调制阶数但解不出正确比特16QAM比QPSK更明显。原因前导符号估计的频偏只能消除整数和小数频偏的初值几十赫兹的残余频偏会让后续符号产生持续相位累积。算一笔账符号周期约66.7微秒48Hz残余频偏在一个符号内旋转约3度10个符号后累积到15度16QAM直接就散了。解决在连续子帧里插入导频子载波每符号取4个导频估计平均相位用一阶锁相环做残余相位跟踪把补偿量反馈给频域相位旋转器。5.4 TD-LTE同步一闪而过帧状态机没和PSS结果绑定现象PSS相关峰在一段时间内能搜到但位置每次都不一样小区搜索时好时坏。原因只做了PSS的单帧滑动检测帧边界没对齐而且常规CP与扩展CP配置没判断导致OFDM符号起始位置偏移5ms内有两个PSS半帧结构也没有约束。解决改用10ms整帧数据做搜索先用PSS定位5ms边界再用SSS区分半帧用CP相关判断CP配置。状态机里把子帧号、帧号、OFDM符号计数三项绑定推进缺一个都飘。5.5 综合通过、上板失效跨时钟域与上电顺序现象仿真完全正确综合时序无违规换一块板就开始间歇性误码甚至同一块板上一次正常下一次不正常非常玄学。原因大概率是跨时钟域问题数字下变频输出的数据时钟与FFT引擎工作时钟不同数据线直接相连没有同步处理CPU配置寄存器与FPGA逻辑之间的读写也有同类问题。解决打开时序报告找出跨时钟域的异步路径加两级同步寄存器或改异步FIFO上电复位顺序写成状态机等三个时钟域各自锁定后再释放复位。这套操作下来时好时坏的板卡现象能消除大半。6. 从能跑到跑赢三层验证法和下一步进阶方向6.1 三层验证法判断项目做完没做完的尺子第一层是自环回测发射输出直接接接收输入EVM低于5%说明基带链路自洽第二层是仪表验证用信号分析仪看频谱模板、星座图和EVMCDMA看频谱扩展是否和码片速率对得上OFDM看子载波正交性TD-LTE则看PSS频谱位置是否符合标准第三层是双板互操作两台XSRP用独立时钟跑端到端传输此时同步算法经受真实载波频偏考验。三层代价依次增高第三层没过就不算真正完成。6.2 值得继续投入的方向把TD-LTE最小链路从纯下行扩展到上下行切换的TDD配置加入随机接入PRACH和HARQ重传是这三个项目之后最自然的进阶路径把OFDM里的导频从块状改成梳状则能逼近真实LTE的参考信号结构。做完这三个项目后我养成的一个习惯是每次只改一个变量、只调一个参数然后把其他变量固定从频谱和星座图上观察影响。通信系统是典型的黑匣子最怕同时动两个参数然后猜问题分步定位才能真正积累经验。希望这些调试习惯能帮到你。本文还有配套的精品资源点击获取