Pensamentos Vividos

terça-feira, janeiro 18, 2005

Telecomunicaçoes - Codificador / Descodificador "4B3T"


INTRODUÇÃO

O seguinte relatório é relativo ao trabalho de codificação de sinaiselaborado em MATLAB pelo Grupo 5 de Engenharia Electrotécnica, no qual lhefoi atribuído o código 4B3T. Trabalho que teve como intuito a implementaçãode um codificador e um descodificador desse código no referido programa.Este código de linha converte blocos de 4 dígitos binários (blocos 4B)em blocos de três símbolos ternários (bloco 3T, também designado por palavraternária), derivando daí o seu nome: 4B de 4 dígitos binários à entrada docodificador, e 3T de 3 símbolos ternários à saída do codificador. A taxa detransmissão vem assim reduzida em 75 por cento, ou seja de 4 para 3. Dadoeste código de linha converter 16=24 conjuntos de quatro dígitos binários em16 conjuntos de três símbolos ternários, existem 27-16=33-24=11 conjuntos detrês símbolos ternário não utilizados ou proibidos, apresentando este código acapacidade (se bem que arcaico, justiça seja feita à palavra) de detecção desímbolos ternários errados, em caso de recepção de um dos 11 blocos 3T nãoutilizados.A Tabela 1 auxilia na codificação/descodificação 4B3T, emconcordância com a Figura 1, o diagrama de transição de estados que regem ofuncionamento da máquina de estados do código 4B3T.Os símbolos à saída do codificador 4B3T, pertencem a um alfabetoconstituído por um conjunto de três símbolos (ou valores de tensão), que são+A Volt, 0 Volt e -A Volt, designado doravante pelas marcas + (tensão positiva),0 (ausência de tensão) e – (tensão negativa), respectivamente. A codificação éfeita escolhendo-se um de dois possíveis modos de transmissão: o modopositivo ou o modo negativo, dados pela soma algébrica dos sinais +, – oumesmo 0.A escolha do modo e feita de acordo com a história passada do sinal eobedece a um diagrama de transição de estados, implementado em hardwareatravés de uma máquina de estados, diagrama esse ilustrado esse na Figura 1.A história passada do sinal é utilizada no processo de codificação, através dacontagem de disparidades acumuladas. Essas disparidades indicam adiferença entre o número de níveis de tensão positivos + e negativos – de cadapalavra ternária.

1. Tabela de Codificação e Diagrama de Estados




Software Realizado em MatLab:

function codificadordescodificador( );
%
%[vect_final]=codificador()
%
%Implementa um codificador do tipo 4B3T;
%O vector "vect" representa o conjunto de simbolos binarios a serem codificados;
% "tb" e a duraçao de cada símbolo (em ms);
%"amp" e o modulo da amplitude de cada simbolo correspondente ao bit 1 (em V);
%"resolucao" e o numero de pontos por cada unidade de tempo; "vect_final" representa
%o sinal (continuo) devidamente codificado.
%
%[vect_descodificado]=descodificador)
%
%Implementa um descodificador do tipo 4B3T;

%"vect_final" representa o sinal continuo contendo o sinal 4B3T codificado;
%"tb" representa o tempo de duraçao de cada símbolo (em ms);
%"resolucao" representa o numero de pontos por cada unidade de tempo;
%"vect_descodificado" e o vector descodificado
%
disp('-------------------------------------------------------------------------');
disp(' >>>>>>>>>>> Codigo 4b3t <<<<<<<<<<<< ');

