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

📄 卷积码编程.txt

📁 matlab卷积码编译程序
💻 TXT
📖 第 1 页 / 共 2 页
字号:
    state_metric=state_metric(:,2:-1:1);     %移动state_metric,将临时值移为确定值
 end
 %开始尾部信道输出解码
 for i=depth_of_trellis-L+2:depth_of_trellis
    flag=zeros(1,number_of_states);
    %  状态数从number_of_states→number_of_states/2→...→2→1
    % 程序说明同上,只不过输入矢量只为0
    last_stop=number_of_states/(2^((i-depth_of_trellis+L-2)*k));
    for j=0:last_stop-1
       branch_metric=0;
       binary_output=deci2bin(output(j+1,1),n);
       for ll=1:n
          branch_metric=branch_metric+metric(channel_output_matrix(ll,i),binary_output(ll));
       end
       if((state_metric(nextstate(j+1,1)+1,2)state_metric(j+1,1)...
             +branch_metric)|flag(nextstate(j+1,1)+1)==0)
          state_metric(nextstate(j+1,1)+1,2)=state_metric(j+1,1)+branch_metric;
          survivor_state(nextstate(j+1,1)+1,i+1)=j;
          flag(nextstate(j+1,1)+1)=1;
       end
    end
    state_metric=state_metric(:,2:-1:1);
 end
 %   从最佳路径中产生解码
 %   译码过程可从数组survivor_state的最后一个位置向前逐级译码
 state_sequence=zeros(1,depth_of_trellis+1);
 %   survivor_state数组的最后的输出状态肯定是“0”
 state_sequence(1,depth_of_trellis)=survivor_state(1,depth_of_trellis+1);
 %   逐级译码过程
 for i=1:depth_of_trellis
    state_sequence(1,depth_of_trellis-i+1)=survivor_state((state_sequence(1,depth_of_trellis+2-i)...
       +1),depth_of_trellis-i+2);
 end
 decorder_output_matrix=zeros(k,depth_of_trellis-L+1);
 for i=1:depth_of_trellis-L+1
    %    根据数组input的定义来得出从当前状态到下一个状态的输入信号矢量
    dec_output_deci=input(state_sequence(1,i)+1,state_sequence(1,i+1)+1);
    %    转成二进制信号
    dec_output_bin=deci2bin(dec_output_deci,k);
    %    将一次译码存入译码输出矩阵decoder_output_matrix相应的位置
    decoder_output_matrix(:,i)=dec_output_bin(k:-1:1)';
 end
 %       按照一维序列形式重新组织输出
 decoder_output=reshape(decoder_output_matrix,1,k*(depth_of_trellis-L+1));
 %       state_metric为网格图最后一个列位置中“0”状态位置的汉明距
 %       离,这个值就是整个译码过程中的汉明距离。
 cumulated_metric=state_metric(1,1);
 %卷积码的维特比译码函数
  
 %nxt_stat.m 记录状态函数
 %       next_state用于记录下一个状态的值
 %       memory_contents用于记录
 function [next_state,memory_contents]=nxt_stat(current_state,input,L,k)
     %   将当前状态值(十进制)转成位数为k*(L-1)的二进制
 binary_state=deci2bin(current_state,k*(L-1));
     %   将输入状态值(十进制)转成位数为k的二进制序列
 binary_input=deci2bin(input,k);
     %   寄存器组的下一个状态值(二进制)
 next_state_binary=[binary_input,binary_state(1:(L-2)*k)];
     %   将寄存器组的下一个状态值(二进制)转成十进制
 next_state=bin2deci(next_state_binary);
     %   用memory_contents来记录各个寄存器在下一个状态下的信息(二进制)
     %   以便与生成矩阵相乘得出输出
 memory_contents=[binary_input,binary_state];
 %nxt_stat.m 记录状态函数
  
 function y=bin2deci(x)
 %bin2dec.m 二进制序列转换十进制数值函数
 %x 二进制序列
 %y 十进制数值
 li=length(x);
 y=(li-1:-1:0);
 y=2.^y;
 y=x*y';
 %bin2dec.m 二进制序列转换十进制数值函数
  
 function y=deci2bin(x,li)
 %dec2bin.m 十进制数值转换二进制序列函数
 y=zeros(1,li);
 i=1;
 while x=0&i=li
    y(i)=rem(x,2);
    x=(x-y(i))/2;
    i=i+1;
 end
 y=y(li:-1:1);
 % dec2bin.m十进制数值转换二进制序列函数
 function distance=metric(x,y)
 %metric.m 距离量度函数
 %被比较比特    x y
 %hamming距离 distance
 if x==y
    distance=0;
 else
    distance=1;
 end
 % metric.m距离量度函数
  
 function [p]=smldPe55_cnv(snr_in_dB)
 %smldPe55_cnv.m 二进制双极性(2,1,2)卷积码通信系统的蒙特卡罗仿真函数
 %snr_in_dB 信噪比
 %p 误码率
 E=1;
 SNR=exp(snr_in_dB*log(10)/10);%Eb/N0
 sgma=E/sqrt(2*SNR);
 N=16;
 loop=10^4/N;
 Ns=N*loop; %仿真序列长度10^4,运行时间约5分钟
 dsource=zeros(1,N);
 G=[1 0 1;1 1 1], %(2,1,2)卷积码编码矩阵
 k=1,
 output_convenc=convenc(G,k,dsource);
 channel_output=zeros(1,length(output_convenc));
 [decoder_output,survivor_state,cumulated_metric]=viterbi(G,k,channel_output);
 numoferr_cnv=0;
 for j=1:loop
    for i=1:N
       temp=rand;
       if (temp0.5)
       dsource(i)=0;
       else 
       dsource(i)=1;
       end
    end
 %length(dsource)
    output_convenc=convenc(G,k,dsource);
 %length(output_convenc)
    for i=1:length(output_convenc)
       if(output_convenc(i)==0)
       r=-E+gngauss(sgma);
       else
       r=E+gngauss(sgma);
       end
       if (r<0)
       channel_output(i)=0;
       else 
       channel_output(i)=1;
       end
    end
 [decoder_output,survivor_state,cumulated_metric]=viterbi(G,k,channel_output);
 %length(decoder_output),pause
    for i=1:length(dsource)
       if(decoder_output(i)~=dsource(i))
       numoferr_cnv=numoferr_cnv+1;
       end
    end
 end
 numoferr_cnv,
 p=numoferr_cnv/Ns;
 %smldPe55_cnv.m 二进制双极性(2,1,2)卷积码通信系统的蒙特卡罗仿真函数
  
 %ce55_cnv.m 二进制双极性(2,1,2)卷积码通信系统的蒙特卡罗仿真绘图
 %仿真序列长度10^4,运行时间约2小时
 echo on
 SNRindB1=0:16;
 SNRindB2=0:0.3:16;
 smld_err_prb=zeros(1,length(SNRindB1));
 smld_err_prb_cnv=zeros(1,length(SNRindB1));
 SNR=0;
 theo_err_prb=zeros(1,length(SNRindB2));
 for i=1:length(SNRindB1)
    smld_err_prb(i)=smldPe55(SNRindB1(i));
    smld_err_prb_cnv(i)=smldPe55_cnv(SNRindB1(i));
 end
 for  i=1:length(SNRindB2)
    SNR=exp(SNRindB2(i)*log(10)/10);
    theo_err_prb(i)=(1/2)*erfc(sqrt(2*SNR)/sqrt(2));
    %Qfunct y=(1/2)*erfc(x/sqrt(2));
    %theo_err_prb(i)=Qfunct(sqrt(2*SNR));
 end
 %绘图函数
 figure;
 semilogy(SNRindB1,smld_err_prb,'b*-');
 axis([0,16,1e-4,1]);
 xlabel('Eb/N0 in dB');
 ylabel('Pe');
 title('(2,1,2)卷积编码系统仿真结果与未编码系统的比较');
 hold on
 semilogy(SNRindB1,smld_err_prb_cnv,'ro-');
 semilogy(SNRindB2,theo_err_prb,'b:');
 %ce55_cnv.m 二进制双极性(2,1,2)卷积码通信系统的蒙特卡罗仿真绘图
 运行结果
 下图(ce55_cnv的运行结果)给出了不同信噪比条件下,发送100000比特的二进制双极性(2,1,2)卷积编码通信系统的蒙特卡罗仿真结果,以及未编码系统的仿真结果和未编码系统的理论值曲线。
 从下图的仿真结果可见,(2,1,2)卷积编码可以降低二进制双极性通信系统的误码率,从而提高通信的有效性。
 需要特别指出的是,仿真时每发送一个码组前后都会将卷积器清零,对此我们可以认为是系统在发送端为同步校准而插入比特0的操作,在接收端这些插入的0比特又会被系统自动去掉。因此从用户角度看,仿真序列并未改变,所得到的仿真误码率结果依然正确,只不过更准确地应该称之为用户误码率,而非系统误码率。
 为方便比较,下面将(2,1,2卷积编码系统仿真结果、(7,4)HAMMING编码系统仿真结果、未编码系统仿真结果和未编码系统的理论值曲线绘制在一起。
 由图可知,相同信噪比条件下,按照仿真结果误码率从高到低顺序依次为:未编码系统、(7,4)HAMMING编码系统、(2,1,2)卷积编码系统,从而可以得出(2,1,2)卷积编码纠错能力优于(7,4)HAMMING编码的结论,与理论结论相符。

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -