You are on page 1of 8

DEPARTAMENTO DE ELECTRNICA Y TELECOMUNICACIONES

TPICOS SELECTOS DE CODIFICACIN PARA CANALES


INALMBRICOS
Tarea 1. Codificacin y Diagramas Trellis de Cdigos
Convolucionales
Alumno: Javier Flix Baldenegro
Ensenada, B.C., a 8 de Febrero de 2010

Objetivos
Generar una secuencia codificada a partir de los codigos convolucionales vistos en clase
(Figuras 1 y 2), as como los diagramas de Trellis correspondientes:

Figura 1. Diagrama esquemtico del CC(3, 1, 2)


Para obtener la secuencia de salida de un CC, basta con realizar la convolucin entre la
entrada U y las respuestas impulso (ec.1 y ec. 2) ,obtenidas visualmente del diagrama o
de la matriz G, y despus multicanalizar las salidas parciales, tal como se expresa en
(ec.3)

Figura 2. Diagrama esquemtico del CC sistemtico(2, 1, 3)

v ( 0 ) u g (1)

ec.1

v (1) u g ( 2 )

ec.2

v v 0( 0 ) v 0(1) , v1( 0 ) v1(1) , v 2( 0 ) v 2(1) ,...

ec.3

Para esto se crearon en Matlab las funciones CC2 y CC3 que corresponden a los
codificadores de los esquemticos de las figuras 1 y 2, respectivamente.
Para su ejecucin solo hay que llamarlos desde la lnea de comandos en forma de
funcin agregando el vector de entrada.
Ejemplo:
>> CC2([1 0 1 1 1])
ans =1 1 1 1 0 1 1 0 0 0 1 0 0 0 1 1 1 0 0 1 1
>>CC3([1 0 1 1 1])
ans = 1 1 0 1 1 1 1 1 1 0 0 0 0 1 0 1
Se pueden ver las caractersticas del CC al teclear help + cdigo.m
Ejemplo:
>> help CC2
Codificador Convolucional (3, 1, 2) visto en clase
function [v] = CC2(u)
proporciona una salida codificada (v) para el CC(3, 1, 2)
con respuestas al impulso
g11 = [1 1 0]
g12 = [1 0 1]
g13 = [1 1 1]
para el vector de entrada u con formato [1 0 1 0 1 0...]
Para ver la respuesta al impulso del CC se introduce el vector [1] y se despliega de
manera demulticanalizado:
Ejemplos:
>> salida=CC2(1); [salida(1:3:end);salida(2:3:end);salida(3:3:end)]
ans =
1 1 0
1 0 1
1 1 1
>> salida=CC3(1); [salida(1:2:end);salida(2:2:end)]
ans =
1 0 0 0
1 1 0 1
Se verific su correcto funcionamiento al comparar los ejemplos vistos en clase.

Podra realizarse un script para verificar todas las combinaciones para cierta longitudes
de entradas y as verificar que las secuencias de salidas son absolutamente correctas,
aunque se considera que por ser un sistema lineal invariante en el tiempo (SLIT) y al
tener la respuesta al impulso correcta, la codificacin ser apropiada.
Para el caso del diagrama de Trellis, se escribi un cdigo para generar la tabla de
verdad que incluye: estado_previo, entrada, salida y estado siguiente. De tal manera
que se dio seguimiento a un tiempo posterior para hacer que el estadio siguiente se
convirtiera en el estado previo y as hacer crecer la tabla, tal como se muestra en las
tablas 1 y 2.
00 0 000 00 0 000 00 0 000 00 0 000 00 0 000 00 0 000 00 0 000 00
00 1 111 10 0 101 01 0 011 00 1 111 10 0 101 01 0 011 00 0 000 00
10 0 101 01 0 011 00 1 111 10 0 101 01 0 011 00 0 000 00 0 000 00
10 1 010 11 0 110 01 1 100 10 1 010 11 0 110 01 0 011 00 0 000 00
01 0 011 00 1 111 10 0 101 01 0 011 00 1 111 10 0 101 01 0 011 00
01 1 100 10 1 010 11 0 110 01 1 100 10 1 010 11 0 110 01 0 011 00
11 0 110 01 1 100 10 1 010 11 0 110 01 1 100 10 0 101 01 0 011 00
11 1 001 11 1 001 11 1 001 11 1 001 11 1 001 11 0 110 01 0 011 00

Tabla 1. Datos para el Trellis del CC(3, 1, 2)


