虽然跑出来了,但没有完全跑出来.jpg
原来是想看看自带的rs编解码函数长什么样,但解码部分不会看,好吧
利用自带的GF域来编了一遍,自带的gf类相关计算函数都在@gf文件夹里,最近去看其他东西了暂时还没来得及研究。

目录

  • 函数列表
  • 主程序
  • 函数
    • RS编码
    • RS译码
    • 生成多项式
    • 校正子计算
    • 伯利坎普迭代
    • 错误数值
    • 错误位置矫正
    • 二进制转GF域
    • GF域转二进制
    • GF域幂次索引
  • 仿真结果

函数列表

函数名 功能
Berlekamp2(syn,M,N,K) Berlekamp迭代算法求错误位置多项式
bin2GFdec(input,k,m) 二进制转GF域
errorcorrect (msg,errorst,pos) 错误位置
errornum2( errorpoly,syn,N,GF_index) 错误数值
GFdec2bin( rs_code,m ) GF域转二进制
GFindex(M) GF域幂次索引
rsdec2(dec_msg,N,K) rs解码
rsenc2(msg, N, K) rs编码
rsgenpoly2(N, K) 生成多项式(没用到,用的自带的)
syndrome2(msg,N,K) 校正子计算

主程序

会跑很久,信息长度缩短能快些,但那样差距不太能体现出来。

clc;
clear;len=100000;
m=8;           %扩域GF(2^m)
n=2^m-1;       %2^m进制编码长度;
k=223;         %信息位长度;
t=(n-k)/2;     %纠错数
msg=randi([0 1], len, 1);mod_bpsk = comm.BPSKModulator;
demod = comm.BPSKDemodulator;%rs编码
demsg=bin2GFdec(msg,k,m);
rs_code=rsenc2(demsg,n,k);data=GFdec2bin( rs_code,m );%BPSK调制-高斯信道
modSignal = step(mod_bpsk,data);   %RS编码
modSignal_2=step(mod_bpsk,msg);    %无编码
N=1;for i=1:10chan = comm.AWGNChannel('NoiseMethod','Signal to noise ratio (SNR)','SNR',i);noisySignal = step(chan,modSignal); receivedData = step(demod,noisySignal); noisySignal_2 = step(chan,modSignal_2); receivedData_2 = step(demod,noisySignal_2); %无编码errorRate = comm.ErrorRate;errorStats = step(errorRate,msg,receivedData_2);BER_BPSK(N)=errorStats(1);fprintf('no RS Error rate = %f\nNumber of errors = %d\n', errorStats(1), errorStats(2))%rs译码1dec_msg=bin2GFdec(receivedData,n,m);decrs_code = rsdec2(dec_msg,n,k);decrsbin_code=GFdec2bin( decrs_code,m );recmsg=decrsbin_code(1:len);errorRate = comm.ErrorRate;errorStats = step(errorRate,msg,recmsg);BER_BPSK_RS(N)=errorStats(1);fprintf('Error rate = %f\nNumber of errors = %d\n', errorStats(1), errorStats(2))fprintf('\n')Y(N)=i;N=N+1;end
figure
semilogy(Y,BER_BPSK,'-o',Y,BER_BPSK_RS,'-o');
legend('无编码','(255,223)RS码');
grid on
xlabel('SNR dB');
ylabel('BER');

函数

RS编码

function code = rsenc2(msg, N, K)% Find fundamental parameters m and t
M = msg.m;
t = (N-K)/2;
T2 = 2*t;       % number of parity symbols[m_msg, n_msg] = size(msg);genpoly   = rsgenpoly(N,K,msg.prim_poly);   % 生成多项式parity = gf(zeros(m_msg,T2),M,msg.prim_poly);%生成多项式最高项为1
genpoly = genpoly(2:T2+1);% Encoding
% Each row gives the parity symbols for each message word
for j=1:size(msg,2),parity = [parity(:,2:T2) zeros(m_msg,1)] + (msg(:,j)+parity(:,1))*genpoly;  %gf多项式除法
endcode = [msg parity];

RS译码

function decrs_code = rsdec2(dec_msg,N,K)M=dec_msg.m;GF_index = GFindex(M);for i=1:size(dec_msg,1)msg=dec_msg(i,:);syn = syndrome2(msg,N,K);errorpoly = Berlekamp2(syn,M,N,K);[errorst pos] = errornum2( errorpoly,syn,N,GF_index);errccor = errorcorrect ( msg,errorst,pos);rmsg=errccor(1:K);cor(i,:)=rmsg.x;enddecrs_code=gf(cor,M);
end

生成多项式

function [genpoly,t] = rsgenpoly2(N, K)t = floor((N-K)/2); %向下取整
t2 = N-K;
m = log2(N+1);
b = 1;                 alpha = gf(2,m); genpoly = 1;
for k=1:t2evalc('genpoly = conv(genpoly,[1 alpha.^(k)]);');
end

校正子计算

跑了下发现这里用的时间最长,引用polyval的次数太多了…

