比特翻转译码2

tic
clc
clear all
count=10000;  %测试次数,可自己选择
%初始化
load('H.mat');
load('G.mat');
for SNR=1:6

    total_err=0;  %错误比特数初始化为0
    for loop=1:count
        x = randi([0,1],1,1024);
        x_send=mod(x*G,2);     %编码
        x_bpsk=2*x_send-1;    %BPSK调制
        re_y=awgn(x_bpsk,SNR,'measured');    %进入高斯信道
        max_ite=20;      %最大迭代次数,可自己选择
        [row,col]=size(H);
        iteration=0;  
        hard=0.5*(sign(re_y)+1);
        y_re = hard;
        syn = mod(y_re*H',2);          % 计算伴随式(校正子)syn
        while (sum(syn) ~= 0) & (iteration < max_ite)   %循环条件syn=0 或达到最大迭代次数
            iteration = iteration + 1;
            
            %Step 2.  计算每一比特参与校正子为1的方程的个数fn
            fn=zeros(1,1);
            for i = 1:col
                fn(i) = syn*H(:,i);
            end
            
            % Step 3:  找到不满足校验方程个数最多的码字的位置,并将其标记
            [ma,index]=max(fn);
            
            % Step 4:  比特翻转
            y_re(index)=not(y_re(index)); %将不满足校验方程个数最多的码字进行翻转
            syn = mod(y_re*H',2);  % 重新计算伴随式syn
            
        end % while
        u = y_re;  %译码结果给u
        newerr=length(find(x_send~=u)); %统计测试一次的误比特数
        total_err=total_err+newerr;  %统计总的误比特数
        
        loop
        
    end
    
     errratio(SNR)=total_err/(length(u)*count);
    %errratio=total_err/(length(u)*count)
 end
toc
semilogy(1:6,errratio,'-b*');  %画图
 xlabel('SNR/dB')
ylabel('误比特率')
legend('BF译码')
title('二元准循环ldpc')
axis([1 10 10^-5 10^0])
grid on

猜你喜欢

转载自blog.csdn.net/sinat_38151275/article/details/79985460