soft_demap_siso_20.m

来自「A SISO 20M OFDM system based on IEEE802.」· M 代码 · 共 141 行

M
141
字号
function dout = soft_demap_siso_20(din, Mode)

switch Mode
    case 1
        CBPS = 104;
    case 2
        CBPS = 104;
    case 3
        CBPS = 208;
    case 4
        CBPS = 208;
    case 6
        CBPS = 312;
    case 7
        CBPS = 312;
end

dout = zeros(1,CBPS);

re_din = real(din);
im_din = imag(din);

if Mode == 1 || Mode == 2
    J=1;
    for I=1:52
        temp_leng0 = (re_din(I) + 0.707)^2;
        temp_leng1 = (re_din(I) - 0.707)^2;
        dout(J) = temp_leng0 - temp_leng1;
        
        temp_leng0 = (im_din(I) + 0.707)^2; 
        temp_leng1 = (im_din(I) - 0.707)^2;
        dout(J+1) = temp_leng0 - temp_leng1;
        J = J+2;
    end
elseif Mode == 3 || Mode == 4
    J=1;
    for I=1:52
     J=1;
    for I=1:52
        if re_din(I) < -0.6325
            i_const0 = [-0.949, -0.949];
            i_const1 = [0.316, -0.316];
        elseif -0.6325 <= re_din(I) && re_din(I) < 0
            i_const0 = [-0.316, -0.949];
            i_const1 = [0.316, -0.316];
        elseif 0 <= re_din(I) && re_din(I) < 0.6325
            i_const0 = [-0.316, 0.949];
            i_const1 = [0.316, 0.316];
        elseif 0.6325 <= re_din(I)
            i_const0 = [-0.316, 0.949];
            i_const1 = [0.949, 0.316];
        end

        if im_din(I) < -0.6325
            q_const0 = [-0.949, -0.949];
            q_const1 = [0.316, -0.316];
        elseif -0.6325 <= im_din(I) && im_din(I) < 0
            q_const0 = [-0.316, -0.949];
            q_const1 = [0.316, -0.316];
        elseif 0 <= im_din(I) && im_din(I) < 0.6325
            q_const0 = [-0.316, 0.949];
            q_const1 = [0.316, 0.316];
        elseif 0.6325 <= im_din(I)
            q_const0 = [-0.316, 0.949];
            q_const1 = [0.949, 0.316];
        end
        dout((I-1)*4+1:(I-1)*4+2) = (re_din(I) - i_const0).^2 - (re_din(I) - i_const1).^2;
        dout((I-1)*4+3:(I-1)*4+4) = (im_din(I) - q_const0).^2 - (im_din(I) - q_const1).^2;
    end

    end
elseif Mode == 6 || Mode == 7
    for I=1:52
        if re_din(I) < -0.925
            i_const0 = [-1.078, -1.078, -1.078];
            i_const1 = [0.154, -0.463, -0.772];
        elseif -0.925 <= re_din(I) && re_din(I) < -0.6175
            i_const0 = [-0.772, -0.772, -1.078];
            i_const1 = [0.154, -0.463, -0.772];
        elseif -0.6175 <= re_din(I) && re_din(I) < -0.3085
            i_const0 = [-0.463, -0.772, -0.154];
            i_const1 = [0.154, -0.463, -0.463];
        elseif -0.3085 <= re_din(I) && re_din(I) < 0
            i_const0 = [-0.154, -0.772, -0.154];
            i_const1 = [0.154, -0.154, -0.463];
        elseif 0 <= re_din(I) && re_din(I) < 0.3085
            i_const0 = [-0.154, 0.772, 0.154];
            i_const1 = [0.154, 0.154, 0.463];
        elseif 0.3085 <= re_din(I) && re_din(I) < 0.6175
            i_const0 = [-0.154, 0.772, 0.154];
            i_const1 = [0.463, 0.463, 0.463];
        elseif 0.6175 <= re_din(I) && re_din(I) < 0.925
            i_const0 = [-0.154, 0.772, 1.078];
            i_const1 = [0.772, 0.463, 0.772];
        elseif 0.925 <= re_din(I) 
            i_const0 = [-0.154, 1.078, 1.078];
            i_const1 = [1.078, 0.463, 0.772];
        end

        if im_din(I) < -0.925
            q_const0 = [-1.078, -1.078, -1.078];
            q_const1 = [0.154, -0.463, -0.772];
        elseif -0.925 <= im_din(I) && im_din(I) < -0.6175
            q_const0 = [-0.772, -0.772, -1.078];
            q_const1 = [0.154, -0.463, -0.772];
        elseif -0.6175 <= im_din(I) && im_din(I) < -0.3085
            q_const0 = [-0.463, -0.772, -0.154];
            q_const1 = [0.154, -0.463, -0.463];
        elseif -0.3085 <= im_din(I) && im_din(I) < 0
            q_const0 = [-0.154, -0.772, -0.154];
            q_const1 = [0.154, -0.154, -0.463];
        elseif 0 <= im_din(I) && im_din(I) < 0.3085
            q_const0 = [-0.154, 0.772, 0.154];
            q_const1 = [0.154, 0.154, 0.463];
        elseif 0.3085 <= im_din(I) && im_din(I) < 0.6175
            q_const0 = [-0.154, 0.772, 0.154];
            q_const1 = [0.463, 0.463, 0.463];
        elseif 0.6175 <= im_din(I) && im_din(I) < 0.925
            q_const0 = [-0.154, 0.772, 1.078];
            q_const1 = [0.772, 0.463, 0.772];
        elseif 0.925 <= im_din(I) 
            q_const0 = [-0.154, 1.078, 1.078];
            q_const1 = [1.078, 0.463, 0.772];
        end
        dout((I-1)*6+1:(I-1)*6+3) = (re_din(I) - i_const0).^2 - (re_din(I) - i_const1).^2;
        dout((I-1)*6+4:(I-1)*6+6) = (im_din(I) - q_const0).^2 - (im_din(I) - q_const1).^2;
     end

 end
 
 for I=1:CBPS
     if abs(dout(I)) >= 0 && abs(dout(I)) < 0.2382
        dout(I) = dout(I)/4;
    elseif abs(dout(I)) >= 0.2382 && abs(dout(I)) < 0.6193
        dout(I) = dout(I)/16;
    elseif abs(dout(I)) >= 0.6193 && abs(dout(I)) < 1.1909
        dout(I) = dout(I)/36;
    elseif abs(dout(I)) >= 1.1909
        dout(I) = dout(I)/64;
    end
end

⌨️ 快捷键说明

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