Códigos Correctores de Errores Codificación Hamming Omar X. Avelar & J. Daniel Mayoral SISTEMAS DE COMUNICACIÓN & TRANSMISIÓN DE DATOS (ESI 043A) Instituto Tecnológico y de Estudios Superiores de Occidente (ITESO) Departamento de Electrónica, Sistemas e Informática (DESI) 1. OBJETIVO El objetivo de la práctica es verificar la ganancia en rendimiento que se obtiene en un sistema de comunicaciones cuando se utilizan códigos correctores de errores. 4. CODIFICACIÓN HAMMING El código corrector de Hamming (7,4) consiste en enviar 7 bits por cada 4, lo que nos define 3 bits de paridad. [G] Para esta codificación – las matriz de transformación 2. ENUNCIADO [ 1 0 G := 0 0 Vamos a tomar como base las tareas 10, 11 y 12. La idea es comparar el rendimiento de un sistema de comunicaciones antes y después de introducir la corrección de errores. Como requisito, vamos a pedir que ambos sistemas operen a la misma tasa de bit y a la misma potencia. Eso quiere decir que cada bit codificado lleva menos energía que los bits del sistema sin codificar. Aún así ́ la teoría predice que el código debe ser capaz de aumentar el rendimiento del sistema. 2. 3. Vamos a operar sobre tres tipos de información: imagen, audio y texto, utilizando comunicación con y sin un código corrector de errores Hamming (7,4). Dado que la tasa de transmisión de la información no debe variar, es necesario transmitir cada bit codificado más rápido (y por lo tanto con menos energía). Supongamos que vamos a transmitir con εb = 1, con valores de εb /N0 = 4 : 10dB. Para cada valor de SNR, encontrar la probabilidad de error en la comunicación. Usando esta probabilidad de error, utilizar el código de la tarea 10 para introducir errores en cada archivo. 0 0 1 0 0 0 0 1 1 1 0 1 1 0 1 1 0 1 1 1 ] Mientras que la matrix partiy check se define como es: [ 1 1 0 1 1 0 0 H := 1 0 1 1 0 1 0 0 1 1 1 0 0 1 3. PASOS A SEGUIR 1. 0 1 0 0 se define como: Para codificar un vector de 4 bits m con multiplicar la matriz de conversión Y a su vez se usa [H ] ] m1, m2, m3, m 4 , el cual va de U =mi G ij falta . para decodificar y detectar errores. S =r H T donde b es el dato codificado por la matriz de transformación nocido como codeword. [G] co- En caso de haber un error, el vector síndrome ( S ) no tendrá el valor [0, 0, 0] lo que indica que es un codeword valido y por lo tanto los primeros 4 bits del codeword son del dato y no hay que hacer ninguna modificación. De lo contrario de acuerdo al valor del síndrome y el acomodo de las matrices de transformación, se necesitan efectuar un toggle en el bit detectado como erróneo para corregirlo. NOVIEMBRE 2009 1 ITESO Códigos de Hamming Por: Omar X. Avelar & J. Daniel Mayoral 5. CÓDIGO (GNU OCTAVE) ## Copyright (C) 2009 Omar X. Avelar ## ## Introduces an error according to the probability ## Data input is an unsigned 8 Bit array. ## ## ## Copyright (C) 2009 Omar X. Avelar & ## J. Daniel Mayoral ## ## Communications and Data Transmission ## Guadalajara, Jalisco. ITESO. ## function stream_err = pErr( stream, Pm ) stream_err = zeros(size(stream)); error file n_err = round(Pm * length(stream))*8; Number bit errors clear all; cd Files; dir_contents = dir; cd ..; n_files = length(dir_contents) - 2; % Empty % % Random # For each file in the directory 'Files' for i=1:n_files errors err_tmp = randerr(length(stream) ,8, [1 0; Pm 1-Pm]); err_mask = bi2de(err_tmp); stream_err = bitxor(stream, err_mask); printf("\nProcessing: \"%s\" ...\n",dir_contents(i+2).name); dotpos = rindex(dir_contents(i+2).name,"."); ext = substr(dir_contents(i+2).name,dotpos); Extension extracted % endfunction curr_file = strcat("Files/",dir_contents(i+2).name); f_temp = fread(fopen(curr_file,'r')); File read as binary fclose(curr_file); % ## Copyright (C) 2009 Omar X. Avelar ## J. Daniel Mayoral ## ## Hamming 7,4 coding for GNU Octave, data input ## is an unsigned 8 Bit vertical array. ## function encoded_stream = Hamming74Encode( stream ) H = [ [1,1,0,1 ; 1,0,1,1 ; 0,1,1,1 ], eye(3,3) ]; % Check G = [ eye(4,4), [1,1,0 ; 1,0,1 ; 0,1,1; 1,1,1] ]; % Generator matrix % Prepares the data temp = de2bi(stream, 8); % to binary (MSB ... LSB) b4 = transpose(reshape(transpose(temp),4,size(temp,1)*2)); % Splits in sections of 4 % Encodes encoded_bin_stream = mod(b4*G,2); encoded_stream = bi2de(encoded_bin_stream); % Integer vertical matrix endfunction ## Copyright (C) 2009 Omar X. Avelar ## J. Daniel Mayoral ## ## Decodes a Hamming 7,4 code and outputs ## an unsigned 8 Bit vertical array. ## function [ stream, syndrome ] = Hamming74Decode( encoded_stream ) H = [ [1,1,0,1 ; 1,0,1,1 ; 0,1,1,1 ], eye(3,3) ]; G = [ eye(4,4), [1,1,0 ; 1,0,1 ; 0,1,1; 1,1,1] ]; tor matrix % Prepares the data temp = de2bi(encoded_stream,7); nary (MSB ... LSB) % Checks for errors b = transpose(temp); S = transpose(mod( H*b, 2)); Calculates the syndrome % Check % Genera% to bi- % err_pos = clip(round((bi2de(S, 'left-msb') / 1.5)),[0,5]); Error position according to the syndrome err_pos = err_pos .* (err_pos < 5); If there is 2 errors (val 5) don't correct err_pos_mask = de2bi(bitshift(2.^err_pos,-1),4,'left-msb'); b4 = bitxor(temp(1:end,1:4), err_pos_mask); Corrects the error % % % b8 = transpose(reshape(transpose(b4),8,size(b4,1)/2)); in 8 bits % Groups stream = bi2de(b8); vertical matrix syndrome = S; Syndrome % Integer % Extracts and saves the header depending on filetype if (ext == ".wav") file_header = f_temp(1:44); file_bin_data = f_temp(45:end); elseif (ext == ".bmp") file_header = f_temp(1:54); file_bin_data = f_temp(55:end); elseif (ext == ".txt") file_header = zeros(0,0); file_bin_data = f_temp(1:end); endif % Raw for SNRdB = 4:10 printf("Raw with %i dB\n", SNRdB); % Energy is constant SNR = 10^(SNRdB/10); % €b/No Pm = 0.5*erfc(sqrt(SNR)); % Probability error according to SNRdB err_data = pErr(file_bin_data, Pm); % Adds an error according to the probability % Data writing fw_cache = vertcat(file_header, err_data); fwrite(fopen([num2str(SNRdB),"dB(Raw)@",dir_contents(i+2).name], 'w+'), fw_cache); endfor % Hamming for SNRdB = 4:10 % Data processing printf("Hamming with %i dB\n", SNRdB); % Energy is constant, so the probability % increases SNR = 10^((SNRdB)/10); % (1/2)*(€b/No) Pm = 0.5*erfc(sqrt(SNR/2)); % Probability error according to SNRdB % Hamming code (7,4) tic(); encoded_data = Hamming74Encode(file_bin_data); toc(); tic(); err_data = pErr(encoded_data, Pm); % Adds an error according to the probability toc(); tic() [decoded_data, syndrome] = Hamming74Decode(err_data); % Decode toc(); printf("\n"); % Data writing fw_cache = vertcat(file_header, decoded_data); fwrite(fopen([num2str(SNRdB),"dB(Hamming)@",dir_contents(i+2).name ], 'w+'), fw_cache); endfor pause; endfor % endfunction NOVIEMBRE 2009 2 ITESO Códigos de Hamming Por: Omar X. Avelar & J. Daniel Mayoral 6. RESULTADOS Al correr el programa con diferentes tipos de archivos podemos observar que tan perceptible son los errores y la corrección de errores. De acuerdo a esta curva característica anterior, el desempeño debe iniciar su mejoría conforme nos alejamos del rango de 4~6 dB. Por ejemplo observemos en una imagen BMP con una resolución de 500x258 px. Fig. 3: SNR = 6 dB. Arriba – Transmisión sin ECC. Arriba – Codificación Hamming @ SNR. Fig. 1: SNR = 4 dB Arriba – Sin codificación Hamming. Abajo – Codificación Hamming.. Lo que nos corrobora la teoría del desempeño de la codificación Hamming que es terrible en bajas relaciones de señal a ruido (Fig.. 2). Fig. 2: Probabilidad de error vs. Eb/No (dB). NOVIEMBRE 2009 Fig. 4: NR = 6 dB. Arriba – Transmisión sin ECC. Arriba – Codificación Hamming @ SNR. 3 ITESO Códigos de Hamming Por: Omar X. Avelar & J. Daniel Mayoral Por otro lado la transmisión de archivos de texto es mas critica ya que cualquier error nos cambia los caracteres. Al ser un carácter en nuestro Iniciaremos la prueba en bajas relaciones de Eb/No. El texto original se podrá ir descubriendo mientras se observan las figuras. En cuanto a la transmisión de audio, se percibieron los mismos resultados (en un archivo de 3 segundos de WAV PCM) que lo visible en la codificación de imágenes BMP. Lo que se percibía como crackling al encontrarnos arriba de 6 dB fue prácticamente nulo con la transmisión de codificación Hamming. 7. CONCLUSIÓN La codificación de Hamming no es efectiva en relaciones de señal a ruido menores a 4 dB. La causa de esto puede ser vista que incluso teniendo nuestro código de (7,4) sucede lo siguiente. 1. La energía de bits es disminuida al estar enviando (7) bits por cada (4), lo que resulta que al encontrarnos con una relación Eb/No nos produzcan demasiados errores los bits, incluso mas que una transmisión pura ya que estos nos pierden energía. 2. El código de Hamming (7,4) es capaz de detectar 2 errores, pero solo puede corregir uno por frame. 3. Al disminuir la probabilidad de error el desempeño del código Hamming es excelente. La siguiente tabla expresa de manera subjetiva la percepción de error en los archivos codificados, donde a menores estrellas tenemos un archivo menos fiel al original. Fig. 5: SNR = 4dB. Arriba – Sin codificación Hamming. Abajo – Codificación Hamming.. En la Fig. 5 podemos observar como la codificación nos distorsiono la mayoría de los caracteres para los dos casos, de esta manera el lector de texto nos muestra unos caracteres los cuales no representan los originales. SNR (dB) Sin codificación Código Hamming 4 ✪ - 5 ✪ ✪✪ 6 ✪✪ ✪✪✪ 7 ✪✪ ✪✪✪✪ 8 ✪✪✪ ✪✪✪✪ 9 ✪✪✪ ✪✪✪✪✪ 10 ✪✪✪✪ ✪✪✪✪✪ De cuantificar el desempeño de código Hamming vs. sin codificación diría que: “Para una relación Eb/No de [n] dB sin codificación es perceptiblemente igual a una Hamming de [n-2] db.” De esta manera podemos ver que el sistema es mas robusto a un canal ruidoso, esta aproximación empírica es acorde a la Fig. 2. Fig. 6: SNR = 6dB. Arriba – Sin codificación Hamming. Abajo – Codificación Hamming.. De acuerdo a la Fig. 6, nuestro archivo de texto ya es decodificado incluso al transmitirlo sin ECC, pero se observan los errores. 1. El titulo solo se presenta correcto con codificación de Hamming. 2. La ultima palabra fue decodificada como collidmr mientras que con codificación de Hamming fue transmitida de manera correcta como collider. Ya a estas alturas de relación señal a ruido en el texto no era perceptible. NOVIEMBRE 2009 4