14
UNIVERSIDADE FEDERAL DE UBERLÂNDIA FACULDADE DE ENGENHARIA ELÉTRICA GRADUAÇÃO EM ENGENHARIA MECATRÔNICA PROCESSAMENTO DIGITAL DE SINAIS Trabalho 2 – Processamento Digital de Sinais MatLab aplicado ao PDS Igor Souza Dotta 90905 Uberlândia Maio, 2012.

Trabalho PDS IgorDotta 90905

Embed Size (px)

Citation preview

Page 1: Trabalho PDS IgorDotta 90905

UNIVERSIDADE FEDERAL DE UBERLÂNDIA FACULDADE DE ENGENHARIA ELÉTRICA

GRADUAÇÃO EM ENGENHARIA MECATRÔNICA PROCESSAMENTO DIGITAL DE SINAIS

Trabalho 2 – Processamento Digital de Sinais MatLab aplicado ao PDS

Igor Souza Dotta 90905

Uberlândia Maio, 2012.

Page 2: Trabalho PDS IgorDotta 90905

1 – Operações com Arquivos de Áudio 1.1 – Leia o arquivo música.wav para a matriz Y, em seguida toque-o (use a função soundsc(Y,FS,BITS)) nos alto-falantes do computador e visualize as amostras (plot(Y)). Explique funcionamento das funções MatLab: wavrecord(...), wavwrite(...), wavread(...). Primeiramente foi alterado o diretório de trabalho do MATLAB, para a pasta onde continham os arquivos necessários para realizar o trabalho. Em seguida, para ler o arquivo, tocar e plotar foi usado o seguinte algoritmo: Y = wavread('musica.wav'); soundsc(Y,44000,16); plot(Y); Amostras plotadas:

x = wavread(filename) – Carrega um arquivo .wav especificado pelo “filename” para o ambiente Matlab, retornando os dados amostrados para “x”. wavrecord(n,FS) - Grava “n” amostras de um sinal de audio, amostrado a “FS” Hz(amostras por segundo). O valor padrão para “FS” é 11025Hz.

0 0.5 1 1.5 2 2.5 3 3.5

x 105

-0.6

-0.4

-0.2

0

0.2

0.4

0.6

0.8

Page 3: Trabalho PDS IgorDotta 90905

wavwrite(y,FS,N,filename) – Escreve os dados contidos na variavel “y”, para um arquivo .wav chamado “filename”. Os dados tem uma amostragem de “FS” Hz e são de “N”-bit de profundidade de dados. *O “N” serve para aumentar o numero de tons que pode ser tocados. 1.2 – Altere os valores de FS e BITS, e toque novamente a matriz Y e verifique as diferenças resultantes. Explique-as.

O valor de entrada “BITS” é quantos tons” Y” poderá gravar, se o valor de “BITS” for 8, “Y”’ poderá tomar valores de 0 à 255, e se for 16, poderá tomar valores de -32768 à +32767, possibilitando um ganho significativo de tons possíveis de serem tocados. “FS” é a taxa de amostragem do sinal, ao diminuir o valor de “FS” percebe-se que a música fica mais lenta, e ao aumentar a música fica mais rápida. 2 – Operações com Arquivos de Imagem 2.1 – Para ler um arquivo de imagem teste.bmp escreva: [m n]=imread('teste', ‘bmp’); Y= ind2gray(m,n); 2.2 – Para ver o conteúdo do arquivo de imagem digite: imshow(Y); Utilizou-se o seguinte algoritmo para gerar a imagem: [m n]=imread('teste', 'bmp'); Y= ind2gray(m,n); imshow(Y);

Page 4: Trabalho PDS IgorDotta 90905

2.3 – O arquivo teste.bmp contém uma imagem de 256x256 pixels de 256 diferentes tons de cinza. Para binarizar esta imagem, temos que colocar para todos os pixels baixo de um determinado tom de cinza (limiar) a cor preta (0), e para os pixels restantes a cor branco (1). Para efetuar a binarização faça uma função que receba como parâmetros uma matriz e um limiar e retorne uma matriz binarizada. A sintaxe da função deve ser: function x = binariza(a,b) % a – matriz com a imagem a ser binarizada % b – limiar de binarizacao (intensidade do pixel) Função criada para binarizar: function x = binariza(a,b) % a – matriz com a imagem a ser binarizada % b – limiar de binarizacao (intensidade do pixel) A=size(a); for i=1:A(1) for ii=1:A(2) if a(i,ii)<(b*256) x(i,ii)=0; else x(i,ii)=255; end end end 2.4 – Depois de construir e testar a função ‘binariza’ faça o seguinte: Y1 = Y > 0.5; imshow(Y1); Comente os resultados.

