XXIII Curso de Especialização em Teleinformática e Redes de Computadores www.teleinfo.ct.utfpr.edu.br Linguagem C e MATLAB Simulação de sistemas de comunicação digital abr-mai/2013 Prof. Gustavo B. Borba 1
Simulação de sistemas de comunicação digital Implementar em MATLAB a simulação dos seguintes sistemas de comunicação digital: Sistema 1 (sem codificação): Fonte binária equiprovável. Mensagens de 4 bits. Modulação binária antipodal (bipolar). Canal AWGN (additive white Gaussian noise). Demodulação por decisão abrupta. Sistema 2 (com codificação): Fonte binária equiprovável. Mensagens de 4 bits. Codificação: código de bloco linear [LBC] C(7,4) [Hamming]. Modulação binária antipodal (bipolar). Canal AWGN (additive white Gaussian noise). Demodulação por decisão abrupta. Decodificação: por síndrome. 2
Objetivos Avaliação de desempenho: Curva da taxa de erro de bit (BER) em função da relação sinal ruído (SNR em db). Para o sistema 1 e sistema 2: Implementar um script Matlab que recebe como parâmetro uma SNR em db máxima (SNRdbMax), calcula a BER(k) para as SNRs em db (SNRdb) de 0 até SNRdbMax com passo igual a 1 e, finalmente, plota a curva BER x SNR [db]. Plotar as duas curvas no mesmo gráfico e comparar o desempenho dos sitemas. 3
Curva BER x SNR [db] típica: BER = número de bits errados recebidos número total de bits transmitidos Interpretação: Uma BER de 10-4, por exemplo, indica que em 10.000 bits transmitidos, 1 bit poderá ser recebido errado. 4
Sistema 1: Diagrama em blocos e implementação 5
Sistema 1: Diagrama em blocos e implementação A simulação consite em calcular a BER(k) para diferentes SNRdb(k), onde k = 0,1,2,...,SNRdbMax. Com isso é possível plotar a curva BER x SNR[db]. Para cada SNRdb(k), o critério de parada é um número de erros limite (nelim). 6
Sistema 1: Código MATLAB Script (criar arquivo sim_sistema1.m): % sim_sistema1 [script] %-------------------------------------------------------------- USUÁRIO SNRdbMax = 8; %SNR[db] máxima a ser simulada nelim = 300; %número de erros limite para parar cálculo de cada BER %---------------------------------------------------------------------- SNRdb = 0:SNRdbMax; %SNRdb de 0 até SNRdbMax %mostra progresso e calcula BER para cada SNRdb for k=1:length(snrdb) disp(['calculando BER para SNR[dB] = ' num2str(snrdb(k))]) BER(k) = sistema1(snrdb(k), nelim); end figure %nova figura semilogy(snrdb, BER, 'r-d'); %eixo y em escala logarítmica xlabel(gca, 'SNR [db]'); %nome do eixo x ylabel(gca, 'BER'); %nome do eixo y title('desempenho do sistema'); %título 7
Sistema 1: Código MATLAB Função sistema1() (criar arquivo sistema1.m): function [ber] = sistema1(snrdb, nelim) nmsg = 0; %inicializa contador do número de mensagens ne = 0; %inicializa contador do número de erros sgma = 1/sqrt(2*10^(snrdb/10)); %variância do ruído Gaussiano %em função da snrdb while(ne < nelim) %FONTE (binária equiprovável, mensagens de 4 bits)... código nos próximos slides %MODULADOR (modulação binária antipodal)... código nos próximos slides %CANAL (AWGN)... código nos próximos slides %DEMODULADOR (demodulação por decisão abrupta)... código nos próximos slides %COMPARADOR... código nos próximos slides %CONTADOR DE ERROS... código nos próximos slides %CONTADOR DE MENSAGENS... código nos próximos slides end ber = ne/(nmsg*4); 8
Sistema 1: Código MATLAB Continuação função sistema1(): %FONTE (binária equiprovável, mensagens de 4 bits)* un = rand(1, 4); %vetor com 4 números aleatórios entre 0 e 1 %de distribuição uniforme mt = double(un > 0.5); %transforma em binário %* %Outra possibilidade: função randint() da Communication Toolbox; %m = randint(1,4,[0,1]); %MODULADOR (modulação binária antipodal) %se m = 0 -> sinal = -1 %se m = 1 -> sinal = +1 sinal = mt*2-1; %sinal (mensagem modulada) %CANAL (AWGN) %ruído Gaussiano com média 0 e variância sgma sinal = sinal + randn(1, 4)*sgma; %sinal com ruído 9
Sistema 1: Código MATLAB Continuação função sistema1(): %DEMODULADOR (demodulação por decisão abrupta) %se sinal(i) positivo -> mr(i) = 1 %se sinal(i) negativo -> mr(i) = 0 mr = double(sinal > 0); %COMPARADOR pe = bitxor(mt, mr); %vetor 4 posicoes; 1 significa erro %naquela posição de mr %CONTADOR DE ERROS ne = ne + sum(pe); %acumula o número de erros %CONTADOR DE MENSAGENS nmsg = nmsg + 1; %acumula o número de mensagens 10
Sistema 1: Resultado 11
Sistema 2: Diagrama em blocos Sistema 2 (com codificação): Fonte binária equiprovável. Mensagens de 4 bits. Codificação: código de bloco linear [LBC] C(7,4) [Hamming]. Modulação binária antipodal (bipolar). Canal AWGN (additive white Gaussian noise). Demodulação por decisão abrupta. Decodificação: por síndrome. 12
Código de bloco linear Detecta e corrige erros. C(n,k) exemplo: C(7,4) (C(7,4) é um código de Hamming). C(7,4) detecta 2 erros e corrige 1 erro. C(7,4) é um código perfeito: corrige todos os padrões cheios de erro (neste caso 1 erro) e nada mais. Mapeia um bloco de k bits na entrada para uma palavra de código de n bits na saída. 13
Código de bloco linear A codificação é feita através de uma matriz geradora G. A matriz geradora tem o seguinte formato: Esta matriz geradora é sistemática à direita. Assim, as palavras codificadas possuem o seguinte formato: 14
Código de bloco linear A decodificação envolve: Passo 1. Cálculo da síndrome Passo 2. Localização do erro Passo 3. Correção do erro Para a decodificação, utiliza-se uma matriz de verificação de paridade H. A matriz de verificação de paridade tem o seguinte formato: 15
Codificação ex.: C(7,4) A matriz geradora é dada: Multiplica-se a mensagem m (palavra a ser transmitida) pela matriz geradora: 16
Codificação ex.: C(7,4) Exemplo de uma operação de multiplicação da mensagem e da matriz geradora 17
Decodificação ex.: C(7,4) Passo 1. Cálculo da síndrome A matriz de verificação de paridade H, definida por H = [I (n-k)x(n-k) P T ] é: Para obter a síndrome S, multiplica-se a palavra de código recebida r pela matriz H transposta: S = r H T A síndrome é o resultado da verificação da paridade. Podese fazer uma analogia com o cenário médico: a identificação da enfermidade (síndrome) é o resultado de um teste diagnóstico (verificação de paridade). 18
Decodificação ex.: C(7,4) Passo 2. Localização do erro Para localizar o erro é necessário consultar uma tabela, chamada de lookup table da síndrome: Não há erro Todos os padrões de erro corrigíveis. Obs.: esta é a coluna do arranjo padrão (standard array) chamada de líder de classe lateral (coset leader). A coluna síndrome S dessa tabela foi obtida multiplicando-se cada padrão de erro pela matriz H T : 19
Decodificação ex.: C(7,4) Passo 3. Correção do erro Para corrigir o erro e obter a mensagem corrigida estimada U, basta inverter o bit b da palavra de código recebida r. b é o bit indicado pelo padrão de erro e obtido na lookup table da síndrome. Para inverter apenas o bit a ser corrigido: U = r e 20
Exemplo ex.: C(7,4) 21
Sistema 2: Implementação Inserir o codificador e o decodificador. Atenção no cálculo do desvio padrão do ruído do canal. Agora há a constante Rc=k/n. Os outros blocos e o cálculo da BER(k) para diferentes SNRdb(k) são similares aos do sistema 1. Pode-se utilizar uma condição extra para a parada da simulação: while((ne < nelim) && (nmsg < 200000)) 22
Sistema 2: Código Matlab Sugestões para a continuação 1. Criar os seguintes arquivos: Para o sistema 2, mesma estrutura do sistema 1: sim_sistema2.m [script] sistema2.m [função] Para a comparação dos dois sistemas: cmp_sistemas_12.m [script] Este script chama as funções sistema1 e sistema2 e plota as duas curvas em um mesmo gráfico. 2. Usar as seguintes funções do Communication Toolbox do MATLAB: syndtable( ) encode( ) decode( ) 23