efinf:blc2016:bitsundbytes:wavdatei

This is an old revision of the document!


Digital Audio: Prinzipien

Schall: Schwankungen des Luftdrucks, erzeugt z.B. durch die Bewegung einer Lautsprechermembran, aufgenommen z.B. vom menschlichen Ohr.

Der Luftdruck (bzw. Auslenkung einer Membran) wird viele Male pro Sekunde gemessen (z.B. CD: 44100Hz). Diese Messpunkte (typischerweise vorzeichenbehaftete 16-Bit Ganzzahlen) werden gespeichert. Diese Messwerte werden Samples genannt. Die Umwandlung wird auch Sampling genannt.

Beim Abspielen, wird entsprechend dieser Werte eine Spannung erzeugt (und die Kurve zwischen Punkten geglättet).

WAV-Format

Das WAV-Format kann ziemlich komplex sein. Wir werden uns auf ein ganz einfaches Format beschränken:

  • Mono (1 Kanal)
  • 44100Hz Samplingrate
  • unkomprimiert
  • 16-Bit signed ints, little-endian
  • Erzeugen von 2 Sekunden 440Hz-Ton (Kammer-a)

Wir gehen von folgender Beschreibung des WAV-Formats aus: https://de.wikipedia.org/wiki/RIFF_WAVE#Beispiel_eines_allgemein_lesbaren_WAVE-PCM-Formats

Ruby Details

String manipulation

Die Daten zuerst in einem String geschrieben. Damit das effizient ist, wird ein String der korrekten Länge angelegt:

  filesize = ????
  wav = 0.chr*filesize  # String mit ASCII 0 gefüllt.

Der String kann dann direkt veränder werden, z.B. mit

  wav[8..11]="WAVE"  # Ersetze die Bytes 8 bis 11 mit den 4 Bytes der ASCII-Codes von "WAVE"
Little-Endian Kodierung

Da wir viele Werte Little-Endian kodieren werden müssen, wird eine Funktion definiert:

def to_le(wert, bytes=2)  # Wird kein zweiter Parameter angegeben, ist dieser automatisch 2
  res = 0.chr*bytes       # String vorbereiten
  bytes.times{|i|         # Bytes durchgehen
    res[i] = (wert & 0xff).chr    # Wert in 8-Bit-ASCII umwandeln (nicht zwingend ein Symbol!)
    wert >>=8             # Kurzform für:  wert = wert >> 8
  }
  return res              # Resultat der Funktion
end
#Zum Testen:
puts to_le(1819242339, 4)
  • efinf/blc2016/bitsundbytes/wavdatei.1473582830.txt.gz
  • Last modified: 2016/09/11 10:33
  • by Ivo Blöchliger