Уникально декодируемый код с использованием MATLAB

Опубликовано: 2 Марта, 2022

Код является отличным, если каждое кодовое слово распознается друг от друга (т. Е. Планирование от исходных сообщений до кодовых слов скоординировано). Отдельный код является чрезвычайно декодируемым, если каждое кодовое слово распознается, когда оно пропитано группой кодовых слов, или если первая исходная компоновка может быть полностью преобразована из закодированной двоичной последовательности.

Тест на уникальную декодируемость:

  1. Рассмотрим два кодовых слова A и B. A состоит из k бит, а B состоит из n бит (k <n), если первые k битов B идентичны A, то A называется префиксом B, оставшиеся последние nk битов называются висящим суффиксом. Пример: A = 010, B = 01001, висящий суффикс - 01.
  2. Создайте список всех кодовых слов, проверьте все пары кодовых слов, чтобы увидеть, является ли какое-либо кодовое слово префиксом другого, всякий раз, когда такая пара присутствует, добавьте висящий суффикс в список, если вы не добавили тот же висящий суффикс в список в предыдущей итерации.
  3. Продолжайте повторять процедуру для расширенного списка, пока не будут сравнены все кодовые слова.

Итоги:

  • У вас есть свисающий суффикс, который является кодовым словом.
  • Висячих суффиксов нет.
  • Свисающий суффикс не является кодовым словом.
  • Если в результате вы получите пункт 5, код нельзя однозначно декодировать.
  • Во всех остальных случаях он однозначно декодируется.

Примеры:

 '0, 01, 011, 0111' - уникально декодируемый код
'0, 1, 00, 11' не является однозначно декодируемым кодом

Code:

% Given Code
code = {"0","01","011","0111"}; 
disp(code) 
  
i = 1;
flag1 = 0;
  
% Storing the code in temp variable 
temp = code;  
  
% Create datastore
ds = {};  
  
while i < length(temp)
  j = 1;
  while j < length(temp)
    c1 = temp{i};
    c2 = temp{j};
    l1 = length(c1);
    l2 = length(c2);         
  
    % To find dangling suffix
    if l1 < l2
      if c1 == c2(1 : l1)
          
        % Extract dangling suffix after comparing codewords
        tsuffix = c2(l1 + 1 : l2);
        l = length(ds);
          
        % Append tsuffix to ds
        if l == 0
            
          % If no dangling suffix available then tsuffix 
          % is new dangling suffix  
          ds = {tsuffix}; 
        else
          k = 1;
          while k <= l
              
            % Compare new tsuffix with "k"th dangling suffix
            flag = strcmp(tsuffix, ds{k});
            if flag ~= 1; 
              k = k + 1;
            end
          end          
          if flag == 0
            
            % Attach tsuffix to dangling suffix array
            ds = [ds {tsuffix}];
            l = length(ds);
          end
        end     
        
        % Append tsuffix to code
        lt = length(temp);
        k = 1;
        while k <= lt
          
          % Compare each extracted dangling suffix 
          % with "k"th original codeword
          flag = strcmp(tsuffix, temp{k});  
          if flag == 1
            flag1 = 1;
            disp("Code is not Uniquely decodable");
            break;
          else
            k = k + 1;
          end
        end       
        if flag == 0
          
          % Attach extracted dangling suffix array to codeword array
          temp = {temp(:) tsuffix};
          lt = length(temp);
        end
      end
    end   
    if flag1 == 1
      break;
    end
    j = j + 1;
  end   
  if flag1 == 1
    break;
  end
  i = i + 1;
end 
  
if flag1 == 0
  disp("Code is Uniquely Decodable");
end

Выход:

 '0' 01 '011' 0111 '
Код однозначно декодируется