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

📄 soft_viterbi_siso_20.m

📁 A SISO 20M OFDM system based on IEEE802.11n standard, using Matlab.
💻 M
字号:
function dec_data = soft_viterbi_siso_20(input_data, Mode)

%----------------------------------------------------------------------
%         Viterbi Decoder (Soft Decision)
%
%       Mode    Data_rate    Coding_rate    BPSC    CBPS    DBPS
%        1         13(Mbps)     1/2          2       104      52
%        2       19.5           3/4          2       104      78
%        3         26           1/2          4       208     104
%        4         39           3/4          4       208     156
%        6       58.5           3/4          6       312     234
%        7         65           5/6          6       312     260
%
%       ex. coded_data = soft_viterbi_siso_20(input_data, Mode)
%----------------------------------------------------------------------
%enzan=0;
%enzan = enzan+1;
if Mode == 1
    DBPS = 52;
    temp_data = input_data;
elseif Mode == 2
    DBPS = 78;
    for l = 1:26
        temp_data((l-1)*6+1) = input_data((l-1)*4+1);
        temp_data((l-1)*6+2) = input_data((l-1)*4+2);
        temp_data((l-1)*6+3) = input_data((l-1)*4+3);
        temp_data((l-1)*6+4) = 0;
        temp_data((l-1)*6+5) = 0;
        temp_data((l-1)*6+6) = input_data((l-1)*4+4);
    end
elseif Mode == 3
    DBPS = 104;
    temp_data = input_data;
elseif Mode == 4
    DBPS = 156;
    for l = 1:52
        temp_data((l-1)*6+1) = input_data((l-1)*4+1);
        temp_data((l-1)*6+2) = input_data((l-1)*4+2);
        temp_data((l-1)*6+3) = input_data((l-1)*4+3);
        temp_data((l-1)*6+4) = 0;
        temp_data((l-1)*6+5) = 0;
        temp_data((l-1)*6+6) = input_data((l-1)*4+4);
    end
elseif Mode == 6
    DBPS = 234;
    for l = 1:78
        temp_data((l-1)*6+1) = input_data((l-1)*4+1);
        temp_data((l-1)*6+2) = input_data((l-1)*4+2);
        temp_data((l-1)*6+3) = input_data((l-1)*4+3);
        temp_data((l-1)*6+4) = 0;
        temp_data((l-1)*6+5) = 0;
        temp_data((l-1)*6+6) = input_data((l-1)*4+4);
    end
elseif Mode == 7
    DBPS = 260;
    for l = 1:52
        temp_data((l-1)*10+1) = input_data((l-1)*6+1);
        temp_data((l-1)*10+2) = input_data((l-1)*6+2);
        temp_data((l-1)*10+3) = input_data((l-1)*6+3);
        temp_data((l-1)*10+4) = 0;
        temp_data((l-1)*10+5) = 0;
        temp_data((l-1)*10+6) = input_data((l-1)*6+4);
        temp_data((l-1)*10+7) = input_data((l-1)*6+5);
        temp_data((l-1)*10+8) = 0;
        temp_data((l-1)*10+9) = 0;
        temp_data((l-1)*10+10) = input_data((l-1)*6+6);
    end    
end

%----------------------------------------------------------------------
%           婎弨抣偺惗惉
%----------------------------------------------------------------------
%0乣b傑偱偺2恑悢昞尰傪弌椡
for l=1:64
    temp0 = dec2bin(l-1, 6);       %惍悢10恑悢仺暥帤楍2恑悢
    for m=1:6
        bin(l, m)=str2num(temp0(m));     %暥帤楍2恑悢仺悢抣攝楍
    end
end

%婎弨抣偺弌椡
J=1;
for l=1:64
    temp1=[0, bin(l,:)];
    for m=1:7
        temp(m) = temp1(8-m);
    end
    bc(J,1)=xor(temp(1), xor(temp(2), xor(temp(4), xor(temp(5), temp(7)))));
    bc(J,2)=xor(temp(1), xor(temp(4), xor(temp(5), xor(temp(6), temp(7)))));
    J=J+1;
end

