Você está na página 1de 3

Universidade Tecnológica Federal do Paraná - UTFPR XXII Curso de Especialização em Teleinformática e Redes de Computadores

Disciplina: Linguagem C e Matlab

Prof.: Gustavo B. Borba

TUTORIAL MATLAB

Codificação de Huffman

17/mai/2012

1. “Garimpar” no MATLAB No help do Matlab, observar que há as seguintes funções disponíveis no Communications Toolbox: huffmandict, huffmanenco, huffmandeco

2. Rodar e analisar um exemplo

2.1 Copiar o exemplo "Example: Creating and Decoding a Huffman Code" do help do Matlab e

criar um script chamado "huff1.m":

%huff1.m [script] sig = repmat([3 3 1 3 3 3 3 3 2 3],1,50); % Data to encode

symbols = [1 2 3]; % Distinct data symbols appearing in sig

p = [0.1 0.1 0.8]; % Probability of each data symbol

dict = huffmandict(symbols,p); % Create the dictionary. hcode = huffmanenco(sig,dict); % Encode the data. dhsig = huffmandeco(hcode,dict); % Decode the code.

2.2 A partir do script, entender o que cada função deve receber e o que devolve.

2.3 Inspecionar a 'tabela de código' (variável "dict") e observar que, conforme o esperado, a

palavras de código de menor comprimento é atribuída ao símbolo que ocorre mais vezes (maior probabilidade):

1

[1,1]

2

[1,0]

3

0

2.4 Conferir os dados codificados e os decodificados:

variável "hcode": dados codificados. Cada posição deste vetor armazena um bit. Comparando os dados de "dict" com "sig" ("sig" contém os dados a serem codificados) e levando em consideração a tabela de código, observa-se que a codificação foi feita corretamente:

0

0

1

1

0

0

0

0

0

1

0

0

variável "dhsig": dados decodificados. Comparar "dhsig" com "sig" e verificar que a decodificação foi feita corretamente:

3

3

1

3

3

3

3

3 2

3

3. Rodar e analisar outro exemplo

3.1 O exemplo a seguir foi extraído do help online do MATLAB. Copiar este exemplo e criar um

script chamado "huff2.m":

%huff2 [script] symbols = 1:6; % Distinct symbols that data source can produce

p = [.5 .125 .125 .125 .0625 .0625]; % Probability distribution

[dict,avglen] = huffmandict(symbols,p); % Create dictionary. actualsig = randsrc(1,100,[symbols; p]); % Create data using p. comp = huffmanenco(actualsig,dict); % Encode the data. dsig = huffmandeco(comp,dict); % Decode the Huffman code. ok = isequal(actualsig,dsig); % Check whether the decoding is correct.

3.2

Observar que os dados originais "actualsig" são gerados de maneira diferente daquela usada

em "huff1.m".

4. Taxa de compactação

4.1 Inserir em huff2.m o seguinte trecho de código para o cálculo da taxa de compactação

(variável "tc"):

%Taxa de compactação em % %tc = (1 - [tamanho dos dados codif]/[tamanho dos dados orig])*100 %Tamanho dos dados originais actualsigSize = length(actualsig); %tamanho em "bytes" %Tamanho dos dados codificados compSize = length(comp)/8; %tamanho em "bytes" %Mas a tabela de código ("dict") deve também fazer parte %dos dados codificados, para que seja possível a futura %decodificação. %Supor que o armazenamento da tabela utiliza 3 bytes por símbolo dictSize = size(dict,1)*3; %numero de linhas de "dict" x 3 %tc tc = round((1 - ((compSize+dictSize)/actualsigSize))*100)

4.2 Rodar e observar que a taxa de compactação é de aproximadamente 55%.

4.3 Alterar a seguinte linha de código para que agora, ao invés de 100 elementos, o vetor a ser

codificado tenha 1000 elementos:

actualsig = randsrc(1,1000,[symbols; p]); % Create data using p.

