Wave Amplitude

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.
anogayales
User
Beiträge: 456
Registriert: Mittwoch 15. April 2009, 14:11

Wave Amplitude

Beitragvon anogayales » Donnerstag 16. April 2009, 16:38

Hallihallo Community,

ich wollte in python mal ein bisschen rumspielen und mit wavedateien graphisch ausgeben lassen.

dazu benötige ich aber einen weg die amplitude an einer gewissen stelle auszulesen.

ich habe bereits eine Wave datei geladen (via import wave) und kann auch ohne probleme darauf zugreifen (via wavefile.readframes(x))

Dennoch habe ich nocht nicht ganz verstanden wie mir diese daten helfen eine amplitude auszuwerten.

Wie geht man an sowas ran bzw. was für daten bekomm ich denn eigentich bei wavefile.readframes(x)?

Danke für eure Hilfe!
Benutzeravatar
snafu
User
Beiträge: 5426
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Beitragvon snafu » Donnerstag 16. April 2009, 16:48

Vielleicht Snack?
shcol (Repo | Doc | PyPi)
anogayales
User
Beiträge: 456
Registriert: Mittwoch 15. April 2009, 14:11

Beitragvon anogayales » Donnerstag 16. April 2009, 17:19

Leider finde ich dazu keine Dokumentation.

Und interne Lösungen wären mir eigentlich lieber, zumal ja wave auch (brauchbare) informationen ausgiebt.
Benutzeravatar
snafu
User
Beiträge: 5426
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Beitragvon snafu » Donnerstag 16. April 2009, 17:34

Gut, das läuft wohl nur über TKinter, aber Doku gibt es schon dafür: http://www.speech.kth.se/snack/man/snac ... n-man.html

Was stellst du dir unter interner Lösung vor? Toolkitunabhängig? Dann musst du das wahrscheinlich selbst berechnen und übertragen.
shcol (Repo | Doc | PyPi)
anogayales
User
Beiträge: 456
Registriert: Mittwoch 15. April 2009, 14:11

Beitragvon anogayales » Donnerstag 16. April 2009, 17:54

genau!

Ganz unabhängig von externen Modulen.

Ich hab hier ein Script, dass eine Wave Datei erzeugt. Dazu brauch man das Modul struct .

Ich habs noch nicht ganz verstanden. Wäre nett wenn mir jemand einen Tipp geben könnte.

Code: Alles auswählen

# create a synthetic 'sine wave' wave file with set frequency and length
# tested with Python25 and Python30  by vegaseat  28dec2008

import math
import wave
import struct

def make_soundfile(freq=440, data_size=10000, filename="sine_wave1.wav"):
    """
    create a synthetic 'sine wave' wave file with frequency freq
    file has a length of about data_size*2 and the given filename
    """
    frate = 11025.0  # framerate as a float
    amp = 8000.0     # multiplier for amplitude

    # make a sine list ...
    sin_list = []
    for i in range(data_size):
        sin_list.append(2 * math.sin(math.pi*freq*(i/frate)))
    wav_file = wave.open(filename, "w")

    # required parameters ...
    nchannels = 1
    sampwidth = 2
    framerate = int(frate)
    nframes = size
    comptype = "NONE"
    compname = "not compressed"

    # set all the parameters at once
    wav_file.setparams((nchannels, sampwidth, framerate, nframes,
        comptype, compname))

    # now write out the file
    print("may take a few seconds ...")
    for s in sin_list:
        # write the audio frames, make sure nframes is correct
        wav_file.writeframes(struct.pack('h', s*amp/2))
    wav_file.close()
    print( "%s written" % filename)


# set some variables ...
freq = 440.0
size = 40000  # data size, file size will be about twice that

# write the synthetic wave file to ...
filename = "WaveTest2.wav"

make_soundfile(freq, size, filename)


Ich will eben keine Datei schreiben, sondern nur die Amplitude an einem gewissen Frame auslesen!

Edit:

Hier hab ich auch noch ein nettes snippet, bin gerade dabei rauszufinden, was in dem numpy array data steht.


Ich plotte mal das Ergebnis, vielleicht sind es ja die waveforms, die ich brauche!

Danke!

Code: Alles auswählen

def readwave(wavfilename):
   w=wave.open(wavfilename,'rb')
   (nchannel, width, rate, length, comptype, compname) = w.getparams()
   frames = w.readframes(length)
   data = numpy.array(struct.unpack("%sh" %length*nchannel, frames)).reshape(length,nchannel)
   return data
anogayales
User
Beiträge: 456
Registriert: Mittwoch 15. April 2009, 14:11

Beitragvon anogayales » Donnerstag 16. April 2009, 19:47

Mit dem unteren Code hat es nun geklappt!

Ich bekomm aufjedenfall brauchbare Werte raus, die mir eine Art Waveform liefern!

Echt klasse:

Hab das ganze mit einer sinusgenerierten Wellenlänge verglichen,
sind ähnlich aus.

Bild

Wäre trotzdem nett, wenn mir jemand das ein oder andere erklären könnte!
Danke!
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Beitragvon numerix » Donnerstag 16. April 2009, 20:04

anogayales hat geschrieben:Wäre trotzdem nett, wenn mir jemand das ein oder andere erklären könnte!Danke!


Das sollte helfen: http://de.wikipedia.org/wiki/Wav

Wer ist online?

Mitglieder in diesem Forum: Nebeig