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

📄 trellis_encoder.m

📁 通信中常用的卷积码信道译码源码程序
💻 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 + -