4.4 Rodar e observar que a taxa de compactação sobe para aproximadamente 70%. Isto é esperado, já que o tamanho de "dict" desta vez tem menos impacto no conjunto de dados codificados.

5. Codificar arquivos texto

5.1 Criar o script a seguir, chamado "huff3.m". Este script foi elaborado a partir do “huff2.m” e lê

os dados originais (a serem codificados) de um arquivo texto.

%huff3 [script] %Codifica e decodifica um arquivo texto. %NÃO armazena os dados codificados em arquivo. %Assume que o espaço em arquivo para armazenamento da tabela de código %(variável "dict") é igual a (númemero de síbolos)x3, em "bytes".

clear all

fid = fopen('txt1.txt', 'rt'); %arquivo a ser codificado actualsig = fread(fid)'; %conteúdo do arquivo fclose(fid);

actualsigu = unique(actualsig); %todos os símbolos presentes no arquivo

h = hist(actualsig, actualsigu); %contagem de cada símbolo

p = h/length(actualsig); %probabilidade de cada símbolo symbols = actualsigu;

%Funções do Communications Toolbox [dict,avglen] = huffmandict(symbols,p); % Create dictionary. comp = huffmanenco(actualsig,dict); % Encode the data. dsig = huffmandeco(comp,dict); % Decode the Huffman code. ok = isequal(actualsig,dsig); % Check whether the decoding is correct.

%Escreve em um arquivo texto os dados decodificados (para comparação %com os dados originais) fid = fopen('decoded.txt', 'wt'); fwrite(fid, dsig, 'char'); fclose(fid);

%Taxa de compactação em % %tc = (1 - [tamanho dos dados codif]/[tamanho dos dados orig])*100 %Tamanho dos dados originais actualsigSize = length(actualsig); %tamanho em "bytes" %Tamanho dos dados codificados compSize = length(comp)/8; %size em "bytes" %Mas a tabela de código ("dict") deve também fazer parte %dos dados codificados, para que seja possível a futura %decodificação. %Supor que o armazenamento da tabela utiliza 3 bytes por símbolo dictSize = size(dict,1)*3; %numero de linhas de "dict" x 3 %tc tc = round((1 - ((compSize+dictSize)/actualsigSize))*100)

5.2 Criar um arquivo texto bastante simples chamado "txt1.txt", com o objetivo de facilitar a

depuração. Sugestão: OBEBEARROTOURRRAAAAA

5.3 Rodar o script e conferir cada etapa, constatando o funcionamento correto: leitura do arquivo

(fread), seleção dos símbolos (unique) e contagem/probabilidade de cada símbolo (hist).

5.4 Observar se o conteúdo do arquivo decodificado salvo (fwrite) com o nome de "decoded.txt" é

idêntico ao original “txt1.txt”.

6. Mais testes

6.1 A taxa de compactação para o arquivo "txt1.txt" não faz sentido, pois os dados codificados

ocupam mais espaço que os originais. Isto acontece devido ao impacto do tamanho de "dict" em relação ao tamanho dos dados originais. Compactando "txt1.txt" com o WinZip pode-se observar que acontece o mesmo: o arquivo compactado é maior que o original.

6.2 Rodar para o arquivo "readme.txt". A taxa de compactação é de aproximadamente 34%.

6.3 O arquivo “redund.txt” tem o mesmo tamanho de “readme.txt”, porém contem muita

redundância e poucos símbolos (apenas ABCD repetindo-se). Ao rodar para este arquivo a taxa

de compactação obtida é de aproximadamente 75%. Conforme esperado, muito mais alta do que a obtida para o arquivo “readme.txt”.

7. Sugestões para a continuação

7.1 Elaborar um script (ou função) que permita a entrada de um arquivo texto e devolva um

arquivo codificado. Neste arquivo codificado deverão estar presentes a tabela ("dict") e os dados originais codificados.

7.2 Elaborar outro script (ou função) para a leitura deste arquivo codificado e decodificação dos

dados. Neste caso, a saída deverá ser um arquivo texto idêntico ao de entrada (original).