Skip to content

Commit

Permalink
Add files via upload
Browse files Browse the repository at this point in the history
  • Loading branch information
GiovanniMeloni authored Jun 22, 2018
1 parent 11b3dd9 commit df728ad
Showing 1 changed file with 89 additions and 46 deletions.
135 changes: 89 additions & 46 deletions TrabFinal/Spectrogram.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,81 @@
import pylab
from scipy.io import wavfile
from scipy.fftpack import fft
from scipy import signal

_audio = "harpsi-cs.wav"
def getFreqArray(_sound, _soundSampleRate):
_soundLenght = len(_sound)
amostraPontos_freq = int (numpy.ceil((_soundLenght + 1) / 2.0))

return numpy.arange(0, amostraPontos_freq, 1.0) * (_soundSampleRate / _soundLenght)

# Para representar o som farei um grafico dos valores do canal de som pelo tempo
#Criando um array de pontos em uma dimensao, que sera o tempo
def AmpPlot(amostraFreq, amostraPontos, _sound):

arrayTempo = numpy.arange(0, amostraPontos, 1)
arrayTempo = arrayTempo / amostraFreq

#em milisegundos
arrayTempo = arrayTempo * 1000

plt.plot(arrayTempo, _soundOneChannel, color='G')
plt.xlabel('Time (ms)')
plt.ylabel('Amplitude')
plt.show()
return


# Para ter a frequencia usarei a Transformada de Fourier (FFT),
def FreqPlot(_sound, _soundSampleRate):
#Comprimento do audio
_soundLenght = len(_sound)

arrayFFT = fft(_sound)

amostraPontos_freq = int (numpy.ceil((_soundLenght + 1) / 2.0))
arrayFFT = arrayFFT[0:amostraPontos_freq]

#A FFT retorna um numero imaginario, porem quero apenas a parte real desse numero (a magnitude)
arrayFFT = abs(arrayFFT)

#agora preciso arrumar o array de frequencia para que ele escale segundo o comprimento do audio
#dessa maneira a magnitude nao depende da amostragem de frequencia ou do comprimento do sinal
arrayFFT = arrayFFT / float(_soundLenght)

#FFT possui numeros negativos e positivos, quero apenas os positivos
arrayFFT = arrayFFT **2


if _soundLenght % 2 > 0: #NUmero impar de pontos da fft
arrayFFT[1:len(arrayFFT)] = arrayFFT[1:len(arrayFFT)] * 2

else: #Numer par de pontos na fft
arrayFFT[1:len(arrayFFT) -1] = arrayFFT[1:len(arrayFFT) -1] * 2

freqArray = numpy.arange(0, amostraPontos_freq, 1.0) * (_soundSampleRate / _soundLenght)

plt.plot(freqArray/1000, 10 * numpy.log10 (arrayFFT), color='B')
plt.xlabel('Frequency (Khz)')
plt.ylabel('Power (dB)')
plt.show()
return


#Declaracoes e Entrada
filenames = ["cello.wav", "ClassicalGuitar.wav", "gtr-jaz-2.wav", "harpsi-cs.wav"]
comparisons = []
answer = 1000000000
pos = 0
for i in range(0, 4):
_soundSampleRate, _sound = wavfile.read(filenames[i])
comparisons.append(getFreqArray(_sound, _soundSampleRate))

print(".wav file name:")
_audio = str(input()).rstrip()

#Lê o arquivo e pega a amostragem de frequencia e o som
amostraFreq, _sound = wavfile.read(_audio)
_soundSampleRate, _sound = wavfile.read(_audio)

#Checa se o arquivo wave eh 16bit ou 32 bit.
_soundDataType = _sound.dtype
Expand All @@ -20,58 +90,31 @@
amostraPontos_audio = float(_sound.shape[0])

#Duracao do arquivo de audio
_soundDuration = _sound.shape[0] / amostraFreq
_soundDuration = _sound.shape[0] / _soundSampleRate

#Quero apenas um canal de som
_soundOneChannel = _sound

# Plotando o audio
# Para representar o som farei um grafico dos valores do canal de som pelo tempo
#Criando um array de pontos em uma dimensao, que sera o tempo
arrayTempo = numpy.arange(0, amostraPontos_audio, 1)

arrayTempo = arrayTempo / amostraFreq

#em milisegundos
arrayTempo = arrayTempo * 1000

plt.plot(arrayTempo, _soundOneChannel, color='G')
plt.xlabel('Time (ms)')
plt.ylabel('Amplitude')
plt.show()

# Plotando o espectrograma
# Para ter a frequencia usarei a Transformada de Fourier (FFT),

#Comprimento do audio
_soundLenght = len(_sound)

arrayFFT = fft(_soundOneChannel)

amostraPontos_freq = int (numpy.ceil((_soundLenght + 1) / 2.0))
arrayFFT = arrayFFT[0:amostraPontos_freq]

#A FFT retorna um numero imaginario, porem quero apenas a parte real desse numero (a magnitude)
arrayFFT = abs(arrayFFT)

#agora preciso arrumar o array de frequencia para que ele escale segundo o comprimento do audio
#dessa maneira a magnitude nao depende da amostragem de frequencia ou do comprimento do sinal

arrayFFT = arrayFFT / float(_soundLenght)
AmpPlot(_soundSampleRate, amostraPontos_audio, _soundOneChannel)

#FFT possui numeros negativos e positivos, quero apenas os positivos
arrayFFT = arrayFFT **2
# Plotando a frequencia
FreqPlot(_soundOneChannel, _soundSampleRate)


if _soundLenght % 2 > 0: #NUmero impar de pontos da fft
arrayFFT[1:len(arrayFFT)] = arrayFFT[1:len(arrayFFT)] * 2
#comparing
_soundFreqArray = getFreqArray(_sound, _soundSampleRate)

else: #Numer par de pontos na fft
arrayFFT[1:len(arrayFFT) -1] = arrayFFT[1:len(arrayFFT) -1] * 2
for i in range(0,4):

freqArray = numpy.arange(0, amostraPontos_freq, 1.0) * (amostraFreq / _soundLenght)
if(len(_soundFreqArray) > len(comparisons[i])):
trying = 0
trying = numpy.linalg.norm(_soundFreqArray-comparisons[i])
else:
trying = numpy.linalg.norm(comparisons[i]-_soundFreqArray)
if (trying < answer):
answer = trying
pos = i

plt.plot(freqArray/1000, 10 * numpy.log10 (arrayFFT), color='B')
plt.xlabel('Frequency (Khz)')
plt.ylabel('Power (dB)')
plt.show()
print("most similar: " + filenames[pos])
print("by a Euclidian Distance of:" + answer)

0 comments on commit df728ad

Please sign in to comment.