disp('-------------------------------------------------------------------------');
op=input('Codificador prima(1) Descodificador prima(2) Ajudas prima(3)-> ');
switch op
case {1}
vect=input(['Introduza o vector [...] -> ']);
if rem(length(vect),4)~=0
disp('---- ERRO VECTOR INVALIDO ----');
vect=input('Introduza novo vector multiplo de 4 [...] -> ');
end
tb=input('Introduza a duraçao de cada símbolo tb -> ');
amp=input('Introduza a amplitude -> ');
resolucao=input('Introduza a resolucao -> ');
resol=1/resolucao;
est_ant=4;
modo_positivo=amp*[0 -1 1; -1 1 0; -1 0 1; 0 1 -1; 1 -1 0; 1 0 -1; 1 -1 1; 1 0 0; 0 1 0; 0 0 1; -1 1 1; 1 1 -1; 1 0 1; 1 1 0; 0 1 1; 1 1 1];
modo_negativo=amp*[0 -1 1; -1 1 0; -1 0 1; 0 1 -1; 1 -1 0; 1 0 -1; -1 1 -1; -1 0 0; 0 -1 0; 0 0 -1; 1 -1 -1; -1 -1 1; -1 0 -1; -1 -1 0; 0 -1 -1; -1 -1 -1];
dispar_ass=[0 0 0 0 0 0 1 1 1 1 1 1 2 2 2 3];
dispar=[0 1 2 3 5 5; 5 0 1 2 3 5; 5 5 0 1 2 3; -3 -2 -1 0 5 5; 5 -3 -2 -1 0 5; 5 5 -3 -2 -1 0];
%(-3=>1; -2=>2; -1=>3; 1=>4; 2=>5; 3=>6;)
modo_func=modo_positivo;
vect_aux = '';
vect_final = '';
vect_1 = '';
for i=1:4:length(vect);
dec=vect(i)*8 + vect(i+1)*4 + vect(i+2)*2 + vect(i+3);
dispar_dec=dispar_ass(dec+1); %Atribuir a disparidade associada
for j=1:6 %ver disparidade seguinte
if dispar_dec==abs(dispar(est_ant,j));
est_seg=j;
if dispar(est_ant,j)>0 %Atribuir o modo de funcionamento negativo ou positivo modo_func=modo_positivo;

elseif dispar(est_ant,j)<0>
modo_func="modo_negativo;">
end
est_ant = est_seg;
break;
end
end
if modo_func==modo_positivo; %construçao do vector de saida
for j=1:3 vect_auxp=(modo_positivo(dec+1,j));
vect_aux=[vect_aux vect_auxp];
end
elseif modo_func==modo_negativo;
for j=1:3 vect_auxp=(modo_negativo(dec+1,j));
vect_aux=[vect_aux vect_auxp];
end
end
end
disp('---->>> Vector Palavra Ternaria <<<---- ');

disp(vect_aux);
for j=1:length(vect_aux)
for i=1:resol:tb*1.3333333
vect_1=vect_aux(1,j);
vect_final=[vect_final vect_1];
end
end
plot(vect_final),title(num2str(vect)),axis([0 (length(vect_final)) -amp-1 amp+1]),ylabel(' Amplitude(v)'),xlabel(' Tempo(ms)'),grid on;
%
%-------------------------------------------------------------------------------------------------------------------------------
%
%Descodificador
%
case {2}
disp('Descodificador <<<<<<<<<<<< ');
vect_final=input(['Introduza o vector [...] -> ']);
if rem(length(vect_final),3)~=0
disp('---- ERRO VECTOR INVALIDO ----');
vect_final=input('Introduza novo vector multiplo de 3 [...] -> ');
end
tb=input('Introduza a duraçao de cada símbolo tb -> ');
resolucao=input('Introduza a resolucao -> ');
for i=1:1:length(vect_final); % determinar a amplitude
if vect_final(1,i)~=0
amp=abs(vect_final(1,i));
end
break
end
vect_descodificado ='';
palavra_binaria=[0 0 0 0; 0 0 0 1; 0 0 1 0; 0 0 1 1; 0 1 0 0; 0 1 0 1; 0 1 1 0; 0 1 1 1; 1 0 0 0; 1 0 0 1; 1 0 1 0; 1 0 1 1; 1 1 0 0; 1 1 0 1; 1 1 1 0; 1 1 1 1];
modo_positivo=amp*[0 -1 1; -1 1 0; -1 0 1; 0 1 -1; 1 -1 0; 1 0 -1; 1 -1 1; 1 0 0; 0 1 0; 0 0 1; -1 1 1; 1 1 -1; 1 0 1; 1 1 0; 0 1 1; 1 1 1];
modo_negativo=amp*[0 -1 1; -1 1 0; -1 0 1; 0 1 -1; 1 -1 0; 1 0 -1; -1 1 -1; -1 0 0; 0 -1 0; 0 0 -1; 1 -1 -1; -1 -1 1; -1 0 -1; -1 -1 0; 0 -1 -1; -1 -1 -1];
for i=1:3:length(vect_final)
vect_aux1=[vect_final(1,i) vect_final(1,i+1) vect_final(1,i+2)];
%
disp(vect_aux1);
for j=1:1:16
if modo_positivo(j,1)== vect_aux1(1,1)
if modo_positivo(j,2)== vect_aux1(1,2)
if modo_positivo(j,3)== vect_aux1(1,3)
vect_aux2=[palavra_binaria(j,1) palavra_binaria(j,2) palavra_binaria(j,3) palavra_binaria(j,4)];
break;
end
end
end
if modo_negativo(j,1)== vect_aux1(1,1)
if modo_negativo(j,2)== vect_aux1(1,2)
if modo_negativo(j,3)== vect_aux1(1,3)
vect_aux2=[palavra_binaria(j,1) palavra_binaria(j,2) palavra_binaria(j,3) palavra_binaria(j,4)];
end
end
end
end
vect_descodificado=[vect_descodificado vect_aux2];
end
disp('---- Vector Descodificado----');
disp(vect_descodificado);
stairs(vect_descodificado,'r'),title(num2str(vect_final)),axis([1 (length(vect_descodificado)) -amp-1 amp+1]),ylabel('Amplitude(v)'),xlabel('Tempo(ms)'),grid on;
case {3}
disp('---------------------------------------------------------------------------------------')
disp('---------------------------------------- Ajudas ------- --------------------------------')
disp('--------------------------------------------------------------------------------------- ')
op1=input('Ajuda para Codificador prima(1) Ajuda para Descodificador prima(2)-> ');
switch op1
case {1}
disp('Codificador<<<<<<<<<<<< ')

