www.pudn.com > RS_BCM_255_223_4[1].Matlab.rar > main.m, change:2007-04-17,size:3902b


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')