Pensamentos Vividos

sábado, janeiro 15, 2005

Trabalho Pratico 2 de Telecomunicaçoes (Codificador/Descodificador 2B1Q)

INTRODUÇÃO:

Com base no programa da disciplina de telecomunicações foi-nos proposto realizar um trabalho acerca do codificador/descodificador do código de linha 2B1Q. Este rabalho consiste em fazer um programa em Matlab, que permita realizar a codificação e por sua vez também a descodificação de uma sequência de bits, introduzida pelo operador que irá usufruir deste mesmo programa.Para terem uma ideia mais clara em que consiste o nosso trabalho, iremos dar uma explicação breve sobre funcionamento do codificador/descodificador 2B1Q. Neste código, um dibit (2 bits) é mapeado num símbolo quaternário (+- 1, +- 3) conforme está mostrado na tabela 1. O código 2B1Q é um código do tipo PAM ( Pulse Amplitude Modulation, onde a informação está contida na amplitude do sinal ) com 4 níveis possíveis, onde cada símbolo ( baud ) pode representar um dibit ( 2 bits ), o que é uma vantagem pois diminui o número de símbolos, a ser transmitido. Este código não possui nível DC na média ( se os ‘0’ e ‘1’ forem equiprováveis). Este tipo de modulação é utilizado no BRI ISDN, HDSL, HDSL2/SHDSL.

DESENVOLVIMENTO:

Ao desenvolvermos o nosso trabalho sobre o codificador/descodificador 2B1Q, tivemos que ter em atenção que neste código cada símbolo de saída vai depender dos símbolos anteriormente gerados e transmitidos, bem como do conjunto de dígitos binários presentes para codificação, pertencendo portanto, aos modos de transmissão com memória.Um dos nossos auxílios, e muito importante, pois sem ele não seríamos capazes de realizar tal trabalho é a tabela de codificação e de descodificação para o código de linha 2B1Q.







Teoricamente o codificador faz o seguinte, analisa o sinal de entrada (figura 1), de 2 em 2 bits e codifica-o da seguinte maneira (figura 2).
Em primeiro ele tem que saber qual o símbolo 2B1Q imediatamente antes da codificação do primeiro conjunto de 2 bits, por regra é arbitrado sempre um símbolo positivo. De seguida ele irá ver qual o próximo par de 2 bits, no nosso caso é o 00, como inicialmente é arbitrado um símbolo positivo vamos a tabela 1 e verificamos que para um símbolo positivo 00 teremos uma saída no codificador de +1. De seguida como sabemos que a nossa saída presente é de +1 e que o nosso próximo par de 2 bits é 11, logo consultando a tabela verificamos que iremos obter uma saída de -3. Este processo é feito sempre da mesma forma, até chegarmos ao ultimo par de 2 bits que no nosso caso é 10, para uma saída presente de -3, logo iremos obter no codificador outra saída que será -1. Já o descodificador funciona da forma inversa.
É um processo que à primeira vista parece um pouco complicado, mas que na realidade se torna bastante simples.

Conclusão:

Após o estudo do código 2B1Q e de outros analisados nas aulas, aos quais nos referimos mais concretamente ao AMI, CMI e Manchester, podemos verificar que este apresenta a menor taxa de sinalização na linha (baud rate) entre os três códigos referidos anteriormente. Isto significa que o código 2B1Q tem menos símbolos na linha por segundo para transportar a mesma quantidade de informação. Há, consequentemente, redução na atenuação do sinal, da interferência e diafonias, que compensam a complexidade e limitações do código, como detecção correcta dos níveis. Para realizarmos este código baseamo-nos, principalmente em informações recolhidas através da Internet e de consultas ao docente responsável pela disciplina para a qual é realizado o trabalho. Depois de tudo isto, e de nos termos deparado com algumas dificuldades, o que é perfeitamente normal, visto que nunca tínhamos feito anteriormente nenhum tipo de programação em Matlab, pensamos que o trabalho foi bem sucedido tirando um aspecto ou outro que nos causou algumas dificuldades. A nossa maior dificuldade na realização da programação foi a interpretação dos resultados do programa, e por sua vez descobrir quais os erros que a programação continha, tudo isto devido a falta de experiência neste tipo de programação. Tirando este pequeno contratempo o nosso trabalho foi concluído, e como tal entregue dentro do prazo estipulado pelo docente da disciplina de Telecomunicações.


Software desenvolvido em MatLab:


Codificador 2B1Q

function [sinal]=codificador(vector,tb,amplitude,resolucao);

%
%[sinal]=codificador(vector,tb,amplitude,resolucao)
%
%Implementa um codifcador do tipo 2B1Q, "vector" representa o conjunto
%de simbolos binarios a serem codificados; "tb" e a duracao de cada símbolo (em ms);
%"amplitude" 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; sinal representa
%o sinal (continuo) devidamente codificado.
%

aux1=1; %Variavel auxiliar que guarda o valor a imprimir
j = 1; %contador que incrementa as posiçoes do vector a imprimir
vect2=[]; %vector auxiliar

if mod(length(vector),2)==0 %testa se o numero de bits do vector e par ou impar

for n=1:2:length(vector) %Percore todas as posicoes do vector

if aux1<0 style="">

if vector(n)==0 & vector(n+1)==0 %verifica a primeira e a segunda posicao do vector de entrada
aux1=-1;
vect(j)=aux1; %Guarda o valor -1 no vector a imprimir caso a entrada seja 0 0

else