for l=1:64
    temp1=[1, bin(l,:)];
    for m=1:7
        temp(m) = temp1(8-m);
    end
    bc(J,1)=xor(temp(1), xor(temp(2), xor(temp(4), xor(temp(5), temp(7)))));
    bc(J,2)=xor(temp(1), xor(temp(4), xor(temp(5), xor(temp(6), temp(7)))));
    J=J+1;
end

%--------------------------------------------------------
%           Viterbi暅崋
%--------------------------------------------------------
PM_mem = zeros(64,2);
pm_set1 = 1;
pm_set2 = 2;

for I=1:DBPS
    J=1;
    L=1;
    
    if (Mode == 2 || Mode == 4 || Mode == 6) && rem(I+1, 3) == 0
        for H=1:64
            if (bc(J,1) == 0 && temp_data((I-1)*2+1) < 0) || (bc(J,1) == 1 && temp_data((I-1)*2+1) >= 0)
                bm1 = abs(temp_data((I-1)*2+1));
            else
                bm1 = -abs(temp_data((I-1)*2+1));
            end
            
            if (bc(J+1,1) == 0 && temp_data((I-1)*2+1) < 0) || (bc(J+1,1) == 1 && temp_data((I-1)*2+1) >= 0)
                bm2 = abs(temp_data((I-1)*2+1));
            else
                bm2 = -abs(temp_data((I-1)*2+1));
            end
            
            if PM_mem(L, pm_set1) + bm1 >= PM_mem(L+1, pm_set1) + bm2
                SV_mem(H, I) = 0;
                PM_mem(H, pm_set2) = PM_mem(L, pm_set1) + bm1;
            else
                SV_mem(H, I) = 1;
                PM_mem(H, pm_set2) = PM_mem(L+1, pm_set1) + bm2;
            end
            J=J+2;
            L=L+2;
            if L == 65
                L=1;
            end
        end
        
    elseif (Mode == 2 || Mode == 4 || Mode == 6) && rem(I, 3) == 0
        for H=1:64
            if (bc(J,2) == 0 && temp_data((I-1)*2+2) < 0) || (bc(J,2) == 1 && temp_data((I-1)*2+2) >= 0)
                bm1 = abs(temp_data((I-1)*2+2));
            else
                bm1 = -abs(temp_data((I-1)*2+2));
            end
            if (bc(J+1,2) == 0 && temp_data((I-1)*2+2) < 0) || (bc(J+1,2) == 1 && temp_data((I-1)*2+2) >= 0)
                bm2 = abs(temp_data((I-1)*2+2));
            else
                bm2 = -abs(temp_data((I-1)*2+2));
            end
        
            if PM_mem(L, pm_set1) + bm1 >= PM_mem(L+1, pm_set1) + bm2
                SV_mem(H, I) = 0;
                PM_mem(H, pm_set2) = PM_mem(L, pm_set1) + bm1;
            else
                SV_mem(H, I) = 1;
                PM_mem(H, pm_set2) = PM_mem(L+1, pm_set1) + bm2;
            end
            J=J+2;
            L=L+2;
            if L == 65
                L=1;
            end
        end
        
        %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    elseif Mode == 7 && (rem(I+3, 5) == 0 || rem(I+1, 5) == 0)
        for H=1:64
            if (bc(J,1) == 0 && temp_data((I-1)*2+1) < 0) || (bc(J,1) == 1 && temp_data((I-1)*2+1) >= 0)
                bm1 = abs(temp_data((I-1)*2+1));
            else
                bm1 = -abs(temp_data((I-1)*2+1));
            end
            
            if (bc(J+1,1) == 0 && temp_data((I-1)*2+1) < 0) || (bc(J+1,1) == 1 && temp_data((I-1)*2+1) >= 0)
                bm2 = abs(temp_data((I-1)*2+1));
            else
                bm2 = -abs(temp_data((I-1)*2+1));
            end
            
            if PM_mem(L, pm_set1) + bm1 >= PM_mem(L+1, pm_set1) + bm2
                SV_mem(H, I) = 0;
                PM_mem(H, pm_set2) = PM_mem(L, pm_set1) + bm1;
            else
                SV_mem(H, I) = 1;
                PM_mem(H, pm_set2) = PM_mem(L+1, pm_set1) + bm2;
            end
            J=J+2;
            L=L+2;
            if L == 65
                L=1;
            end
        end
        
    elseif Mode == 7 && (rem(I+2, 5) ==0 || rem(I, 5) == 0)
        for H=1:64
            if (bc(J,2) == 0 && temp_data((I-1)*2+2) < 0) || (bc(J,2) == 1 && temp_data((I-1)*2+2) >= 0)
                bm1 = abs(temp_data((I-1)*2+2));
            else
                bm1 = -abs(temp_data((I-1)*2+2));
            end
            if (bc(J+1,2) == 0 && temp_data((I-1)*2+2) < 0) || (bc(J+1,2) == 1 && temp_data((I-1)*2+2) >= 0)
                bm2 = abs(temp_data((I-1)*2+2));
            else
                bm2 = -abs(temp_data((I-1)*2+2));
            end
        
            if PM_mem(L, pm_set1) + bm1 >= PM_mem(L+1, pm_set1) + bm2
                SV_mem(H, I) = 0;
                PM_mem(H, pm_set2) = PM_mem(L, pm_set1) + bm1;
            else
                SV_mem(H, I) = 1;
                PM_mem(H, pm_set2) = PM_mem(L+1, pm_set1) + bm2;
            end
            J=J+2;
            L=L+2;
            if L == 65
                L=1;
            end
        end
        %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
        
    else
          for H=1:64
            if (bc(J,1) == 0 && temp_data((I-1)*2+1) < 0) || (bc(J,1) == 1 && temp_data((I-1)*2+1) >= 0)
                bm1 = abs(temp_data((I-1)*2+1));
            else
                bm1 = -abs(temp_data((I-1)*2+1));
            end
            if (bc(J,2) == 0 && temp_data((I-1)*2+2) < 0) || (bc(J,2) == 1 && temp_data((I-1)*2+2) >= 0)
                bm1 = bm1 + abs(temp_data((I-1)*2+2));
            else
                bm1 = bm1 - abs(temp_data((I-1)*2+2));
            end
            
            if (bc(J+1,1) == 0 && temp_data((I-1)*2+1) < 0) || (bc(J+1,1) == 1 && temp_data((I-1)*2+1) >= 0)
                bm2 = abs(temp_data((I-1)*2+1));
            else
                bm2 = -abs(temp_data((I-1)*2+1));
            end
            if (bc(J+1,2) == 0 && temp_data((I-1)*2+2) < 0) || (bc(J+1,2) == 1 && temp_data((I-1)*2+2) >= 0)
                bm2 = bm2 + abs(temp_data((I-1)*2+2));
            else
                bm2 = bm2 - abs(temp_data((I-1)*2+2));
            end
        
            if PM_mem(L, pm_set1) + bm1 >= PM_mem(L+1, pm_set1) + bm2
                SV_mem(H, I) = 0;
                PM_mem(H, pm_set2) = PM_mem(L, pm_set1) + bm1;
            else
                SV_mem(H, I) = 1;
                PM_mem(H, pm_set2) = PM_mem(L+1, pm_set1) + bm2;
            end
            J=J+2;
            L=L+2;
            if L == 65
                L=1;
            end
        end
    end
        
    if pm_set1 == 1
        pm_set1 = 2;
        pm_set2 = 1;
    else
        pm_set1 = 1;
        pm_set2 = 2;
    end
end

%Trace Back
add=1;
for number=DBPS:-1:1
    pdec_data(number)=SV_mem(add, number);
    if add<=32
        if SV_mem(add, number)==0
            add=(add*2)-1;
        elseif SV_mem(add, number)==1
            add=add*2;
        end
    elseif add>=33
        if SV_mem(add, number)==0
            add=((add-32)*2)-1;
        elseif SV_mem(add, number)==1
            add=(add-32)*2;
        end
    end
end
  
pdec_data=[pdec_data,0,0,0,0,0,0];

for I=7:DBPS+6
    dec_data(I-6) = pdec_data(I);
end

⌨️ 快捷键说明

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