000 0 00 000 0 00 000 0 00 000 0 00 000 0 00 000 0 00 000 0 00 000 0 00 000
000 1 11 100 0 01 010 0 00 001 0 01 000 1 11 100 0 01 010 0 00 001 0 01 000
100 0 01 010 0 00 001 0 01 000 1 11 100 0 01 010 0 00 001 0 01 000 0 00 000
100 1 10 110 0 01 011 0 01 001 1 10 100 1 10 110 0 01 011 0 01 001 0 01 000
010 0 00 001 0 01 000 1 11 100 0 01 010 0 00 001 0 01 000 0 00 000 0 00 000
010 1 11 101 0 00 010 1 11 101 0 00 010 1 11 101 0 00 010 0 00 001 0 01 000
110 0 01 011 0 01 001 1 10 100 1 10 110 0 01 011 0 01 001 0 01 000 0 00 000
110 1 10 111 0 00 011 1 10 101 1 11 110 1 10 111 0 00 011 0 01 001 0 01 000
001 0 01 000 1 11 100 0 01 010 0 00 001 0 01 000 0 00 000 0 00 000 0 00 000
001 1 10 100 1 10 110 0 01 011 0 01 001 1 10 100 0 01 010 0 00 001 0 01 000
101 0 00 010 1 11 101 0 00 010 1 11 101 0 00 010 0 00 001 0 01 000 0 00 000
101 1 11 110 1 10 111 0 00 011 1 10 101 1 11 110 0 01 011 0 01 001 0 01 000
011 0 01 001 1 10 100 1 10 110 0 01 011 0 01 001 0 01 000 0 00 000 0 00 000
011 1 10 101 1 11 110 1 10 111 0 00 011 1 10 101 0 00 010 0 00 001 0 01 000
111 0 00 011 1 10 101 1 11 110 1 10 111 0 00 011 0 01 001 0 01 000 0 00 000
111 1 11 111 1 11 111 1 11 111 1 11 111 1 11 111 0 00 011 0 01 001 0 01 000

Tabla 2. Datos para el Trellis del CC(2, 1, 3)


Con los datos generados es posible realizar los trazos para formar un diagrama Trellis,
tal como se muestra en las figuras 3 y 4, las cuales muestran los Trellis para los CC(3, 1,
2) y CC(2, 1, 3), respectivamente

Figura 3. Diagrama de Trellis para el CC(3, 1, 2)

Figura 3. Diagrama de Trellis para el CC(2, 1, 3)

En las siguientes pginas se muestra el cdigo en Matlab del trabajo realizado. Consta
de las funciones CC2.m y CC3.m para realizar la CC(3, 1, 2) y CC(2, 1, 3)
respectivamente. Tambin estan los cdigos TrellisA.m y TrellisB.m para obtener
directamente la grfica Trellis de los CC(3, 1, 2) y CC(2, 1, 3), respectivamente:

Cdigo fuente:
% Codificador Convolucional (3, 1, 2) visto en clase
%
% function [v] = CC2(u)
%
% proporciona una salida codificada (v) para el CC(3, 1, 2)
% con respuestas al impulso
% g11 = [1 1 0]
% g12 = [1 0 1]
% g13 = [1 1 1]
% para el vector de entrada u con formato [1 0 1 0 1 0...]
function [v] = CC2(u)
g11 = [1 1 0];
g12 = [1 0 1];
g13 = [1 1 1];
%% codificacin
v1 = mod(conv(u, g11), 2);
v2 = mod(conv(u, g12), 2);
v3 = mod(conv(u, g13), 2);
%% multicanalizar
% se reacomodan las salidas v1, v2 y v3 en una salida nica siguiendo
% la secuencia:
% v = v1(1)v2(1)v3(1), v1(2)v2(2)v3(1), ..., v1(end)v2(end)v3(end)
v=zeros(1, length(v1)*3);
v(1:3:end) = v1;
v(2:3:end) = v2;
v(3:3:end) = v3;

% Codificador Convolucional Sistemtico (2, 1, 3) visto en clase


%
% function [v] = CC3(u)
%
% proporciona una salida codificada (v) para el CC(2, 1, 3)
% con respuestas al impulso
% g11 = [1 0 0 0]
% g12 = [1 1 0 1]
% para el vector de entrada u con formato [1 0 1 0 1 0...]
function [v] = CC3(u)
g11 = [1 0 0 0];
g12 = [1 1 0 1];
%% codificacin
v1 = mod(conv(u, g11), 2);
v2 = mod(conv(u, g12), 2);
%% multicanalizar
% se reacomodan las salidas v1 y v2 en una salida nica siguiendo
% la secuencia:
% v = v1(1)v2(1), v1(2)v2(2), ..., v1(end)v2(end)
v=zeros(1, length(v1)*2);
v(1:2:end) = v1;
v(2:2:end) = v2;

