📄 main.m
字号:
clear
echo off
clc
n2=255; % 码长
k2=223; % 信息段长度
m=8; % 每个符号比特数
M=2^m;
w=16/m; % BUFFER的行数
sym_map=[1;(1+j)/sqrt(2);j;(-1+j)/sqrt(2);-1;(-1-j)/sqrt(2);-j;(1-j)/sqrt(2)];
N=20;
SNR=[7.6:0.2:8.4];
for L=1:length(SNR)
L
SNR1=SNR(L)
for pp=1:N %---------------------
pp
source=randint(w,k2,M); %生成w行k2列信息源
msg = gf(source,m); % 将多进制符号映射到伽逻华域
en_codeout=rsenc(msg,n2,k2); % 对多进制符号进行编码
hex_symbol=en_codeout.x; %将伽逻华域映射到多进制符号,hex_symbol相当于一个w×n2的buffer
interlace=hex_symbol(:)'; %交织
binary_code=deTObi(interlace,m); %将十进制化为二进制
temp=m*w*n2/16; %分成三组,temp为每组比特数,这里为8
u1=binary_code(1:temp); %第一组(8,1)码分到前temp比特
u2=binary_code((temp+1):(8*temp)); %第二组(8,7)码分到接下的7*temp比特
u3=binary_code((8*temp+1):(16*temp)); %第三组(8,8)码分到最后的8*temp比特
c1=encode_81(u1); %第一组(8,1)码编码
c2=encode_87(u2); %第二组(8,7)码编码
c3=u3; %第三组(8,8)码编码
c=c1+2*c2+4*c3; %形成BCM码并映射:逆时针方向0(000),1(100)
%2(010),3(110),4(001),5(101),6(011)
%,7(111)
symbol=exp(j.*pi./4.*c); %8PSK调制
%-加入高斯噪声
f=size(symbol);
EsNo=10^(SNR1/10);
Es=1;
No=Es/EsNo;
sigma=sqrt(No/2);
x=randn(f);
y=randn(f);
noise=sigma*(x+j*y);
channel_out=symbol+noise;
%channel_out=awgn(symbol,SNR1); %上面一小段可用这句代替
%f=(w*n2*m/16)*8; %计算C的长度,w行n2列每个m比特,每16比特一组,一组8个符号
%for i=1:f
%[min_error hard_decision(i)]=min(abs(channel_out(i)-sym_map));%寻找最近的点,硬判决
%end
hard_decision=soft_decision(channel_out); %软判决解调
f=(w*n2*m/16)*8;
%hard_decision=hard_decision-1; %将1-8的数字调整为0-7
viterbi_out=viterbi(hard_decision); %维特比译码
b_v_out=deTObi(viterbi_out,3); %译码输出转化为3比特二进制数
binary_viterbi_out=reshape(b_v_out,3,f); %形成3行的矩阵格式方便分组译码
u1_out=binary_viterbi_out(3,2); %第一帧(8,1)码解码
u2_out=binary_viterbi_out(2,1:7); %第一帧(8,7)码解码
for frame=1:(n2-1)
u1_out=[u1_out binary_viterbi_out(3,(frame*8+2))]; %(8,1)码解码
u2_out=[u2_out binary_viterbi_out(2,(frame*8+1):(frame*8+7))]; %(8,7)码解码
end
u3_out=binary_viterbi_out(1,:); %(8,8)码直接输出
binary_code_out=[u1_out u2_out u3_out];
hex_symbol_out=biTOde(binary_code_out,8); %转化为8比特的十进制数
re_interlace=reshape(hex_symbol_out,w,n2); %解交织※组成矩阵
[de_codeout,cnumerr] = rsdec(gf(re_interlace,m),n2,k2); %对多进制符号进行译码
receive=de_codeout.x; %将译码输出的码字进行合并成一串多进制符号
receive3=receive(:)';
source3=source(:)';
if pp==1
receive2=receive3;
source2=source3;
else
receive2=[receive2 receive3];
source2=[source2 source3];
end
end %--------------
errors=0;
for n=1:w*k2*N
if(receive2(n)~=source2(n))
errors=errors+1;
end
end
errors
SER(L)=errors/(w*k2*N)
end
figure(1);
semilogy(SNR,SER,'-ro')
title(['BER vs SNR' ])
xlabel('Es/No (dB)')
ylabel('BER')
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -