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()
Avez-vous essayé "recherche"? Cette question a été posée. stackoverflow.com/questions/2648151/python-frequency-detection par exemple.
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

Leave a Reply

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *