(7,4)线性分组码matlab仿真(包含纠错部分代码)
2015-12-18 19:54
2151 查看
clc
clear all
%%%%%%%%生成初始序列%%%%%%%
SignNum = 100; %信息长度
genmat=[1 0 0 0 1 1 1;0 1 0 0 1 1 0;0 0 1 0 1 0 1;0 0 0 1 0 1 1];
Length = SignNum ; %原始码序列长度
OrigiSeq=(sign(randn(1,SignNum))+1)/2; %产生原始的0或1信息序列
%%%%%%%%hamming编码%%%%%
ConCode=encode (OrigiSeq,7,4,'linear',genmat); %线性分组码编码后序列
%%%%%BPSK调制%%%%%%%%
BPSKCode =pskmod(ConCode,2);
%%%%%%%定义信噪比%%%%%%%%%%%%
EbN0 =-5:8; %EbN0-dB
snr=10.^(EbN0./10); %转化为功率信噪比
error = zeros(1,10);
%%%%%%%%%%%%%信噪比循环接收统计误码率%%%%%%%%%%%%
for k = 1:length(EbN0)
for b=1:100;
%%%%%%%%%%%%%%加性高斯白噪声信道%%%%%%%%%%%
RecCode = awgn(BPSKCode,EbN0(k),'measured');
%%%%%%%%%%%%%%BPSK解调%%%%%%%%%%%%%%%
% BPSKdecode = BPSKDecode(RecCode, Length*7/4); %BPSK解调
BPSKdecode=pskdemod(RecCode,2); %%%%%%%上面的式子可以直接用自带pskdemod函数来解调,而不用调用函数%%%%%%%%%
%% 纠错部分
OrigiSeq2 =reshape(OrigiSeq,(SignNum)/4,4); %%原始bit信息重装成 25*4矩阵
SignNums=length(BPSKdecode);
BPSKdecode1=reshape((BPSKdecode)',7,(SignNums)/7); %%重装成 25*7矩阵
BPSKdecode1=(BPSKdecode1)';
BPSKdecode=jiucuo(OrigiSeq2,BPSKdecode1); %%%%%调用纠错函数
%%%% a:注意reshape函数的使用,按列读取,按列存储
%%%% b:BPSKdecode=jiucuo(OrigiSeq2,BPSKdecode1)中其实只需一个变量BPSKdecode1即可
%%
[g,h]=size(BPSKdecode); % g=1,h=175
%%%%%%%%%%%%%% linear码译码%%%%%%%%%%%%%%
Decoder=decode(BPSKdecode,7,4,'linear',genmat);
[m,n]=size(Decoder); % m=1,n=100
%%%%%%%统计误码率%%%%%%%%
[o,p]=size(OrigiSeq); %%% o=1,p=100
error(b) = sum(abs(Decoder-OrigiSeq))/Length;
end
%%%%%%%%%%%%%%计算平均误码率%%%%%%%%%%%%%
errorout(k)=mean(error,2);
end
errorout; %%%%%%%%和ber_theory比较数值大小
%%%%%%%%%%%%%计算理论误码率%%%%%%%%%%%%%
ber_theory=0.5*erfc(sqrt(snr)); %计算理论误比特率
ber_theory;
%%%%%%%%%%%%%绘制误码率曲线%%%%%%%%%%%%%%
figure
semilogy (EbN0,errorout,'b*-',EbN0,ber_theory,'rd-');
hold on
xlabel('Eb/N0(dB)');
ylabel('误比特率');
legend('加 linear code','理论值');
title('BPSK+linear误比特率曲线');
grid on; %%%%添加网格线
OrigiSeq=OrigiSeq(1:20)%提取前20个仿真结果
Decoder=Decoder(1:20)
figure
t=1:20;
subplot(211);stairs(t,OrigiSeq,'r');axis([1 20 -0.5 1.5]);title('编码前序列');%%%%%%%%%%%%%%%%%%%%%
subplot(212);stairs(t,Decoder,'b');axis([1 20 -0.5 1.5]);title('译码后序列');
function BPSKdecode=jiucuo(OrigiSeq2,BPSKdecode1)
%%编码过程
H=[1 1 1 0 1 0 0;1 1 0 1 0 1 0;1 0 1 1 0 0 1];
G=gen2par(H);
I=OrigiSeq2;
% I=[0 0 0 0;0 0 0 1;0 0 1 0;0 0 1 1;0 1 0 0;0 1 0 1;0 1 1 0;0 1 1 1
% 1 0 0 0;1 0 0 1;1 0 1 0;1 0 1 1;1 1 0 0;1 1 0 1;1 1 1 0;1 1 1 1];
C=rem(I*G,2);%%%原始序列编码后的码字 25*7矩阵
%%译码过程
RC=BPSKdecode1;
% 接收到的码字 ,,,如果第一行第一位出错,和最后一行最高位出错
% RC=[ 0 0 0 0 0 0 1
%
% 0 0 0 1 0 1 1
% 0 0 1 0 1 0 1
% 0 0 1 1 1 1 0
% 0 1 0 0 1 1 0
% 0 1 0 1 1 0 1
% 0 1 1 0 0 1 1
% 0 1 1 1 0 0 0
% 1 0 0 0 1 1 1
% 1 0 0 1 1 0 0
% 1 0 1 0 0 1 0
% 1 0 1 1 0 0 1
% 1 1 0 0 0 0 1
% 1 1 0 1 0 1 0
% 1 1 1 0 1 0 0
% 1 1 1 1 1 1 1
%
%
% 1 0 0 0 0 0 0]
E=[0 0 0 0 0 0 0;0 0 0 0 0 0 1;0 0 0 0 0 1 0;0 0 0 0 1 0 0;
0 0 0 1 0 0 0;0 0 1 0 0 0 0;0 1 0 0 0 0 0;1 0 0 0 0 0 0];
S=rem(E*H',2); %%% 8*3矩阵
[k,l]=size(S); %%% k=8
X=rem(RC*H',2);
[m,n]=size(RC); %%% m=25
for j=1:m
for i=1:k
if X(j,:)==S(i,:)
DC(j,:)=rem(RC(j,:)+E(i,:),2);
end
end
end
DC
%%%统计纠错后矩阵中的元素个数
[w,y]=size(DC);
z=w*y;
BPSKdecode=reshape((DC)',1,z);%%%注意DC先要转置,从而可以按一个个码字排列成一行
end
clear all
%%%%%%%%生成初始序列%%%%%%%
SignNum = 100; %信息长度
genmat=[1 0 0 0 1 1 1;0 1 0 0 1 1 0;0 0 1 0 1 0 1;0 0 0 1 0 1 1];
Length = SignNum ; %原始码序列长度
OrigiSeq=(sign(randn(1,SignNum))+1)/2; %产生原始的0或1信息序列
%%%%%%%%hamming编码%%%%%
ConCode=encode (OrigiSeq,7,4,'linear',genmat); %线性分组码编码后序列
%%%%%BPSK调制%%%%%%%%
BPSKCode =pskmod(ConCode,2);
%%%%%%%定义信噪比%%%%%%%%%%%%
EbN0 =-5:8; %EbN0-dB
snr=10.^(EbN0./10); %转化为功率信噪比
error = zeros(1,10);
%%%%%%%%%%%%%信噪比循环接收统计误码率%%%%%%%%%%%%
for k = 1:length(EbN0)
for b=1:100;
%%%%%%%%%%%%%%加性高斯白噪声信道%%%%%%%%%%%
RecCode = awgn(BPSKCode,EbN0(k),'measured');
%%%%%%%%%%%%%%BPSK解调%%%%%%%%%%%%%%%
% BPSKdecode = BPSKDecode(RecCode, Length*7/4); %BPSK解调
BPSKdecode=pskdemod(RecCode,2); %%%%%%%上面的式子可以直接用自带pskdemod函数来解调,而不用调用函数%%%%%%%%%
%% 纠错部分
OrigiSeq2 =reshape(OrigiSeq,(SignNum)/4,4); %%原始bit信息重装成 25*4矩阵
SignNums=length(BPSKdecode);
BPSKdecode1=reshape((BPSKdecode)',7,(SignNums)/7); %%重装成 25*7矩阵
BPSKdecode1=(BPSKdecode1)';
BPSKdecode=jiucuo(OrigiSeq2,BPSKdecode1); %%%%%调用纠错函数
%%%% a:注意reshape函数的使用,按列读取,按列存储
%%%% b:BPSKdecode=jiucuo(OrigiSeq2,BPSKdecode1)中其实只需一个变量BPSKdecode1即可
%%
[g,h]=size(BPSKdecode); % g=1,h=175
%%%%%%%%%%%%%% linear码译码%%%%%%%%%%%%%%
Decoder=decode(BPSKdecode,7,4,'linear',genmat);
[m,n]=size(Decoder); % m=1,n=100
%%%%%%%统计误码率%%%%%%%%
[o,p]=size(OrigiSeq); %%% o=1,p=100
error(b) = sum(abs(Decoder-OrigiSeq))/Length;
end
%%%%%%%%%%%%%%计算平均误码率%%%%%%%%%%%%%
errorout(k)=mean(error,2);
end
errorout; %%%%%%%%和ber_theory比较数值大小
%%%%%%%%%%%%%计算理论误码率%%%%%%%%%%%%%
ber_theory=0.5*erfc(sqrt(snr)); %计算理论误比特率
ber_theory;
%%%%%%%%%%%%%绘制误码率曲线%%%%%%%%%%%%%%
figure
semilogy (EbN0,errorout,'b*-',EbN0,ber_theory,'rd-');
hold on
xlabel('Eb/N0(dB)');
ylabel('误比特率');
legend('加 linear code','理论值');
title('BPSK+linear误比特率曲线');
grid on; %%%%添加网格线
OrigiSeq=OrigiSeq(1:20)%提取前20个仿真结果
Decoder=Decoder(1:20)
figure
t=1:20;
subplot(211);stairs(t,OrigiSeq,'r');axis([1 20 -0.5 1.5]);title('编码前序列');%%%%%%%%%%%%%%%%%%%%%
subplot(212);stairs(t,Decoder,'b');axis([1 20 -0.5 1.5]);title('译码后序列');
function BPSKdecode=jiucuo(OrigiSeq2,BPSKdecode1)
%%编码过程
H=[1 1 1 0 1 0 0;1 1 0 1 0 1 0;1 0 1 1 0 0 1];
G=gen2par(H);
I=OrigiSeq2;
% I=[0 0 0 0;0 0 0 1;0 0 1 0;0 0 1 1;0 1 0 0;0 1 0 1;0 1 1 0;0 1 1 1
% 1 0 0 0;1 0 0 1;1 0 1 0;1 0 1 1;1 1 0 0;1 1 0 1;1 1 1 0;1 1 1 1];
C=rem(I*G,2);%%%原始序列编码后的码字 25*7矩阵
%%译码过程
RC=BPSKdecode1;
% 接收到的码字 ,,,如果第一行第一位出错,和最后一行最高位出错
% RC=[ 0 0 0 0 0 0 1
%
% 0 0 0 1 0 1 1
% 0 0 1 0 1 0 1
% 0 0 1 1 1 1 0
% 0 1 0 0 1 1 0
% 0 1 0 1 1 0 1
% 0 1 1 0 0 1 1
% 0 1 1 1 0 0 0
% 1 0 0 0 1 1 1
% 1 0 0 1 1 0 0
% 1 0 1 0 0 1 0
% 1 0 1 1 0 0 1
% 1 1 0 0 0 0 1
% 1 1 0 1 0 1 0
% 1 1 1 0 1 0 0
% 1 1 1 1 1 1 1
%
%
% 1 0 0 0 0 0 0]
E=[0 0 0 0 0 0 0;0 0 0 0 0 0 1;0 0 0 0 0 1 0;0 0 0 0 1 0 0;
0 0 0 1 0 0 0;0 0 1 0 0 0 0;0 1 0 0 0 0 0;1 0 0 0 0 0 0];
S=rem(E*H',2); %%% 8*3矩阵
[k,l]=size(S); %%% k=8
X=rem(RC*H',2);
[m,n]=size(RC); %%% m=25
for j=1:m
for i=1:k
if X(j,:)==S(i,:)
DC(j,:)=rem(RC(j,:)+E(i,:),2);
end
end
end
DC
%%%统计纠错后矩阵中的元素个数
[w,y]=size(DC);
z=w*y;
BPSKdecode=reshape((DC)',1,z);%%%注意DC先要转置,从而可以按一个个码字排列成一行
end
相关文章推荐
- 解析在main函数之前调用函数以及对设计的作用详解
- java和matlab画多边形闭合折线图示例讲解
- C#调用Matlab生成的dll方法的详细说明
- 从java中调用matlab详细介绍
- 稀疏自动编码器 (Sparse Autoencoder)
- VC++与Matlab混合编程的快速实现
- Matlab 矩阵运算
- matlab与opencv部分函数的对照
- matlab神经网络工具箱创建神经网络
- Matlab
- MATLAB 入门教程
- matlab函数_连通区域
- MATLAB中函数模式和命令模式的区别
- MATLAB 添加自定义的模块到simulink库浏览器
- MATLAB for Mac使编辑器支持中文
- [转]matlab中plot用法
- 初学数模-MATLAB Quick Start! Part I
- 初学数模-MATLAB Quick Start! Part II
- matlab程序优化以及eclipse与github的结合
- matlab中的rand函数(用于产生随机数)