Upgrade to Pro — share decks privately, control downloads, hide ads and more …

fisl14

Avatar for Renato Candido Renato Candido
June 29, 2013
42

 fisl14

Slides da apresentação "Fragmentos de processamento digital de sinais e algumas aplicações com Python" realizada no FISL14.

Avatar for Renato Candido

Renato Candido

June 29, 2013

Transcript

  1. Fragmentos de processamento digital de sinais e algumas aplicações com

    Python Renato Candido FISL 14 5 de julho de 2013
  2. Sobre Engenheiro eletrônico Aluno de doutorado na Poli - USP

    Software livre → Liria Tecnologia: www.liria.com.br Consultoria tecnológica Contato [email protected] twitter, identi.ca: @renatocan
  3. Sumário 1 PDS para quem nunca viu 2 PDS com

    Python 3 Algumas aplicações
  4. Exemplos de sinais Sinal senoidal: 0.00 0.02 0.04 0.06 0.08

    0.10 t (s) −200 −150 −100 −50 0 50 100 150 200 s(t) (V) Variação da temperatura em um dia: 0 5 10 15 20 horas 16 18 20 22 24 26 28 30 32 Temperatura (◦ C)
  5. Exemplos de sinais (2) Sinal de eletrocardiograma: 0 100200 300

    400 500 600 700 800 −150 −100 −50 0 50 100 150 200
  6. Exemplos de sinais (4) Cotação da bolsa: Feb 02 Feb

    09 Feb 16 Feb 23 Mar 01 Mar 08 Mar 15 Mar 22 Mar 29 Apr 05 Apr 12 20.5 21.0 21.5 22.0 22.5 23.0 23.5 24.0 24.5 25.0
  7. Processamento de sinais Tem o objetivo de obter alguma informação

    do sinal 0.00 0.02 0.04 0.06 0.08 0.10 t (s) −200 −150 −100 −50 0 50 100 150 200 s(t) (V) 60 Hz !
  8. Processamento de sinais (2) 0 5 10 15 20 horas

    16 18 20 22 24 26 28 30 32 Temperatura (◦ C) Média: 25 ℃ Previsão amanhã: 20 ℃
  9. Processamento de sinais (3) ECG: detecção de QRS 0 100200

    300 400 500 600 700 800 −150 −100 −50 0 50 100 150 200
  10. Processamento de sinais (5) Decisão Feb 02 Feb 09 Feb

    16 Feb 23 Mar 01 Mar 08 Mar 15 Mar 22 Mar 29 Apr 05 Apr 12 20.5 21.0 21.5 22.0 22.5 23.0 23.5 24.0 24.5 25.0 Compra!
  11. Processamento digital de sinais Substitui o circuito dedicado por um

    circuito programável Possibilitado pelo aumento do desempenho dos computadores Projeto do sistema por software
  12. Amostragem 0 Ta 2Ta3Ta t (s) −200 −150 −100 −50

    0 50 100 150 200 s(t) (V) Amostragem do sinal Tempo contínuo⇒Tempo discreto Período de amostragem Ta Frequência de amostragem fa = 1/Ta Teorema da amostragem fa > 2 × fmax
  13. Quantização Armazenar os valores com uma quantidade finita de bits

    Com 2 bits → 4 níveis Analógico⇒Digital 0 5 10 15 20 25 30 t (ms) −200 −150 −100 −50 0 50 100 150 200 s(t) (V) 0 5 10 15 20 25 30 t (ms) −60 −40 −20 0 20 40 60 Erro
  14. Quantização (2) Mais bits → mais resolução → mais memória

    Com 4 bits → 16 níveis 0 5 10 15 20 25 30 t (ms) −200 −150 −100 −50 0 50 100 150 200 s(t) (V) 0 5 10 15 20 25 30 t (ms) −60 −40 −20 0 20 40 60 Erro
  15. Sinal digital de tempo discreto Amostragem e quantização 0 5

    10 15 20 25 30 t (ms) −200 −150 −100 −50 0 50 100 150 200 s(t) (V)
  16. Sinal digital de tempo discreto (2) Resultado final 0 2

    4 6 8 10 n −200 −150 −100 −50 0 50 100 150 200 s(n) Vetor com os valores das amostras [ -10. 130. 130. 10. -130. -150. -10. 130. 150. 30. -110. -150.]
  17. Processamento e conversão Processamento por software Se necessário, conversão para

    sinal analógico 8-Bit DAC Entrada digital Saída analógica Tensão 0-5V D0 D7 D1 D2 D3 D4 D5 D6
  18. Softwares É o mais utilizado Toolboxes para diversas áreas GNU

    Octave Software Livre Sintaxe compatível com Matlab Packages http://octave.sourceforge.net/packages.php SciPy W 3β δ1 ρ1 σ2 =U 3β δ1 ρ1 + 1 8π2 α2 α2 dα ′ 2 U 2β δ1 ρ1 −α ′ 2 U1β ρ1 σ2 U0β ρ1 σ2 dρ dt +ρv ·∇v =−∇p +µ ∇2 v +ρg ∞ −∞ e −x2 dx = π FG =Gm1 m2 r2 matplotlib Software livre Linguagem de uso geral: web, banco de dados, rede, GUI, jogos, etc
  19. NumPy http://www.numpy.org/ Biblioteca para aplicações numéricas em Python Computação eficiente

    com rotinas escritas em Fortran e C (LAPACK) Arrays multidimensionais Tipos de dados especiais: int8, uint32 Manipulação de arrays: reshape, transpose, concatenate Criação de arrays: zeros, ones, random Operações elemento a elemento Operações vetoriais e matriciais
  20. NumPy (2) Exemplo ex1 import numpy as np vzeros =

    np. zeros(10) # cria um vetor com 10 zeros print "vzeros" print vzeros x = np. linspace (0 , 2*np. pi , 10) # cria um vetor com 10 elementos # entre 0 e 2pi # linearmente espaçados print "x" print x senox = np. sin (x) # cria um vetor senox com o mesmo # número de elementos de x # sendo cada elemento igual ao # seno do respectivo elemento de x print "senox" print senox
  21. NumPy (3) Saída ex1 vzeros [ 0. 0. 0. 0.

    0. 0. 0. 0. 0. 0.] x [ 0. 0.6981317 1.3962634 2.0943951 2.7925268 3.4906585 4.1887902 4.88692191 5.58505361 6.28318531] senox [ 0.00000000e+00 6.42787610e−01 9.84807753e−01 8.66025404e−01 3.42020143e−01 −3.42020143e−01 −8.66025404e−01 −9.84807753e−01 −6.42787610e−01 −2.44929360e−16]
  22. SciPy SciPy http://www.scipy.org/ Bibliotecas semelhantes aos toolboxes do Matlab Otimização

    Processamento de imagens Processamento de sinais Code snippets em http://scipy-central.org/
  23. SciPy (2) Exemplo ex2 from scipy . io . wavfile

    import read amostras = read( ’audio .wav’ ) # Lê um arquivo de áudio wav # retorna uma tupla com 2 elementos: # a frequência de amostragem do sinal # e um array com os valores de cada amostra print "amostras" print amostras Saída ex2 amostras (44100, array([6048, 6936, 5983, . . . , 2958, 4583, 4978], dtype=int16 ))
  24. Matplotlib W 3β δ1 ρ1 σ2 =U 3β δ1 ρ1

    + 1 8π2 α2 α2 dα ′ 2 U 2β δ1 ρ1 −α ′ 2 U1β ρ1 σ2 U0β ρ1 σ2 dρ dt +ρv ·∇v =−∇p +µ ∇2 v +ρg ∞ −∞ e −x2 dx = π FG =Gm1 m2 r2 matplotlib http://matplotlib.org/ Ferramenta para geração de gráficos Sintaxe parecida com a do Matlab
  25. Matplotlib (2) Exemplo ex3 import numpy as np import matplotlib

    . pyplot as plt x = np. linspace (0 , 2*np. pi , 10) senox = np. sin (x) plt . figure () # Cria uma figura plt . plot (x, senox) # Faz o gráfico de x por senox plt .show() # Mostra o gráfico
  26. Matplotlib (3) Saída ex3 0 1 2 3 4 5

    6 7 −1.0 −0.5 0.0 0.5 1.0
  27. Matplotlib (4) Melhorando o gráfico - Exemplo ex4 import numpy

    as np import matplotlib . pyplot as plt x = np. linspace (0 , 2*np. pi , 1000) # Mais pontos −> Maior resolução senox = np. sin (x) plt . figure () # Cria uma figura plt . plot (x, senox) # Faz o gráfico de x por senox plt . xlabel ( ’x ’ ) # Label eixo X plt . ylabel ( ’seno(x) ’ ) # Label eixo Y plt . t i t l e ( ’Exemplo Matplotlib ’ ) # Título plt . axis ([0 , 2*np. pi , −1.2, 1.2]) # Limites do gráfico plt . grid () # Mostra grade plt .show() # Mostra o gráfico
  28. Matplotlib (5) Saída ex4 0 1 2 3 4 5

    6 x −1.0 −0.5 0.0 0.5 1.0 seno(x) Exemplo Matplotlib
  29. Aplicação 1 - Síntese de áudio Amostragem de senóides 0

    Ta 2Ta3Ta t (s) −200 −150 −100 −50 0 50 100 150 200 s(t) (V) Sinal de tempo contínuo: sc (t) = Asen(2π · f · t) Sinal de tempo discreto: sd (n) = sc (n · Ta ) p/ n = 0,1,2... sd (n) = Asen(2π · f · Ta · n) = Asen(2π · f fa · n)
  30. Aplicação 1 - Síntese de áudio (2) sd (n) =

    Asen(2π · f fa · n) Código import numpy as np import scipy . io . wavfile # Frequência de amostragem fa = 44100 # Frequência do sinal senoidal f = 440 # Índices n de 0 a 44100*2−1 n = np. arange( fa*2) # Gera o sinal sinal = 10000*np. sin (2*np. pi* f / fa*n) Código (cont.) # Converte para 16 bits por amostra sinalq = sinal . astype (np. int16 ) # Grava arquivo wav scipy . io . wavfile . write ( ’som.wav’ , fa , sinalq )
  31. Aplicação 2 - Notas musicais 12 notas musicais Frequências: do:

    261 , 63 Hz fas: 369 , 99 Hz dos: 277 , 18 Hz sol: 391 , 99 Hz re: 293 , 66 Hz sols: 415 , 30 Hz res: 311 , 13 Hz la: 440 , 00 Hz mi: 329 , 63 Hz las: 466 , 16 Hz fa: 349 , 23 Hz si: 493 , 88 Hz Oitava acima → dobro da frequência Oitava abaixo → metade da frequência
  32. Aplicação 2 - Notas musicais (2) Código import numpy as

    np import scipy . io . wavfile # Função para tocar um sinal senoidal de frequência f # por um determinado tempo em segundos def tocaseno( f , tempo, fa=44100): n = np. arange(np. floor (tempo*fa )) sinal = 10000*np. sin (2*np. pi* f / fa*n) return sinal
  33. Aplicação 2 - Notas musicais (3) Código # Frequências das

    notas musicais # da oitava chamada de 0 fnotas = { ’s ’ : 0, # silêncio ’do ’ : 261.63, ’dos ’ : 277.18, ’ re ’ : 293.66, ’ res ’ : 311.13, ’mi ’ : 329.63, ’ fa ’ : 349.23, ’ fas ’ : 369.99, ’ sol ’ : 391.99, ’ sols ’ : 415.30, ’ la ’ : 440.00, ’ las ’ : 466.16, ’ si ’ : 493.88, }
  34. Aplicação 2 - Notas musicais (4) Código musicaclose = ((

    ’ las ’ , 0.4 , 0) , ( ’do ’ , 0.4 , 1) , ( ’ sols ’ , 0.4 , 0) , ( ’s ’ , 0.3 , 0) , ( ’ sols ’ , 0.5 , −1), ( ’ res ’ , 0.5 , 0) , ( ’s ’ , 0.3 , 0) , ( ’ las ’ , 0.4 , 1) , ( ’do ’ , 0.4 , 2) , ( ’ sols ’ , 0.4 , 1) , ( ’s ’ , 0.3 , 1) , ( ’ sols ’ , 0.5 , 0) , ( ’ res ’ , 0.5 , 1) , )
  35. Aplicação 2 - Notas musicais (5) Código # Dada uma

    sequência de notas com o determinado tempo e oitava , # retorna o sinal "tocando a música" def tocamusica (musica ): sinalmusica = np. array([0]) for nota in musica : fnota = fnotas [nota[0]] tnota = nota[1] oitava = nota[2] sinalnota = tocaseno( fnota*(2**oitava ) , tnota) sinalmusica = np. concatenate(( sinalmusica , sinalnota )) return sinalmusica
  36. Aplicação 2 - Notas musicais (6) Código close = tocamusica

    (musicaclose ) closeq = close . astype (np. int16 ) # Grava arquivo wav fa = 44100 scipy . io . wavfile . write ( ’ close .wav’ , fa , closeq ) # Sinais com 8 bits closeq8 = ( close /100).astype (np. int8 ) # Grava arquivo wav 8 bits fa = 44100 scipy . io . wavfile . write ( ’ close_8.wav’ , fa , closeq8)
  37. Aplicação 3 - Filtragem Sinal de áudio com interferência de

    60 Hz. Objetivo: Filtrar o sinal e remover a interferência x Memória x Memória x x x Memória Memória Memória Memória x + + + + + + x
  38. Aplicação 3 - Filtragem (2) Coeficientes do filtro A [

    1. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. −0.85] B [ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 −1]
  39. Aplicação 3 - Filtragem (3) Código import numpy as np

    import scipy . io . wavfile import scipy . signal # Lê um arquivo wav audio = scipy . io . wavfile . read( ’audio60 .wav’ ) fa = audio[0] # frequência de amostragem audio_orig = audio[1] # amostras # Lê um arquivo numpy com parâmetros A e B do f i l t r o npzfile = np. load( ’H.npz ’ ) A = npzfile [ ’A ’ ] B = npzfile [ ’B ’ ] print "A" print A print "B" print B
  40. Aplicação 3 - Filtragem (4) Código (cont.) # Fi l

    tr a o sinal de áudio usando um f i l t r o linear # com parâmetros A e B audio_filt = scipy . signal . l f i l t e r (B, A, audio_orig ) # Quantização audio_filt_q = audio_filt . astype( ’ int16 ’ ) # Grava um arquivo wav scipy . io . wavfile . write ( ’ audiofilt .wav’ , fa , audio_filt_q )
  41. Obrigado ! Contato Renato Candido [email protected] twitter, identi.ca: @renatocan Arquivos

    Slides: http://speakerdeck.com/renatocan/fisl14 Programas: http://github.com/renatocan/fisl14