if vector(n)==0 & vector(n+1)==1 %verifica o valor das posicoes do vector de entrada

aux1=-3;
vect(j)=aux1; %Guarda o valor -3 no vector a imprimir caso a entrada seja 0 1

else
if vector(n)==1 & vector(n+1)==0 %verifica o valor das posicoes do vector de entrada
aux1=1;
vect(j)=aux1; %Guarda o valor 1 no vector a imprimir caso a entrada seja 1 0

else

if vector(n)==1 & vector(n+1)==1 %verifica o valor das posicoes do vector de entrada
aux1=3;
vect(j)=aux1; %Guarda o valor 3 no vector a imprimir caso a entrada seja 1 1
end
end
end
end

else

if vector(n)==0 & vector(n+1)==0 %verifica o valor das posicoes do vector de entrada
aux1=1;
vect(j)=aux1; %Guarda o valor 1 no vector a imprimir caso a entrada seja 0 0

else

if vector(n)==0 & vector(n+1)==1 %verifica o valor das posicoes do vector de entrada
aux1=3;
vect(j)=aux1; %Guarda o valor 3 no vector a imprimir caso a entrada seja 0 1

else

if vector(n)==1 & vector(n+1)==0 %verifica o valor das posicoes do vector de entrada
aux1=-1;
vect(j)=aux1; %Guarda o valor -1 no vector a imprimir caso a entrada seja 1 0

else

if vector(n)==1 & vector(n+1)==1 %verifica o valor das posicoes do vector de entrada
aux1=-3;
vect(j)=aux1; %Guarda o valor -3 no vector a imprimir caso a entrada seja 1 1

end

end

end

end

end

j = j+1; %incrementa o contador das posiçoes do vector a imprimir

end

%ciclos de resoluçao

for i = 1:length(vect)

for k = 1:resolucao

aux(k) = vect(i);

end

vect2 = [vect2 aux];

end

[sinal]=vect2; %imprime na saida o vector descodificado (para visualizaçao do resultado, ecrever: " >> sinal " na linha de comandos)

plot (vect2),AXIS([1 ((length(vect2)+1)*tb) -(amplitude+1) amplitude+1]); %Imprime o Vector de saida ja codificado

title (num2str(vector));

ylabel('Tensao Saida');

xlabel('Tempo');

grid on;

else

disp('numero de bits do vector impar'); %resultado do teste de paridade do vector de entrada caso seja impar o nº de bits

end

Descodificador 2B1Q:

function [saida]=descodificador(vect,resolucao);
%
%[saida]=descodificador(vector,resolucao)
%Implementa um descodifcador do tipo 2B1Q, "vector" representa o conjunto
%de simbolos "numericos" a serem codificados;
%"resolucao" e o numero de pontos por cada unidade de tempo;
%[saida] representa o vector descodificado
%

aux1=1; %Variavel auxiliar (representa o sinal do bit da posiçao do vector)
j = 1;
vect2=[]; %vector auxiliar

if mod(length(vect),2)==0 %testa se o numero de bits do vector e par ou impar
for n=1:length(vect) %Percore todas as posicoes do vector

if aux1<0>

if vect(n)==1 %verifica a primeira posicao do vector de entrada
aux2=1; %guarda o valor 1 na variavel auxiliar "aux2"
aux3=0; %guarda o valor 0 na variavel auxiliar "aux3"
vect1(j)=aux2; %preenche a primeira posiçao do vector auxiliar com o valor guardado no em "aux2"
vect1(j+1)=aux3; %preenche a primeira segunda do vector auxiliar com o valor guardado no em "aux3"
else
if vect(n)==3

aux2=1;

aux3=1;

vect1(j)=aux2;

vect1(j+1)=aux3;

else

if vect(n)==-1

aux2=0;

aux3=0;

vect1(j)=aux2;

vect1(j+1)=aux3;

else

if vect(n)==-3

aux2=0;

aux3=1;

vect1(j)=aux2;

vect1(j+1)=aux3;

end

end

end

end

else

if vect(n)==-1

aux2=1;

aux3=0;

vect1(j)=aux2;

vect1(j+1)=aux3;

else

if vect(n)==-3

aux2=1;

aux3=1;

vect1(j)=aux2;

vect1(j+1)=aux3;

else

if vect(n)==1

aux2=0;

aux3=0;

vect1(j)=aux2;

vect1(j+1)=aux3;

else

if vect(n)==3

aux2=0;

aux3=1;

vect1(j)=aux2;

vect1(j+1)=aux3;

end

end

end

end

end

aux1 = vect(n); %actualiza a variavel auxiliar

j=j+2;

end

%ciclo de resoluçao

for i = 1:length(vect1)

for k = 1:resolucao

aux(k) = vect1(i);

end

vect2 = [vect2 aux];

end

[saida]=vect2; %imprime na saida o vector descodificado (para visualizaçao do resultado, ecrever: " >> saida " na linha de comandos)

else

disp('numero de bits do vector impar'); %resultado do teste de paridade do vector de entrada caso seja impar o nº de bits

end

Autores: Nuno Santos

Nelson Louçano

David Silva e Pinto

Ricardo Valente


1 Comments:

  • Hello, I'm from Ecuador don't speak portuguese but i understand, i'm writing because the program in matlab, codificador y descodificador doesn't run, there is a message of arguments, please help me.muito obrigado

    By Blogger ANDRÉS MOSCOSO, at 2:25 da manhã  

Enviar um comentário

<< Home