ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

Simulink信道编码与交织:卷积码、维特比译码及误码率参数适配

Simulink信道编码与交织:卷积码、维特比译码及误码率参数适配 简介一套围绕MATLAB Simulink通信系统建模与仿真的源码包聚焦信道编码与交织技术面向通信工程、电子信息类专业学生及需要开展系统级仿真的科研人员。压缩包共29个文件大小仅130KB包含12个m脚本、6个mat数据文件、5个slx模型、3个xml及3个slxc辅助文件覆盖汉明码、循环码、CRC、卷积码、RS码等典型信道编码实现并配有交织与解交织的完整仿真链路。已有195人学习浏览轻量易用。通过源码可完整经历数据生成、信道编码、交织、信道模拟、解交织、解码及误码率性能评估等关键步骤模型文件与脚本相互对应既适合逐模块拖拽调试也便于阅读代码理解算法细节能够帮助读者将通信原理与Simulink建模实操紧密结合快速搭建自己的编码仿真实验。1. 从一条链路说起为什么源码包里最值得读的是信道编码和交织接手一份带“信道编码和交织”字样的 Simulink 源码包最容易低估的往往就是这两个模块。调制解调和滤波决定信号在频谱上的形状而信道编码和交织决定的是误码率底线。调通这类链路时我反复遇到一种现象模型从启动到运行完全无报错误码率却始终停留在 0.1 附近不下降。追踪到最后通常不是调制问题而是维特比译码回溯延迟和去交织器没有对齐。这一层不梳理清楚后面更换调制方式、调整码率都会连锁出错。下面按“原理定位 → 解包运行 → 误码率统计 → 参数适配”的顺序把 Simulink 里卷积码和交织器之间的配合讲清楚。2. 卷积码与交织器的原理定位从突发错误到随机错误Simulink 里的每个模块都是通信原理的图形化封装。很多人习惯双击模块直接填参数但卷积编码器和交织器这对组合的合理性在于它们一前一后解决了信道的两种错误形态。卷积码依赖维特比译码纠正随机散布的比特错误交织器把突发错误转化为随机错误。两条机制首尾衔接任何一侧的参数变动都会影响另一侧的纠错效果。2.1 突发错误为什么能击穿卷积码的纠错能力一个典型 1/2 码率、约束长度 K7 的卷积码自由距离大约为 10理论上能可靠纠正 4~5 个随机错误。如果信道在一次瞬时干扰中连续打错 40 个比特错误高度聚集维特比译码器在网格图上连续遇到 40 个异常分支度量。路径度量的优劣被拉平幸存路径的判决失去可信度译码输出的错误数有时比直接不译码还多这是发射端编码反而恶化性能的典型原因。没有交织器时卷积码对突发信道几乎是裸奔状态。2.2 poly2trellis 与卷积码参数之间的关联MATLAB 里卷积码的网格结构由 poly2trellis 函数转换得到。编码器与译码器必须基于同一份 trellis 结构否则状态转移关系不一致译码结果完全不可用。最常用的配置是约束长度 7、生成多项式为八进制的 [171 133]% 创建 1/2 码率、约束长度 7 的卷积码网格 trellis poly2trellis(7, [171 133]); % 输出 trellis 对象numStates 2^(K-1) 64 % 维特比译码的路径搜索就在这 64 个状态之间进行第一位的 7 是约束长度指当前输出比特受到前 7 个输入比特的影响后两个数决定每路输出的抽头连接方式。约束长度 K 每加 1状态数翻倍维特比计算量指数增长仿真耗时明显拉长。课程设计和工程原型大多取 K7 或 K9K9 时 traceback depth 要相应调大否则路径尾部可能未收敛就进入下一帧。2.3 想换码率时先想清楚凿孔位置不少源码包会提供 2/3 或 3/4 码率但底层生成多项式还是 1/2 码率那组。这靠凿孔puncturing完成编码端按删除矩阵周期性丢弃部分冗余比特译码端用同样的删除矩阵把缺失位标记为未知再按母码的网格做译码。Simulink 的 Convolutional Encoder 模块可以在参数里指定 puncture pattern。puncture pattern 里的 1 表示保留发送0 表示删除。以 1/2 母码生成 3/4 码率常用的 pattern [1 1; 1 0] 为例它表示从每 4 个编码比特中删掉 1 个发送 3 个。代价是码字自由距离变小编码增益下降。源码包里如果只改了码率而没同步改译码端的删除矩阵误码率会差几个数量级这是排查时经常被忽略的一处。2.4 块交织器按行写入、按列读出的重排模型Simulink 里 Block Interleaver 对应一个 Nrow×Ncol 矩阵。编码后的比特按行填入矩阵按列读出后送调制器接收端 Block Deinterleaver 按列写入、按行读出把信道中的一段连续错误重新分布到不同行变成彼此相隔 Nrow 比特的孤立错误。交织器本身不产生冗余只改变比特在时间轴上的顺序因此不占用额外带宽只引入固定延迟。设计交织尺寸时列数决定一次能切碎的最大突发长度行数决定突发被分散后的最小间距。常用的参考配置如下表设计目标主要调节维度典型取值区间抗短时脉冲干扰列数 Ncol16~64抗深衰落行数 Nrow16~64低时延实时链路Nrow×Ncol 乘积512~1024 比特乘积同时决定了去交织延迟和所需的缓存大小。对基带离散仿真来说交织矩阵每增大一倍仿真占用内存和端到端延迟都近似翻倍所以源码调优时不要无脑加大矩阵。3. 解包源码后从哪下笔模型结构与关键参数设置把源码 zip 解压后先做的是扫一眼文件清单。常见的构成是一个 .slx 或 .mdl 模型文件、一个 init_params.m 初始化脚本、一个 ber_sweep.m 驱动脚本可能还有存放预计算数据的 .mat 文件。模型文件里的模块参数大量引用工作区变量也就是填“变量名”而不是“数值”。拿到新源码包时必须先运行初始化脚本再打开模型否则会看到一片 undefined variable 的红框报错。3.1 初始化脚本里通常定义什么下面是一份典型 init_params.m 的核心片段变量名和模块引用一一对应% init_params.m - 先运行这个脚本再打开模型 fs 1e6; % 系统采样率单位 Hz frameLen 128; % 每帧信息比特数 codeRate 1/2; % 卷积码码率 codedLen frameLen / codeRate; % 编码后每帧比特数1/2 码率下为 256 interleaveSize [16 16]; % 交织矩阵 [行数 列数] trellis poly2trellis(7, [171 133]); EbNo 4; % 当前仿真信噪比单位 dBAWGN Channel 块的 SNR 参数引用 EbNoConvolutional Encoder 和 Viterbi Decoder 的 trellis 参数引用 trellisBlock Interleaver 的尺寸引用 interleaveSize。集中定义的好处是做参数扫描时不用反复打开模块对话框改一行脚本就能重跑整个链路。打开新源码包后先运行脚本再打开模型验证。3.2 编码与译码模块的参数对照和回环自检Convolutional Encoder 和 Viterbi Decoder 模块都有 Trellis structure 参数必须填同一个 trellis 变量。Simulink 的 Viterbi Decoder 还要求填写 Traceback depth太小会让路径未充分收敛偏大则白白增加延迟。约束长度 7 时取 30 是常用值。在把模型接到信道之前建议先做一次无信道回环自检% 工作区验证卷积编码与维特比译码闭环是否一致 txBits randi([0 1], 128, 1); % 一帧信息比特 codedBits convenc(txBits, trellis); % 卷积编码 rxBits vitdec(codedBits, trellis, 30, trunc, hard); assert(isequal(txBits, rxBits), 编码译码闭环不一致);如果这段代码在 MATLAB 命令行能通过再谈 Simulink 链路的问题如果通不过说明 trellis 定义与译码参数不匹配后面模型里必然也错。这是源码包排错时最高效的第一步。基带离散模型里 AWGN Channel 模块的 SNR 参数含义是信号功率与噪声功率之比如果填的是 EbNo 而不是换算后的 SNR需要确认模型内部是否做了归一化处理否则切换调制方式后曲线会整体偏移。3.3 交织与去交织的对称性和延迟补偿Block Interleaver 和 Block Deinterleaver 在参数上互为逆操作。发送端 16×16 按行写入按列读出接收端就必须按列写入按行读出这个对称性决定了参数必须一致。但延迟是不对称的发送端交织器每行读入即可输出接收端去交织器必须攒满整个矩阵才开始输出所以延迟基本等于矩阵容量。Viterbi Decoder 的 traceback 也会引入延迟这两部分叠加后是最常见的延迟失衡来源。模块延迟来源典型数值Viterbi DecoderTraceback depth5×(K-1) 30Block Deinterleaver矩阵填充时间16×16 256Convolutional Encoder移位寄存器延迟K-1 6合计—约 292实际调试时我用“扫描延迟参数找最小误码率”的方法来判断令 Error Rate Calculation 的 Receive delay 从 0 递增到 512画出误码率曲线曲线最低点就是链路真实延迟。这个方法比自己数模块级延迟可靠得多。4. 驱动脚本与误码率统计让模型变成可重复实验模型搭好只是第一步真正有价值的是在不同信噪比条件下反复运行并输出可对比的结果。Simulink 图形界面适合单次调试批量扫描信噪比必须借助 MATLAB 脚本。很多源码包附带的 ber_sweep.m 就是下面这类骨架。4.1 用 sim 命令扫描信噪比% ber_sweep.m 扫描 Eb/N0 并记录误码率 clear; clc; init_params; % 加载模型基础参数 EbNoVec 0:2:10; % 0~10 dB步进 2 dB berResults zeros(1, length(EbNoVec)); for i 1:length(EbNoVec) EbNo EbNoVec(i); % 更新工作区变量模型自动采用 simOut sim(comm_conv_interleaver, StopTime, 2e5); berLog simOut.get(BER); % 从仿真输出对象取误码率三元组 berResults(i) berLog(end, 1); % 三元组第一列为误码率 fprintf(Eb/N0 %d dB, BER %.4e\n, EbNoVec(i), berResults(i)); end figure; semilogy(EbNoVec, berResults, o-); % 绘制半对数座标的 BER 曲线 xlabel(Eb/N0 (dB)); ylabel(BER); grid on;sim 返回的 simOut 是 Simulink.SimulationOutput 对象包含 To Workspace 模块导出的所有信号。这里用 simOut.get(BER) 取出名为 BER 的矩阵。循环中每次改 EbNo 后重新调用 sim就完成一个工作点的仿真。StopTime 的单位在离散基带模型里对应被处理的比特样本数为了达到 1e-3 量级误码率的统计精度至少需要 1e5 比特StopTime 设成 2e5 是比较稳妥的做法。4.2 三种误码率统计方式怎么选方式实现途径适用场景Error Rate Calculation 模块模型内在线统计实时观察、链路调测bertool 图形工具内置误码率扫描界面快速对比多个编码方案biterr 函数后处理从 Workspace 取数据计算需要自定义后处理的场合Error Rate Calculation 模块输出 [误码率 错误比特数 总比特数]接一个 To Workspace 模块即可被脚本读取。biterr 更适合离线比较已经导出的两段比特序列% 离线比较发送端与接收端的比特序列 [errNum, berVal] biterr(txBits, rxBits); % txBits 与 rxBits 长度必须一致返回值分别是错误比特数和误码率4.3 误码率 0.5 是延迟未对齐的标志如果误码率在整个 Eb/N0 扫描区间都停留在 0.5 左右基本可以断定接收端和参考信号完全没有对齐。0.5 接近两个不相关比特序列比较时的预期值。另一种碰到的情况是曲线形状对但整体偏移 3 dB 或 4 dB这通常与 AWGN Channel 的信噪比换算有关但先不要急着改噪声方差还是先检查错误统计位置确认统计的是译码前还是译码后的信号。提示把 Error Rate Calculation 的 Receive delay 配成 MATLAB 工作区变量仿真前用循环遍历 0 到 512 的延迟值画出误码率随延迟变化的曲线。曲线到达最低点后平缓的区间就是该链路实际延迟的可选范围。5. 更换调制方式时的参数联动从源码开始做适配拿到源码后最常见的需求是更换调制方式。如果原模型默认 BPSK改成 QPSK 或 16QAM 之后不只是调制器模块改个 M-ary number 的事情信噪比定义和交织结构都要跟着动。5.1 调制阶数变化时交织宽度同步调整BPSK 一个符号携带 1 个编码比特QPSK 变成 2 个16QAM 变成 4 个。交织矩阵的列数如果不考虑符号边界同一个符号内的两个比特可能被分散到不同的交织行接收端解调时符号检测错误率被放大。把交织矩阵的列数取为调制阶数的整数倍是常见做法QPSK 用 16×3216QAM 用 32×32。对应的帧结构里编码后比特总数也必须是调制阶数和交织矩阵容量的公倍数否则 Buffer 模块会在帧边界补零或丢弃数据。5.2 交织深度的仿真耗时与收益平衡交织矩阵端到端延迟比特相对误码率仿真耗时8×8100基线短16×16292改善约一个数量级中32×321060接近 16×16明显拉长超过一定深度后误码率改善趋缓因为卷积码自由距离决定了纠错上限。在源码调优时我会同时绘制多组交织深度的 BER 曲线找到目标误码率附近曲线开始分离的位置取那个最小延迟的参数而不是选表里最大的矩阵。5.3 每次改动后必须复查的三个参数改动调制方式后按三个顺序排查Error Rate Calculation 的 Receive delay 是否等于新链路的实际延迟Viterbi Decoder 的 Traceback depth 是否仍满足约束长度对应的要求帧长、交织矩阵容量和调制阶数之间是否存在整倍数关系。这三处任何一个失真都不会报编译错误但会让误码率统计失去意义。本文还有配套的精品资源点击获取
返回列表