Sons¶
Os sinais da natureza são representados geralmente por sinais analógicos (exceto na mecânica quântica), onde existem variações contínuas da pressão do ar que chega até os nossos ouvidos - para captação de som - e variações contínuas de intensidade de luz no espaço.
Vamos verificar o comportamento do sinal do som.
Ele possui:
duration
: tempo de duração em segundos.frequency_la
: frequência natural da nota Lá em Hertz.
duration = 2 # Duração da nota de 2 segundos
frequency_la = 440 # Nossa nota tocada será 440 Hz
Como não possuímos um “tocador analógico” aqui, vamos precisar gerar áudio digital a partir das variáveis duration
e frequency_la
a uma taxa de 44.100 amostras por segundo. O som pode ser representado digitalmente através de um array de valores em ponto flutuante.
Você irá perceber que o som será gerado e representado através de uma onda senoidal. Para isto será levado em consideração a frequência, a duração do som (o array duration
) e o produto entre o tempo e a quantidade de amostras por segundo.
# 44100 amostras por segundo
sample_rate = 44100
# Gera um array com o tempo em segundos vezes a quantidade de amostras por segundo
# variando entre 0 e `duration` segundos.
audio_data = np.linspace(0, duration, duration * sample_rate, False)
# Gera som com onda senoidal de 440 Hz
note_la = np.sin(frequency_la * audio_data * 2 * np.pi)
# Cria um vetor de tempo para plotagem
audio_time_vector = np.linspace(0, len(note_la) / sample_rate, num=len(note_la))
Ao tocar o som gerado em note_la
, temos:
Ao “abrir” o som, poderíamos ver como seriam os “dados brutos”!
Eles iriam aparecer desta forma:
Dados brutos da nota La gerado através de um array numpy com os 100 primeiros valores:
[ 0. 0.0626 0.1251 0.187 0.2481 0.3083 0.3673 0.4249 0.4808
0.5347 0.5866 0.6362 0.6833 0.7277 0.7692 0.8078 0.8431 0.8751
0.9037 0.9288 0.9502 0.9678 0.9817 0.9917 0.9978 1. 0.9983
0.9926 0.983 0.9696 0.9524 0.9314 0.9068 0.8786 0.8469 0.8119
0.7738 0.7326 0.6885 0.6417 0.5924 0.5407 0.487 0.4313 0.3739
0.3151 0.255 0.194 0.1321 0.0698 0.0071 -0.0555 -0.118 -0.18
-0.2412 -0.3016 -0.3607 -0.4184 -0.4745 -0.5287 -0.5808 -0.6307 -0.6781
-0.7228 -0.7647 -0.8035 -0.8393 -0.8717 -0.9007 -0.9261 -0.9479 -0.966
-0.9803 -0.9908 -0.9973 -0.9999 -0.9986 -0.9934 -0.9843 -0.9713 -0.9545
-0.934 -0.9097 -0.8819 -0.8507 -0.8161 -0.7783 -0.7374 -0.6936 -0.6471
-0.5981 -0.5467 -0.4932 -0.4377 -0.3805 -0.3219 -0.2619 -0.2009 -0.1392
-0.0769]
Quantidade de amostras geradas: 88200 amostras em 2 segundos.
Não é muito intuitivo observar as amostras desta forma. Vamos então utilizar uma forma melhor de representação?
Imagine estes dados dispostos em função do tempo, de 0 a 2 segundos.
Source
# Exibindo o sinal gerado
utils.plot_signal(
audio_time_vector,
note_la,
title=f"Sinal de Áudio - Nota La ({frequency_la} Hz)",
# subtitle=f"Onda Senoidal com {sample_rate} amostras por segundo",
labels=["Sinal de áudio"],
x_title="Tempo (s)",
y_title="Amplitude",
)
Não é possível enxergar o sinal ainda devido a quantidade de amostras, pois são 44.100 a cada segundo!
Vamos então tentar “ampliar” a visualização do sinal para que seja exibido entre 0s e 0,02s (ou 20ms). Veja abaixo:
Source
utils.plot_signal(
audio_time_vector,
note_la,
t_inicial=0,
t_final=0.02,
title="Sinal de Áudio - Nota La (440 Hz)",
x_title="Tempo (s)",
y_title="Amplitude",
)
Desta forma podemos visualizá-lo melhor. O que você pode perceber é que o sinal é uma onda senoidal, ou seja, ele possui um padrão de repetição. Esse padrão é o que chamamos de frequência. A frequência do som é a quantidade de ciclos que ocorrem em um segundo. O ciclo completo da onda senoidal é chamado de período. O período é o inverso da frequência, ou seja, quanto maior a frequência, menor o período e vice-versa.
Veremos melhor este conceito mais adiante, mas por enquanto, vamos continuar com a representação digital de imagens.
Imagens¶
As imagens são representadas por uma matriz de pixels, onde cada pixel possui um valor que representa a intensidade de cor. Cada pixel é representado por três valores: vermelho, verde e azul (RGB). A combinação desses três valores resulta em uma cor específica.
A imagem abaixo mostra a representação de uma imagem em uma matriz de pixels:
#TODO: Para continuar