当前位置: 首页 > article >正文

matlab仿真 信道编码和交织(下)

(内容源自详解MATLAB/SIMULINK 通信系统建模与仿真   刘学勇编著第八章内容,有兴趣的读者请阅读原书) 

​ 

clear all
  n=3;k=2;%A(3,2)循环码
  N=10000;%消息比特的行数
  msg=randi([0 1],N,k);%消息比特一共N*k行
  pol=cyclpoly(n,k);%循环码的生成多项式
  [h,g]=cyclgen(n,pol);%生成循环码
  code1=encode(msg,n,k,'cyclic/binary');%循环码编码
  code2=mod(msg*g,2);
  noisy=randerr(N,n,[0 1;0.7 0.3]);%噪声
  noisycode1=mod(code1+noisy,2);
  noisycode2=mod(code2+noisy,2);%噪声叠加
  newmsg1=decode(noisycode1,n,k,'cyclic');%译码
  newmsg2=decode(noisycode2,n,k,'cyclic');
  [number,ratio1]=biterr(newmsg1,msg);%误比特率
  [number,ratio2]=biterr(newmsg2,msg);
  disp(['The bit error rate1 is',num2str(ratio1)])
  disp(['The bit error rate2 is',num2str(ratio2)])

 

循环码的产生分为两步,首先通过 cyclpoly函数形成循环码的生成多项式,再利用cyclgen函数,将生成多项式作为参数,生成循环码。

这里添加噪声之后需要异或,因为本质上循环码都是二进制的情况,添加噪声只是将0(1)变为1(0)

m=4;n=2^m-1;%码字长度
k=5;%消息长度
N=100;%消息比特行数
msg=randi([0,1],N,k);%消息比特
[genpoly,t]=bchgenpoly(n,k);%BCH码的纠错能力

code=bchenc(gf(msg),n,k);%BCH编码
noisycode=code+randerr(N,n,1:t);%每个码字加入不超过纠错能力的误码(1)
[newmsg,err,ccode]=bchdec(noisycode,n,k);%BCH译码
if ccode==code
    disp('所有错误比特都被纠正')
end
if newmsg==msg
    disp('译码消息与原消息相同')
end

(1)这里的纠错能力是t,也就是说当码字变化范围在t以内的时候,可以正常纠错,所以后面随机数采用的范围为1:t

 

clear all
m=4;
n=15;
k=11;
t=(n-k)/2;%码的纠错能力
N=1000;%信息符号的行数
msg=randi([0 2^m-1],N,k);%信息符号
msg1=gf(msg,m);
msg1=rsenc(msg1,n,k).';%15-11RS编码
msg2=de2bi(double(msg1.x),'left-msb');%转换为二进制(1)
y=bsc(msg2,0.01);%通过二进制对称信道
y=bi2de(y,'left-msb');%转换为十进制
y=reshape(y,n,N).';
dec_x=rsdec(gf(y,4),n,k);%RS解码
[err,ber]=biterr(msg,double(dec_x.x),m)%解码后的误比特率

 (1)这里double中使用msg1.x而不是直接使用msg1,是因为只有在后面加上.x才能正常进行二进制的转化,最后一行的double也是相同的道理

 

 

clear all
EbN0=0:10;%SNR范围
N=1000000;%消息比特的个数
M=2;%BPSK调制
L=7;%约束长度
trel=poly2trellis(L,[171 133]);%卷积码生成多项式
tblen=6*L;%维特比译码回溯深度(1)
msg=randi([0 1],1,N);%消息比特序列
msg1=convenc(msg,trel);%卷积编码
x1=pskmod(msg1,M);%BPSK调制
for ii=1:length(EbN0)
    %加入高斯白噪声,因为码率为1/2,所以每个符号的能量要比比特能量少3dB
    y=awgn(x1,EbN0(ii)-3);%(2)
    y1=pskdemod(y,M);%硬判决
    y1=vitdec(y1,trel,tblen,'cont','hard');%维特比译码
    [err,ber1(ii)]=biterr(y1(tblen+1:end),msg(1:end-tblen));%误比特率
    
    y2=vitdec(real(y),trel,tblen,'cont','unquant');%软判决
    [err,ber2(ii)]=biterr(y2(tblen+1:end),msg(1:end-tblen));%误比特率
