% (7,4)系统循环码编码、译码
clc;
clear all;
close all;
%=================编码================
n=7;k=4;r=n-k;
mx=input('请输入信息码字:m=\n'); %输入信息码字
gx=[1 0 1 1]; %循环码生成多项式
x_nk=[1,zeros(1,r)]; %x^(n-k),
messg=conv(x_nk,mx); %x^(n-k)*mx
[qx,rx0]=deconv(messg,gx); %模gx,qx为所得除式,rx0为余式
rx=mod(rx0,2); %将余式rx0转换为二进制
cx=messg+rx; %编码码字多项式
c=cx %输出编码码字
%=================绘图===================
fs=1000;ts=1/fs; %fs为一个单位内的样点
for i=1:n %以方波形式输出编码码字,一个单位内一个码字
for j=1:fs
cx_wave((i-1)*fs+j)=c(i);
end
end
t=0:ts:n-ts;
plot(t,cx_wave); %以方波形式输出编码码字
xlabel('时间');
ylabel('幅度');
title('(7,4)循环码编码输出波形');
axis([0 7 0 1.2]);
%==================译码====================
S=zeros(1,r); %初始化校验子
gx=[1 0 1 1]; %循环码生成多项式
Rx=input('请输入接收码字:R=\n');%接收码字多项式
% Rx=[1 0 1 0 1 1 1];
R=Rx; %接收码字
[nx,Sx0]=deconv(Rx,gx); %接收码字多项式除以gx,Sx0为余式(十进制)
Sx=mod(Sx0,2); %将Sx0转换为G(2)域下多项式
S=Sx(5:7); %Sx0最后3位为检验子
if S==[0 0 0] %校验子=0
disp('There is no wrong!'); %显示接收码字无错
E=[0 0 0 0 0 0 0]; %查表得出错误图样为0
C=R; %译码输出为接收码字
elseif S==[0 0 1] %接收码字第一位r0错
disp('r0 is wrong!'); %显示r0错
E=[0 0 0 0 0 0 1]; %查表得出错误图样
C=xor(R,E); %译码输出C=R+E
elseif S==[0 1 0] %r1错
disp('r1 is wrong!');
E=[0 0 0 0 0 1 0];
C=xor(R,E);
elseif S==[1 0 0] %r2错
disp('r2 is wrong!');
E=[0 0 0 0 1 0 0];
C=xor(R,E);
elseif S==[0 1 1] %r3错
disp('r3 is wrong!');
E=[0 0 0 1 0 0 0];
C=xor(R,E);
elseif S==[1 1 0] %r4错
disp('r4 is wrong!');
E=[0 0 1 0 0 0 0];
C=xor(R,E);
elseif S==[1 1 1] %r5错
disp('r5 is wrong!');
E=[0 1 0 0 0 0 0];
C=xor(R,E);
elseif S==[1 0 1] %r6错
disp('r6 is wrong!');
E=[1 0 0 0 0 0 0];
C=xor(R,E);
end
C %输出译码码字
评论0