ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

瑞利信道差分仿真与DAF-SC协作中继在继电保护中的应用

瑞利信道差分仿真与DAF-SC协作中继在继电保护中的应用 简介Matlab环境下的继电保护与瑞利衰落信道仿真代码包面向电气工程、通信方向学生及科研人员用于理解电力系统保护与无线信道建模的交叉应用。压缩包共19个文件以12个.m脚本和4个.fig图形文件为主另有2个.eps矢量图与1个txt说明文件脚本覆盖功率分配、差分编解码、误码率计算等核心流程fig文件便于查看仿真结果整体仅175KB轻量精炼。目前已有38人学习下载。通过该代码可学习MPSK调制映射、平坦衰落信道模拟、差分检测及协同中继的主要实现方法也能结合继电保护方案体会信号处理思想在工程中的具体运用。附带的license.txt提醒使用者注意许可约定文件结构简洁适合希望快速复现并继续改进相关模型的读者。1. 继电保护信号为什么要在瑞利信道里做差分仿真你在做保护整定时默认信道是零误码的但实际智能变电站里失灵保护、闭锁式纵联保护的信号经常要经过无线、载波或光纤复合通道而无线通道的多径效应会带来瑞利衰落——信号幅度按瑞利分布随机起伏深度衰落时一个符号就可能被“吃掉”。一次误码如果落在跳闸命令上就是拒动或误动。这个压缩包里的 Matlab 方案正是把继电保护中的“命令比特”先用差分编码调制再扔进瑞利衰落信道用选择合并重建信号最后统计误码率和中断概率。适合研究保护通道可靠性、或者做 D2D 通信物理层仿真的工程师。代码结构不复杂但把数字通信里的 DAF-SC-SPL-2013 思想和一个保护信号的端到端流程搭在了一起值得拆开看清楚。2. 建模基础DAF-SC 协作中继与瑞利信道的 Matlab 映射2.1 继电保护中的信道问题为什么要引入瑞利衰落继电保护的通信通道通常被建模成“二进制对称信道”即只给一个误码率 p不关心误码是怎么产生的。但在真实场景中保护信号经过电力线载波、微功率无线或者无线专网时多径传播会造成接收信号包络的随机波动。当发射机与接收机之间没有直达路径时信道系数服从瑞利分布此时接收信噪比呈指数分布深衰落发生的概率不可忽略。保护信号一旦在衰落的低谷到达符号判决就会出错。所以研究保护方案在瑞利信道下的表现不能只看平均误码率还要看瞬时的信噪比分布。这个包中的DAF_SC.m和Pe_SC.m就是围绕这个目标组织的。这里的 DAF 是 Decode-and-Forward译码转发SC 是 Selection Combining选择合并SPL-2013 暗示这套思路参考了 2013 年 IEEE Signal Processing Letters 上的协作分集思想。对于保护信号来说中继节点可以看作相邻保护装置或通信网关它把收到的保护命令先解码再转发接收端从直传和中继两路里选择信噪比更好的那条降低深衰落导致的误码。2.2 DAF-SC 的数学结构与代码文件映射假设直传链路信道系数为 h1中继链路为 h2噪声均为复高斯白噪声。译码转发中继先检测出发送比特再重新调制转发。选择合并的判决依据是两条链路的瞬时信噪比γ1 |h1|^2 · Es/N0γ2 |h2|^2 · Es/N0接收端选择 max(γ1, γ2) 对应的支路做解调。这个过程在代码里被拆成了多个函数DAF_SC.m负责整体迭代DAF_SC_Outage.m负责计算中断概率PowerAllocation.m用来优化中继和源端的功率分配系数。你打开PowerAllocation.m会发现它本质上是在固定总功率 Es 下扫描源端到中继的功率占比 α使端到端误码率最小。α 通常取 0.30.5 之间具体取决于直传信道与中继信道的平均信噪比之比。2.3 复杂高斯数据与 MPSK 映射信道和调制怎么生成瑞利衰落的“密文瑞利衰落信道”本质上是复高斯随机变量的模。Matlab 中用randn生成实部和虚部组合成零均值复高斯变量其模就服从瑞利分布。代码中bits.m生成随机比特bin2mpsk.m把比特映射到 MPSK 符号mpsk2bin.m是逆向映射。下面是典型的信道与调制生成过程% 生成复高斯信道系数 h模服从瑞利分布 h (randn(1, N) 1j * randn(1, N)) / sqrt(2); % 生成随机二进制比特流 bits randi([0 1], 1, N * log2(M)); % 比特映射为 MPSK 符号0 映射为相位 01 映射为相位 pi 依此类推 syms bin2mpsk(bits, M); % 加性复高斯白噪声噪声功率由 SNR 决定 noise sqrt(0.5 * 10^(-SNR_dB/10)) * (randn(1, N) 1j * randn(1, N)); % 接收信号符号经过信道衰落再加噪声 r syms .* h noise;这里N是符号长度M是调制阶数SNR_dB是每符号信噪比。复高斯随机变量的两个正交分量方差都设成 0.5是为了让|h|^2的期望值为 1这样信噪比不被信道增益抬高或压低仿真结果才有可比性。3. 核心模块拆解差分编解码与误码率统计 Pe_SC3.1 差分编码器diff_encoder.m免去信道相位估计在瑞利信道中接收信号的相位会被信道随机旋转。如果采用相干解调需要先估计信道相位这要占用额外的导频开销。保护信号的报文往往很短来不及做复杂的信道估计所以这个包采用了差分编码。diff_encoder.m的作用是把 MPSK 符号的相位变化编码到相邻符号的相位差上function y diff_encoder(x) % x: MPSK 符号序列幅度归一化 % y: 差分编码后的符号y(1) x(1) y zeros(size(x)); y(1) x(1); for k 2:length(x) y(k) y(k-1) * x(k); % 相位累加当前符号乘以前一符号 end end解码时就不再需要信道相位只要看相邻符号的相位差就能恢复原始符号。代价是如果深衰落持续两个符号以上会出现成对误码但保护信号本身有 CRC 校验能容忍少量误码后重发。这里的乘法操作在极坐标下就是相位相加所以diff_encoder实际上是一个增量相位调制器。需要注意输入符号幅度必须是 1否则累乘会改变幅度。3.2 差分检测器diff_detector.m直接相位比较对应地diff_detector.m接收衰落叠加噪声后的符号序列通过共轭相乘提取相位差function est_bits diff_detector(r, M) % r: 经过信道和差分编码后的接收符号 % M: 调制阶数 % 共轭相乘得到相位差 phase_diff r(2:end) .* conj(r(1:end-1)); % 将相位差判决到最近的 MPSK 星座点 ref exp(2j * pi * (0:M-1) / M); % 参考星座点 [~, idx] min(abs(phase_diff. - ref), [], 2); est_bits mpsk2bin(ref(idx)., M); % 通过逆向映射恢复比特 end这段代码里conj是关键它把当前符号乘以上一符号的共轭结果的角度就是两个符号的相位差。注意如果信道在相邻两个符号之间变化太快相位差就不等于发送时的相位差所以差分检测对多普勒频移敏感。保护信号的传输速率通常不高比如 64 kbps在城区慢衰落环境下多普勒频移只有几赫兹影响很小。3.3 误码率仿真主流程Pe_SC.m 的蒙特卡洛循环Pe_SC.m是整个包的统计核心它通过蒙特卡洛仿真计算不同信噪比下的误码率。写法上它遍历一组 SNR 值每个 SNR 重复多次随机信道和噪声统计误码总数。简化后的流程如下SNR_dB 0:2:20; BER zeros(size(SNR_dB)); M 4; % QPSK numSymbols 1e4; % 每个 SNR 下的符号数 trials 10; % 重复次数降低方差 for s 1:length(SNR_dB) total_errors 0; total_bits 0; for t 1:trials bits randi([0 1], 1, numSymbols * log2(M)); syms bin2mpsk(bits, M); diff_syms diff_encoder(syms); h1 (randn(1, numSymbols) 1j * randn(1, numSymbols)) / sqrt(2); h2 (randn(1, numSymbols) 1j * randn(1, numSymbols)) / sqrt(2); r1 diff_syms .* h1 sqrt(0.5 * 10^(-SNR_dB(s)/10)) * (randn(1, numSymbols) 1j*randn(1, numSymbols)); r2 diff_syms .* h2 sqrt(0.5 * 10^(-SNR_dB(s)/10)) * (randn(1, numSymbols) 1j*randn(1, numSymbols)); % 选择合并比较两路接收符号幅度 r_sc r1; idx abs(r2) abs(r1); r_sc(idx) r2(idx); est_bits diff_detector(r_sc, M); total_errors total_errors sum(est_bits ~ bits); total_bits total_bits length(bits); end BER(s) total_errors / total_bits; end semilogy(SNR_dB, BER, o-); grid on; xlabel(SNR (dB)); ylabel(误码率);参数上numSymbols决定每个 SNR 点的精度点数越大曲线越平滑但耗时越长。trials控制独立信道重数建议不少于 10。这段代码里选择合并的判决条件是瞬时接收幅度abs(r)直接比较这在噪声功率相同的前提下等价于比较信噪比。如果直传和中继噪声功率不同就不能这样比要除以各自的噪声功率再比。4. 文件结构与数据流从bits.m到SC_M2M4.eps4.1 压缩包文件角色一览拿到这个 zip先不要急着运行按下面的表格把文件分类。license.txt需要最先阅读它规定了代码的使用范围G2可能是某组信道增益数据也可能是G2函数的实现需要打开文件确认。表格中的顺序就是推荐的执行顺序文件角色说明license.txt授权声明使用前确认允许范围尤其是商用和再分发限制bits.m数据源生成随机比特序列bin2mpsk.m/mpsk2bin.m比特与符号互转配合diff_encoder.m、diff_detector.m使用diff_encoder.m调制前处理将 MPSK 符号做差分编码flat_cos.m成形/滤波可能用于平坦衰落信道的余弦成形检查具体实现DAF_SC.m主仿真脚本调用上述函数执行完整协作链路Pe_SC.m误码率统计输出 BER-SNR 曲线PowerAllocation.m功率分配优化扫描源端/中继功率比cxn.m信道复增益生成内含复合高斯到瑞利信道的转换int_num.m积分/数值工具可能用于计算近似误码率公式DAF_SC_Outage.m中断概率计算信噪比低于门限的概率SC_M2.fig、SC_M4.fig、pa_m2m4.fig结果图交互式查看波形和曲线可用openfig打开4.2 主链路的调用顺序整套仿真按“比特生成 → 调制 → 差分编码 → 双支路信道 → 选择合并 → 差分检测 → 误码统计”执行。DAF_SC.m通常不会直接调用所有函数而是把用户选择的调制阶数M2或M4传入SC_M2M4相关的分支。.fig文件里存的是已经跑好的结果图比如SC_M2.fig是 BPSK 下的误码率曲线SC_M4.fig是 QPSK 下的曲线pa_m2m4.fig则是功率分配系数与误码率的关系。如果你要复现某张.fig不要只看图要把对应的仿真参数记下来。比如SC_M2.fig中的 SNR 范围是 0 到 20 dB还是 0 到 30 dB决定了你重跑时Pe_SC.m里的SNR_dB向量要设置成一致。cxn.m和int_num.m通常不用修改但如果换成自己的信道系数要确保复高斯变量的方差仍是 1。4.3 G2 与 license.txt 的处理建议G2没有扩展名这有三种可能一是 Matlab 的.mat数据文件但缺少扩展名二是函数文件G2.m但在压缩包里显示为G2三是某个数据集目录。拿到后先执行which G2如果返回路径说明是函数如果提示找不到再用load(G2)看看是否是 mat 文件。不要盲目改后缀免得破坏二进制内容。license.txt里如果是 GPL 或 BSD 许可你可以在自己的项目里引用但要保留版权声明如果是“仅限学术使用”就不能拿去做商业保护装置。对于工程人员来说即使只是内部仿真也建议把 license 归档到项目目录避免后续交付时产生版权纠纷。5. 参数调优与排错让保护信号仿真更接近现场5.1 三个容易踩的参数坑第一个坑是SNR_dB的定义方式。上面的仿真代码中噪声功率用的是0.5 * 10^(-SNR_dB/10)这里 0.5 是因为复噪声的实部和虚部各占一半功率。如果改成实信道仿真噪声功率就是10^(-SNR_dB/10)直接照搬会低 3 dB误码率曲线右偏。第二个坑是diff_encoder的初始化。如果第一个符号没有参考值有的实现会固定发一个 1 作为参考那么算误码时要把第一个符号的判决丢掉否则会多出一个固定错误。第三个坑是选择合并时的幅度比较前提是两路噪声功率相同。如果DAF_SC.m里中继链路有放大系数比较前要把接收符号做归一化。下面给出一份可复用的参数调整表参数常见值作用风险numSymbols1e4 ~ 1e5误码率置信度过小则曲线抖动trials10 ~ 50信道重数过大使仿真时间线性增长M2 / 4调制阶数高阶需要更高 SNRSNR_dB0:2:20扫描范围范围太窄看不到误码率地板功率分配 α0.3 ~ 0.5源端/中继功率两端信道差异大时要调整5.2 波形调不出来时的排查顺序先跑Pe_SC.m如果报错说维度不一致八成是bin2mpsk.m里的reshape方向错误。MPSK 映射后符号长度是 bit 长度的log2(M)分之一检查有没有多重reshape导致的行列转置。如果曲线在低信噪比下不是 0.5而是接近某个固定值说明diff_detector.m的参考星座点顺序有误——MPSK 星座点的索引要和bin2mpsk.m的顺序完全一致。如果.fig文件打不开用openfig(SC_M2.fig)不要用openopen在新版 Matlab 中可能把 fig 当图片打开。5.3 从平坦瑞利扩展到频率选择性信道原始代码假设每个符号经历的信道不变这是平坦衰落。实际电力线载波和宽带无线会有频率选择性符号速率提高后需要用抽头延迟线模型。常见做法是把每个符号的平坦系数替换成多径系数卷积% 生成两径信道 tap1 (randn(1, N) 1j * randn(1, N)) / sqrt(2); % 第一径 tap2 0.5 * (randn(1, N) 1j * randn(1, N)) / sqrt(2); % 第二径衰减 6 dB % 对发送符号做两径卷积线性卷积再截断 tx diff_syms; rx filter(tap1, 1, tx) filter(tap2, 1, [zeros(1, 2), tx(1:end-2)]);这里filter的第一个参数是信道冲激响应第二个参数固定为 1 表示 FIR 滤波。两径间距 2 个符号对应多径时延为两倍符号周期。此时差分检测需要把相位差计算扩展到间隔 2 个符号否则会因码间干扰产生系统性误码。你可以把diff_detector里的r(2:end) .* conj(r(1:end-1))改成r(3:end) .* conj(r(1:end-2))代价是有效信噪比略微下降。5.4 与 Simulink 保护模型联调的思路纯 m 脚本适合批量跑点但如果你想看保护逻辑在信道误码下的动作时序可以把上述误码率曲线导入 Simulink。常见做法是先用Pe_SC.m得到某个平均 SNR 下的误码序列把它存成.mat变量再用 Simulink 的From Workspace模块作为保护信号传输通道的输出。这样你可以在保护逻辑模型里注入实际误码模式而不是单纯用随机数误码能更真实地评估距离保护、差动保护对通道误码的敏感度。6. 用 Pe_SC 的曲线反推保护通道的 SNR 门限最后给你一个可直接落地的验证技巧用Pe_SC.m跑出的曲线反推保护通道的最低允许信噪比。保护规程里通常要求“允许信号”的传输误码率不大于 1e-4不同厂家有差异你在semilogy画出的曲线上找到 BER1e-4 对应的 SNR 值那就是你的保护信号可靠传输的门限。如果现场实测通道在这个信噪比之上就能留有余量如果低于门限就要考虑增加中继、提高发射功率或改用更低阶调制。实际操作时先把Pe_SC.m里的SNR_dB改成0:0.5:20减小步长提高门的精度再增大numSymbols到 5e4让低误码率点更稳。跑完后用grid on和xline(threshold)标出门限位置导出为.fig备用。另一个验证手段是拿差分 BPSK 的理论误码率公式 PB 0.5·exp(-γb) 画在同图上如果仿真点在高信噪比时与理论线几乎重合就说明你的信道和检测实现没有笔误如果差 1~2 dB检查噪声功率定义是否统一。最后把PowerAllocation.m扫描得到的 α 最优值记进仿真报告这个值在不同 SNR 下基本稳定如果出现突变说明某一条链路进入了中断区此时选择合并不会带来增益直接用直传可能更可靠——这也是DAF_SC_Outage.m里要计算中断概率的原因。这样你交付的不只是一张曲线图而是一个带门限结论的保护通信通道校核方法。本文还有配套的精品资源点击获取
返回列表