end

ber=berawgn(EbN0,'psk',2,'nodiff');%BPSK调制理论误比特率
semilogy(EbN0,ber,'-ko',EbN0,ber1,'-k*',EbN0,ber2,'-k.');
legend('BPSK理论误比特率','硬判决误比特率','软判决误比特率')
title('卷积码性能')
xlabel('Eb/N0');ylabel('误比特率')

 

(1)回溯深度和约束长度的关系 (2)-3dB

参考文章链接:

 http://t.csdnimg.cn/XG45Khttp://t.csdnimg.cn/XG45K

 

 

 

 

clear all
N=10000;
k=4;%编码码字消息序列长度
n=7;%编码码字长度
x=randi([0 1],N*k,1);%消息比特
code=encode(x,n,k);%(7,4)汉明编码
code1=matintrlv(code,N/10,10*n);%(N/10,10*n)矩阵交织
noise=randerr(N,n,[0:n-3;0.8 0.09 0.07 0.03 0.01]);%信道差错,包括独立差错和突发差错
noise=reshape(noise.',N*n,1);
y=bitxor(code,noise);%无交织接受信号
y=decode(y,n,k);%汉明译码
[err ber]=biterr(x,y);%统计误比特率

y1=bitxor(code1,noise);%有交织接收信号
y1=matdeintrlv(y1,N/10,10*n);%解交织
y1=decode(y1,n,k);%汉明编码
[err,ber1]=biterr(x,y1);%统计误比特率
disp('无交织时的误比特率:');
ber
disp('有交织时的误比特率:');
ber1

总结,交织器通过改变可能出错的码中各个数据的位置,从而将可能连续出现的错误分开,从而减小错误对判决的影响。


http://www.kler.cn/news/284886.html

相关文章:

  • 【docker】docker学习笔记
  • Datawhale AI夏令营 第五期 CV方向 Task3笔记
  • GD - GD32350R_EVAL - PWM实验和验证1
  • React原理之Diff算法
  • ESP32-S3 IDF框架 控制 WS2812 灯条:实现多种灯效
  • 【通过h5作为中转页跳转到微信小程序】
  • 【Linux】06.Linux 下的编译器——gcc/g++
  • 【C++ 第十八章】C++11 新增语法(2)
  • vue3+el-tale封装(编辑、删除、查看详情按钮一起封装)
  • 【HarmonyOS 4.0】@ohos.router 页面路由
  • ★ 算法OJ题 ★ 力扣11 - 盛水最多的容器
  • sqlite3 数据插入效率
  • YOLOv8改进 | 模块缝合 | C2f融合卷积重参数化OREPA【CVPR2022】
  • Having trouble using OpenAI API
  • 回归预测|基于鹅GOOSE优化LightGBM的数据回归预测Matlab程序 多特征输入单输出 2024年优化算法
  • vue3本地运行错误集
  • 5.3 MySql实战
  • Xilinx FPGA在线升级——升级思路
  • 鸿蒙开发5.0【基于Swiper的页面布局】
  • LeetCode 热题100-9 找到字符串中所有字母异位词
  • vscode 未定义标识符 “uint16_t“C/C++(20) 但是可以顺利编译
  • Java算法—插入排序(Insertion Sort)
  • 一种导出PPT到MP4的方法
  • 大数据测试怎么做,数据应用测试、数据平台测试、数据仓库测试
  • ​T​P​一​面​
  • 系统编程-消息队列
  • 力扣2116.判断一个括号字符串是否有效
  • Qt_信号槽机制
  • 计算机网络概述(网络结构)
  • MYSQL——聚合查询