disp(' ')
disp('Implementa um codificador do tipo 4B3T; O vector "vect" representa o conjunto')
disp('de simbolos binarios a serem codificados; "tb" e a duraçao de cada símbolo (em s);')
disp('"amp" e o modulo da amplitude de cada simbolo correspondente ao bit 1 (em V);')
disp('"resolucao" e o numero de pontos por cada unidade de tempo; "vect_final" representa')
disp('o sinal (continuo) devidamente codificado.') case {2}
disp('Descodificador<<<<<<<<<<<< ')
disp(' ')
disp('Implementa um descodificador do tipo 4B3T; "vect_final" representa o sinal continuo');
disp('contendo o sinal 4B3T codificado; "tb" representa o tempo de duraçao de cada símbolo (em ms) ');
disp('"resolucao" representa o numero de pontos por cada unidade de tempo')
disp('"vect_descodificado" e o vector descodificado')
otherwise
disp('---- ERRO OPÇAO INVALIDA ----');
end
otherwise
disp('---- ERRO OPÇAO INVALIDA ----');
end


3. Ensaios

3.1 Codificador

--------------------------------- >>>>>>>>>>> Codigo 4b3t <<<<<<<<<<<< ----------------------
Codificador prima(1) Descodificador prima(2) Ajudas prima(3)-> 1
Introduza o vector [...] -> [1 0 1 1 0 1 0 0 0 0 1 0 0 1 0 1 1 1 1 1 1 1 0 1 0 1 1 1 10 1 1]
Introduza a duraçao de cada símbolo tb -> 10
Introduza a amplitude -> 5
Introduza a resolucao -> 100
---->>> Vector Palavra Ternaria <<<-----
5 -5 5 5 -5 0 -5 0 5 5 0 -5 5 5 5 -5 -5 0 -5 0 0 5 5 -5





3.2 Descodificador

-------------------------------------------------------------------------
>>>>>>>>>>> Codigo 4b3t <<<<<<<<<<<< -------------------------------------------------------------------------
Codificador prima(1) Descodificador prima(2) Ajudas prima(3)-> 2
Descodificador <<<<<<<<<<<<> [-3 -3 3 3 -3 0 -3 0 3 3 0 -3 3 3 3 -3 -3 0 -3 0 0 3 3 -3]
Introduza a duraçao de cada símbolo tb -> 10
Introduza a resolucao -> 100
---- Vector Descodificado----
1 0 1 1 0 1 0 0 0 0 1 0 0 1 0 1 1 1 1 1 1 1 0 1 0 1 1 1 1 0 1 1



3.3 Ajudas

3.3.1 Codificador
-------------------------------------------------------------------------
>>>>>>>>>>> Codigo 4b3t <<<<<<<<<<<
-------------------------------------------------------------------------
Codificador prima(1) Descodificador prima(2) Ajudas prima(3)-> 3
---------------------------------------------------------------------------------------
------------------------------------------------ Ajudas ---------------------------
---------------------------------------------------------------------------------------


