Seite 1 von 1

Wave Amplitude

Verfasst: Donnerstag 16. April 2009, 16:38
von anogayales
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!

Verfasst: Donnerstag 16. April 2009, 16:48
von snafu
Vielleicht Snack?

Verfasst: Donnerstag 16. April 2009, 17:19
von anogayales
Leider finde ich dazu keine Dokumentation.

Und interne Lösungen wären mir eigentlich lieber, zumal ja wave auch (brauchbare) informationen ausgiebt.

Verfasst: Donnerstag 16. April 2009, 17:34
von snafu
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.

Verfasst: Donnerstag 16. April 2009, 17:54
von anogayales
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

Verfasst: Donnerstag 16. April 2009, 19:47
von anogayales
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!

Verfasst: Donnerstag 16. April 2009, 20:04
von numerix
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