Laboratório de Sistemas e Sinais L1: Matrizes, Sons e Imagens Luís Caldas de Oliveira Março de 2009 O objectivo deste laboratório é o de explorar a utilização de matrizes em Matlab e de usá-las para construir sinais de audio e imagens. O laboratório foi projectado para o ajudar a familiarizar-se com os fundamentos do Matlab. É estanque, no sentido em que não é necessária nenhuma documentação adicional sobre o Matlab pois, em vez disso, confiamos nas facilidades de ajuda on-line. O Matlab utiliza o termo função de uma forma mais alargada do que a utilizada quando nos referimos às funções matemáticas: todos os comandos do Matlab que recebem argumentos entre parênteses são chamados de função. A maioria têm um domínio e um contradomínio bem-definidos e definem, de facto, um mapeamento entre o domínio e o contradomínio. Estes podem ser vistos formalmente como funções (matemáticas). Outros, no entanto, como oplot e osound só mais dificilmente poderão ser vistos desta forma. Para iniciar o Matlab basta simplesmente clicar duas vezes sobre o ícone do Matlab no desktop, ou encontrar o comando do Matlab no menu start. Isto abrirá uma janela de comandos do Matlab, que apresenta um prompt >>. Os comandos devem ser introduzidos após o prompt. Explore os programas de demonstração pré-definidos com o comandodemo. Matlab oferece um sistema de ajuda on-line acessível usando o comando de help. Por exemplo, para obter informação sobre a funçãosize, introduza o seguinte: >> help size Há também um help desk (em formato HTML para ser lido num web browser) com material introdutório útil. Está disponível no menu de ajuda. Se não tiver nenhuma experiência prévia com Matlab, consulte o tópico Getting Started no help desk e dedique-lhe algum tempo. 1. Uma variável em Matlab é uma matriz. Uma matriz tem dimensões N M onde N e M pertencem aos Naturais. N é o número das linhas e M é o número das colunas. Se N = M = 1 a variável é um escalar. Se N = 1 e M > 1, então a variável é um vector linha. Se N > 1 e M = 1, então a variável é um vector coluna. Se N e M forem maiores do que um, então a variável é uma matriz, e se N = M então a variável é uma matriz quadrada. Os coeficientes de uma matriz são números reais ou complexos. (a) Cada uma das seguintes linhas contém uma atribuição de um valor a uma variável chamadamatriz. Para cada uma, identifique as dimensões da matriz (M e N) e diga se a variável é um escalar, um vector linha, um vector coluna ou uma matriz i. array = [1 2 3 4 5] ii. array = [1:5] iii. array = [1:1:5] iv. array = [1:-1:-5] v. array = [1 2; 3 4] vi. array = [1; 2; 3; 4] (b) Todas as seguintes atribuições correspondem a uma matriz 2 3. Compare as diferenças. i. array = zeros(2,3) ii. array = ones(2,3) iii. array = eye(2,3) iv. array = rand(2,3) 1
v. array = [ones(2,1) eye(2,2)] vi. array = [zeros(1,3); ones(1,3)] (c) Considere o construtor de matrizes array = start : step : stop onde o start, stop e step são variáveis escalares ou números reais. Quantos elementos contém array? Use os comandos size e length do Matlab para determinar o comprimento das matrizes dadas por1:0.3:10 e1:1:-1. (d) Um vector linha pode ser transformado num vector coluna usando a operação de transposição. Compare o resultado da execução dos seguintes comandos: i. transpose([1 2 3 4]) ii. [1 2 3 4]. iii. transpose([1 2*j 3 4]) (em Matlab j = i = ( 1)) iv. [1 2*j 3 4]. v. [1 2*j 3 4] 2. O Matlab pode ser usado como uma linguagem de programação de uso geral. No entanto, e ao contrário de uma linguagem de programação tradicional, o Matlab tem caraterísticas especiais para operar sobre matrizes que o tornam particularmente conveniente para modelar sinais e sistemas. (a) Neste exercício, usaremos o Matlab para calcular: Use um ciclofor (experimentehelp for) para calcular o resultado do somatório. 25 (b) Use a função sum para obter de uma forma mais compacta, com uma só linha, a soma da alínea anterior. A diferença entre estas duas aproximações ilustra a diferença entre o Matlab e uma linguagem de programação mais tradicional. O ciclo for está mais próximo doestilo que se usaria em C++ ou Java. A função desum ilustra o que o Matlab faz melhor: operações compactas em matrizes inteiras. (c) Em Matlab, toda a função pré-definida que opera sobre um escalar pode também operar sobre uma matriz. Por exemplo, >> sin(pi/4) 0.7071 >> sin([0 pi/4 pi/2 3*pi/4 pi]) 0 0.7071 1.0000 0.7071.0000 Esta caraterística é chamada de vectorização. Encontre uma expressão compacta para calcular o valor de: 9 ( sin k π ) 10 (d) Dadas duas matrizesaebque têm as mesmas dimensões, o Matlab pode multiplicar os seus elementos um a um usando o operador.*. Por exemplo, >> [1 2 3 4].* [1 2 3 4] 1 4 9 16 Encontre uma expressão compacta para calcular o valor de: 9 k ( sin k π ) ( cos k π ) 10 10 2
3. Um sinal em tempo discreto pode ser aproximado em Matlab por um vector (tanto linha como coluna). Neste exercício, irá construir alguns desses vectores e representá-los graficamente. (a) Crie uma matriz que seja um vector linha com comprimento 36, com zeros em toda parte excepto na 18 a posição, que tem o valor 1. (Sugestão: tente help zeros para encontrar uma maneira criar de um vector linha apenas com zeros, e atribua então ao 18 o elemento desse vector o valor um.). Este vector é uma aproximação de um impulso em tempo discreto, que é um sinal nulo em toda parte excepto numa amostra. Usaremos impulsos estudar sistemas lineares. Represente o sinal do impulso, usando plot estem. (b) Considere que a variável t representa o tempo em segundos no intervalo [ 1,1]. Tratando-se de um intervalo com infinitos pontos não o podemos representar directamente em Matlab. No entanto, recorrendo ao conceito de amostragem, podemos ter um vector com um número finito de elementos que representa esse intervalo. Crie uma variável t em Matlab que represente o intervalo de tempo [ 1, 1] amostrado ao ritmo de 8000 amostras por segundo (8000 Hz). (c) Utilize o vector definido na alínea anterior para representar o graficamente o sinal sinusoidal x : [ 1, 1] Reais, dada por t [ 1,1],x(t) = sin(2π 5t + π/6) Em que t é o tempo em segundos. Determine a frequência do sinal sinusoidal (o número de ciclos em cada segundo). (d) Mude a expressão da alínea anterior de forma a que o sinal passe a ter uma frequência de 440 Hz. Trace o gráfico do sinal no intervalo [ 1,1]. Por que é difícil ler o gráfico? Trace em seguida as amostras que se encontram no intervalo [0,0.01] (este é um intervalo de 10 ms). (e) A função Matlabsound (vejahelp sound ), que tem a seguinte sintaxe sound(sinalamostrado, frequencia) envia a matriz uni-dimensional ou vector sinalamostrado para a placa de audio do computador. O segundo argumento especifica a frequência de amostragem em amostras por segundo. Os valores no sinalamostrado devem ser números reais na gama [ 1.0, 1.0]. Se estiverem fora desta gama serão saturados em 1.0 ou 1.0. Use esta função para ouvir o sinal criado na alínea anterior. Oiça tanto o intervalo de 10 ms como um intervalo de 2 s. (f) Oiça os sinais e explique as diferenças relativamente ao que ouviu anteriormente: i. sound (0.5 * sinalamostrado, frequencia) ii. sound (2 * sinalamostrado, frequencia) iii. sound (sinalamostrado, frequencia/2) iv. sound (sinalamostrado, frequencia*2) 4. A figura 1 mostra uma imagem a preto e branco em que a intensidade da imagem varia sinusoidalmente no sentido vertical. A linha superior da imagem é constituída por píxeis brancos. Ao precorrer verticalmente a imagem no sentido descendente a intensidade varia gradualmente para preto, voltando em seguida de novo ao branco, terminando um ciclo. A imagem é 200x200 píxeis, pelo que a frequência vertical é de 1/200 ciclos por píxel. A imagem apresentada na página tem aproximadamente 10x10 centímetros, ou seja, a sua frequência vertical é de 0.1 ciclos por centímetro. A intensidade da imagem é constante no sentido horizontal (tem uma frequência horizontal dos ciclos 0 por centímetro). Uma imagem em Matlab pode ser representada como uma matriz com duas dimensões onde cada elemento indexa um mapa de cores. (a) Considere a imagem construída pelo comandoimage: >> v = [1:64]; >> image(v); Isto deverá criar uma imagem como a mostrada na figura 2. A imagem tem 1 píxel de altura por 64 píxeis de largura (o Matlab por omissão estica a imagem para caber em toda a janela rectangular para gráficos, por isso cada píxel será neste caso representado por um píxel muito alto). Pode-se usar a função Matlabrepmat para construir uma imagem mais alta do que 1 píxel pela repetição desta linha de um determinado número de vezes. 3
Figura 1: Uma imagem onde a intensidade varia sinusoidalmente no sentido vertical. Figura 2: Uma imagem do mapa de cores por omissão. 4
(b) Cada píxel tem um valor que varia entre 1 e 64. Estes valores servem para indexar o mapa de cores por omissão, que tem comprimento 64, e cobre uma variação contínua do azul ao vermelho através das cores do arco-íris. Para ver os valores numéricos do mapa de cores de omissão >> map = colormap para verificar seu tamanho >> size(map) 64 3 Repare que tem 64 linhas e três colunas. Cada linha é uma entrada no mapa de cores. As três colunas dão, respectivamente, as quantidades de vermelho, verde, e azul no mapa de cores. Estas quantidades variam de 0 (cor ausente) a 1 (intensidade máxima dessa cor). Examine o mapa de cores para verificar que começa com a cor azul e que termina com a vermelha. (c) Mude o mapa de cores usando o comandocolormap da seguinte forma: >> mapa = gray(256); >> colormap (mapa); >> imagem = 128*sin([0:199]*2*pi/200)+128; >> image(imagem); Examine a variável map para compreender a imagem resultante. A este mapa de cores chama-se grayscale colormap (tons de cinzento). Qual a representação para a cor branca e para a cor preta? (d) Execute a seguinte sequência de comandos em Matlab: >> mapa = gray(256); >> colormap (mapa); >> imagem= 128.*sin([0:199]. *4*pi/200)*sin([0:199]*4*pi/200)+128; >> image(imagem); Tente explicar o que observa. 5