Ajuda para Codificador prima(1) Ajuda para Descodificador prima(2)-> 1
Codificador<<<<<<<<<<<<
Implementa um codificador do tipo 4B3T; O vector "vect" representa o conjuntode simbolos binarios a serem codificados; "tb" e a duraçao de cada símbolo(em ms);"amp" e o modulo da amplitude de cada simbolo correspondente ao bit 1 (emV);"resolucao" e o numero de pontos por cada unidade de tempo; "vect_final"representao sinal (continuo) devidamente codificado.

3.3.2 Descodificador
-------------------------------------------------------------------------
>>>>>>>>>>> Codigo 4b3t <<<<<<<<<<<<
-------------------------------------------------------------------------
Codificador prima(1) Descodificador prima(2) Ajudas prima(3)-> 3
---------------------------------------------------------------------------------------
------------------------------------------------ Ajudas ---------------------------

---------------------------------------------------------------------------------------

Ajuda para Codificador prima(1) Ajuda para Descodificador prima(2)-> 2
Descodificador<<<<<<<<<<<<>

4. Notas Importantes

No decorrer da elaboração deste programa deparamo-nos com oproblema de ele não funcionar com o software MATLAB R13 6.5, o que nãoocorria na versão utilizada na sua criação a versão R12 6.0. Após diversastentativas sem sucesso de resolução deste problema e visto que o programana outra versão estava a funcionar convenientemente não achamos relevante oerro encontrado provavelmente devido a erros de conflito de software.Como demonstrado no ponto 3. Ensaios o programa é funcional.Apesar do docente pedir um programa para codificar e um outro paradescodificar e cada qual com o seu help (ajuda), nós achamos que seria maisinteressante que fosse implementado um programa com as duas opçõesinseridas nele, ou seja um programa que desse para o utilizador escolher entrea opção 1) Codificador e 2) Descodificador. Com esta opção tomada e como outilizador caso necessita-se de recorrer ao help iria aceder aos dois emconjunto devido ao facto de apenas utilizarmos um único programa, e pararesolver este pequeno bug decidimos que seria conveniente criar uma terceiraopção para os help’s 3) Ajudas. Nesta terceira opção dividimos em duas outrasopções, ajuda para codificador e ajuda para descodificador,Verificamos que por vezes na execução do programa, na altura deinserir os dados o programa bloqueava e nessas alturas era necessáriorecorrer á instrução Ctrl+C e reiniciar o programa inserindo os dadosnovamente.Apesar do docente ter referido que preferia a não a inclusão do comandostairs em detrimento do comando plot no codificador, no caso dodescodificador como só nos é pedido o vector descodificado e nós achamosconveniente apresentar também a representação gráfica do mesmo e para issousamos o comando stairs.

5. Metodologia

Atendendo a que um dos elementos mais importantes quiçá o maisimportante para codificação/descodificação do nosso código 4B3T é a tabelade codificação e o diagrama de transição de estados para uma correctaimplementação desta tabela e do diagrama usamos como solução quatromatrizes para a tabela e uma matriz para implementação do diagrama.A matriz que se refere ao diagrama foi elaborada em função do estadoanterior e do estado seguinte, onde em função do estado anterior e do paridadeassociada a esse estado obtemos o estado seguinte que é o número da colunacorrespondente ao estado da paridade.




Nesta Tabela os dígitos 5 significam que para o estado em causa nãoexiste transição para o estado seguinte nessa coluna.Ao receber o vector binário a codificar associamos a cada quatroelementos o seu respectivo número em decimal de forma a ser-nos possívelassociar os quatro dígitos ao respectivo modo (Positivo/Negativo) e escolher apalavra ternária associada e também a sua disparidade associada. Com basenestes dados construímos um novo vector onde já temos o sinal praticamentecodificado (vect_aux). A este vector sabendo de antemão que a cada grupo dequatro dígitos corresponde uma palavra ternária de três dígitos o que implicaque a cada um deles corresponde 4/3 de tb, sendo tb a duração de cadasímbolo em unidade de tempo (ms). Como a resolução é o número de pontospor cada tb, através de alguns ciclos transformamos o vector praticamentecodificado (vect_aux) no vector codificado onde entramos com todos osparâmetros.Inicialmente o programa codificador era para receber os parâmetros logode seguida ao nome do programa (codificador (vect,tb,resolucao,amp)) talcomo demonstrado no exemplo do trabalho mas optamos por outra solução,que é a do próprio programa pedir os parâmetros ao utilizador.Implementamos o descodificador utilizando as tabelas já referidasanteriormente e usadas no codificador daí ter surgido a ideia depois posta emprática de juntar o codificador com o descodificador num único programa. Emfunção do vector que é introduzido para descodificar agrupamos em grupos detrês depois como já sabemos que a cada palavra ternária existe apenas umapalavra binária associada independentemente do seu modo de funcionamentoe/ou disparidade associada construímos então o vector já descodificado.Como referido anteriormente o programa contém um codificador e umdescodificador e as respectivas ajudas tudo junto, implementamos um menuonde permitimos ao utilizador escolher a opção desejada.Tivemos em conta ao longo do programa de fazer aparecer mensagensde erro sempre que eram inseridas opções inválidas no menu atl comodemonstrado abaixo, e nos vectores mas neste caso o utilizador teria outraoportunidade de inserir um novo vector pois apareceria uma mensagemexplicando o tipo de vector a introduzir.

