Está en la página 1de 4

Codificador Hamming

hnoguera.wordpress.com

Archivo CalcularPatronError.m
% Autor: Herminio Noguera Ruiz.
function [salida] = CalcularPatronError(sindrome);
% Calcula el patrn de error dada la matriz de sndromes. Matriz de salida
% de tres columnas.
filas = size(sindrome, 1);
salida = zeros(filas, 7);
for i = 1:filas
if sum(xor(sindrome(i, :), [0,0,0])) == 0
salida(i, :) = [0,0,0,0,0,0,0];
end
if sum(xor(sindrome(i, :), [0,0,1])) ==
salida(i, :) = [0,0,1,0,0,0,0];
end
if sum(xor(sindrome(i, :), [0,1,0])) ==
salida(i, :) = [0,1,0,0,0,0,0];
end
if sum(xor(sindrome(i, :), [0,1,1])) == 0
salida(i, :) = [0,0,0,1,0,0,0];
end
if sum(xor(sindrome(i, :), [1,0,0])) ==
salida(i, :) = [1,0,0,0,0,0,0];
end
if sum(xor(sindrome(i, :), [1,0,1])) ==
salida(i, :) = [0,0,0,0,1,0,0];
end
if sum(xor(sindrome(i, :), [1,1,0])) ==
salida(i, :) = [0,0,0,0,0,1,0];
end
if sum(xor(sindrome(i, :), [1,1,1])) ==
salida(i, :) = [0,0,0,0,0,0,1];
end
end

0
0

0
0
0
0

Archivo CodificacionLineal.m
function [salida] = CodificacionLineal(senyal, m_gen);
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%

------------------------------------------------------------------------CODIFICADOR HAMMING
------------------Entrada:
-------'senyal' es el vector de valores unit8 del sonido original.
'm_gen' es la matriz generadora para el cdigo bloque lineal (matriz 4x7)
Salida:
------'out' es una matriz de 7 columnas y el doble de filas que 'senyal'. Cada
columna equivale a una palabra cdigo.
Autor: Herminio Noguera Ruiz.
-------------------------------------------------------------------------

tam=length(senyal);
salida=zeros(2*tam,7);
for i=1:tam
mensaje = DividirEnDos(senyal(i));
salida(2*i-1,:) = ProductoMatricesMod2(mensaje(1,:), m_gen);
salida(2*i,:) = ProductoMatricesMod2(mensaje(2,:), m_gen);
end

Archivo CuatroBitsAEntero.m
% Autor: Herminio Noguera Ruiz.
function [salida] = CuatroBitsAEntero(matriz_4b)
% Toma una matriz binaria de 4 columnas y cualquier nmero par de filas y
% construye con la ayuda de la funcion 'matriz_de_4bits' un nmero binario
% de 8 bits que luego pasa a decimal.
[filas, columnas] = size(matriz_4b);
salida = uint8(zeros(filas/2, 1));
for i = 1:filas/2
for j = 1:4
salida(i) = salida(i) + matriz_4b(2*i-1, j) * 2^(8-j);
salida(i) = salida(i) + matriz_4b(2*i, j) * 2^(4-j);
end
end

Archivo DividirEnDos.m
% Autor: Herminio Noguera Ruiz.
function [salida] = DividirEnDos(entero);
% Divide un entero en dos nmeros binarios de 4 bits.
salida = zeros(2,4);
for i = 8:-1:1
if i > 4
if (entero >= 2^(i-1))
salida(1, 8-i+1) = 1;
entero = entero - 2^(i-1);
end
else
if (entero >= 2^(i-1))
salida(2, 4-i+1) = 1;
entero = entero - 2^(i-1);
end
end
end

Archivo ProductoMatricesMod2.m
% Autor: Herminio Noguera Ruiz.
function [salida] = ProductoMatricesMod2(matriz1, matriz2);
% Calcula el producto modulo 2 de matrices binarias.
[filas1, columnas1] = size(matriz1);
[filas2, columnas2] = size(matriz2);
if columnas1 ~= filas2
'Matrices no multiplicables'
else
salida = zeros(filas1, columnas2);
for i = 1:filas1
for j = 1:columnas2
for k = 1:columnas1
salida(i,j) = xor(salida(i,j), matriz1(i,k) * matriz2(k,j));
end
end
end
end
end

Archivo Test.m
% Archivo para testeo del funcionamiento del Codificador Hamming.
%
% Autor: Herminio Noguera Ruiz.
G = [[0,1,1;1,0,1;1,1,0;1,1,1], eye(4)]; % Matriz generadora del cdigo.
senyal = uint8(wavread('prueba.wav')*255); % Almacena el archivo de audio en una variable.
wavplay(senyal,8000); % Reproduce el archivo de audio almacenado en la variable.
subplot(2,2,1), plot(senyal); % Muestra la grfica del sonido almacenado.
title('Seal original');
mensaje_codificado = CodificacionLineal(senyal, G);
PB=0.01; % Probabilidad de error de bit.
H = [eye(3), transpose([0,1,1;1,0,1;1,1,0;1,1,1])]; % Matriz de control de paridad.
error_de_canal = rand(size(mensaje_codificado))<=PB; % Simula errores de canal segn PB.
senyal_corrupta_7bits = xor(error_de_canal, mensaje_codificado); % Aade error a seal original.
senyal_corrupta_4bits = senyal_corrupta_7bits(:, [4,5,6,7]);
senyal_corrupta = CuatroBitsAEntero(senyal_corrupta_4bits);
subplot(2,2,2), plot(senyal_corrupta); % Muestra la grfica del sonido corrupto.
title('Seal corrupta (ignorando bits de paridad)');
wavplay(uint8(senyal_corrupta), 8000); % Reproduce la seal corrupta (sin codificar ni decodificar).
sindrome = ProductoMatricesMod2(senyal_corrupta_7bits, transpose(H)); % Calcula la matriz de
sndromes.
% Correccin errores.
senyal_recuperada_7bits = xor(CalcularPatronError(sindrome), senyal_corrupta_7bits);
senyal_recuperada_4bits = senyal_recuperada_7bits(:, [4,5,6,7]);
senyal_recuperada = CuatroBitsAEntero(senyal_recuperada_4bits); % Convierte a enteros.
subplot(2,2,3), plot(senyal_recuperada); % Muestra la grfica de la seal recuperada.
title('Seal recuperada (tras codificado lineal y decodificado)');
wavplay(uint8(senyal_recuperada), 8000); % Reproduce la seal recuperada tas codificar y decodificar.

hnoguera.wordpress.com

También podría gustarte