⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.m

📁 RS编解码的Matlab源代码
💻 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 + -