Sinais amostrados transformam-se em sequências de números. A linha abaixo, cria uma sequência (lista) com 5 números
x = [4, 3, 7, -9, 1]
Ilustra-se a seguir algumas formas de se selecionar elementos da sequência
x[0] # primeiro elemento (Ãndices iniciam em 0)
x[1] # segundo elemento (Ãndice 1)
x[-1] # último elemento (neste caso, Ãndice 4)
x[-2] # penúltimo elemento (neste caso, Ãndice 3)
x[1:4] # fatia (slice) do Ãndice 1 ao Ãndice 3 (4-1)
x[1:-1] # idem acima; fatia do segundo ao penúltimo elemento
x[1:] # fatia do segundo ao último elemento
x[::2] # fatia pode conter um 'passo'
x[::-1] # o 'passo' pode ser negativo
x[::-2]
Em Python importam-se módulos à medida que forem necessários. O módulo numpy
é conveniente para manipulação de vetores e matrizes, dentre muitas outras funcionalidades
import numpy as np
x = np.array([4, 3, 7, -9, 1])
print(x)
print(x.dtype) # data type
print(x.itemsize) # tamanho em bytes de cada elemento (int32)
print(x.size) # número de elementos em x
print(x.itemsize * x.size) # tamanho de x em bytes
print(x.nbytes) # idem acima
print(x.ndim) # número de dimensões (1: array, 2: matriz, etc. )
print(x.shape) # array unidimensional com 5 elementos
print(1/x) # inverso elemento a elemento de x
print(x*x) # produto elemento a elemento de x por ele mesmo
print(x**2) # idem acima
x.dot(x) # produto escalar de `x` com `x`: 16+9+49+81+1
from numpy import pi
y = np.array([x, 2*x, x/pi])
print(y)
print(y.dtype) # devido à divisão, o elemento agora é do tipo float
print(y.shape)
z = y.transpose() # atenção: transpose() retorna uma `view` de y e não uma cópia
print(z)
z[0,0] = 1
print('z:\n', z,'\ny:\n', y) # note que a atribuição a z[0,0] afetou y[0,0]!
print(z[1:-1, :])
o = z/z
print(o)
print(o.shape)
o.resize(3,5) # resize é um método (atua diretamente em `o`)
print(o)
print(o.shape)
m = np.arange(1,13)
print(m)
m = m.reshape(4,3) # reshape é uma função (retorna o novo objeto)
print(m)
n = m.T # atributo .T tem mesmo efeito que função transpose()
print(n)
print(n.flatten()) # flatten retorna uma nova cópia
print(n.ravel()) # cuidado: retorna uma `view` e não uma cópia
p = n[::2,::2] # atenção: p é uma 'view' de n (não é uma cópia)
print(p)
p[0,0] = 0 # modificando p causará modificação em n
print(p)
print(n) # note que n foi modificado (cuidado com 'views' formadas por slices)
Números complexos são representados por j
b = np.array([1 - 1.j, 3 + 4.j])
print(b)
print(b.real) # parte real de b; também np.real(b)
print(np.real(b))
print(b.imag) # parte imaginária de b; também np.imag(b)
print(b.conj()) # conjugado de b; também np.conj(b)
print(abs(b)) # absoluto de b; também np.abs(b)
print(np.angle(b, deg=True)) # retorna fase; deg=True em graus, deg=False em radianos (default)
print(np.angle(b)) # retorna fase; deg=True em graus, deg=False em radianos (default)
Vetores e matrizes
r = np.random.rand(3, 3)
print(r)
s = np.ones((3,1))
print(s)
print(r * s)
print(s * r)
t = np.dot(r, s) # produto da matriz r (3x3) pelo vetor s (3x1) resultando t (3x1)
print(t)
u = np.dot(s.T, r) # produto do vetor s (1x3) pela matriz r (3x3) resultando u (1x3)
print(u)
v = np.dot(r, r.T)
print(v)
vinv = np.linalg.inv(v)
print(np.dot(v, vinv).round())
d = np.linalg.det(v) # determinante de v
print(d)
w = np.linalg.solve(v, s) # solução de sistema de equações lineares
print(np.dot(v, w))
z = np.zeros((1,3))
print(z)
z += 1
print(z)
print(z[0])
print(np.vstack((z[0], 2*z[0], 3*z[0])))
print(np.vstack((z, 2*z, 3*z)))
print(np.hstack((z[0], 2*z[0], 3*z[0])))
print(np.hstack((z[0], 2*z[0], 3*z[0])).ndim)
print(np.hstack((z, 2*z, 3*z)))
print(np.hstack((z, 2*z, 3*z)).ndim)
import matplotlib.pyplot as plt
%matplotlib inline
import scipy.misc
img = scipy.misc.lena()
maxi = 255
R = len(img)
C= len(img[0])
plt.imshow(img/maxi)
plt.show()
imgd = abs(np.diff(img,axis=0))/maxi
plt.imshow(imgd)
plt.show()
s = [ 67, 111, 110, 102, 105, 114, 109, 101, 32, 113, 117, 101, 32, 117, 109,
32, 116, 101, 120, 116, 111, 32, 112, 111, 100, 101, 32, 115, 101, 114,
32, 99, 111, 110, 115, 105, 100, 101, 114, 97, 100, 111, 32, 117, 109,
32, 115, 105, 110, 97, 108, 32, 110, 111, 32, 116, 101, 109, 112, 111, 33]
print(len(s))
texto = '' . join(chr(v) for v in s)
print(texto)
plt.plot(s);
# geracao de forma de onda
fs = 10000 # freq de amostragem
T = 2 # duracao em segundos
t = np.arange(fs*T)/fs # tempo
f1 = 100 # feq de sinal 1 em Hz
f2 = 95 # feq de sinal 2 em Hz
# ref signal
y = np.sin(2*pi*f1*t)
# resample ref sinal with f2
yn = y[::f2]
Y = np.abs(np.fft.fft(y))
f = t / T * fs
plt.plot(f[0:400], Y[0:400])
plt.grid()
plt.xlabel('$f \,$, Hz')
plt.title('$|Y(e^{j \, 2 \pi \, f})|$')
plt.show()
plt.figure(figsize=(12, 5))
dt = 2000 # faixa de observacao
plt.plot(t[:dt], y[:dt])
plt.title('y(t)')
plt.xlabel('t,s')
plt.grid()
# sinal discreto no tempo
plt.stem(t[:dt:f2], yn[:(dt//f2+1)], 'k')
plt.plot(t[:dt:f2], yn[:(dt//f2+1)], 'g:')
plt.show()