PEL304 Aplicações em Processamento de Sinais

Prof. Ivandro Sanches

IPython Notebook, Python 3.4.3


Aula 1 - Sinais e sistemas discretos

Geração de forma de onda

In [1]:
import numpy as np
import matplotlib
import matplotlib.pyplot as plt
%matplotlib inline
# geracao de forma de onda
fs=1000 # freq. amostragem, Hz
T=1 # duracao em segundos
t=np.arange(fs*T)/fs # tempo
f1=50 # freq sinal 1 em Hz
f2=120 # freq sinal 2 em Hz
pi = np.pi
y=np.sin(2*pi*f1*t)+np.sin(2*pi*f2*t)
yn=y+0.3*np.random.randn(len(t)) # y+ruido
dt=50 # faixa de observacao
plt.subplot(211)
plt.plot(t[:dt],y[:dt])
plt.title('y(t)')
plt.grid()
plt.subplot(212)
plt.plot(t[:dt],yn[:dt])
plt.title('yn(t)')
plt.grid()
plt.xlabel('t, s')
plt.show()

Geração do espectro correspondente

In [2]:
# geracao de espectros
Y=abs(np.fft.fft(y))
Yn=abs(np.fft.fft(yn))
f=np.arange(0,len(Y))*fs/len(Y)
# ou: f=arange(0,fs,fs/len(Y))
df=int(200*len(Y)/fs) # observação até 200Hz
plt.subplot(211)
plt.plot(f[:df],Y[:df])
plt.ylabel('|Y(f)|'), plt.grid()
plt.subplot(212)
plt.plot(f[:df],Yn[:df])
plt.ylabel('|Yn(f)|'), plt.grid()
plt.xlabel('f, Hz')
plt.show()

Processamento rudimentar de imagem

In [3]:
from scipy.ndimage import imread
img=imread('sunflower.jpg').astype(np.float)
maxi=255; R=len(img); C=len(img[0])
plt.imshow(img/maxi)
plt.show()
In [4]:
imgd=[[[abs((img[i,j,k]-img[i+1,j,k])/maxi)
             for k in range(3)] for j in range(C)]
             for i in range(R-1)]
# idem acima: imgd = abs(diff(img,axis=0))/maxi
plt.imshow(imgd)
plt.show()

Importância de se garantir a frequência de amostragem correta.

Abaixo ilustra-se uma senoide de 95 Hz amostrada a 100 Hz

In [5]:
fs=100 # freq. amostragem, Hz
fa=95  # freq. sinal analógico, Hz
T=0.2  # duracao em segundos
t=np.arange(T*fs+1)/fs # tempo discreto
ta=np.arange(T*fs*100)/(fs*100) # tempo
pi = np.pi
sd=np.cos(2*pi*(fs-fa)*t)  # sinal discreto
sa=np.cos(2*pi*fa*ta)      # sinal analógico
plt.figure(figsize=(12,15))
plt.subplot(311)
plt.plot(ta,sa,color='k'), plt.grid()
plt.title("Sinal analógico, senoide de %g Hz" % fa)
plt.xlabel("t, s")
plt.subplot(312)
plt.stem(t,sd)
plt.hold(True)
plt.plot(ta,sa,color='k')
plt.plot(t,sd, ':')
plt.hold(False), plt.grid()
plt.xlabel("t, s")
plt.title("Senoide de %g Hz amostrada a %g Hz" % (fa, fs))
plt.subplot(313)
plt.stem(np.arange(T*fs+1),sd)
plt.title("Sinal discreto")
plt.xlabel("n")
plt.show()

Convolução entre duas sequências finitas

In [6]:
h=[1,1,1,1,0,0]
x=[1,1,1,0,0,0]
y=np.convolve(h,x)
n=np.arange(len(x))
plt.subplot(311),
plt.stem(n,h), plt.ylabel('h(n)'),
plt.subplot(312),
plt.stem(n,x), plt.ylabel('x(n)'),
plt.subplot(313),
plt.stem(n,y[:len(x)]), plt.ylabel('y(n)'),
plt.xlabel('n'), plt.grid()
plt.show()

Espectrograma de sinal de voz

In [7]:
from scipy.io import wavfile
fs, data = wavfile.read('605SPF26.wav')
nfft = 1024
opxx, freqs, bins, im=plt.specgram(data, nfft, fs, noverlap=7*nfft/8, cmap=plt.cm.gist_stern)

Reproduzir o sinal de arquivo

In [8]:
import winsound
winsound.PlaySound('605SPF26.wav', winsound.SND_FILENAME)

Sinal no tempo

In [9]:
L=len(data)
t=np.arange(L)
t=t*(1./fs)
plt.plot(t,data)
plt.xlabel('t (s)')
plt.ylabel('amplitude de 605SPF26.wav')
plt.grid()
plt.show()

Geração de sons DTMF

In [10]:
Fs = 8000; N = 4000
t  = np.arange(N)*1.0/Fs # N amostras a Fs
fc = [697, 770, 852, 941]
fr = [1209, 1336, 1477]; 
f  = []
for c in range(4):
    for r in range(3):
        f.append([fc[c],fr[r]])
tons = np.zeros([len(f),N])
for i in range(len(f)):
    tons[i,:] = np.sin(2*pi*t*f[i][0])
    tons[i,:] += np.sin(2*pi*t*f[i][1])
    tons[i,:] /= 2.1 # normalizacao
D=2; # tecla 3
# obs.: D=9-> tecla '*'
#       D=10-> tecla '0'
#       D=11-> tecla '#'
tom=tons[D,:]
plt.subplot(211)
NP=200; plt.plot(t[:NP],tom[:NP]); plt.grid()
plt.xlabel('tempo, s'); plt.ylabel('Amplitude')
plt.title('tecla %d' % (D+1))
plt.show()

Análise do espectro via periodograma

In [11]:
from scipy import signal
[F,P]=signal.welch(tom,fs=Fs, window='hanning',
        nperseg=256, noverlap=128,nfft=256,
        scaling='density')
# indices de P de 0 a 128 (equiv. a Fs/2)
iF=max(np.argwhere(F<2100))
plt.subplot(212)
plt.plot(F[:iF],10*np.log10(P[:iF]))
plt.grid(); plt.xlabel('frequência, Hz')
plt.ylabel('Magnitude, dB')
plt.show()

Escrita, leitura e reprodução de .wav

In [12]:
from scipy.io import wavfile
samples = np.floor(32767*tom) # 32767=2**15-1
s=samples.astype(np.short)
wavfile.write('3.wav', Fs, s)
rate,data=wavfile.read('3.wav')
print("deve ser zero:", max(abs(data-samples)))
import winsound
winsound.PlaySound('3.wav', winsound.SND_FILENAME)
deve ser zero: 0.0