-------------------------------------------------------------------------
>>>>>>>>>>> Codigo 4b3t <<<<<<<<<<<< ------------------------------------------------------------------------- Codificador prima(1) Descodificador prima(2) Ajudas prima(3)-> 1
Introduza o vector [...] -> [1 0 1]
---- ERRO VECTOR INVALIDO ----
Introduza novo vector multiplo de 4 [...] ->
-------------------------------------------------------------------------
>>>>>>>>>>> Codigo 4b3t <<<<<<<<<<<< ------------------------------------------------------------------------- Codificador prima(1) Descodificador prima(2) Ajudas prima(3)-> 2
Descodificador <<<<<<<<<<<<> [3 0 3 0]
---- ERRO VECTOR INVALIDO ----
Introduza novo vector multiplo de 3 [...] ->

CONCLUSÃO

Apesar deste trabalho ser executado no final do semestre e com o prazode conclusão em cima dos exames e ser elaborado em MATLAB um programaque infelizmente não nos é leccionado, apenas esporadicamente em algumasdas disciplinas e muito vagamente. Surgiram-nos muitas dificuldades, maisprecisamente na implementação em MATLAB que só foram ultrapassadasgraças a colaboração do docente. No que concerne ao código e ao facto dasua difícil interpretação, tivemos no final a recompensa com o funcionamentodo programa e uma maior compreensão do código pois ficamos a percebe-loem todas as suas vertentes (codificação/descodificação).Este programa apesar de ao inicio não nos sentirmos capazes de o levara bom termo, no final já tínhamos bastantes ideias para a sua elaboração quenão puderam ter efeito devido á escassez de tempo e á falta de mais emelhores conhecimento na programação utilizada. Nomeadamente, umafunção que permite-se ao utilizador após escolher uma opção e executá-lapoder voltar ao menu inicial sem ter que reiniciar o programa. Também nãopudemos melhorar o seu aspecto pois não sabíamos programar em GUI sendoessa outra das falhas a apontar.Uma das vantagens de ter feito este trabalho e crendo que está afuncionar para todos os casos possíveis, pois testamos muitos é a de aoestudarmos para a disciplina o capítulo de transmissão digital em banda-basepodermos verificar se os nossos gráficos elaborados manualmente em código4B3T estão correctos.Portanto é com muito agrado que concluímos que apesar de todo otrabalho que tivemos na elaboração deste relatório e do programa adjacente, eque após superarmos todas as dificuldades com que nos deparamos nossentimos um pouco mais á vontade a programar neste tipo de software e nopróprio código.



Trabalho Realizado Por:

Vitor Lopes
Joao Pedro Sa Cardante
Manuel Afonso
Jose Araujo







2 Comments:

  • Quria deixar aqui os meus parabens a equipa que desenvolveu este trabalho, sem duvida o melhor (o meu tambem nao esta mal de todo, saiu-me na RIFA) lol! Esta excelente. Espero que o professor saiba dar valor ao esforço e merito suficiente pelos trabalhos apresentados por todos os grupos! Espero poder continuar com o apoio de todos os amigos de todos os grupos, no nosso curso nao ha rivalidades, ha espirito de ajuda e de solidariedade para com todos, vamos continuar assim! Um abraço a todo o pessoal do meu curso, em especial oas verdadeiros!

    By Blogger Nuno Santos, at 2:57 da tarde  

  • Por acaso esta mt bom, gostaria era q me contactasses se arranjasses mais trabalhos destes mas para codificaçoes diferentes, Rz NRZ AMI CMI.... vampirinho66@hotmail.com

    By Blogger VamPiro6, at 6:37 da tarde  

Enviar um comentário

<< Home