%% trellis del CC(3, 1, 2)


clear all
%% respuestas al impulso del CC
g1 = [1 1 0];
g2 = [1 0 1];
g3 = [1 1 1];
%%
cantidad_bits = 5;
m = length(g1) - 1;
U = de2bi(0:power(2, m+1)-1); %se generan todas las combinaciones de entrada
tabla = [zeros(length(U),1), U(:, 2), U(:, 3)];

for tiempo = 1:cantidad_bits,


for indice=1:length(U),
salida(indice, :) = ...
[ mod(sum(and(U(indice, :), g1)), 2), ... %bit0 de salida
mod(sum(and(U(indice, :), g2)), 2), ... %bit1 de salida
mod(sum(and(U(indice, :), g3)), 2)]; %bit2 de salida
end %for indice
%para desplegar en el formato visto en clase
%[estado(bb), bit_entrante], se reordenan "U" y "salida"
entrada = U(:, 1);
estado_nuevo = [U(:, 1), U(:, 2)];
tabla = [tabla, entrada, salida, estado_nuevo];
entrada = U(:, 3);
U = [entrada, tabla(:, [end-1, end])];
end %for tiempo
entrada = zeros(length(U),1);
U = [entrada, tabla(:, [end-1, end])];
for tiempo = 1:m,
for indice=1:length(U),
salida(indice, :) = ...
[ mod(sum(and(U(indice, :), g1)), 2), ... %bit0 de salida
mod(sum(and(U(indice, :), g2)), 2), ... %bit1 de salida
mod(sum(and(U(indice, :), g3)), 2)]; %bit2 de salida
end %for indice
%para desplegar en el formato visto en clase
%[estado(bb), bit_entrante], se reordenan "U" y "salida"
estado_nuevo = [U(:, 1), U(:, 2)];
tabla = [tabla, entrada, salida, estado_nuevo];
U = [entrada, tabla(:, [end-1, end])];
end %for tiempo
tabla = tabla(:, [2: end]);
%% graficar trellisA
entradas=tabla(:,3:6:end);
salidas=tabla(:,4:6:end)*1+tabla(:,5:6:end)*2+tabla(:,6:6:end)*4;
estados=tabla(:, 1:6:end)*1 + tabla(:, 2:6:end)*2;
[R, C] = size(estados);
x=0:C-1;
valido=ones(R,C);
valido(3:end, 1)=0;
valido(3:4, 2)=0;
valido(7:8, 2)=0;
[I1, J1]=find(estados==1);
[I2, J2]=find(estados==2);
for indice_I1=1:length(I1), estados(I1(indice_I1), J1(indice_I1))=2; end
for indice_I2=1:length(I2), estados(I2(indice_I2), J2(indice_I2))=1; end
figure
hold on
for indice_R=1:R,
for indice_C=1:C-1,
if valido(indice_R, indice_C)==1,
if entradas(indice_R, indice_C)==0,
plot([(indice_C-1)*1, indice_C*1], estados(indice_R, indice_C:indice_C+1 )*1, ':ro', 'LineWidth', 2,
'MarkerEdgeColor', 'k','MarkerFaceColor',[.9 .9 .9], 'MarkerSize',15)
text((indice_C+indice_C-1)/2-.04, (estados(indice_R, indice_C)+estados(indice_R, indice_C+1))/2-.1,
num2str(salidas(indice_R, indice_C)), 'Fontsize', 12, 'Color', 'r')
end
if entradas(indice_R, indice_C)==1,
plot([(indice_C-1)*1, indice_C*1], estados(indice_R, indice_C:indice_C+1 )*1, '-bo', 'LineWidth', 2,
'MarkerEdgeColor', 'k','MarkerFaceColor',[.9 .9 .9], 'MarkerSize',15)
text((indice_C+indice_C-1)/2-.04, (estados(indice_R, indice_C)+estados(indice_R, indice_C+1))/2+.1,
num2str(salidas(indice_R, indice_C)), 'Fontsize', 12, 'Color', 'b')
end
end
end
end
plot(7.3, 0, 'o', 'LineWidth', 2, 'MarkerEdgeColor', 'k','MarkerFaceColor',[.9 .9 .9], 'MarkerSize',15)
text(7.6, 0, 'estado 0', 'Fontsize', 12, 'Color', 'k')
plot(7.3, 1, 'o', 'LineWidth', 2, 'MarkerEdgeColor', 'k','MarkerFaceColor',[.9 .9 .9], 'MarkerSize',15)
text(7.6, 1, 'estado 2', 'Fontsize', 12, 'Color', 'k')
plot(7.3, 2, 'o', 'LineWidth', 2, 'MarkerEdgeColor', 'k','MarkerFaceColor',[.9 .9 .9], 'MarkerSize',15)
text(7.6, 2, 'estado 1', 'Fontsize', 12, 'Color', 'k')
plot(7.3, 3, 'o', 'LineWidth', 2, 'MarkerEdgeColor', 'k','MarkerFaceColor',[.9 .9 .9], 'MarkerSize',15)
text(7.6, 3, 'estado 3', 'Fontsize', 12, 'Color', 'k')
plot([0, 1.2], [3,3],':ro', 'LineWidth', 2, 'MarkerEdgeColor', 'k','MarkerFaceColor',[.9 .9 .9], 'MarkerSize',15)

