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

📄 trellis_decoder.m

📁 通信中常用的卷积码信道译码源码程序
💻 M
字号:
function [outputs,varargout] = ...    trellis_decoder(Data_received, Trellis, Lut, alpha_channel, dec_name, ...                    varargin);%------------------------------------------------------------------------------% Decode codes with trellis.%% Format:% -------%% Convolution codes (hard/soft): % [outputs [raw_ber]]= ...%  trellis_decoder(Data_received, Trellis, Lut, alpha_channel, ...%                  'convolution', SF, [fading_gains], [sigma_2], [Data], ...%                  [TerminateF], [PunctureF], [ModMap])%% Trellis coded modulation:% outputs = ...%  trellis_decoder(Data_received, Trellis, Lut, alpha_channel, ...%                  'tcm', SF, fading_gains, TerminateF, PunctureF)%% Turbo codes (BPSK):% [outputs [raw_ber]] = ...%  trellis_decoder(Data_received, Trellis, Lut, alpha_channel, 'turbo',...%                  SF, fading_gains, sigma_2, Data, TerminateF, PunctureF, ...%                  alpha_rsc, iterations)% % Turbo coded modulation (QPSK):% [outputs [raw_ber]] = ...%  trellis_decoder(Data_received, Trellis, Lut, alpha_channel, 'turbocm',...%                  SF, fading_gains, sigma_2, Data, TerminateF, PunctureF, ...%                  alpha_rsc, iterations, alpha_bit, ModMap)%% % Author: MVe% Date:   05.07.2002%------------------------------------------------------------------------------%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -- Initial parameter checking etc.. -- %% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%Data = NaN;% Check if the function call format is correct and extract% additional parameter(s) if necessary.tmp1 = length(varargin);% If additional arguments are given (for soft decoding)if tmp1>0  switch dec_name   case 'convolution'     if tmp1==6       fading_gains = varargin{1};              % fading coefficients       N0 = 2*varargin{2};                      % noise power       Data = varargin{3};                      % original data bits       TerminateF = varargin{4};                % terminated trellis or not       PunctureF = varargin{5};                 % punctured code or not       ModMap = varargin{6};			% constellation       if length(fading_gains) ~= length(Data_received)         error(['length(fading coefficients) == length(data received)' ...                ' required']);       end % if fading_gains ~= length(Data_received)     end % if tmp1==6       case 'tcm'     if tmp1==3       fading_gains = varargin{1};              % fading coefficients       TerminateF = varargin{2};                % terminated trellis or not       PunctureF = varargin{3};                 % punctured code or not       if length(fading_gains) ~= length(Data_received)         error(['length(fading coefficients) == length(data received)' ...                ' required']);       end % if fading_gains ~= length(Data_received)     end % if tmp1==3   case 'turbo'    if tmp1==7       fading_gains = varargin{1};	         % fading coefficients      N0 = 2*varargin{2};                    % noise power      Data = varargin{3};		             % original data bits      TerminateF = varargin{4};		         % terminated trellis or not      PunctureF = varargin{5};               % punctured code or not      alpha_rsc = varargin{6};		         % interleaver between RSC's      iterations = varargin{7};              % number of MAP-iterations       if length(fading_gains) ~= length(Data_received)        error('length(fading coefficients) == length(data received) required');      end % if fading_gains ~= length(Data_received)    end % if tmp1==7    case 'turbocm'    if tmp1==9      fading_gains = varargin{1};	         % fading coefficients      N0 = 2*varargin{2};                    % noise power      Data = varargin{3};		             % original data bits      TerminateF = varargin{4};		         % terminated trellis or not      PunctureF = varargin{5};               % punctured code or not      alpha_rsc = varargin{6};		         % interleaver between RSC's      iterations = varargin{7};              % number of MAP-iterations       alpha_bit = varargin{8};               % bit-level interleaving      ModMap = varargin{9};                  % constellation points      if length(fading_gains) ~= length(Data_received)        error('length(fading coefficients) == length(data received) required');      end % if fading_gains ~= length(Data_received)    end % if tmp1==7       end % switch dec_name  end % if tmp1>0% Works currently only for vectors of size 1xDtmp1 = size(Data_received);tmp2 = size(Data);if sum([length(tmp1)>2, sum(tmp1(:)>1)>1, length(tmp2)>2, sum(tmp2(:)>1)>1])  error('Decoder works only with vector inputs');else  tmp = bin2dec(char([tmp1(1)>tmp1(2), tmp2(1)>tmp2(2)]+48));  switch tmp   case 0    reshape_flag = 0;   case 1    Data = Data.';   case 2    reshape_flag = 1;    Data_received = reshape(Data_received,tmp1(2),tmp1(1));   case 3     reshape_flag = 1;    Data_received = reshape(Data_received,tmp1(2),tmp1(1));    Data = Data.';  end % switch tmp    end % if sum([length(tmp1)>2, sum(tmp1(:)>1)>1, length(tmp2)>2,...%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -- Hard decision decoding (only for convolution codes) -- %% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%if ~Trellis.SoftDecF  outputs = convolution_dec(Data_received,Trellis,Lut,alpha_channel);  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  %% -- Soft decision decoding  -- %%  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  else  switch dec_name      case 'tcm'    % SIHO trellis    outputs = ...        tcm_dec(Data_received,Data,Trellis,Lut,alpha_channel,...                fading_gains,TerminateF,PunctureF,SF);       case 'convolution'    % Trellis decoder with soft inputs    [outputs, berrs, ferrs] = ...	conv_dec_soft_C(Data_received,Data,Trellis,Lut,alpha_channel,...			fading_gains,N0,TerminateF,PunctureF,ModMap);    % $$$     % MAP% $$$     [outputs, Raw_BER] = ...% $$$         map_siso1_bpsk(Data_received,Data,Trellis,alpha_channel,...% $$$                        fading_gains,N0,TerminateF,PunctureF);       case 'turbo'    % Iterative MAP    [outputs, Raw_BER] = ...            map_app_siso1_bpsk(Data_received,Data,Trellis,fading_gains,N0, ...                           alpha_channel,alpha_rsc,TerminateF,PunctureF,...                           iterations);   case 'turbocm'    % Iterative MAP    [outputs, Raw_BER] = ...            map_app_siso1_bpsk(Data_received,Data,Trellis,fading_gains,N0, ...                           alpha_channel,alpha_rsc,TerminateF,PunctureF,...                           iterations, alpha_bit, ModMap);  end % if strcmp(dec_name,'convolution')end % if ~Trellis.SoftDecF% Reshape the output vector if necessaryif reshape_flag  outputs = outputs.';end % if reshape_flag% Output uncoded bit error rate, if requiredif exist('Raw_BER','var')  varargout{1} = Raw_BER;end % if exist('Raw_BER','var')% Output number of coded bit errors, if requiredif exist('berrs','var')  varargout{1} = berrs;end % if exist('berrs',...% Output number of coded frame errors, if requiredif exist('ferrs','var')  varargout{2} = ferrs;end % if exist('ferrs',...

⌨️ 快捷键说明

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