Domanda

Ok cosa im cercando di fare è un tipo di software di elaborazione audio in grado di rilevare una frequenza diffuso un se la frequenza è giocato abbastanza a lungo (alcuni ms) So che ho ottenuto un riscontro positivo. so che avrei bisogno di usare FFT o qualcosa simiral, ma in questo campo della matematica i suck, ho fatto cercare in internet, ma didn non trovo un codice che potrebbe fare solo questo.

l'im obiettivo cercando di accieve è quello di farmi un protocollo personalizzato per inviare i dati di valle suono, esigenza molto basso bitrate per sec (5-10bps) ma anche im molto limitata sulla fine transmiting modo che il software recieving dovrà essere in grado personalizzato (cant utilizzare un modem / effettivo hardware software) anche io voglio che questo sia solo software (nessun hardware aggiuntivo, tranne scheda audio)

grazie molto per l'aiuto.

È stato utile?

Soluzione

Il aubio librerie sono state avvolto con SWIG e può quindi essere usata da Python. Tra le loro molte caratteristiche includono diversi metodi per la rilevazione passo / stima compresa la YIN algoritmo e alcuni algoritmi pettine armonico.

Tuttavia, se si vuole qualcosa di più semplice, ho scritto del codice per la stima passo un po 'di tempo fa e si può prendere o lasciare. Non sarà così preciso come utilizzando gli algoritmi in aubio, ma potrebbe essere abbastanza buono per le vostre esigenze. Io fondamentalmente appena preso la FFT dei tempi di dati di una finestra (una finestra di Blackman in questo caso), al quadrato i valori FFT, trovato il bidone che ha avuto il valore più alto, e usato un'interpolazione quadratica intorno al picco utilizzando il registro del valore massimo e le sue due valori vicini per trovare la frequenza fondamentale. L'interpolazione ho quadratica preso da un pezzo di carta che ho trovato.

E funziona abbastanza bene su toni di prova, ma non sarà così robusta o accurato come gli altri metodi menzionati sopra. La precisione può essere aumentata aumentando la dimensione del blocco (o ridotta diminuendo esso). La dimensione del blocco deve essere un multiplo di 2 a fare pieno uso della FFT. Inoltre, io sono solo determinare l'inclinazione fondamentale per ogni pezzo senza sovrapposizioni. Ho usato PyAudio per riprodurre il suono attraverso durante la scrittura fuori campo stimato.

Codice Sorgente:

# 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()

Altri suggerimenti

Se avete intenzione di utilizzare FSK (Frequency Shift Keying) per la codifica dei dati , si è probabilmente meglio utilizzare il Goertzel algoritmo modo da poter controllare solo le frequenze che si desidera, invece di una piena DFT / FFT.

È possibile trovare lo spettro di frequenza delle finestre scorrevoli sul suono da qui e quindi controllare la presenza della banda di frequenza prevalente tramite trovare l'area sotto la curva dello spettro di frequenza per quella banda da qui .

Anche se non ho provato l'elaborazione audio con Python prima, forse si potrebbe costruire qualcosa sulla base di SciPy (o il suo sottoprogetto NumPy), un quadro di efficienza / ingegneria scientifica calcolo numerico? Si potrebbe iniziare a guardare scipy.fftpack per la FFT.

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