Sei sulla pagina 1di 4

Codificador Hamming

hnoguera.wordpress.com

Archivo CalcularPatronError.m

% Autor: Herminio Noguera Ruiz.

function [salida] = CalcularPatronError(sindrome);

% Calcula el patrón de error dada la matriz de síndromes. 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])) == 0
salida(i, :) = [0,0,1,0,0,0,0];
end
if sum(xor(sindrome(i, :), [0,1,0])) == 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])) == 0
salida(i, :) = [1,0,0,0,0,0,0];
end
if sum(xor(sindrome(i, :), [1,0,1])) == 0
salida(i, :) = [0,0,0,0,1,0,0];
end
if sum(xor(sindrome(i, :), [1,1,0])) == 0
salida(i, :) = [0,0,0,0,0,1,0];
end
if sum(xor(sindrome(i, :), [1,1,1])) == 0
salida(i, :) = [0,0,0,0,0,0,1];
end
end
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 código 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 código.
%
% 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 número par de filas y


% construye con la ayuda de la funcion 'matriz_de_4bits' un número 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 números 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 código.


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 gráfica del sonido almacenado.
title('Señal 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 según PB.
senyal_corrupta_7bits = xor(error_de_canal, mensaje_codificado); % Añade error a señal 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 gráfica del sonido corrupto.
title('Señal corrupta (ignorando bits de paridad)');
wavplay(uint8(senyal_corrupta), 8000); % Reproduce la señal corrupta (sin codificar ni decodificar).

sindrome = ProductoMatricesMod2(senyal_corrupta_7bits, transpose(H)); % Calcula la matriz de


síndromes.
% Corrección 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 gráfica de la señal recuperada.


title('Señal recuperada (tras codificado lineal y decodificado)');
wavplay(uint8(senyal_recuperada), 8000); % Reproduce la señal recuperada tas codificar y decodificar.

hnoguera.wordpress.com

Potrebbero piacerti anche