function syn = syndrome2(msg,N,K)M=msg.m;t2=N-K;alpha=gf(2,M);for i=1:t2a=alpha.^i;sym=polyval(msg,a);p(i)=sym.x;endsyn=gf(p,M);
end

伯利坎普迭代

function errorpoly = Berlekamp2(syn,M,N,K)t=(N-K)/2;u=1;  %迭代步数初始化errorpoly=gf(1,M); %错误位置多项式初始化du=syn(1);  %迭代步差lup=0;lu=0;  %errorpoly最高幂次p=-1;dp=gf(1,M);;   %ρ初始化errp=gf(1,M);for u=1:2*terrp2=errorpoly;    xerrp=errp;        if du==gf(0,M)        %du=0errorpoly=errorpoly;elseif u-1-p>0xerrp(size(errp,2)+u-1-p)=0;endxerrp=du*dp.^(-1)*xerrp;if length(xerrp)>length(errorpoly)         %多项式加法长度保持一致a=length(xerrp)-length(errorpoly);errorpoly(a+1:length(errorpoly)+a)=errorpoly;errorpoly(1:a)=gf(0,M);elseif length(xerrp)<length(errorpoly)a=length(errorpoly)-length(xerrp);xerrp(a+1:length(xerrp)+a)=xerrp;xerrp(1:a)=gf(0,M);enderrorpoly=errorpoly+xerrp;endif (p-lup<u-1-lu)&&(du~=gf(0,M))       %选ρdp=du;p=u-1;errp=errp2;lup=lu;endlu=size(errorpoly,2)-1;if u<2*tdu=syn(u+1);for b=1:luif size(errorpoly,2)==1du=du;elsedu=du+errorpoly(end-b)*syn(u+1-b);endendendend
end

错误数值

function [errorst pos] = errornum2( errorpoly,syn,N,GF_index)
%求错误数值
%errorpoly-错误位置多项式
%syn-校正子
%GF-GF域
%errorst-错误多项式
%pos-错误位置M=errorpoly.m;root=roots(errorpoly);syn1=syn(end:-1:1);if length(root)==0         %如果没有根,则错误多项式为0errorst=0;pos=0;elseZ=conv(errorpoly,syn1);Z0=Z(end-length(errorpoly)+2:end);for i=1:length(root)ZB=polyval(Z0,root(i));sigma=gf(1,M);for k=1:length(root)if root(k)~=root(i)sigma=sigma*(1+(root(k)).^(-1)*root(i));endendsigma=sigma*(root(i)).^(-1);error=ZB/sigma;errornum(i)=error.x;pos1=root(i);if pos1==gf(1,M)pos(i)=N;elsepos(i)=GF_index(pos1.x+1);endenderrorst=gf(errornum,M);end
end

错误位置矫正

function errccor = errorcorrect (msg,errorst,pos)errccor=msg;if pos==0elsefor i=1:length(errorst)errccor(pos(i))=msg(pos(i))+errorst(i);endend
end

二进制转GF域

function msg= bin2GFdec(input,k,m)
%二进制分帧并转GF域L=length(input);z=fix(L/(k*m));        r=mod(L,k*m);r1=k*m-mod(L,k*m);if r~=0     %若原始信息数除不尽信息位,则用0填满input(L+1:L+r1)=0;z=z+1;endinputGF=zeros(length(input)/m,1);for   i=1:length(input)/mfor x=1:minputGF(i)=2^(m-x)*input((i-1)*m+x)+inputGF(i);endendmsgtemp=reshape(inputGF,k,z);msg=msgtemp';msg=gf(msg,m);
end

GF域转二进制

function data = GFdec2bin( rs_code,m )a=size(rs_code,1);b=size(rs_code,2);data=zeros(a*b*m,1);for x=1:afor y=1:brs_dec=rs_code(x,y);rs_dec=dec2bin(rs_dec.x,m);for i=1:mdata((x-1)*b*m+(y-1)*m+i)=str2num(rs_dec(i));endendend
end

GF域幂次索引

function GF_index = GFindex(M)GF_index=zeros(2^M,1);GF_index(1)=-1;GF_index(2)=0;alpha=gf(2,M);for i=1:2^M-2a=alpha.^i;GF_index(a.x+1)=i; end
end

仿真结果

信噪比大于4的场合误码率比起无编码就显著下降了,从6开始其实是0。

感想:该复习数电了。