plot([0, 1.2], [2.5,2.5],'-bo', 'LineWidth', 2, 'MarkerEdgeColor', 'k','MarkerFaceColor',[.9 .9 .9], 'MarkerSize',15)


text([0.2, 0.2], [2.7, 3.2], ['entrada 1'; 'entrada 0'], 'Fontsize', 12, 'Color', 'k')
text([0], [2.2], ['Salida en octal'], 'Fontsize', 12, 'Color', 'k')
axis([-.5, 9, -.5, 3.5])
title('Diagrama de Trellis del CC(3,1,2)')
xlabel('tiempo')
hold off

%% trellis del CC Sistemtico (2, 1, 3) visto en clase


clear all
%% respuestas al impulso del CC
g1 = [1 0 0 0];
g2 = [1 1 0 1];
%%
cantidad_bits = 5;
m = length(g1) - 1;
U = de2bi(0:power(2, m+1)-1); %se generan todas las combinaciones de entrada
tabla = [zeros(length(U),1), U(:, 2), U(:, 3), U(:, 4)];
for tiempo = 1:cantidad_bits,
for indice=1:length(U),
salida(indice, :) = ...
[ mod(sum(and(U(indice, :), g1)), 2), ... %bit0 de salida
mod(sum(and(U(indice, :), g2)), 2)]; %bit1 de salida
end %for indice
%para desplegar en el formato visto en clase
%[estado(bb), bit_entrante], se reordenan "U" y "salida"
entrada = U(:, 1);
estado_nuevo = U(:, 1:end-1);
tabla = [tabla, entrada, salida, estado_nuevo];
entrada = U(:, end);
U = [entrada, tabla(:, [end-2, end-1, end])];
end %for tiempo
entrada = zeros(length(U),1);
U = [entrada, tabla(:, [end-2, end-1, end])];
for tiempo = 1:m,
for indice=1:length(U),
salida(indice, :) = ...
[ mod(sum(and(U(indice, :), g1)), 2), ... %bit0 de salida
mod(sum(and(U(indice, :), g2)), 2)]; %bit1 de salida
end %for indice
%para desplegar en el formato visto en clase
%[estado(bb), bit_entrante], se reordenan "U" y "salida"
estado_nuevo = [U(:, 1), U(:, 2), U(:, 3)];
tabla = [tabla, entrada, salida, estado_nuevo];
U = [entrada, tabla(:, [end-2, end-1, end])];
end %for tiempo
tabla = tabla(:, [2: end]);
%% graficar trellisB
entradas=tabla(:,4:6:end);
salidas=tabla(:,5:6:end)*1+tabla(:,6:6:end)*2;
estados=tabla(:, 1:6:end)*1 + tabla(:, 2:6:end)*2 + tabla(:, 3:6:end)*4;
[R, C] = size(estados);
x=0:C-1;
valido=ones(R,C);
valido(3:end, 1)=0;
valido(3:8 , 2)=0; valido(11:end, 2)=0;
valido(3:4:end , 3)=0; valido(4:4:end, 3)=0;
[I3, J3]=find(estados==3);
[I6, J6]=find(estados==6);
[I1, J1]=find(estados==1);
[I4, J4]=find(estados==4);
for indice_I1=1:length(I1), estados(I1(indice_I1), J1(indice_I1))=4; end
for indice_I4=1:length(I4), estados(I4(indice_I4), J4(indice_I4))=1; end
for indice_I3=1:length(I3), estados(I3(indice_I3), J3(indice_I3))=6; end
for indice_I6=1:length(I6), estados(I6(indice_I6), J6(indice_I6))=3; end
figure
hold on
for indice_R=1:R,
for indice_C=1:C-1,
if valido(indice_R, indice_C)==1,
if entradas(indice_R, indice_C)==0,
plot([(indice_C-1)*1, indice_C*1], estados(indice_R, indice_C:indice_C+1 )*1, ':ro', 'LineWidth', 2,
'MarkerEdgeColor', 'k','MarkerFaceColor',[.9 .9 .9], 'MarkerSize',15)