Utilizando os dois algoritmos, tem-se: [m n]=imread('teste', 'bmp'); Y= ind2gray(m,n); figure imshow(Y); Y1=binariza(Y,0.5); figure imshow(Y1);

Page 5: Trabalho PDS IgorDotta 90905

Sendo que nesta segunda, ele mostra a figura original e a segunda que foi binarizada em 50%.

Pode-se perceber que houve aumento na nitidez da imagem. O programa trabalhou da seguinte maneira: os tons de cinza em menos de 50% (que seriam os mais próximos de preto) foram transformados em preto, e os acima de 50% (os mais próximos de branco) foram transformados em branco. 2.5 – Leia o arquivo teste1.bmp e visualize os dados, utilizando as funções mesh(...) e contour(...). Analise os resultados.

Para ler o arquivo e testar o mesh e o contour foi usado o seguinte programa [m n]=imread('teste1', 'bmp'); Y= ind2gray(m,n); Y1=im2double(Y); figure mesh(Y1); figure contour(Y);

Foi necessário utilizar o im2double, pois o resultado do ind2gray fica de 0 a 255. Estes foram os resultados obtidos:

Imagem Original Mesh

Page 6: Trabalho PDS IgorDotta 90905

Mesh(Y) – Desenha uma grade de linhas com a cor determinada por “Y” que também é a altura, então a cor é proporcional a altura.

Contour(Y) – Desenha contornos de uma matriz “Y” onde os valores de “Y” são interpretados como altura relativa ao plano x-y. É como se fosse a função “mesh” vista de cima. 3 – Operações com Arquivos de Vídeo 3.1 – Para ler e visualizar o arquivo vídeo.avi escreva: mov = aviread('video.avi'); movie(mov,2,23); 3.2 – Usando novamente a função aviread(...), leia e grave em um arquivo apenas a metade do conteúdo do arquivo vídeo.avi. Utilize as funções aviinfo(...) e movie2avi(...). 3.3 – Faça uma função que grave em arquivos cada uma das imagens do vídeo que gravou no item anterior (crie um diretório temporário ou use o temp para gravar estes arquivos).

Tentou-se duas diferentes formas de analisar o vídeo, com as funções aviread() e com a mmreader(), porém foram obtidos os seguintes erros:

Contour

Page 7: Trabalho PDS IgorDotta 90905

4 - Atividades 4.1 Crie uma função que receba dois sinais unidimensionais e retorne a soma desses sinais. Os sinais podem ser de tamanhos diferentes. Lembre-se de que um sinal unidimensional precisa de dois vetores para seu armazenamento em MatLab: um vetor para a base temporal, e outro para a amplitude do sinal. Exemplo de cabeçalho para a função a ser criada: function [z,nz] = somasinais(x,nx,y,ny) % z - vetor com a amplitude da soma dos sinais x e y % nz ¡V vetor com a base temporal do sinal em z % x - vetor com a amplitude do primeiro sinal a ser somado % nx - vetor com a base temporal do sinal em x % y - vetor com a amplitude do segundo sinal a ser somado % ny - vetor com a base temporal do sinal em y ... Função criada para receber e adicionar dois sinais unidimensionais: function [y,n] = sigadd(x1,n1,x2,n2) n = min(min(n1),min(n2)):max(max(n1),max(n2));

Page 8: Trabalho PDS IgorDotta 90905

y1 = zeros(1, length(n)); y2 = y1; y1(find((n>=min(n1))&(n<=max(n1))==1)) = x1; y2(find((n>=min(n2))&(n<=max(n2))==1)) = x2; y = y1 + y2; Segue um algoritmo como exemplo: % definindo x(n) x=ones(1,5); nx=-2:2; % definindo h(n) h=[3 4 3 2]; nh=-1:2; [y,n] = sigadd(x,nx,h,nh) subplot(3,1,1); stem(nx,x); axis([-3 3 0 7]); grid on; title('Soma de sinais'); xlabel('n'); ylabel ('x[n]'); subplot(3,1,2); stem(nh,h); axis([-3 3 0 7]); grid on; xlabel('n'); ylabel ('h[n]'); subplot(3,1,3); stem(n,y); axis([-3 3 0 7]); grid on; xlabel('n'); ylabel ('y[n]');

Page 9: Trabalho PDS IgorDotta 90905

4.2 O PDS trabalha geralmente com sinais da fala, musica, vídeo, eletrocardiograma (ECG) e eletroencefalograma (EEC). Pesquise na Internet as faixas de frequências dos cinco tipos de sinais citados. Fala 80hz a 300hz

