.wav Datei einfügen und Amplitude ermitteln/Normierung

mit matplotlib, NumPy, pandas, SciPy, SymPy und weiteren mathematischen Programmbibliotheken.
Antworten
raiden123
User
Beiträge: 3
Registriert: Dienstag 24. Juli 2018, 15:02

Hallo liebe Community,

mit den folgendem Code habe ich eine .wav-Datei eingefügt und geplottet:

import matplotlib.pyplot as plt
import numpy as np
import wave
import sys


spf = wave.open('wavfile.wav','r')

signal = spf.readframes(-1)
signal = np.fromstring(signal, 'Int16')

plt.plot(signal)
plt.show().

Nun zur Frage. Meine vorgegebenes Signal hat eine max. Amplitude von 200 (aus ASCII-Code erstellt .wav-Datei). Beim Plotten wird das Signal jedoch durch Int16 normiert, sodass in der Darstellung die maximale Amplitude 16Bit, also 2^15, beträgt. Wie lasse ich mir den Normierungsfaktor anzeigen bzw. auswerfen, da ich in Zukunft nicht die max. Amplitude kenne und sie aus dem Signalverlauf berechnen wollte.

Im Voraus vielen Dank für die Hilfe.
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Das wundert mich. Int16 normiert nix. Dazu müsste es ja erstmal alles normal konvertieren, das Maximum bestimmen, und dann mit einem Faktor multiplizieren. Und das verändert die Daten.

Was du ggf meinst ist die Skalierung der Darstellung. Das ist aber was ganz anderes!
raiden123
User
Beiträge: 3
Registriert: Dienstag 24. Juli 2018, 15:02

Sorry das ist für mich alles noch Neuland.

Kurzes Beispiel. Zwei Signal mit jeweils einem Impuls mit der Amplitude 200 und 100. Beim Plotten der Signal wird mir als Wert der maximalen Amplitude 2^15 angegeben (bei Int32 ist die Amplitude 2^31). Wie kriege ich nun den Faktor raus, der die Skalierung/Normierung beschreibt. Gibt es dafür einen Befehl?
raiden123
User
Beiträge: 3
Registriert: Dienstag 24. Juli 2018, 15:02

Falls es möglich ist, würde ich mich über einen kurzen Code freuen mit dem ich einen .wav-Datei einfügen und plotten kann und sich die Amplituden nicht verändern.
Benutzeravatar
__blackjack__
User
Beiträge: 13004
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Woher weisst Du denn das die maximale Amplitude 200 ist und 200 *was*? Ist das tatsächlich der maximale Samplewert? Bei 16 Bit Samples?

Falls `scipy` als externe Abhängigkeit okay ist, würde ich `scipy.io.wavfile` zum lesen verwenden. Oder aber beim `wave`-Modul dann wenigstens prüfen ob die Annahmen korrekt sind. Also beispielsweise die 16 Bit. Und von Mono gehst Du ja wahrscheinlich stillschweigend auch aus.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Benutzeravatar
kbr
User
Beiträge: 1487
Registriert: Mittwoch 15. Oktober 2008, 09:27

Wenn Du numerische Werte, die im Bereich von 0 bis 200 liegen, von matplotlib plotten lässt, dann wirst Du irgendein Plot in den Grenzen von 0 bis 200 bekommen.
Wenn Du was anderes herausbekommst, dann machst Du auch was anderes.
Antworten