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

📄 turbo_enc.m

📁 turbo码的MATLAB编程
💻 M
字号:
function [outputs,inf_bits,varargout] = ...    turbo_enc(Data,Trellis,alpha_rsc,TerminateF,PunctureF,NEncoders, varargin);%------------------------------------------------------------------------------% Encode binary 1-D data vector with turbo codes.%% Format:% -------% Binary outputs:% [outputs,inf_bits] = turbo_enc(Data,Trellis,alpha_rsc,TerminateF,...%                                PunctureF,NEncoders)%% Turbo coded modulation, QPSK outputs:% [outputs,inf_bits,alpha_bit,ModMap] = turbo_enc(Data,Trellis,alpha_rsc,...%                                        TerminateF, PunctureF, NEncoders, ...%					'QPSK')%% % Author: MVe% Date:   05.07.2002%------------------------------------------------------------------------------if length(varargin)==1  cm_flag = 1;  cm_type = varargin{1};else  cm_flag = 0;end % if length(varargin)==1  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -- Initialise few parameters -- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%DLength = size(Data,2);% "Pointer" presentation of the input data.tmp = zeros(DLength/Trellis.k,1);Data_ptr = zeros(1,DLength/Trellis.k);tmp(:,1) = ...    bin2dec(reshape(char(Data(1,:)+48),Trellis.k,DLength/Trellis.k).')+1;Data_ptr = tmp.';% Extract most used variables from struct 'Trellis'output_tot = Trellis.Output_bin;output_parity = Trellis.Output_Parity_bin;nextstate = Trellis.NextState;n = Trellis.n;k = Trellis.k;% Initialise state of the trellis.state = 1;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -- First encoder (possible termination of trellis) -- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%for i1 = 1:length(Data_ptr)  % Output caused by transition (encoded bits)  outputs(1,(i1-1)*n+1:i1*n) = output_tot{state,Data_ptr(i1)};  % New state after the transition  state =  nextstate(state,Data_ptr(i1));end % for 1:length(Data)% -- Terminate trellis with tail bits (if required) -- %%%% Drive trellis to zero state:           %%%%   Tail bits == output of the feedback. %%%if TerminateF  for i1 = [1:Trellis.m] + i1    % Output caused by transition (encoded bits)    outputs(1,(i1-1)*n+1:i1*n) = Trellis.Tail_Output_bin{state};    % New state after the transition    state =  Trellis.Tail_NextState(state);  end % i1 = [1:Trellis.m] + i1end % if TerminateF% Separate parity and information (+tail) bitsinf_bits(1,:) = outputs(1,1:1/Trellis.Rate:end);tmp = reshape(outputs,1/Trellis.Rate, length(outputs)*Trellis.Rate);tmp = tmp(2:end,:);out_parity(1,:) = tmp(:).';%%%%%%%%%%%%%%%%%%%%%%%%%%%% -- Rest of the RCS's -- %%%%%%%%%%%%%%%%%%%%%%%%%%%%% Initialise state of the trellis.state = 1;for i1 = 1:NEncoders-1    % Interleaving between RSC's  rsc_input(1,:) = inf_bits(1,alpha_rsc(i1,:));  % -- Bin -> pointer -- %  tmp_size = size(rsc_input);    % "Pointer" presentation of the input data.  tmp = zeros(tmp_size(2)/k,tmp_size(1));  rsc_input_ptr = zeros(tmp_size(1),tmp_size(2)/k);  tmp(:,1) = bin2dec(reshape(char(rsc_input(1,:)+48), k,tmp_size(2)/k).')+1;  rsc_input_ptr = tmp.';    % -- Outputs (only parity bits are of interest) -- %  state = 1;  for i2 = 1:length(rsc_input_ptr)    % Output caused by transition (parity bits only)    index_ptr = [(i2-1)*(n-k)+1:i2*(n-k)];    out_parity(i1+1,index_ptr) = output_parity{state,rsc_input_ptr(i2)};    % New state after the transition    state = nextstate(state,rsc_input_ptr(i2));  end % for 1:length(rsc_input)  end % for i1 = 2:NEncoders%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -- Puncturing (only for turbo-codes)-- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%d_size = length(inf_bits);%% MODIFY !!!!!!!! %%%% -- Puncture to 1/2-rate code -- %%if PunctureF    %% NOTE!! Do better!! WORKS ONLY FOR 1/2-rate RSC's !!!  outputs = zeros(1,d_size*(1/Trellis.Rate));    % Information (+tail) bits  outputs(1:1/Trellis.Rate:end) = inf_bits;  % Parity bits  p_size = size(out_parity,1);  tmp = zeros(1,d_size*(1/Trellis.Rate)-length(inf_bits));  for i1 = 1:p_size    tmp(i1:p_size:end) = out_parity(i1,i1:p_size:end);  end % for i1 = 1:p_size    outputs(2:1/Trellis.Rate:end) = tmp;  else    outputs = zeros(1,d_size*(NEncoders+1));  % Information (+tail) bits  outputs(1:NEncoders+1:end) = inf_bits;  % Parity bits  p_size = size(out_parity,1);  for i1 = 1:p_size    outputs(i1+1:p_size+1:end) = out_parity(i1,:);  end % for i1 = 1:p_size    end % if PunctureFif cm_flag  switch cm_type   case 'QPSK'    L_out=length(outputs);        % Gray mapping    ModMap = [1+j, -1+j, 1-j, -1-j].';    M_bits = log2(length(ModMap));    % Bit level interleaving    [dummy,alpha_bit] = sort(rand(1,length(outputs)));    outputs = outputs(alpha_bit);        % "Pointer" presentation of the input data.    tmp = zeros(L_out/M_bits,1);    tmp(:,1) = ...        bin2dec(reshape(char(outputs(1,:)+48),M_bits,L_out/M_bits).')+1;    % Modulate output    outputs = ModMap(tmp).';    varargout{1} = alpha_bit;    varargout{2} = ModMap;   otherwise    error(sprintf('Coded modulation type %s for turbo-codes not supported', ...                  cm_type));      end % switch cm_type    end % if cm_flag

⌨️ 快捷键说明

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