RS码编译matlab仿真2
虽然跑出来了,但没有完全跑出来.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相关推荐
- 数字双向码的matlab仿真,数字双相码的仿真 文字版.pdf
通信原理上机实验报告 年级: 姓名: 学号: 时间: 数字双相码的仿真 一.实验目的 1.熟悉MATLAB软件的工作环境 2.熟练掌握数字双相码的MATLAB仿真 3.熟练掌握数字双相码的Simuli ...
- matlab画极化码,极化码的matlab仿真(1)——参数设置
根据老师的安排,对于极化码的了解从仿真开始. 仿真的手段有很多种.可以利用C,C++,matlab等进行仿真的实现.其中matlab由于具有强大的函数库,和壮观的矩阵运算能力,被(我们老师课题组)看中 ...
- 数字双向码的matlab仿真,matlab2016 ccs
(s 简称 CCSLink)提供了 MATLAB.TI DSP 集成开发环 境(CCS)和硬件 DSP 的双向连接,允许开发者在 MATLAB 的 环境下就可以完成对 CCS 和硬件目标 DSP 的操 ...
- 极化码的matlab仿真(2)——编码
第二篇我们来介绍一下极化码的编码. 首先为了方便进行编码,我们需要进行数组的定义 signal = randi([0,1],1,ST); %信息位比特,随机二进制数 frozen = zeros(1, ...
- 通信使用matlab三元码实验报告,Matlab仿真DSBSC信号与双极性不归零码通信原理实验报告二实验...
Matlab仿真DSBSC信号与双极性不归零码通信原理实验报告二实验 Matlab 仿真 DSB-SC 信号与双极性不归零码通信原理实验报告二实验题目:Matlab 仿真 DSB-SC 信号与双极性不 ...
- 差动双相码matlab仿真,数字双相码的仿真.docx
数字双相码的仿真 通信原理上机实验报告年级:姓名:学号:时间:数字双相码的仿真一.实验目的1.熟悉MATLAB软件的工作环境2.熟练掌握数字双相码的MATLAB仿真3.熟练掌握数字双相码的Simuli ...
- matlab计算abc三相短路电流_手把手教你做FOC电机控制MATLAB仿真
一.整体结构及功能介绍用MATLAB2013以上版本打开文件,看到如图所示界面:可以看到仿真最外层由四个模块组成,电源模块(红色方框),电机与控制模块(蓝色方框),控制信号给定模块(黄色方框),信号分 ...
- RS编码译码误码率性能matlab仿真
目录 1.算法描述 2.仿真效果预览 3.MATLAB部分代码预览 4.完整MATLAB程序 1.算法描述 纠错编码技术在卫星通信.移动通信及数字存储等领域已获得了广泛的应用.RS码作为其中最重要的码 ...
- 【RS码2】RS码的BM迭代译码原理详解及MATLAB实现(不使用MATLAB库函数-代码见CSDN同名资源)
关注公号[逆向通信猿]更精彩!!! 理论基础 订阅<信道编码>专栏,首先查阅各子程序的详解 [有限域生成]本原多项式生成有限域的原理及MATLAB实现 [有限域除法]二元多项式除法电路原理 ...
- 【RS码1】系统RS码编码原理及MATLAB实现(不使用MATLAB库函数)
关注公号[逆向通信猿]更精彩!!! 基础知识 要想搞懂本节知识,需要先熟悉掌握以下前几篇博客 [多元域乘法]多项式乘法电路原理及MATLAB详解 [多元域除法]多项式除法电路原理及MATLAB详解 R ...
最新文章
- 网络工程师常用英文简写
- mpvue微信小程序动画_mpvue微信小程序系列
- Java8新特性学习_001_(Lambda表达式,函数式接口,方法引用,Stream类,Optional类)
- php 怎么输入php ini,PHP怎么找到php.ini配置文件?-php教程
- 《Android 源码设计模式解析与实战》— Android 书籍
- 超详细,手把手 教你 SQLyog 安装教程
- mysql多表条件查询_mysql 多表 多个条件 查询
- DataStructuresAndAlgorithm--字谜游戏
- Robin广场舞案例实践分析之深入思考
- java校验中文姓名合法性(需要支持生僻字与分隔符·)
- 0640与6130的区别_达人评测熊猫6143收音机与6130有区别没有?使用哪个好?使用四周后体验分享...
- 如何把视频或者音频转成文字
- facenet 人脸识别库的搭建和使用方法(二)
- Windows 解决端口占用
- Potplay视频播放画面扭曲
- java 内存读写文件_Java的文件读写操作
- 数据结构与算法之多路查找树(2-3树、2-3-4树、B树、B+树)
- 培训网站比较-CSDN-51CTO-慕课网
- xsemaphoretake返回_【FreeRTOS操作系统教程】第21章 FreeRTOS计数信号量
- artDialog打开一个页面,获取页面元素值
热门文章
- 21天学通java web 第二版pdf_21天学通JAVA WEB开发 pdf完全版_IT教程网
- linux内核实时补丁的实现,Canonical释出用于Ubuntu 18.04 LTS和16.04 LTS的新Linux内核实时补丁...
- 如何对SNP设计引物: CAPS, dCAPS
- 数学女孩儿中的数列问题
- java编写安卓计算器_Android计算器编写代码
- 简单的遗传算法java实例
- 离散数学 习题篇 —— 等价关系的计数
- 如何删除数据库SQL重复数据
- Quartus II 13.1与Modelsim SE的安装
- ora01017 linux,ORA-01017: invalid username/password; logon denied 解决办法