📄 turbo_enc.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 + -