📄 trellis_encoder.m
字号:
function [outputs,alpha_channel,varargout] = ... trellis_encoder(Data,Trellis,Lut,TerminateF,varargin);%------------------------------------------------------------------------------% Encode binary 1-D data vector with convolution / turbo codes.%% Format:% -------%% Convolution codes:% [outputs,alpha_channel]= trellis_encoder(Data, Trellis, Lut, TerminateF, ...% ['convolution'], [enc_type])%% Trellis coded modulation (QPSK only):% [Data_coded,alpha_channel,ModMap] = ...% trellis_encoder(Data,Trellis,Lut,TerminateF, 'tcm', enc_type)%% Turbo codes (binary output):% [outputs,alpha_channel,alpha_rsc,NEncoders] = ...% trellis_encoder(Data, Trellis, Lut, TerminateF, ...% 'turbo', [PunctureF], [number of RSC's])% % Turbo coded modulation (QPSK output):% [outputs,alpha_channel,alpha_rsc,NEncoders,alpha_bit,ModMap] = ...% trellis_encoder(Data, Trellis, Lut, TerminateF, ...% 'turbocm', [PunctureF], [number of RSC's])% % Author: MVe% Date: 05.07.2002%------------------------------------------------------------------------------%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -- Initial parameter checking etc.. -- %% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Check if the function call format is correct and extract% additional parameter(s) if necessary.tmp1 = length(varargin);% If additional arguments are givenif tmp1>0 switch tmp1 % Convolution or turbo with no number of RSC's given case 1 encoder_name = varargin{1}; if or(strcmp(encoder_name, 'turbo'), strcmp(encoder_name, 'turbo')) NEncoders = 2; PunctureF = 0; else enc_type = Trellis.EncType; %if TerminateF % enc_type = 'recursive'; %else % enc_type = 'non-recursive'; %end % if TerminateF end % if strcmp(encoder_name,'turbo') % Turbo or convolution case 2 encoder_name = varargin{1}; if or(strcmp(encoder_name,'turbo'),strcmp(encoder_name,'turbocm')) PunctureF = varargin{2}; else enc_type = varargin{2}; end % if strcmp(encoder_name,'turbo') % Turbo, fully defined case 3 encoder_name = varargin{1}; PunctureF = varargin{2}; NEncoders = varargin{3}; otherwise error('Too many parameters'); end % switch tmp1else % Assume convolution encoder, if additional parameters not given encoder_name = 'convolution'; enc_type = Trellis.EncType; end % if tmp1~=0% Works currently only for 1-D vectorstmp = size(Data);if or(length(tmp) > 2,sum(tmp(:)>1)>1) error('Encoder works only with vector inputs');else if tmp(1)>tmp(2) reshape_flag = 1; Data = Data.'; else reshape_flag = 0; end % if tmp(1)>tmp(2) end % if or(length(tmp) > 2,sum(tmp(:)>1)>1)%%%%%%%%%%%%%%%%%%%%%% -- Encoding -- %%%%%%%%%%%%%%%%%%%%%%DLength = size(Data,2);outputs = zeros(1,DLength*(1/Trellis.Rate));switch encoder_name %% -- Convolution codes, one linear or recursive component encoder -- %% case 'convolution' outputs = convolution_enc(Data,Trellis,TerminateF,enc_type); case 'tcm' [outputs,ModMap] = convolution_enc(Data,Trellis,TerminateF,enc_type,'tcm'); %% -- Turbo codes, multiple recursive component encoders -- %% case 'turbo' % -- Create pseudo-random odd-even interleaver(s) between RSC's -- % alpha_rsc = odd_even_interleaver(DLength, TerminateF, NEncoders, Trellis.m); % -- Encode bits with RSC's (only for rates 1/k, k = 2,3,4) -- % % % outputs = [inf#1, par#11, ..., par#1NEncoders, inf#2, par#21, ...] % outputs = turbo_enc(Data,Trellis,alpha_rsc,TerminateF,PunctureF,NEncoders); case 'turbocm' % -- Create pseudo-random odd-even interleaver(s) between RSC's -- % alpha_rsc = odd_even_interleaver(DLength, TerminateF, NEncoders, Trellis.m); % -- Encode bits with RSC's (only for rates 1/k, k = 2,3,4) -- % % [outputs,alpha_bit,ModMap] = turbo_enc(Data,Trellis,alpha_rsc,TerminateF,... PunctureF, NEncoders, 'QPSK'); otherwise error(sprintf('Unknown encoder ''%s''',encoder_name));end % switch encoder_name%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -- Output variables -- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% If rsc-interleaver has been created, output itif exist('alpha_rsc','var') varargout{1} = alpha_rsc;end % if exist('alpha_rsc','var')% Number of encodersif exist('NEncoders','var') varargout{2} = NEncoders;end % if exist('NEncoders','var')% If bit-interleaver has been created, output itif exist('alpha_bit','var') varargout{3} = alpha_bit;end % if exist('alpha_bit','var')if exist('ModMap','var') switch encoder_name case 'tcm' varargout{1} = ModMap; case 'turbocm' varargout{4} = ModMap; end % switch encoder_nameend % if exist('ModMap','var')% Interleave for channel[dummy,alpha_channel] = sort(rand(1,length(outputs)));%[alpha_channel] = [1:length(outputs)];outputs = outputs(alpha_channel);% Reshape the output vector if necessaryif reshape_flag outputs = outputs.';end % if reshape_flag
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -