
简介这份资源面向无线通信、扩频与CDMA方向的学习者和研究人员提供Rake接收机的Matlab仿真实现用于理解多径衰落信道下的分集接收与信号合并机制。压缩包为rar格式共2个文件均为.m脚本分别对应发射端与接收端的仿真流程整体约3KB体量轻便便于直接运行和二次修改。目前已有2424人学习下载说明该主题在通信仿真学习中具有较高关注度。代码围绕多径信道的模拟、各路径“手指”信号的检测与跟踪以及最大比值合并、等增益合并、选择式合并等策略展开读者可据此对比不同合并方式对误码率和信噪比的影响并调整信道参数观察性能变化。对于需要完成课程设计、理解Rake接收原理或搭建通信链路仿真框架的读者这份脚本可作为可运行的参考起点帮助快速建立从发射、传播到接收合并的完整认知。1. 从一次误码率曲线“躺平”说起Rake接收机到底在解决什么做扩频通信仿真的人多半遇到过这种场景多径信道一开误码率曲线直接躺平信噪比往上加也没用。第一次碰到时我以为是噪声参数设错了查了半天才发现问题出在接收端把多径当成了纯粹的干扰。实际上在宽带扩频系统里多径分量只要延迟差超过一个码片就可以被分辨出来而 Rake 接收机干的事就是把这些可分辨的多径“捡起来”按一定准则合并把原本的干扰变成有用的分集增益。这份 Rake 接收机 Matlab 程序仿真资源核心就是围绕分集接收和合并技术展开的一套可运行脚本。它适合正在做扩频通信课程设计、毕设或者需要快速验证合并算法效果的从业者。你不需要从零推导公式但需要理解每一路 finger 在干什么、合并权重怎么来的否则调参时只能靠玄学。下面我按“先立住原理、再动手复现、最后排坑”的顺序拆开讲。2. 分集接收与合并技术的原理底座为什么是 Rake 而不是均衡器2.1 多径分辨与 finger 分配的物理含义扩频信号经过多径信道后接收到的信号可以写成若干延迟副本的叠加。关键在于扩频码的自相关特性当延迟差大于一个码片周期时各副本近似正交可以被独立解扩。Rake 接收机正是利用这一点为每条可分辨路径分配一个 finger每个 finger 用对应延迟的扩频码做解扩得到该路径的幅度和相位估计。这里有个容易混淆的点finger 不是越多越好。路径数超过实际可分辨的多径数时多出来的 finger 只会引入噪声。常见做法是先做信道估计取能量超过门限的抽头分配给 finger。我一般会把门限设在最强路径能量的 10% 到 20% 之间具体看信噪比。2.2 三种合并准则的选型理由合并技术决定了各 finger 输出怎么加权。常见的有最大比合并MRC、等增益合并EGC和选择合并SC。MRC 按各路径信噪比加权理论性能最好但需要准确的幅度估计EGC 只做相位补偿实现简单在幅度估计不准时反而更稳SC 只选最强一路复杂度最低但浪费了分集增益。在这份 Matlab 仿真里三种合并方式通常都会给出对比。如果你只是验证系统能否工作先用 EGC 跑通再换 MRC 看性能提升。下面这张表是我整理的关键参数对照调参时可以直接参考。合并方式权重来源对幅度估计的依赖典型适用场景MRC各路径信噪比高信道估计准确、追求最优性能EGC仅相位补偿低幅度估计受限、实现资源紧张SC选最强路径中快速验证、路径数少提示仿真里如果 MRC 性能反而比 EGC 差先检查信道估计的幅度是否做了归一化这是最常见的翻车点。3. 把 Rake 接收机跑起来Matlab 脚本结构与关键参数3.1 仿真主流程与文件组织一份典型的 Rake 接收机仿真脚本会包含发射端扩频、多径信道、接收端解扩与合并、误码率统计几个模块。我习惯把参数集中在一个配置段避免后面改一个数要翻遍全文。下面这段代码是主流程的骨架你可以直接照着搭。% rake_sim_main.m % Rake接收机仿真主流程 clear; clc; close all; %% 参数配置 SF 31; % 扩频因子取31便于用m序列 Nsym 2000; % 仿真符号数 SNR_dB 0:2:16; % 信噪比扫描范围 nFinger 4; % Rake finger数量 mergeMode MRC; % 合并方式MRC / EGC / SC delayProfile [0 2 5 9]; % 各路径延迟码片数 gainProfile [1 0.6 0.4 0.25]; % 各路径平均增益 %% 生成扩频码 pn comm.PNSequence(Polynomial, x^5x^21, ... SamplesPerFrame, SF, InitialConditions, [1 0 0 0 0]); spreadCode step(pn); spreadCode 2*spreadCode - 1; % 映射到±1 %% 主循环 ber zeros(size(SNR_dB)); for idx 1:length(SNR_dB) % 发射端BPSK调制 扩频 txSym randi([0 1], Nsym, 1); txMod 2*txSym - 1; txSig reshape(txMod * spreadCode., [], 1); % 多径信道按延迟和增益叠加 rxSig zeros(length(txSig) max(delayProfile), 1); for p 1:length(delayProfile) delayed [zeros(delayProfile(p),1); txSig]; rxSig(1:length(delayed)) rxSig(1:length(delayed)) ... gainProfile(p) * delayed; end % 加高斯白噪声 rxSig awgn(rxSig, SNR_dB(idx), measured); % 接收端Rake解扩与合并 [decBits, ~] rake_receiver(rxSig, spreadCode, ... delayProfile, nFinger, mergeMode); % 误码率统计 ber(idx) sum(decBits ~ txSym) / Nsym; end %% 绘图 semilogy(SNR_dB, ber, -o); xlabel(SNR (dB)); ylabel(BER); title([Rake接收机性能 - mergeMode]); grid on;这段代码的逻辑说明参数配置段集中了扩频因子、符号数、信噪比范围、finger 数量和合并方式改任何一个都不用动主循环。扩频码用 5 阶 m 序列生成长度 31映射到 ±1 后与调制符号相乘完成扩频。多径信道部分按延迟和增益把发射信号叠加成接收信号注意这里用的是平均增益实际仿真中如果要做衰落信道需要把增益换成随机变量。最后调用rake_receiver做解扩合并统计误码率。参数怎么改nFinger不要超过length(delayProfile)否则多出的 finger 没有对应路径mergeMode切换时确保rake_receiver内部有对应分支SNR_dB范围根据你关心的误码率区间调整一般 0 到 16 dB 能覆盖从 10^-1 到 10^-4 的变化。3.2 Rake 接收机核心函数解扩、信道估计与合并主流程调用的rake_receiver是整套仿真的核心。它要完成三件事对每条路径做解扩、估计各路径的幅度相位、按合并准则输出判决变量。下面是我常用的实现框架。function [decBits, metrics] rake_receiver(rxSig, code, ... delays, nFinger, mergeMode) % Rake接收机解扩 信道估计 合并 % 输入rxSig-接收信号, code-扩频码, delays-路径延迟 % nFinger-finger数, mergeMode-合并方式 % 输出decBits-判决比特, metrics-各finger合并权重 SF length(code); nSym floor((length(rxSig) - max(delays)) / SF); fingerOut zeros(nSym, nFinger); fingerWeight zeros(1, nFinger); % 对每条路径做解扩 for f 1:nFinger d delays(f); % 取对应延迟的接收段 seg rxSig(d1 : d nSym*SF); seg reshape(seg, SF, nSym).; % 解扩与扩频码做内积 fingerOut(:, f) seg * code / SF; end % 信道估计用解扩输出的均值估计幅度 for f 1:nFinger fingerWeight(f) mean(abs(fingerOut(:, f))); end % 合并 switch mergeMode case MRC % 最大比合并按幅度加权相位取共轭 w fingerWeight .* exp(-1j*angle(mean(fingerOut, 1))); combined fingerOut * w.; case EGC % 等增益合并只补偿相位 w exp(-1j*angle(mean(fingerOut, 1))); combined fingerOut * w.; case SC % 选择合并取最强路径 [~, best] max(fingerWeight); combined fingerOut(:, best); otherwise error(未知合并方式: %s, mergeMode); end % BPSK判决 decBits real(combined) 0; metrics fingerWeight; end逻辑说明解扩部分把接收信号按延迟截取后 reshape 成矩阵每一列是一个符号周期内的采样与扩频码做内积就得到该路径的解扩输出。信道估计用解扩输出的平均幅度作为权重相位用平均相位估计。MRC 的权重是幅度乘相位共轭EGC 只保留相位共轭SC 直接选幅度最大的路径。参数说明delays必须与主流程的delayProfile一致否则解扩位置对不上nFinger小于路径数时只处理前几条实际中应该按能量排序后取前几条fingerWeight在 MRC 里直接作为权重如果信道估计不准可以加一个遗忘因子做滑动平均。注意解扩时的归一化因子是SF如果你用的扩频码不是 ±1 而是 0/1需要先做映射否则内积结果会偏。4. 仿真结果怎么读误码率曲线与合并增益的验证4.1 误码率曲线的正确打开方式跑完仿真后最直观的验证就是看误码率随信噪比下降的斜率。单径情况下BPSK 的误码率曲线是一条标准的水fall 曲线。加入多径后如果不做 Rake 合并曲线会明显右移甚至出现错误平台。开启 Rake 后曲线应该向左移动且 finger 数越多、合并方式越优移动越明显。我一般会同时画三条曲线无 Rake、EGC、MRC。如果 MRC 和 EGC 几乎重合说明各路径幅度差异不大或者信道估计没起作用。如果 MRC 反而更差回去检查权重计算里的相位符号。4.2 合并增益的量化对比合并增益可以用相同误码率下信噪比的差值来衡量。比如误码率 10^-3 时MRC 比单径节省多少 dB。下面这张表是我在某次仿真中记录的数据你可以用自己跑出来的结果对照。合并方式达到 BER10^-3 所需 SNR相对单径增益无 Rake约 14 dB基准SC约 11 dB3 dBEGC约 9 dB5 dBMRC约 8 dB6 dB这些数值会随路径增益分布变化但趋势是稳定的MRC 最优EGC 次之SC 最弱。如果你的结果偏离这个趋势太多先查 finger 分配是否合理。5. 避坑与排查Rake 仿真里最容易翻车的五个地方5.1 误码率曲线出现错误平台现象信噪比加到很高误码率不再下降卡在某个值。 原因通常是路径间干扰没消除干净或者解扩时延迟对齐有偏差。多径延迟如果不是整数码片解扩输出会有残留干扰。 解决检查delayProfile是否与信道实际延迟一致如果是非整数延迟需要在解扩前做插值或者改用分数间隔。5.2 MRC 性能不如 EGC现象理论上 MRC 应该最好但仿真里反而比 EGC 差。 原因信道估计的幅度没有归一化或者相位估计用了错误的参考。MRC 对幅度估计误差敏感估计偏差会被放大。 解决在计算权重前对幅度做归一化或者改用滑动平均降低估计噪声。如果还是不行先用 EGC 验证链路再逐步加回 MRC。5.3 finger 数量增加但性能不变现象把nFinger从 2 加到 4误码率曲线几乎不动。 原因多出来的 finger 对应的路径能量太低合并后只贡献噪声。或者delays里后几条路径的增益设得太小。 解决打印各 finger 的权重确认后几条路径的权重是否接近零。如果是说明它们不值得合并减少 finger 数反而更好。5.4 解扩输出幅度异常现象解扩后的符号幅度远大于或远小于预期。 原因扩频码没有做 ±1 映射或者归一化因子用错。用 0/1 序列做内积时直流分量会累积。 解决确认spreadCode已经映射到 ±1归一化因子用SF而不是sqrt(SF)除非你做的是正交扩频。5.5 仿真速度慢到无法忍受现象跑一次误码率扫描要十几分钟。 原因用了双重循环逐符号处理Matlab 的向量化优势没发挥出来。 解决把符号维度做成矩阵运算像上面rake_receiver里那样用 reshape 和矩阵乘法比逐符号循环快一个数量级。6. 进阶技巧把静态多径换成衰落信道后怎么调静态多径跑通后下一步通常是加衰落。我一般会把每条路径的增益换成瑞利衰落每个符号周期更新一次。这时候信道估计不能再直接用均值得改成滑动平均或者用导频辅助。具体做法是在每帧开头插几个导频符号用导频做幅度相位估计数据段用估计值合并。% 瑞利衰落信道下的Rake接收片段 % 每条路径增益按Jakes模型生成 fd 100; % 最大多普勒频移 ts 1; % 符号周期 rayleighGain zeros(nSym, length(delayProfile)); for p 1:length(delayProfile) rayleighGain(:, p) rayleighchan(ts, fd); end % 接收端用导频做信道估计 pilotLen 10; % 导频符号数 % ... 导频段解扩后估计各路径幅度相位 % ... 数据段用估计值做MRC合并这里的关键是估计更新速率要跟得上衰落变化。多普勒频移越大滑动平均的窗口要越短否则估计滞后会导致合并增益下降。我习惯先用理想信道估计验证算法上限再换成实际估计看损失多少这样能分清是算法问题还是估计问题。从那以后我每次跑 Rake 仿真都强制先跑一遍单径无衰落的基准曲线确认链路本身没问题再逐步加多径、加衰落、加估计误差。这样出问题时能快速定位是哪一层引入的。希望帮到你。本文还有配套的精品资源点击获取