Come estrarre le informazioni sulla frequenza da un flusso audio di input (usando PortAudio)?

StackOverflow https://stackoverflow.com/questions/259451

Domanda

Voglio registrare il suono (voce) usando PortAudio (PyAudio) e trasmettere l'onda sonora corrispondente sullo schermo. Per quanto sia disperato, non sono in grado di estrarre le informazioni sulla frequenza dal flusso audio in modo da poterle disegnare in forma Hz / tempo.


Ecco un esempio di frammento di codice che registra e riproduce l'audio registrato per cinque secondi, nel caso in cui sia utile:

p = pyaudio.PyAudio()

chunk = 1024
seconds = 5

stream = p.open(format=pyaudio.paInt16,
                channels=1,
                rate=44100,
                input=True,
                output=True)

for i in range(0, 44100 / chunk * seconds):
    data = stream.read(chunk)
    stream.write(data, chunk)

Desidero estrarre le informazioni necessarie dalla variabile sopra "dati". (Oppure usa un altro approccio di alto livello con PortAudio o un'altra libreria con collegamenti Python.)


Sarei molto grato per qualsiasi aiuto! Sono apprezzate anche le curiosità vagamente correlate della saggezza dell'analisi audio. :)

È stato utile?

Soluzione

Quello che vuoi è probabilmente la trasformata di Fourier dei dati audio. Esistono diversi pacchetti che possono calcolarlo per te. scipy e numpy sono due di questi. Viene spesso chiamato "Trasformata di Fourier veloce" (FFT), ma questo è solo il nome dell'algoritmo.

Ecco un esempio del suo utilizzo: https : //svn.enthought.com/enthought/browser/Chaco/trunk/examples/advanced/spectrum.py

Altri suggerimenti

La trasformata di Fourier non ti aiuterà molto se desideri che l'analisi sia condotta sia nel dominio della frequenza che del tempo. Potresti dare un'occhiata a "Trasformazioni wavelet". C'è un pacchetto chiamato pywavelets ... http://www.pybytes.com/pywavelets/#discrete-wavelet- trasformare-dwt

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top