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