2010-11-30 5 views
4

Je génère des fichiers son qui reproduisent des sons à diverses fréquences avec un certain nombre d'harmoniques.
Finalement, ces sons seront lus sur un appareil avec un petit haut-parleur.Python: analyse de fréquence de fichiers son

J'ai la courbe de réponse en fréquence du haut-parleur et que vous voulez faire ce qui suit en Python:

  1. Terrain le spectre de fréquences du fichier audio. J'ai besoin d'un prendre la FFT du fichier et le tracer avec gnuplot
  2. Appliquer une fonction de transfert non linéaire basée sur la courbe de réponse en fréquence dans la feuille de données. Tracer le résultat après l'application de la fonction.

Est-ce que quelqu'un sait:

  • Qu'est-ce que la façon simple de faire cela serait?
  • ou d'une Application (basée sur GNU/Linux) qui pourrait faire cela pour moi?
+0

L'introduction de SciPy inclut faire une FFT et tracer le résultat: http://www.scipy.org/Getting_Started –

+1

Votre logo semble délicieux. –

Répondre

8

Je sais que vous n'avez pas mentionné Pylab/Matplotlib, mais cela fonctionne. Voici un exemple (suppose un signal monocanal):

x, fs, nbits = audiolab.wavread('schubert.wav') 
audiolab.play(x, fs) 
N = 4*fs # four seconds of audio 
X = scipy.fft(x[:N]) 
Xdb = 20*scipy.log10(scipy.absolute(X)) 
f = scipy.linspace(0, fs, N, endpoint=False) 
pylab.plot(f, Xdb) 
pylab.xlim(0, 5000) # view up to 5 kHz 

Y = X*H 
y = scipy.real(scipy.ifft(Y)) 
+0

Qu'est-ce que H? Vouliez-vous dire N? – waffleman

+0

Non, je voulais dire «H». Désolé, j'ai juste sauté un tas d'étapes parce que je suis paresseux. Si 'h' est votre réponse impulsionnelle, alors' H = scipy.fft (h) '. Au point 2 de votre question, vous recevez directement une réponse en fréquence de la fonction de transfert, ce qui signifie «H». –

0

scipy a une FFT et se connecte jolplot. Vous devriez être capable d'utiliser le module signal pour faire le calcul.

2

Vous pouvez utiliser numpy et matPlotLib. Quelque chose comme le code ci-dessous:

spectrum = numpy.fft.fft(signal) 
frequencies = numpy.fft.fftfreq(len(spectrum)) 
pylab.plot(frequencies,spectrum) 
pylab.show() 

Cela montrera un graphique du spectre fft.