拓冰建站拓冰建站
首页 / 资讯中心 / 正文

SDR实验代码详解:升余弦成型滤波与匹配滤波链路仿真

简介华中科技大学电信学院软件无线电SDRMATLAB实验资料包围绕调制解调、滤波、信道编码等信号处理实验提供可运行的m代码与配套实验报告帮助通信工程、电子信息类学生理解无线通信系统原理和MATLAB仿真方法。包内同时整合了无人机导航、控制、避障等算法源码以及无人驾驶相关的路径规划、环境感知Simulink模型覆盖从底层信号处理到上层智能决策的完整链路。资源共152个文件以87个m脚本为核心搭配mat数据、docx/ppt报告、bmp/png/jpg实验截图、pdf文档和zip/rar压缩包等整体大小107.73MB目录结构清晰便于按模块检索学习。目前已有130人学习下载适合需要对照实验代码深入实践的学生或希望复用无人机/智能车算法源码的开发者从中可获得完整的实验思路与可二次开发的代码基础。1. 从一套 HUST 电信学院的 SDR 实验代码开始做无线通信的人大多遇到过这种尴尬教材把匹配滤波、成型滤波、误码率曲线讲得头头是道可一上手仿真信噪比设成 20dB 和 12dB出来的星座图差别在哪、为什么下采样后判决点偏了却说不清楚。这套华中科技大学电信学院的软件无线电 MATLAB 实验代码恰好把这条从发射机到接收机的完整链路拆开了——发射机成型滤波、AWGN 信道加噪、接收机匹配滤波与下采样、星座图绘制、误码率对比每一步都有对应的 .bmp 结果图和可运行的实验报告。它适合两类人正在修通信原理或软件无线电课程、需要对照实验报告复现结果的学生以及想把发端成型滤波 收端匹配滤波这套框架快速落地验证的工程师。实验本身不依赖板卡和 USRP纯 MATLAB 就能跑通但结论能直接平移到实际 SDR 硬件链路。2. 发射机成型滤波与 AWGN 信道建模先把频带约束搞清楚2.1 为什么一定要有成型滤波数字通信里矩形脉冲的频谱是 Sa 函数主瓣宽且旁瓣衰减慢。如果不做滤波就直接发射相邻频带会被严重干扰这在真实射频前端是过不了频谱模板的。成型滤波的作用是把基带信号的频谱压缩到目标带宽内同时控制码间串扰。最常见的实现是升余弦滚降滤波器滚降因子 α 决定带宽压缩程度和时域波形拖尾。α 越大频谱越宽但拖尾衰减越快抗定时误差能力越强α 越小频谱利用率越高但对采样定时越敏感。MATLAB 里设计成型滤波器我一般会先用rcosdesign函数生成系数再通过upfirdn完成上采样和滤波。这套实验代码里的发射机成型滤波.bmp展示的就是经过该滤波器后的时域波形和频谱你可以看到原本的矩形包络变成平滑的升余弦形状。2.2 上采样率与滚降因子的参数配合成型滤波前必须先上采样。如果符号速率是 Rs上采样倍数 sps 表示每个符号采几个点。sps 太小滤波器过渡带会非常陡峭实现阶数高且数值不稳定sps 太大数据量膨胀仿真速度变慢。常见做法是取 sps4 或 8滚降因子取 0.22 到 0.5 之间。做实验时可以用下面这段代码快速观察参数效果% 参数设置 Rs 1e6; % 符号速率 1 MHz sps 8; % 每符号采样点 alpha 0.35; % 滚降因子 span 10; % 滤波器截断跨度符号数 % 生成升余弦滤波器系数 rrcFilter rcosdesign(alpha, span, sps, sqrt); % 生成随机 QPSK 符号 data randi([0 3], 1000, 1); modSymbol pskmod(data, 4, pi/4); % 上采样 成型滤波 txSignal upfirdn(modSymbol, rrcFilter, sps); % 查看滤波器频响 fvtool(rrcFilter, Analysis, freq);这段代码里rcosdesign生成了根升余弦系数sqrt指定为平方根升余弦——这是为了收发两端各用一个根升余弦滤波器级联后等效为一个升余弦滤波器实现无码间串扰。upfirdn的第三个参数sps完成插值滤波后信号速率变为Rs * sps。值得注意的是upfirdn会引入span * sps个点的群延迟后续任何处理都要考虑这一点否则星座图相位会偏转。2.3 AWGN 信道与信噪比 SNR 的换算陷阱实验包里 awgn信噪比20.bmp、16.bmp、12.bmp 这三张图对应不同 SNR 下的接收效果。在 MATLAB 中加高斯白噪声最常用的函数是awgn但它的 SNR 定义是信号功率与噪声功率之比默认以 dBW 为单位而且是对整个输入信号进行功率测量。这里有一个经常踩的坑如果输入信号是复数基带信号awgn默认的 SNR 是按实数信号功率算的会导致实际噪声功率比预期低 3dB 左右。更可控的做法是自己生成噪声% 计算信号功率 sigPow mean(abs(txSignal).^2); % 目标 SNR 20 dB snrDb 20; % 噪声功率 noisePow sigPow / (10^(snrDb/10)); % 生成复高斯噪声 noise sqrt(noisePow/2) * (randn(size(txSignal)) 1j*randn(size(txSignal))); % 加噪 rxSignal txSignal noise;这里噪声的实部和虚部分别使用randn生成并乘以sqrt(noisePow/2)目的是让噪声总功率为noisePow。如果只乘sqrt(noisePow)噪声功率会翻倍SNR 比设定值低 3dB。另外awgn函数默认假设输入信号功率为 0dBW如果你不手动传入信号功率小信号会被淹没所以实验报告里通常会给出类似r awgn(txSignal, snrDb, measured)的写法但measured会额外消耗一次功率统计时间在大数据量仿真时要注意性能。参数推荐值说明sps48上采样倍数越大波形越平滑但计算量增大alpha0.220.5滚降因子0.35 是兼顾频谱效率和定时裕量的常用值span612滤波器截断跨度太小则频域旁瓣高太大则延迟大SNR 范围020 dB低于 0 dB 时星座图基本不可判高于 20 dB 误码率接近 03. 接收机匹配滤波、下采样与星座图还原3.1 匹配滤波的本质最大化输出信噪比接收机第一件事是匹配滤波。理论上当滤波器冲激响应是发送信号的时间反转共轭时输出信噪比最大。在根升余弦系统里接收端再使用一个根升余弦滤波器两个滤波器级联后满足奈奎斯特第一准则即采样的时刻无码间串扰。实验包里接收机匹配滤波.bmp通常画出的是经过匹配滤波后信号的眼图或波形你能看到眼图张开嘴的位置就是最佳采样点。需要注意这里的匹配滤波不是简单的低通而是与发射端匹配的根升余弦。如果直接用filter(rrcFilter, 1, rxSignal)你会得到三个滤波器级联的效果——发射、信道、接收其中发射和接收都是根升余弦。如果发射用的是普通升余弦接收端只需用普通低通不能再用rcosdesign的sqrt。3.2 下采样找到最佳采样时刻匹配滤波后的信号速率仍然是sps倍符号速率。要恢复符号需要在每个符号周期内取一个点。最佳采样时刻通常在眼图张开最大处也就是符号周期的中间点。但由于upfirdn和匹配滤波都引入延时直接从头开始每隔sps取点可能落在符号边缘。一种稳健做法是先用已知的训练序列做定时同步但在基础实验中通常通过查看星座图观察采样点偏移手动调整抽取起点。下面是实验代码里常见的下采样流程% 匹配滤波 rxFiltered upfirdn(rxSignal, rrcFilter, 1, sps); % 注意upfirdn 的第四参数是降采样倍数这里等效于匹配滤波下采样 % 去掉滤波引入的延迟 delay span * sps / 2; % 发射端滤波延迟 rxTrimmed rxFiltered(delay1 : end-delay); % 截取整数倍符号长度方便 reshape numSymbols floor(length(rxTrimmed) / sps); rxSymbols rxTrimmed(1 : numSymbols*sps); % 重排为 [sps, numSymbols] 矩阵每列是一个符号周期的所有采样点 rxMatrix reshape(rxSymbols, sps, []); % 取每个符号周期的中间点作为最佳采样点 if mod(sps,2) 0 bestIdx sps/2 1; % 偶数时取中间偏右一个点 else bestIdx (sps1)/2; end sampled rxMatrix(bestIdx, :); % 星座图 scatterplot(sampled);这段代码把upfirdn的第四参数设为sps一步完成匹配滤波和降采样。但要注意这样得到的输出已经压缩了sps倍再做reshape时矩阵列数正好是符号数。bestIdx的选择需要微调——如果你的滤波器群延迟不是对称的最佳采样点可能偏离中点。我在调试时通常先画出全部sps行的散点图看哪一行聚类最紧凑再回填那个索引。3.3 星座图怎么看信噪比和同步误差接收机星座图信噪比16.bmp 和 信噪比12.bmp 的差异非常直观SNR16dB 时QPSK 四个簇明显分开但边界模糊部分点有向原点靠近的趋势SNR12dB 时四个簇连成一片误符号率已经很高。除了噪声星座图还能暴露出三个问题第一相位旋转。如果接收端本振与发送端存在固定相位差星座图整体旋转四个簇还在但角度偏了。第二采样点偏移。如果bestIdx取错星座图会出现四角向中心收缩的模糊感因为采到了符号过渡沿。第三I/Q 不平衡。如果发射端幅度不平衡星座图会呈椭圆形而非圆形。实际调试时我一般会用scatterplot(sampled)直接看再用mean(abs(sampled-real(sampled)))这类统计量辅助判断。实验报告里通常会把这三张不同 SNR 的星座图放在一起配合误码分析表说明随着 SNR 降低聚类方差增大判决裕度减小这个基本结论。4. 误码率分析与实验报告里的那些图怎么复现4.1 误码分析的两种模式误码率BER仿真有两种模式理论曲线和蒙特卡洛仿真。理论曲线用berawgn函数直接画适合快速对比蒙特卡洛仿真逐帧发送数据、加噪、判决、统计错误比特数适合验证链路实现的正确性。实验包里的误码分析.bmp应该包含这两条曲线的对比。理论上QPSK 在 AWGN 信道下的误比特率为Pb Q(sqrt(2Eb/N0))其中 Eb/N0 与 SNR 的换算关系是 SNR(dB) Eb/N0(dB) 10log10(sps) - 10*log10(2)因为每个符号承载 2 比特而且过采样率会影响噪声带宽。蒙特卡洛仿真要跑出接近理论值的曲线需要足够的错误比特数。通常要求累计错误比特不少于 100 个否则波动太大。下面这个代码片段我常用snrVec 0:2:16; berSim zeros(size(snrVec)); for idx 1:length(snrVec) numErr 0; totalBits 0; while numErr 100 totalBits 1e7 % 生成数据、调制、成型、加噪、匹配滤波、采样、判决 [numErr, totalBits] updateBer(...); % 自行封装 end berSim(idx) numErr / totalBits; end这里while循环的条件很关键numErr 100保证统计显著性totalBits 1e7防止高 SNR 时跑太久。实际仿真时低 SNR 只需要几千比特就能攒到 100 个错误高 SNR 则需要几百万甚至上千万比特。实验报告中如果只跑固定 10000 比特SNR16dB 时误码率可能为 0曲线尾部会塌陷不如用这种自适应停止条件。4.2 实验报告里的分析结论应该怎么写一套好的实验报告不只是贴图和代码更要说明每个现象对应的原理。HUST 这份报告里我猜它有三类关键内容系统框图与参数表、每张图的解说、误码率对比表。你在复现时可参考下面这个表格结构SNR (dB)理论 BER (QPSK)仿真 BER星座图特征判决大致结果0约 6e-2有偏差四簇混叠中心有大量点基本无法判决8约 1e-3接近理论四簇可辨边界有模糊可判决但错误率较高12约 3e-6接近理论四簇清晰少量跨界点误码率极低16约 1e-100样本不足四簇锋利无跨界点无错误实际写报告时不要只抄这个表要补上自己的发现。比如你会发现仿真 BER 在低 SNR 时比理论略高原因可能是成型滤波器引入了额外的码间串扰span 不够长时。把 span 从 6 提到 10曲线会向理论值靠近。这就是实验里最有价值的调试点。4.3 滤波延时的处理细节实验代码里最容易让你蒙圈的是滤波延时。upfirdn的延时由滤波器阶数和上采样倍数决定。发射机成型滤波器的群延迟是(span*sps)/2个输出采样点接收机匹配滤波器还要再引入同样的延迟。如果你在仿真里最后发现星座图旋转或散开先别怀疑噪声检查去掉的延迟点对不对。一个快速验证方法不加载噪直接发一个冲激观察txFiltered的峰值位置。用find(abs(rxFiltered) max(abs(rxFiltered)))找到主峰就知道最佳采样点相对输入起点的偏移。把这个偏移换算成符号周期再调整下采样起始点星座图立刻变清晰。很多实验报告里给出的接收机下采样信噪比20.bmp就是这么调出来的——下采样位置正确后SNR20dB 时采样点几乎完全重合在理想星座点上。5. 把 SDR 实验搬到无人机与智能机器场景的三种思路这套实验虽然是教科书式的 AWGN 链路但只要替换信道模型和前端参数它就能直接服务于无人机通信和智能机器的感知系统。我针对不同目标给三条可落地的改造路径。第一条用于无人机数据链的链路预算验证。把符号速率 Rs 改为无人机图传常用的 5 MHz 或 10 MHz滚降因子保持 0.35信道从纯 AWGN 替换成带有多径衰落的频选信道比如用comm.RicianChannel建模低空无人机与地面站之间的莱斯信道。你可以分频段对比 2.4 GHz 和 5.8 GHz 下的散射分量观察不同信噪比下的接收机星座图是否仍能收敛。实验报告里的误码分析表格可以直接换成不同莱斯 K 因子下的误码率曲线这比单纯改 SNR 更有实际参考价值。第二条把匹配滤波模块复用为突发检测器。无人机遥控链路经常是突发模式接收机不知道信号何时到来。匹配滤波器的输出峰值可以当作突发检测的判据——用rxFiltered的功率滑动平均值除以历史均值超过阈值就判定突发到达。我在实验代码里封装过一个类似函数function [startIdx, peakPower] burstDetect(rxFiltered, threshold) winLen 8; movAvg movmean(abs(rxFiltered).^2, winLen); refPower movmean(movAvg, 100); % 长时平均作为底噪 ratio movAvg ./ (refPower eps); [peakPower, startIdx] max(ratio); if peakPower threshold startIdx []; end end这里threshold一般取 35过低会导致虚警过高会漏检。你可以用实验包里的 20dB 和 12dB 加噪信号各测几次观察阈值灵敏度。这个函数放在无人机的遥控接收端比直接用xcorr做相关检测省内存。第三条把 IQ 数据流接入深度学习的调制识别。无人机频谱感知中经常需要判断空中是遥控信号还是图传信号。你可以用实验代码生成不同 SNR 下的 QPSK、16QAM 基带信号把rxFiltered的下采样输出整理成[sps, numSymbols]的矩阵作为卷积神经网络输入。注意这里用的是匹配滤波后的数据不是原始噪声数据因为匹配滤波已经提升了特征密度。实际测试时SNR 低到 4dB 时识别准确率会明显下降这时候可以改用双通道输入——实部和虚部分别作为两个通道类似图像的红绿通道。这套 HUST 实验代码的价值不在那几个 .bmp 图片而在于它把 SDR 链路里最容易出错的三个环节——滤波系数设计、延时补偿、SNR 换算——全部摊开给你看了。你最后检验自己有没有学会的方法很简单把代码里的 QPSK 换成 16QAM把滚降因子改成 0.22看看星座图和误码率曲线是否仍然符合理论预期。改得动说明你掌握了改不动说明还有某个环节没真正吃透。本文还有配套的精品资源点击获取
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门