资源简介
是关于(8,4,4)汉明扩展码的程序,已经调通。算法复杂度适中,亲测可用!!!
代码片段和文件信息
%(844)扩展码硬判决+软判决+spa
clc
clear
Eb_N0dB=0:1:10;
Eb_N0=10.^(0.1*Eb_N0dB);
Es_N0=(1/2).*Eb_N0;%将Eb_N0转化为Es_N0
trip=5000;
zero_matrix=[0 0 0 0];
information=zeros(164);
n=8;k=4;
G=[1 0 0 0 1 0 1 1;0 1 0 0 1 1 1 0;0 0 1 0 0 1 1 1; 0 0 0 1 1 1 0 1];
H=[1 1 0 1 1 0 0 0;0 1 1 1 0 1 0 0;1 1 1 0 0 0 1 0;1 0 1 1 0 0 0 1];
%产生所有可能信息位和所有可能码字
for i=1:16
information(i:)=de2bi(i-14‘left-msb‘);
end
codebook=rem(information*G2);
%产生信息位+编码+调制+硬判决+软判决
%msg1是一个M*k个随机产生的信息位
msg1=randint(trip*k1);
%将msg1变成矩阵的形式,每行含有k个信息位
msg2=vec2mat(msg1k);
%对信息序列进行编码
code2=rem(msg2*G2);
%对信息序列进行BPSK调制
bp_code2=2*code2-1;
%加入高斯白噪声,并采用硬判决译码
for i=1:1:length(Eb_N0dB);
noise_aver=0;noise_sigma=sqrt(1/(2* Es_N0(i)));
noise2=normrnd(noise_avernoise_sigmasize(bp_code2));
noise_code2=bp_code2+noise2;
for j=1:trip
for k=1:n
if noise_code2(jk)>0de_code2(jk)=1;
else de_code2(jk)=0;
end
end
end
for j=1:trip
error=[0 0 0 0 0 0 0 0];
if(de_code2(j:)*(H‘)==zero_matrix)tr_code(j:)=de_code2(j:);
else
S=rem((de_code2(j:)*(H‘))2);%caculate the 校正子
S_DE=bi2de(S);
H_de=bi2de(H‘);
index1=find(H_de==S_DE);
if(index1)%计算错误图样
error(index1)=1;
end
tr_code(j:)=rem(de_code2(j:)+error2);%,
end
end
for a=1:1:trip;
for b=1:4;
tr_info(ab)=tr_code(ab);
end
end
[number(i)ratio(i)]=biterr(tr_infomsg2);
end
semilogy(Eb_N0dBratio‘b-‘);
hold on;
grid on;
%软判决译码,采用最大似然译码准则译码;
for i=1:1:length(Eb_N0dB);
noise_aver=0;noise_sigma=sqrt(1/(2* Es_N0(i)));
noise2=normrnd(noise_avernoise_sigmasize(bp_code2));
noise_code2=bp_code2+noise2;
%对接收到的软序列,进行最大似然译码(等效于最小距离译码);
for j=1:1:trip
w=noise_code2(j:)‘;
product=codebook*w;
index2=find(product==max(product));
tr_code(j:)=codebook(index2:);
end
for a=1:1:trip
for b=1:4
tr_info2(ab)=tr_code(ab);
end
end
[number(i)ratio(i)]=biterr(tr_info2msg2);
end
semilogy(Eb_N0dBratio‘k-o‘);
hold on;
%和积算法(SPA),迭代30次
m=4;
for i=1:1:length(Eb_N0dB);
noise_aver=0;noise_sigma=sqrt(1/(2* Es_N0(i)));sigma2=noise_sigma*noise_sigma;
noise2=normrnd(noise_avernoise_sigmasize(bp_code2));
noise_code2=bp_code2+noise2;
%转换成接收序列的先验概率信息,p_zero()为每一位取0的概率;
for j=1:1:trip;
for l=1:1:n;
p_zero(jl)=1/(1+exp(2*noise_code2(jl)/sigma2));
p_one(jl)=1/(1+exp(-2*noise_code2(jl)/sigma2));
end
end
%以7个信息位为一个单位,分别对M*7个码组依次进行迭代译码;
for j=1:1:trip;%共M行7位的信息组
Imax=1;%最大迭代次数初始化;
for a=1:1:m;
for b=1:1:n;%第一次迭代,变量节点到校验节点传递的信息
if H(ab)==0q_zero(ab)=0;q_one(ab)=0;%初始化;
else q_zero(ab)=p_zero(jb);q_one
- 上一篇:OFDM迭代注水算法
- 下一篇:matlab级联STATCOM仿真
评论
共有 条评论