Frage zu einem Python Code Fragment?

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
slumber
User
Beiträge: 1
Registriert: Samstag 24. Dezember 2011, 13:50

Hallo,

ich versuche mich in die Python Programmierung einzuarbeiten, und bin dabei auf dieses doch sehr interessante Forum gestossen. Ich habe ein kleines Python programm, welches ich gerne besser verstehen möchte, evtl. kann mir dabei jemand weiter helfen? Grundsätzlich geht es darum einen Stream von der Soundkarte einzulesen, eine FFT darauf anzuwenden, und dann einen sog. "Waterfall plot" auszugeben. Nach einiger Suche, habe ich festgestellt, das dies in Python deutlich einfacher (und schneller) zu bewerkstelligen ist, als z.B. in C oder Pascal. Es geht dabei um ein Script von dieser Seite

http://www.swharden.com/blog/2010-03-05 ... in-python/.

ich poste hier mal den für mich interessanten Teil (mit dem ich auch die grössten Verständnisprobleme habe):

Code: Alles auswählen

def graph():
        global chunks, bufferSize, fftx,ffty, w
        if len(chunks)>0:
                data = chunks.pop(0)
                data=scipy.array(struct.unpack("%dB"%(bufferSize*2),data))
                #print "RECORDED",len(data)/float(sampleRate),"SEC"
                ffty=scipy.fftpack.fft(data)
                fftx=scipy.fftpack.rfftfreq(bufferSize*2, 1.0/sampleRate)
                fftx=fftx[0:len(fftx)/4]
                ffty=abs(ffty[0:len(ffty)/2])/1000
                ffty1=ffty[:len(ffty)/2]
                ffty2=ffty[len(ffty)/2::]+2
                ffty2=ffty2[::-1]
                ffty=ffty1+ffty2
                ffty=(scipy.log(ffty)-1)*120
                fftx,ffty=downSample(fftx,ffty,2)
                updatePic(fftx,ffty)
                reloadPic()
              
if len(chunks)>20:
                print "falling behind...",len(chunks)
Kann mir vielleicht jemand grob erklären (oder gar den Auschnitt kommentieren) was in der Funktion graph() gemacht wird?

Allen Lesern fröhliche Weihnachten und vorab schon Herzlichen Dank für die Hilfe!

Weihnachtliche Grüsse,
Jan
Zuletzt geändert von Anonymous am Samstag 24. Dezember 2011, 15:16, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Code-Tags gesetzt.
BlackJack

@slumber: Mal davon abgesehen, dass das mit den vielen unschönen, teilweise sogar unnötigen ``globals``\s sehr unsauber und unübersichtlich ist, gibt es dort auch umständlichen bis sogar IMHO falschen Code. Die Aufnahme erfolgt mit 16-Bit, die FFT wird dann aber auf diese Daten als *Bytes* angewendet. Das mag hübsch aussehen, ist aber falsch, oder!? Die Umwandlung über das `struct`-Modul ist an der Stelle auch umständlich und langsam.

Einige der Funktionen arbeiten auf `scipy`/`numpy`-Arrays mit Schleifen im Python-Code und Indexzugriffen. Das sollte man wenn immer möglich mit den Mitteln lösen, welche die Arrays zur Verfügung stellen.

FFT ist Dir ein Begriff? Dann musst Du eigentlich nur noch die Slicing-Notation in Python im allgemeinen und die Implementierung bei `scipy`/`numpy`-Arrays im besonderen kennen. Und den Überblick über die vielen globalen Namen behalten. :twisted:
Antworten