text((indice_C+indice_C-1)/2-.09, (estados(indice_R, indice_C)+estados(indice_R, indice_C+1))/2-.1,


num2str(salidas(indice_R, indice_C)), 'Fontsize', 12, 'Color', 'r')
end
if entradas(indice_R, indice_C)==1,
plot([(indice_C-1)*1, indice_C*1], estados(indice_R, indice_C:indice_C+1 )*1, '-bo', 'LineWidth', 2,
'MarkerEdgeColor', 'k','MarkerFaceColor',[.9 .9 .9], 'MarkerSize',15)
text((indice_C+indice_C-1)/2-.09, (estados(indice_R, indice_C)+estados(indice_R, indice_C+1))/2+.1,
num2str(salidas(indice_R, indice_C)), 'Fontsize', 12, 'Color', 'b')
end
end
end
end
plot(8.8, 0, 'o', 'LineWidth', 2, 'MarkerEdgeColor', 'k','MarkerFaceColor',[.9 .9 .9], 'MarkerSize',15)
text(9.2, 0, 'estado 0', 'Fontsize', 12, 'Color', 'k')
plot(8.8, 1, 'o', 'LineWidth', 2, 'MarkerEdgeColor', 'k','MarkerFaceColor',[.9 .9 .9], 'MarkerSize',15)
text(9.2, 1, 'estado 4', 'Fontsize', 12, 'Color', 'k')
plot(8.8, 2, 'o', 'LineWidth', 2, 'MarkerEdgeColor', 'k','MarkerFaceColor',[.9 .9 .9], 'MarkerSize',15)
text(9.2, 2, 'estado 2', 'Fontsize', 12, 'Color', 'k')
plot(8.8, 3, 'o', 'LineWidth', 2, 'MarkerEdgeColor', 'k','MarkerFaceColor',[.9 .9 .9], 'MarkerSize',15)
text(9.2, 3, 'estado 6', 'Fontsize', 12, 'Color', 'k')
plot(8.8, 4, 'o', 'LineWidth', 2, 'MarkerEdgeColor', 'k','MarkerFaceColor',[.9 .9 .9], 'MarkerSize',15)
text(9.2, 4, 'estado 1', 'Fontsize', 12, 'Color', 'k')
plot(8.8, 5, 'o', 'LineWidth', 2, 'MarkerEdgeColor', 'k','MarkerFaceColor',[.9 .9 .9], 'MarkerSize',15)
text(9.2, 5, 'estado 5', 'Fontsize', 12, 'Color', 'k')
plot(8.8, 6, 'o', 'LineWidth', 2, 'MarkerEdgeColor', 'k','MarkerFaceColor',[.9 .9 .9], 'MarkerSize',15)
text(9.2, 6, 'estado 3', 'Fontsize', 12, 'Color', 'k')
plot(8.8, 7, 'o', 'LineWidth', 2, 'MarkerEdgeColor', 'k','MarkerFaceColor',[.9 .9 .9], 'MarkerSize',15)
text(9.2, 7, 'estado 7', 'Fontsize', 12, 'Color', 'k')
plot([0, 1], [6.5,6.5],':ro', 'LineWidth', 2, 'MarkerEdgeColor', 'k','MarkerFaceColor',[.9 .9 .9], 'MarkerSize',15)
plot([0, 1], [6 ,6 ],'-bo', 'LineWidth', 2, 'MarkerEdgeColor', 'k','MarkerFaceColor',[.9 .9 .9], 'MarkerSize',15)
text([0.2, 0.2], [6.2,6.7], ['entrada 1'; 'entrada 0'], 'Fontsize', 12, 'Color', 'k')
text([0], [5.5], ['Salida en decimal 0-3'], 'Fontsize', 12, 'Color', 'k')
axis([-.5, 10, -.5, 7.5])
title('Diagrama de Trellis del CCS(2, 1, 3)')
xlabel('tiempo')
hold off

Conclusiones:
Se puede verificar lo aprendido en clase con respecto a codificacin convolucinal, al
realizar una codificacin en Matlab del algoritmo necesario para obtener la codificacin
convolucional as como graficar el diagrama de Trellis para un cdigo dado.

Bibliografa:
Notas del curso

T. Moon, Error Correction Coding, 1a Edicin, Wiley, 2005

www.mathworks.com

You might also like