Sistemas de Processamento Digital Engenharia de Sistemas e Informática Ficha 1 2005/2006 4.º Ano/ 2.º Semestre Sistemas e Sinais e Discretos Nesta ficha pretende-se estudar os conceitos associados aos sinais e sistemas discretos no tempo. Além disso, será introduzido um número significativo de tipos de sinais importantes assim como as operações com os mesmos. Em termos gerais, a maior ênfase desta ficha será a representação e a implementação de sinais e sistemas com o MATLAB. Sistemas Discretos no Tempo Os sinais são normalmente classificados em analógicos e discretos. Um sinal analógico será apresentado com a seguinte notação x a (t), no qual a variável t representa o tempo em segundos. Por outro lado um sinal discreto será representado por x(n), no qual a variável n é um valor inteiro, que representa instantes temporais. Assim chama-se sinal discreto no tempo, a uma sequência de números que é denotada com a seguinte notação:..., x( 1), x( 0), x( 1),... = = ( ) { xn ( )} xn onde a seta indica a posição da amostra em n=0. No MATLAB representa-se uma sequência de duração finita através dum vector linha, de valores. Contudo, este vector não contém informação sobre a posição da amostra n. Assim, uma representação correcta de x(n), necessita de dois vectores, um para x e outro para n. Por exemplo, a sequência 2, 1, 1, 0, 1, 4, 3, 7 xn ( ) = { xn ( )} = Pode ser representada no MATLAB como, >>n=[-3,-2,-2,0,1,2,3,4]; x=[2,1,-1,0,1,4,3,7]; Geralmente, utiliza-se um vector x isolado quando a posição da amostra não é necessária, ou quando essa informação é trivial (e.g. quando a sequência começa em n=0). Uma sequência arbitrária de duração infinita não pode ser representada em MATLAB, devido às limitações de memória. Tipos de Sequências Em geral, no processamento digital de sinal utilizam-se várias sequências elementares para objectivos de análise. Seguidamente, apresenta-se a sua representação em MATLAB. Impulso Unitário δ ( n) 1, n = 0 = =..., 0, 0,1, 0, 0,... 0 n 0 Sistemas de Processamento Digital Manuel A. E. Baptista 1
Para implementar δ, no intervalo n 1 n 0 n 2, usa-se o seguinte código: function [x,n] = impseq(n0,n1,n2) Gera x(n) = delta(n-n0); n1 <= n,n0 <= n2 ---------------------------------------------- [x,n] = impseq(n0,n1,n2) if ((n0 < n1) (n0 > n2) (n1 > n2)) error('os argumentos devem satisfazer a condicao n1 <= n0 <= n2') end n = [n1:n2]; x = [zeros(1,(n0-n1)), 1, zeros(1,(n2-n0))]; x = [(n-n0) == 0]; Degrau Unitário ( ) u n 1, n >= 0 = =..., 0, 0,1, 1, 1,... 0 n < 0 Para implementar u(n), no intervalo n 1 n 0 n 2, usa-se o seguinte código: function [x,n] = stepseq(n0,n1,n2) Gera x(n) = u(n-n0); n1 <= n,n0 <= n2 ------------------------------------------ [x,n] = stepseq(n0,n1,n2) if ((n0 < n1) (n0 > n2) (n1 > n2)) error('os argumentos devem satisfazer n1 <= n0 <= n2') end n = [n1:n2]; x = [zeros(1,(n0-n1)), ones(1,(n2-n0+1))]; x = [(n-n0) >= 0]; Sequência Exponencial Real n ( ), ; x n = a n a Em MATLAB o operador array.^ é necessário para implementar uma sequência exponencial real. Por exemplo, para gerar x(n) = (0.9) n, 0 n 10, precisamos da seguinte script em MATLAB: >> n = [0:10]; x = (0.9).^n; Sequência Exponencial Complexa ( ) ( σ+ jω ) = 0 n x n e n Onde α é a atenuação e ω 0 é a frequência em radianos. A função exp do MATLAB é usada para gerar a sequência exponencial. Por exemplo, para gerar x(n) = exp [(2 + j3)n], 0 n 10, é necessária a seguinte script: >> n = [0:10]; x = exp((2+3j)*n); Sequência Sinusoidal ( ) ( ω θ) x n = cos n+, n 0 Sistemas de Processamento Digital Manuel A. E. Baptista 2
Onde t é a fase em radianos. Uma função MATLAB cos (ou sin) é usada para gerar sequências sinusoidais. Por exemplo, para gerar x(n) = 3 cos(0.1πn+π/3) + 2 sin(0.5πn), 0 n 10, é necessária a seguinte script: >> n = [0:10]; x = 3*cos(0.1*pi*n+pi/3) + 2*sin(0.5*pi*n); Sequência Aleatória Em MATLAB para gerar uma sequência aleatória de N amostras, existem dois tipos de sequências pseudoaleatórias. A função rand(1,n) gera uma sequência aleatória de comprimento N, cujos os elementos se encontram distribuídos uniformemente em [0,1]. Por outro lado, a função randn(1,n) gera uma sequência N aleatória com distribuição Gaussiana, com valor médio 0 e variância 1. Sequência Periódica Uma sequência x(n) é periódica se x(n) = x(n + N), n. O menor valor inteiro N que satisfaz a relação ~ anterior, designa-se por período fundamental. Neste caso utiliza-se x (n), para representar uma sequência ~ periódica. Para gerar P períodos de x (n) a partir de um período {x(n), 0 n N-1}, podemos copiar x(n), P vezes: >> xtilde = [x,x,,x]; Mas, uma forma elegante em MATLAB, apela à utilização das suas capacidades de indexação. Em primeiro lugar, gera-se uma matriz contendo P linhas de dos valores x(n). Depois, pode-se concatenar P linhas num vector mais comprido, usando o construtor (:). Contudo, este construtor funciona apenas com colunas. Assim teremos de usar o operador que calcula a transposta duma matriz,, para obtermos o mesmo efeito. >> xtilde = x *ones(1,p); P colunas de x; x é um vector linha >> xtilde = xtilde(:); vector coluna mais comprido >> xtilde = xtilde ; vector linha mais comprido Operações com sequências Adição de sinais Esta adição amostra amostra é dada por {x 1 (n)} + {x 2 (n)} = {x 1 (n) + x 2 (n)} A sua implementação em MATLAB faz-se através do operador aritmético +. Contudo, os comprimentos das sequências x1(n) e x2(n) deverão ser os mesmos. Se as sequências forem de comprimentos diferentes, ou se a posição das amostras for diferente entre sequências com o mesmo tamanho, este operador não pode ser usado directamente. Em MATLAB podemos então implementar a seguinte função: function [y,n] = sigadd(x1,n1,x2,n2) implements y(n) = x1(n)+x2(n) ----------------------------- [y,n] = sigadd(x1,n1,x2,n2) y = soma da sequencia em n, que inclui n1 e n2 x1 = primeira sequencia em n1 x2 = segunda sequência em n2 (n2 pode ser diferente de n1) n = min(min(n1),min(n2)):max(max(n1),max(n2)); duração de y(n) y1 = zeros(1,length(n)); y2 = y1; inicialização y1(find((n>=min(n1))&(n<=max(n1))==1))=x1; x1 com duração de y y2(find((n>=min(n2))&(n<=max(n2))==1))=x2; x2 com duração de y y = y1+y2; Sistemas de Processamento Digital Manuel A. E. Baptista 3
Multiplicação de sinais Esta adição amostra amostra é dada por {x 1 (n)}. {x 2 (n)} = {x 1 (n)x 2 (n)} Esta é implementada através do operador de array.*. Mais uma vez, se aplicam as mesmas restrições para a aplicação do operador.*, como no caso do operador +. function [y,n] = sigmult(x1,n1,x2,n2) implements y(n) = x1(n)*x2(n) ----------------------------- [y,n] = sigmult(x1,n1,x2,n2) y = produto da sequência em n, que inclui n1 e n2 x1 = primeira sequência em n1 x2 = segunda sequência em n2 (n2 pode ser diferente de n1) n = min(min(n1),min(n2)):max(max(n1),max(n2)); duração de y(n) y1 = zeros(1,length(n)); y2 = y1; y1(find((n>=min(n1))&(n<=max(n1))==1))=x1; x1 com duração de y y2(find((n>=min(n2))&(n<=max(n2))==1))=x2; x2 com duração de y y = y1.* y2; Escamento de sinais Nesta operação temos a multiplicação de cada amostra por um escalar α, α{x(n)} = {αx(n)} Para a sua implementação utiliza-se o operador aritmético *. Deslocamento de sinais Nesta operação cada amostra é deslocada dum quantidade k, para obter a sequência deslocada y(n) Se fizermos m=n-k, então n= m+k e a operação acima é dada por, y(m+k) = {x(m)} Assim, esta operação não tem nenhum efeito no vector x, mas o vector n é alterado pela adição de k a cada elemento. Vejamos a sua implementação em MATLAB. function [y,n] = sigshift(x,m,n0) implements y(n) = x(n-n0) ------------------------- [y,n] = sigshift(x,m,n0) n = m+n0; y = x; Inversão (Folding) de sinais Nesta operação cada amostra de x(n) e invertida em torno de n=0, para obter a sequência invertida y(n). y(n) = {x(-n)} Em MATLAB esta operação é realizada através da função fliplr(x) para os valores das amostras e pela função -fliplr(n) para as posições das amostras, como mostra a seguinte implementação: function [y,n] = sigfold(x,n) implements y(n) = x(-n) ----------------------- [y,n] = sigfold(x,n) y = fliplr(x); n = -fliplr(n); Sistemas de Processamento Digital Manuel A. E. Baptista 4
Soma de Amostras Esta operação difere da relativa à adição de sinais pois, esta adiciona todos os valores das amostras de x(n) entre n 1 e n 2. n2 n1 ( ) = ( ) +... + ( ) x n x n x n 1 2 A sua implementação faz-se através da função sum(x(n1:n2)). Multiplicação de Amostras Esta operação difere da relativa à multiplicação de sinais pois, esta multiplica todos os valores das amostras de x(n) entre n 1 e n 2. n2 n1 ( ) = ( )... ( ) x n x n x n 1 2 A sua implementação faz-se através da função prod(x(n1:n2)). Parte Par e Ímpar dum Sinal Uma sequência de valores reais x e (n) é par (simétrica) se x e (-n)=x e (n) Analogamente, uma sequência de valores reais x o (n) é ímpar (assimétrica) se x o (-n)=x o (n) Então, qualquer sequência arbitrária de valores reais x(n) pode ser decomposta nas suas componentes par e ímpar x(n)=x e (n)+x o (n) x e (n)=1/2[x(n)+x(-n)] e x o (n)=1/2[x(n)-x(-n)] respectivamente. A sua implementação em MATLAB pode ser: function [xe, xo, m] = evenodd(x,n) Sinal Real decomposto na parte par e ímpar ------------------------------------------------- [xe, xo, m] = evenodd(x,n) if any(imag(x) ~= 0) error('x não é uma sequência real') end m = -fliplr(n); m1 = min([m,n]); m2 = max([m,n]); m = m1:m2; nm = n(1)-m(1); n1 = 1:length(n); x1 = zeros(1,length(m)); x1(n1+nm) = x; x = x1; xe = 0.5*(x + fliplr(x)); xo = 0.5*(x - fliplr(x)); Séries Geométricas n 1 α, para α 1 ou 1 α n= 0 N n= 0 N n 1 α α, α, para n>=0 1 α Sistemas de Processamento Digital Manuel A. E. Baptista 5
Sistemas Discretos Em termos matemáticos, um sistema discreto no tempo, descreve-se através dum operador T[.] que toma uma sequência x(n) (excitação) e a transforma numa outra sequência y(n) (resposta). Isto é, Y(n) = T[x(n)] Nesta disciplina, dizemos que um sistema processa um sinal de entrada resultando num sinal de saída. Em geral lidamos com sistemas lineares. Sistemas Lineares Um sistema discreto T[.] é um operador linear L[.] se e só se L[.] satisfaz o princípio da sobreposição, L[a 1 x 1 (n)+a 2 x 2 (n)] = a 1 L[x 1 (n)] + a 2 L[x 1 (n)], a 1, a 2, x 1 (n), x 2 (n) Assim, a saída y(n) dum sistema linear para uma entrada aleatória x(n) é dada por Y(n) = L[x(n)] = [L x( k) δ ( n k) ] = x( kl ) [ δ ( n k)] n= A resposta L[δ(n-k)] pode ser interpretada como a resposta dum sistema linear no instante n, devido a uma amostra unitária no instante k. Chama-se resposta impulsional e é denotada por h(n,k). A saída é dada pela soma, Sistema Linear Invariante no Tempo n= x( khnk ) (, ) Um sistema linear em que o par x(n) e y(n), é invariante a um deslocamento n no tempo, designa-se como invariante no tempo. Para um sistema LTI, o L[.] e os operadores de deslocamento são reversíveis. n= x(n) L[.] y(n) Delocamento k y(n-k) x(n) Deslocamento k x(n-k) L[.] y(n-k) Então um sistema LTI, pode ser representado por LTI[.]. Seja x(n) e y(n) o par entrada saída dum sistema LTI. Então h(n,k) torna-se numa função invariante no tempo h(n-k), e a saída é dada por Convolução Y(n) = LTI[x(n)] = [L x( khn ) ( k) ] n= Y(n) = LTI[x(n)] = [L x( khn ) ( k) ] A resposta impulsional dum sistema LTI é dada por h(n). A operação anterior, designa-se por soma da convolução linear e representa-se por Exercícios n= Y(n) x( n)* h( n) x(n) h(n) y(n) = x( n)* h( n ) Exercício 1 Gere e trace cada uma das seguintes sequências, no intervalo indicado. a) x(n) = 2δ(n+2) - δ(n-4), -5 n 5. b) x(n) = n[u(n) u(n-10)] + 10e -0.3(n-10) [u(n-10)-u(n-20)], 0 n 20. = c) x(n) = cos(0.04πn) + 0.2ω(n), 0 n 50, onde ω(n) é uma sequência aleatória gaussiana, com valor médio zero e variância unitária. d) ~ x (n) =..., 5, 4, 3, 2, 1,5, 4,3, 2,1, 5, 4 3, 2, 1,..., -10 n 9. Sistemas de Processamento Digital Manuel A. E. Baptista 6
Exercício 2 Considere a sequência, x(n) = Determine e represente as seguintes sequências. a) x 1 (n)=2x(n-5)-3x(n+4) b) x 2 (n)=x(3-n)+x(n)x(n-2) 1, 2,3, 4,5, 6,7, 6,5, 4,3, 2,1 Exercício 3 Gere o sinal complexo, x(n) = e (-0.1+j0.3)n, -10 n 10 e represente o seu módulo, fase, parte real e parte imaginária, em quatro gráficos separados. Exercício 4 Atendendo às condições associadas ao cálculo da série geométricas em termos de convergências, implemente para cada uma dessas uma função que realize o seu cálculo. Exercício 5 Considere a sequência x(n) = u(n) u(n-10). Decomponha x(n) na suas partes par e ímpar e represente-as. Exercício 6 A operação dilatação dum sinal (ou decimação) define-se como y(n) = x(nm), em que a sequência x(n) é subamostrada dum factor M...., 2, 4,3, 6,5, 1,8,... e.g. x(n) = então se M=2 teremos, y(n) =..., 2, 3,5, 8,... Desenvolva uma função em MATLAB dnsample, que tenha a forma function y = dnsample(x,m), para realizar a função acima. Para o efeito, utilize os mecanismos de indexação. Exercício 7 Considere o impulso rectangular x(n) = u(n) u(n-10) como a entrada dum sistema LTI, com resposta impulsional, h(n) = (0.9) n u(n) Determine a saída y(n), para: i. n < 0; ii. 0 n < 9; iii. n 9. Exercício 8 Dadas as sequências seguintes, 3,11,7, 0, 1, 4, 2 x(n) =, -3 n 3; h(n) = 2,3,0, 5, 2,1, -1 n 4; Determine a convolução y(n) * h(n). Nota: use a função >> y = conv (x,h); Exercício 9 Porém, a função anterior não fornece nem aceite qualquer informação no tempo, tiverem duração arbitrária. O que é necessário é um ponto de início e um ponto de fim de y(n). Dada a duração finita de x(n) e h(n), é fácil determinar esses pontos. { x(n); n xb n n xe } e { h(n); n hb n n he } Então: n yb = n xb + n hb e n ye = n xe + n he >>Function [y,ny] = conv_m (x, nx, h, nh) Sistemas de Processamento Digital Manuel A. E. Baptista 7