%%广西师范大学通信工程廖庆钧源码
clc;clear all;close all;
tic
%L=4 成功
%{
%256biter的位置配置,每行30
situation = [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ...
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 ...
0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 ...
0 1 0 1 1 1 0 0 0 0 0 0 0 1 0 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 ...
1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 ...
1 1 0 1 1 1 1 1 1 1 0 0 0 1 0 1 1 1 0 1 1 1 1 1 1 1 0 1 1 1 ...
1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 1 0 1 1 1 0 1 1 1 1 1 1 1 1 1 ...
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 ...
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1];
%}
%1024biter的位置配置,每行62
situation = [
%1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ...
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ...
0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ...
0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 1 0 0 0 1 0 1 1 1 ...
0 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ...
...
0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 1 1 1 0 0 0 0 0 0 0 1 0 0 0 1 0 1 1 1 0 0 1 1 ...
1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 1 1 1 1 1 0 0 0 0 0 0 1 1 0 1 1 1 1 1 1 1 0 1 ...
1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 1 0 1 1 1 0 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 ...
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ...
0 1 0 0 0 0 0 0 0 1 0 0 0 1 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 1 1 1 1 1 1 1 0 0 0 0 0 1 1 1 0 1 1 1 ...
...
1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 1 0 1 1 1 0 1 1 1 1 1 1 1 0 0 0 1 0 1 1 1 0 1 ...
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 ...
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 1 0 0 0 1 0 1 1 1 0 0 0 1 0 1 1 1 1 1 1 1 1 1 1 1 0 0 1 1 1 1 ...
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 ...
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 ...
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 ...
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1];
Code_number = 1000;%码块数
error_block = 0;%误码块
variance = 0.468651637666584;%方差
%variance = [0.882775230578565,0.833393557743508,0.786774252414380,0.742762790173522,0.701213290563792,0.661988033552990,0.624957003046831,0.589997455937416,0.556993515258742,0.525835786100745,0.496420993008766,0.468651637666584];
%[0.75 1 1.25 1.5 1.75 2 2.25 2.5 2.75 3 3.25 3.5];%y为信噪比
BER = ones(1,Code_number);%误比特率,先分配好空间大小
for n = 1:Code_number%这个for函数用来求误码块率的
%%%%%%随机比特序列%%%%%%%%%%%%%%%%%%%%%%%%%%
N = 1024;
K = 512;
L = 4;
random_data = rand(1,K-24);%产生K-24比特的随机序列
partition1 = 0.5;%对random_data进行量化
codebook1 = [0,1];
[index,random_data_out] = quantiz(random_data,partition1,codebook1); %输出随机序列
%fid = fopen('random_data_out.txt','wt');%打印输出到random_data_out.txt文件
%fprintf(fid,'%x\n',random_data_out);%为什么这里总是返回一个值呢 ans
%fclose(fid);
%{
fid = fopen('random_data_out.txt','r');%读random_data_out.txt文件
random_data_out = fscanf(fid, '%x', 488);
fclose(fid);
random_data_out = random_data_out';
%}
%%%%%%添加CRC比特%%%%%%%%%%%%%%%%%%%%%%%%%%
Message = random_data_out;%将随机序列作为信息比特
Message(1,K) = 0;%将信息多项式左移24位
Generate = [1,1,0,0,0,0,1,1,0,0,1,0,0,1,1,0,0,1,1,1,1,1,0,1,1];%25位生成多项式
pointer = 25;%位置地址
Compare = Message(1:pointer);%先将Message中的前25比特放到比较的向量中
while pointer<=K
Compare = xor(Generate,Compare);%进行异或运算
index1 = find(Compare);%获取数值不为零的地址
if isempty(index1) %如果index3为空
if (pointer+25)<=K
Compare(1:25) = Message((pointer+1):(pointer+25));
pointer = pointer+25;
else
break
end
else
switch index1(1)%获取第一个数值不为零的地址
case 2%如果第一个不为零数值在地址2则把Compare向前移1位,再把移位后的空位用Message中的值补上
if (pointer+1)<=K%if语句用来跳出循环
Compare(1:24) = Compare(2:25);
Compare(25) = Message(pointer+1);
pointer = pointer+1;%地址加一
else
break
end
case 3
if (pointer+2)<=K
Compare(1:23) = Compare(3:25);
Compare(24:25) = Message((pointer+1):(pointer+2));
pointer = pointer+2;
else
break
end
case 4
if (pointer+3)<=K
Compare(1:22) = Compare(4:25);
Compare(23:25) = Message((pointer+1):(pointer+3));
pointer = pointer+3;
else
break
end
case 5
if (pointer+4)<=K
Compare(1:21) = Compare(5:25);
Compare(22:25) = Message((pointer+1):(pointer+4));
pointer = pointer+4;
else
break
end
case 6
if (pointer+5)<=K
Compare(1:20) = Compare(6:25);
Compare(21:25) = Message((pointer+1):(pointer+5));
pointer = pointer+5;
else
break
end
case 7
if (pointer+6)<=K
Compare(1:19) = Compare(7:25);
Compare(20:25) = Message((pointer+1):(pointer+6));
pointer = pointer+6;
else
break
end
case 8
if (pointer+7)<=K
Compare(1:18) = Compare(8:25);
Compare(19:25) = Message((pointer+1):(pointer+7));
pointer = pointer+7;
else
break
end
case 9
if (pointer+8)<=K
Compare(1:17) = Compare(9:25);
Compare(18:25) = Message((pointer+1):(pointer+8));
pointer = pointer+8;
else
break
end
case 10
if (pointer+9)<=K
Compare(1:16) = Compare(10:25);
Compare(17:25) = Message((pointer+1):(pointer+9));
pointer = pointer+9;
else
break
end
case 11