RS码编译matlab仿真2相关推荐

  1. 数字双向码的matlab仿真,数字双相码的仿真 文字版.pdf

    通信原理上机实验报告 年级: 姓名: 学号: 时间: 数字双相码的仿真 一.实验目的 1.熟悉MATLAB软件的工作环境 2.熟练掌握数字双相码的MATLAB仿真 3.熟练掌握数字双相码的Simuli ...

  2. matlab画极化码,极化码的matlab仿真(1)——参数设置

    根据老师的安排,对于极化码的了解从仿真开始. 仿真的手段有很多种.可以利用C,C++,matlab等进行仿真的实现.其中matlab由于具有强大的函数库,和壮观的矩阵运算能力,被(我们老师课题组)看中 ...

  3. 数字双向码的matlab仿真,matlab2016 ccs

    (s 简称 CCSLink)提供了 MATLAB.TI DSP 集成开发环 境(CCS)和硬件 DSP 的双向连接,允许开发者在 MATLAB 的 环境下就可以完成对 CCS 和硬件目标 DSP 的操 ...

  4. 极化码的matlab仿真(2)——编码

    第二篇我们来介绍一下极化码的编码. 首先为了方便进行编码,我们需要进行数组的定义 signal = randi([0,1],1,ST); %信息位比特,随机二进制数 frozen = zeros(1, ...

  5. 通信使用matlab三元码实验报告,Matlab仿真DSBSC信号与双极性不归零码通信原理实验报告二实验...

    Matlab仿真DSBSC信号与双极性不归零码通信原理实验报告二实验 Matlab 仿真 DSB-SC 信号与双极性不归零码通信原理实验报告二实验题目:Matlab 仿真 DSB-SC 信号与双极性不 ...

  6. 差动双相码matlab仿真,数字双相码的仿真.docx

    数字双相码的仿真 通信原理上机实验报告年级:姓名:学号:时间:数字双相码的仿真一.实验目的1.熟悉MATLAB软件的工作环境2.熟练掌握数字双相码的MATLAB仿真3.熟练掌握数字双相码的Simuli ...

  7. matlab计算abc三相短路电流_手把手教你做FOC电机控制MATLAB仿真

    一.整体结构及功能介绍用MATLAB2013以上版本打开文件,看到如图所示界面:可以看到仿真最外层由四个模块组成,电源模块(红色方框),电机与控制模块(蓝色方框),控制信号给定模块(黄色方框),信号分 ...

  8. RS编码译码误码率性能matlab仿真

    目录 1.算法描述 2.仿真效果预览 3.MATLAB部分代码预览 4.完整MATLAB程序 1.算法描述 纠错编码技术在卫星通信.移动通信及数字存储等领域已获得了广泛的应用.RS码作为其中最重要的码 ...

  9. 【RS码2】RS码的BM迭代译码原理详解及MATLAB实现(不使用MATLAB库函数-代码见CSDN同名资源)

    关注公号[逆向通信猿]更精彩!!! 理论基础 订阅<信道编码>专栏,首先查阅各子程序的详解 [有限域生成]本原多项式生成有限域的原理及MATLAB实现 [有限域除法]二元多项式除法电路原理 ...

  10. 【RS码1】系统RS码编码原理及MATLAB实现(不使用MATLAB库函数)

    关注公号[逆向通信猿]更精彩!!! 基础知识 要想搞懂本节知识,需要先熟悉掌握以下前几篇博客 [多元域乘法]多项式乘法电路原理及MATLAB详解 [多元域除法]多项式除法电路原理及MATLAB详解 R ...

最新文章

  1. 网络工程师常用英文简写
  2. mpvue微信小程序动画_mpvue微信小程序系列
  3. Java8新特性学习_001_(Lambda表达式,函数式接口,方法引用,Stream类,Optional类)
  4. php 怎么输入php ini,PHP怎么找到php.ini配置文件?-php教程
  5. 《Android 源码设计模式解析与实战》— Android 书籍
  6. 超详细,手把手 教你 SQLyog 安装教程
  7. mysql多表条件查询_mysql 多表 多个条件 查询
  8. DataStructuresAndAlgorithm--字谜游戏
  9. Robin广场舞案例实践分析之深入思考
  10. java校验中文姓名合法性(需要支持生僻字与分隔符·)
  11. 0640与6130的区别_达人评测熊猫6143收音机与6130有区别没有?使用哪个好?使用四周后体验分享...
  12. 如何把视频或者音频转成文字
  13. facenet 人脸识别库的搭建和使用方法(二)
  14. Windows 解决端口占用
  15. Potplay视频播放画面扭曲
  16. java 内存读写文件_Java的文件读写操作
  17. 数据结构与算法之多路查找树(2-3树、2-3-4树、B树、B+树)
  18. 培训网站比较-CSDN-51CTO-慕课网
  19. xsemaphoretake返回_【FreeRTOS操作系统教程】第21章 FreeRTOS计数信号量
  20. artDialog打开一个页面,获取页面元素值

热门文章

  1. 21天学通java web 第二版pdf_21天学通JAVA WEB开发 pdf完全版_IT教程网
  2. linux内核实时补丁的实现,Canonical释出用于Ubuntu 18.04 LTS和16.04 LTS的新Linux内核实时补丁...
  3. 如何对SNP设计引物: CAPS, dCAPS
  4. 数学女孩儿中的数列问题
  5. java编写安卓计算器_Android计算器编写代码
  6. 简单的遗传算法java实例
  7. 离散数学 习题篇 —— 等价关系的计数
  8. 如何删除数据库SQL重复数据
  9. Quartus II 13.1与Modelsim SE的安装
  10. ora01017 linux,ORA-01017: invalid username/password; logon denied 解决办法