La fréquence de détection à partir d'un fichier son
Ce que je suis en train de réaliser est le suivant: j'ai besoin de la fréquence des valeurs d'un fichier son (.wav) pour l'analyse. Je sais que beaucoup de programmes donnera un graphique visuel (spectrogramme) des valeurs mais j'ai besoin de données brutes. Je sais que cela peut être fait avec la FFT et devrait être assez facilement scriptable en python, mais vous ne savez pas comment faire exactement.
Donc, disons que d'un signal dans un fichier .4s longtemps, alors je voudrais plusieurs mesures donnant un résultat dans un tableau pour chaque point d'évaluation du programme de mesures et quelle est la valeur (fréquence) trouvé (et éventuellement de puissance (dB) trop). La complexité de la chose, c'est que je veux analyser les chants des oiseaux, et ils ont souvent des harmoniques ou le signal est sur une gamme de fréquence (par exemple, 1000 à 2000 Hz). Je voudrais que le programme de sortie de cette information, car c'est important pour l'analyse, je tiens à faire avec les données 🙂
Maintenant, il est un morceau de code qui ressemble beaucoup à je voulais, mais je pense qu'il ne me donne pas toutes les valeurs que je veux.... (merci à Justin Peel pour l'affichage de cette à une autre question :)) Donc je suppose que j'ai besoin de numpy et pyaudio, mais malheureusement, je ne suis pas familier avec python donc je suis en espérant qu'un expert Python peut m'aider sur ce point?
Code Source:
# Read in a WAV and find the freq's
import pyaudio
import wave
import numpy as np
chunk = 2048
# open up a wave
wf = wave.open('test-tones/440hz.wav', 'rb')
swidth = wf.getsampwidth()
RATE = wf.getframerate()
# use a Blackman window
window = np.blackman(chunk)
# open stream
p = pyaudio.PyAudio()
stream = p.open(format =
p.get_format_from_width(wf.getsampwidth()),
channels = wf.getnchannels(),
rate = RATE,
output = True)
# read some data
data = wf.readframes(chunk)
# play stream and find the frequency of each chunk
while len(data) == chunk*swidth:
# write data out to the audio stream
stream.write(data)
# unpack the data and times by the hamming window
indata = np.array(wave.struct.unpack("%dh"%(len(data)/swidth),\
data))*window
# Take the fft and square each value
fftData=abs(np.fft.rfft(indata))**2
# find the maximum
which = fftData[1:].argmax() + 1
# use quadratic interpolation around the max
if which != len(fftData)-1:
y0,y1,y2 = np.log(fftData[which-1:which+2:])
x1 = (y2 - y0) * .5 / (2 * y1 - y2 - y0)
# find the frequency and output it
thefreq = (which+x1)*RATE/chunk
print "The freq is %f Hz." % (thefreq)
else:
thefreq = which*RATE/chunk
print "The freq is %f Hz." % (thefreq)
# read some more data
data = wf.readframes(chunk)
if data:
stream.write(data)
stream.close()
p.terminate()
Oui, c'est au moins la 5ème fois cette question est venue jusqu'ALORS dans les 2 dernières semaines.
Oui j'avais cherché et regarda autour de lui.. mais il n'a pas trouver la réponse exacte dont j'avais besoin. Mais en cherchant plus loin, j'ai trouvé un programme qui fait exactement ce dont j'ai besoin:) son analyse des pro, si quelqu'un d'autre lit à cette question et cherche à faire des choses similaires. Vous pouvez obtenir les données (fréquence, etc) avec ce programme exportées vers Excel ou matlab!
OriginalL'auteur Mieke Zwart | 2010-12-13
Vous devez vous connecter pour publier un commentaire.
Je ne suis pas sûr si c'est ce que vous voulez, si vous voulez juste la FFT:
Si vous voulez l'ampleur de la réponse:
Utilisation
x[:,0]
au lieu dex
.Impression de la valeur de X en donnant à cette sortie
[-1.15917969+0.j -0.06542969+0.j -0.06542969+0.j ..., -0.06542969+0.j -0.06542969+0.j -0.06542969+0.j]
Mais je devrais obtenir qu'une seule fréquence, droit? où est la fréquenceOriginalL'auteur Steve Tjoa
Je pense que ce que vous devez faire, c'est un De courte durée à transformée de Fourier(TFCT). Fondamentalement, vous n'multiples qui se chevauchent partiellement Fft et les additionner pour chaque point dans le temps. Ensuite, vous trouverez la crête pour chaque point dans le temps. Je n'ai pas fait moi-même, mais j'ai regardé dans quelques, dans le passé, et c'est certainement la façon d'aller de l'avant.
Il y a du code Python pour faire une TFCT ici et ici.
OriginalL'auteur Justin Peel