A análise espectral baseia-se na ideia de usar “somas trigonométricas” de senos e cossenos para descrever fenômenos periódicos. Se a série é periódica, a expansão do sinal é chamada de Série de Fourier. Se é aperiódica, a expansão é denominada Transformada de Fourier (ou Integral de Fourier) [1].
A Transformada de Fourier fornece a decomposição do sinal em ondas de frequências distintas, produzindo o espectro. Por ele é possível visualizar o sinal em bandas de frequências, facilitando a análise. Constatam-se, assim, quais frequências e ruídos compõem o sinal [2].
O software Octave possui função interna para converter o domínio do tempo de um sinal para o domínio da frequência, tratando-se da Transformada rápida de Fourier (FFT), que pode ser acionada por fft() [3]. Opcionalmente, fftshift() move a frequência central da FFT para o centro do vetor, facilitando a visualização e análise do espectro [4]. No Python, encontramos as operações equivalentes no numpy (confira abaixo).
O espectrograma corresponde ao gráfico de duas dimensões que relaciona o tempo e a frequência do sinal. Quando a ele se acrescenta a terceira dimensão, como a correspondente à amplitude do sinal (medida em dB), relacionando-a a cores, é possível constatar a energia do sinal ao longo do tempo e respectivas frequências, o que pode ser útil, por exemplo, para esteganografia ou análises de EEG, erupções vulcânicas, terremotos etc. a partir de seus sinais característicos [5] [6].
[<matplotlib.lines.Line2D at 0x7f2110263850>]
[0.00000e+00 1.25000e-04 2.50000e-04 ... 9.99625e-01 9.99750e-01 9.99875e-01] <class 'numpy.ndarray'> 8000
[<matplotlib.lines.Line2D at 0x7f2110087250>]
3000
<ipython-input-11-89a36e3a393a>:9: UserWarning: amplitude_to_db was called on complex input so phase information will be discarded. To suppress this warning, call amplitude_to_db(np.abs(S)) instead. D = librosa.amplitude_to_db(librosa.stft(y), ref=np.max)
{'__header__': b'MATLAB 5.0 MAT-file, Platform: PCWIN, Created on: Thu Sep 13 15:13:57 2007', '__version__': '1.0', '__globals__': [], 'fs': array([[4000]], dtype=uint16), 'X1': array([[-0.12512207, -0.08862305, -0.01721191, ..., 0. , 0.0020752 , 0.0177002 ], [-0.00354004, -0.00024414, -0.00146484, ..., 0.00109863, -0.00231934, -0.00146484], [ 0.00842285, -0.0012207 , 0.00793457, ..., -0.02294922, -0.01330566, 0.01647949], ..., [ 0.00769043, -0.00183105, 0.00244141, ..., 0.00146484, 0.00036621, -0.00048828], [-0.00109863, -0.00793457, -0.00158691, ..., 0.09753418, -0.05407715, -0.03918457], [-0.00183105, -0.02844238, 0.01757812, ..., 0.00537109, -0.01123047, -0.00512695]]), 'X2': array([[-0.04553223, -0.03430176, -0.06079102, ..., 0.0144043 , 0.01330566, -0.01416016], [ 0.02624512, 0.00402832, -0.01416016, ..., 0.01794434, -0.03369141, -0.02392578], [-0.02441406, -0.02355957, 0.00256348, ..., 0.02392578, -0.00280762, 0.00476074], ..., [ 0.03479004, -0.00915527, -0.02575684, ..., 0.01782227, -0.01525879, -0.03393555], [ 0.04272461, 0.02441406, -0.03625488, ..., 0.0255127 , 0.04675293, 0.03222656], [-0.04907227, -0.0246582 , 0.03857422, ..., 0.0369873 , 0.02990723, 0.02490234]])}
4000