punc_conv.m

来自「The Viterbi algorithm」· M 代码 · 共 47 行

M
47
字号
% Mahdi Zahedi 5 June 2008
function U = punc_conv(data_in, constlen, codegen, puncpat)
% data_in = [0 1 0 0 1 0 0 1]; % the left bit enter first
% Rate = 2/3; constlen = [5 4]; codegen = [23 35 0; 0 5 13];
[No_in  No_out] = size(codegen);
[next_state,output] = trellisgen(constlen,codegen);
x = fliplr(constlen);
for p=1:No_in
    reg_N(p+1) = sum(x(1:p))-p;
end
n_tap = sum(constlen)-No_in;
reg = zeros(1,n_tap); state=1;
T = length(data_in)/No_in;     % Number of message bits to send through channel
for t = 1:T
    first = No_in*t-(No_in-1);
    last = No_in*t;
    symbol=data_in(last:-1:first);
    symbol_dec = bi2de(symbol)+1; mat=[];
    for k=1:No_in
        m = reg(reg_N(k)+1:reg_N(k+1));
        mm = bitshift(bi2de(m,'left-msb'),-1);
        mat_k = de2bi(mm,x(k)-1,'left-msb');
        mat_k(1) = symbol(k);
        mat = [mat mat_k];
    end
    reg = mat;
    state(t+1) = bi2de(reg,'left-msb')+1;
    w(t,:) = de2bi(output(state(t),symbol_dec), No_out, 'left-msb');
end  % Loop t=1:T
v = reshape(w', 1, size(w,1) * size(w,2));
%% Puncturing
j=1;k=0;
for i=1:length(v)
    if (j>length(puncpat))
        j=1;
    end
    if (puncpat(j) == 1)
        k = k+1;
        U(k) = v(i);
    end
    j = j+1;
end




⌨️ 快捷键说明

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