clear;
clc;
tic
rs_k = 15; %msg byte length
rs_n = 31; %rs block length
m=5; %每个符号属于2^5扩域,可用5bit表示
I=8; %interweave depth
conv_k=1;
conv_n=2;
cons_len=7;
q_size = 3; %cov decode quantization width
tblen=35;
L=I*rs_k; %编码前的总长度
blockL=I*rs_n; %编码后的总长度
msg_l = m*L; %msg bit length
% 交织为8个帧
msg_byte=randi([0 rs_n],1,L);
msg_byte_itw=interweave(msg_byte,I,L);
gf_msg_byte_itw=gf(msg_byte_itw,m);
% 每个帧进行rs编码
gf_rscode=gf(zeros(I,rs_n),m);
for i=1:I
gf_rscode(i,:)=rsenc(gf_msg_byte_itw(i,:), rs_n, rs_k);
end
% 解交织为信息位在前,校验位在后的长码
rscode=double(gf_rscode.x);
msg_byte_enc=deinterweave(rscode,I,blockL);
% 每个符号扩为m比特,
msg_bit=zeros(blockL,m);
for i=1:blockL
a = dec2bin(msg_byte_enc(i),m) - '0';
msg_bit(i,:) = a;
end
% 矩阵化为行向量
msg_bit=msg_bit';
msg_bit=msg_bit(:);
msg_bit=msg_bit';
%*** cov_enc
msg_in=[msg_bit,msg_bit(1:tblen)]; % 受译码延迟影响,需要额外补充tblen个bit
right_channel_output=convolutional_encoder(msg_in);
%add noise
dB=0:0.2:4.8; % range of SNR values in dB2.2
SNRpbit=10.^(dB/10); % Eb/No conversion from dB to decimal
No_uncoded=1./SNRpbit; % since Eb=1
R=(conv_k/conv_n)*(rs_k/rs_n); % code rate
No=No_uncoded./R;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
maximum_blockerror=10;
max_simulation_symbol=2*1e8; % maximum simulation symbols
max_symbolerrors=100;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
symbolerrors=0;
blockerrors=0;
block=0;
SER=zeros(1,length(dB)); % array for Channel Error Rate
FER=zeros(1,length(dB));
block_array=zeros(1,length(dB));
en_msg=zeros(1,length(right_channel_output));
zb=zeros(1,length(en_msg));
zb2=zeros(1,length(en_msg));
zb=-2*right_channel_output+1; % BPSK modulation
result_cov_byte=zeros(1,blockL);
result_rs=zeros(I,rs_k);
gf_result_rs=gf(zeros(I,rs_k),m);
k_array = [];
error_block = [];
error = [];
for z=1:length(SNRpbit)
symbolerrors=0;
blockerrors=0;
block=0;
while((blockerrors<maximum_blockerror)&&(symbolerrors<max_symbolerrors)&&((block*msg_l)<max_simulation_symbol)) %while loop
block = block + 1;
% if mod(block,100)==0
% block
% end
sigma=sqrt(No(z)/2);
zb2=(zb + sigma*randn(size(zb))); %AWGN
%%for soft decode
[~,en_msg]=quantiz(zb2,[-1.5 -1.0 -0.5 0 0.5 1.0 1.5],7:-1:0);
result_cov_temp = convolutional_decoder(en_msg,tblen,q_size);
result_cov=result_cov_temp(tblen+1:end);
% bit to byte
result_cov_m=reshape(result_cov,[m,blockL]);
result_cov_m=result_cov_m'; % 每行为5个数字,代表5bit,表示一个GF(2^5)的元素
% 2进制->十进制,交织
for i = 1:blockL
B = result_cov_m(i,:);
result_cov_byte(i) = bin2dec(num2str(B));
end
result_cov_itw=interweave(result_cov_byte,I,blockL);
gf_result_cov_itw=gf(result_cov_itw,m);
% 译码
for i=1:I
gf_result_rs(i,:) = rsdec(gf_result_cov_itw(i,:),rs_n,rs_k);
end
% 解交织
result_rs=double(gf_result_rs.x);
result_rs_last=deinterweave(result_rs,I,L);
result_rs_d = double(result_rs_last(1:L));
% 十进制到二进制
result_rs_bit = zeros(L,m);
for i = 1:L
a = dec2bin(result_rs_d(i),m) - '0';
result_rs_bit(i,:) = a;
end
result_rs_bit = result_rs_bit';
result_rs_bit = result_rs_bit(:);
result_rs_bit = result_rs_bit';
l = length(find(result_rs_bit(1:msg_l)~=msg_bit(1:msg_l)));
symbolerrors = symbolerrors + l;
%symbolerrors
if l~=0
blockerrors=blockerrors+1;
end
if mod(block,5)==0
fprintf('\n SNR: %d',dB(z));
fprintf('\n simulation bits: %d',block*msg_l);
fprintf('\n symbolerrors: %d',symbolerrors);
fprintf('\n blockerrors: %d',blockerrors);
end
% fprintf('\n SNR: %d',dB(z));
% fprintf('\n simulation bits: %d',block*msg_l);
% fprintf('\n symbolerrors: %d',symbolerrors);
% fprintf('\n blockerrors: %d',blockerrors);
end
block_array(z)=block; %counting blocks per SNR point
SER(z)=symbolerrors/(block*msg_l);
FER(z)=blockerrors/block;
end
semilogy(dB,SER,'-o')
title('Bit Error Rate')
ylabel('BER')
xlabel('Eb/No (dB)')
grid
toc