Musica 20Hz a 20kHz

Video 0Hz a 4MHz

Eletrocardiograma 0,03Hz a 250Hz

Eletroencefalograma(alfa) 8Hz a 13Hz

Eletroencefalograma(beta) 14Hz a 30Hz

Eletroencefalograma(delta) 1Hz a 3Hz

Eletroencefalograma(teta) 4Hz a 7Hz

4.3 ¡V Trace o gráfico dos seguintes sinais de tempo discreto, na faixa de 0 ≤ n ≤ 10. i. x[n] = u[n]- u[n - 4] Foi criada uma função para gerar o degrau unitário: function [x, n] = stepseq(n0, n1, n2) % Degrau

-3 -2 -1 0 1 2 30

2

4

6

Soma de sinais

n

x[n

]

-3 -2 -1 0 1 2 30

2

4

6

n

h[n

]

-3 -2 -1 0 1 2 30

2

4

6

n

y[n

]

Page 10: Trabalho PDS IgorDotta 90905

n = [n1:n2]; x = [(n-n0) >= 0]; stem (x); Depois foi criado um algoritmo para plotar os sinais como se deseja: n = 0:10; x = (stepseq(0,0,10) - stepseq(4,0,10)); stem(n,x); title('Sequencia de Degraus'); xlabel('n'); ylabel ('x[n]');

ii. x[n] = u[3- n] Foi criada uma função para inverter o sinal, y[n] = x[-n]: function [y,n] = sigfold(x,n) y = fliplr(x); n = -fliplr(n); E outra função para deslocar o sinal, y[n] = x[n – k]: function [y,n] = sigshift(x, m, n0) n = m + n0; y = x; Algoritmo para resolver o problema proposto neste enunciado: n = -10:30 ; x = (stepseq(0,-10,30) ); [x1 n1] = sigfold(x, n); [x1 n1] = sigshift(x1, n1,3); stem(n1,x1); title('Sequencia de Degraus'); xlabel('n'); ylabel ('x[n]');

0 1 2 3 4 5 6 7 8 9 100

0.1

0.2

0.3

0.4

0.5

0.6

0.7

0.8

0.9

1Sequencia de Degraus

n

x[n

]

Page 11: Trabalho PDS IgorDotta 90905

axis([-10 10 0 1]);

iii. x[n] = 0,5n {u[n] - u[n - 5]} Utilizando as funções acima descritas, criou-se um algoritmo para resolver este item: n = 0:10; x = (stepseq(0,0,10) - stepseq(5,0,10)); x1= (0.5.^n).*x; stem(n,x1); xlabel('n'); ylabel ('x[n]');

-10 -8 -6 -4 -2 0 2 4 6 8 100

0.1

0.2

0.3

0.4

0.5

0.6

0.7

0.8

0.9

1Sequencia de Degraus

n

x[n

]

Page 12: Trabalho PDS IgorDotta 90905

4.4 - Descreva o resultado do seguinte comando MatLab: x = linspace(x1, x2, N); y = linspace(a,b,n) - Gera um vetor linha "Y" de "n" pontos linearmente espaçados entre e incluídos a e b. Para n<2 a função retorna b. 4.5 Crie programas MatLab (scripts), usando laco e operação vetorial, para: i. Calcular e apresentar a soma da serie: 1, 3, 5, ..., 99; n=0; for i=0:49 n=n+(i*2+1); end n ii. Gere e trace o sinal y[n]= nsen(πn / 2) no intervalo 0 ≤ n ≤ 10. n=0:10; y= n.*sin((pi.*n)/2); stem(y)

0 1 2 3 4 5 6 7 8 9 100

0.1

0.2

0.3

0.4

0.5

0.6

0.7

0.8

0.9

1Sequencia de Degraus

n

x[n

]

Page 13: Trabalho PDS IgorDotta 90905

iii. Idem para z[n] = nu[n] no intervalo 0 ≤ n ≤ 10. n=0:10; x = (stepseq(0,0,10) ); y=n.*x; stem(y);

1 2 3 4 5 6 7 8 9 10 11-8

-6

-4

-2

0

2

4

6

8

10

1 2 3 4 5 6 7 8 9 10 110

1

2

3

4

5

6

7

8

9

10

Page 14: Trabalho PDS IgorDotta 90905

iv. Idem para z[n] = 0,5n e jnπ/ 2 no intervalo 0 ≤ n ≤ 10. n=0:10; y= 0.5.^n.*exp(j.*n.*pi/2); stem(y)

1 2 3 4 5 6 7 8 9 10 11-0.2

-0.1

0

0.1

0.2

0.3

0.4

0.5